Hanye官网
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

index.vue 31KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884
  1. <template>
  2. <div>
  3. <div class="w-full h-[88px] md:h-[0]"></div>
  4. <!-- 轮播图 -->
  5. <section class="max-w-full mb-12 md:mb-32 xl:px-8 lg:px-6 md:px-4 px-4">
  6. <Swiper
  7. :modules="[Pagination, Autoplay, EffectCreative]"
  8. :slides-per-view="1"
  9. :space-between="30"
  10. :loop="true"
  11. :pagination="{ el: '.swiper-pagination-1', clickable: true }"
  12. :autoplay="{
  13. delay: 5000,
  14. disableOnInteraction: false,
  15. pauseOnMouseEnter: true,
  16. waitForTransition: true,
  17. }"
  18. effect="creative"
  19. :creativeEffect="{
  20. prev: {
  21. shadow: true,
  22. translate: ['-120%', 0, -500],
  23. rotate: [0, 0, -90],
  24. opacity: 0,
  25. },
  26. next: {
  27. shadow: true,
  28. translate: ['120%', 0, -500],
  29. rotate: [0, 0, 90],
  30. opacity: 0,
  31. },
  32. }"
  33. :speed="1000"
  34. :grabCursor="true"
  35. :parallax="true"
  36. class="h-[320px] sm:h-[320px] md:h-[768px] lg:h-[900px] swiper-container-1"
  37. >
  38. <SwiperSlide>
  39. <div
  40. class="max-w-screen-2xl mx-auto h-full relative"
  41. :style="{
  42. backgroundImage: `url(${homeA2Webp})`,
  43. backgroundSize: 'cover',
  44. backgroundPosition: 'center',
  45. backgroundRepeat: 'no-repeat',
  46. }"
  47. >
  48. <div
  49. class="w-full h-full flex-col justify-center flex gap-2 select-none relative z-10"
  50. >
  51. <div
  52. class="rounded border border-white w-12 h-8 bg-white/10 backdrop-blur-md leading-none justify-center flex items-center text-white text-sm font-normal"
  53. >
  54. SSD
  55. </div>
  56. <div class="justify-center flex flex-col gap-2">
  57. <span
  58. class="text-white md:text-6xl text-1xl sm:text-2xl font-normal"
  59. >{{ t("home.carousel.two.title") }}</span
  60. >
  61. <span
  62. class="text-white md:text-6xl text-1xl sm:text-2xl font-normal"
  63. >{{ t("home.carousel.two.description") }}</span
  64. >
  65. <span
  66. class="text-white md:text-6xl text-1xl sm:text-2xl font-normal"
  67. >{{ t("home.carousel.two.description2") }}</span
  68. >
  69. <span
  70. class="text-cyan-400 md:text-6xl text-1xl sm:text-2xl font-normal"
  71. >{{ t("home.carousel.two.description3") }}</span
  72. >
  73. </div>
  74. <div class="md:flex hidden flex-col gap-2 mt-4">
  75. <div
  76. class="flex items-center gap-2 text-stone-50 text-xl font-normal"
  77. >
  78. <div class="w-2 h-2 bg-white rounded-full"></div>
  79. {{ t("home.carousel.two.description4") }}
  80. </div>
  81. <div
  82. class="flex items-center gap-2 text-stone-50 text-xl font-normal"
  83. >
  84. <div class="w-2 h-2 bg-white rounded-full"></div>
  85. {{ t("home.carousel.two.description5") }}
  86. </div>
  87. </div>
  88. <div
  89. class="md:w-36 w-28 md:h-14 h-10 md:mt-12 mt-2 flex items-center justify-center bg-[#35F1FF] rounded-lg hover:bg-[#35F1FF]/80 transition-colors duration-300"
  90. >
  91. <nuxt-link
  92. :to="`${homepagePath}/products/E500P-4T00A`"
  93. class="w-full h-full !flex items-center justify-center text-zinc-900"
  94. >
  95. {{ t("products.view_details") }}
  96. </nuxt-link>
  97. </div>
  98. </div>
  99. </div>
  100. </SwiperSlide>
  101. <SwiperSlide v-if="!isMobile">
  102. <div class="max-w-screen-2xl mx-auto h-full relative">
  103. <video
  104. :src="homeA3Webp"
  105. autoplay
  106. muted
  107. loop
  108. class="w-full h-full object-cover"
  109. ></video>
  110. <div
  111. class="w-full h-full flex-col justify-center hidden md:flex absolute top-0 left-0 z-10"
  112. >
  113. <div class="justify-center">
  114. <span class="text-white text-6xl font-normal leading-[78px]">{{
  115. t("home.carousel.three.title")
  116. }}</span>
  117. <span class="text-white text-6xl font-normal leading-[78px]">{{
  118. t("home.carousel.three.description")
  119. }}</span>
  120. <br />
  121. <span class="text-white text-6xl font-normal leading-[78px]">{{
  122. t("home.carousel.three.description2")
  123. }}</span
  124. ><br />
  125. <span
  126. class="text-cyan-400 text-6xl font-normal leading-[78px]"
  127. >{{ t("home.carousel.three.description3") }}</span
  128. >
  129. </div>
  130. <div class="flex flex-col gap-2 mt-4">
  131. <div
  132. class="flex items-center gap-2 text-stone-50 text-xl font-normal"
  133. >
  134. <div class="w-2 h-2 bg-white rounded-full"></div>
  135. {{ t("home.carousel.three.description4") }}
  136. </div>
  137. <div
  138. class="flex items-center gap-2 text-stone-50 text-xl font-normal"
  139. >
  140. <div class="w-2 h-2 bg-white rounded-full"></div>
  141. {{ t("home.carousel.three.description5") }}
  142. </div>
  143. </div>
  144. <div
  145. class="w-36 h-14 mt-12 flex items-center justify-center bg-[#35F1FF] rounded-lg hover:bg-[#35F1FF]/80 transition-colors duration-300"
  146. >
  147. <nuxt-link
  148. :to="`${homepagePath}/about`"
  149. class="w-full h-full !flex items-center justify-center text-zinc-900"
  150. >
  151. {{ t("products.view_details") }}
  152. </nuxt-link>
  153. </div>
  154. </div>
  155. </div>
  156. </SwiperSlide>
  157. <SwiperSlide>
  158. <div
  159. class="max-w-screen-2xl mx-auto h-full relative"
  160. :style="{
  161. backgroundImage: `url(${homeA1Webp})`,
  162. backgroundSize: 'cover',
  163. backgroundPosition: 'center',
  164. backgroundRepeat: 'no-repeat',
  165. }"
  166. >
  167. <div
  168. class="w-full h-full flex-col justify-center flex gap-2 select-none relative z-10"
  169. >
  170. <div
  171. class="rounded border border-white w-12 h-8 bg-white/10 backdrop-blur-md leading-none justify-center flex items-center text-white text-sm font-normal"
  172. >
  173. SSD
  174. </div>
  175. <div class="justify-center flex flex-col gap-2">
  176. <span
  177. class="text-white md:text-6xl text-1xl sm:text-2xl font-normal"
  178. >{{ t("home.carousel.one.title") }}</span
  179. >
  180. <span
  181. class="text-white md:text-6xl text-1xl sm:text-2xl font-normal"
  182. >{{ t("home.carousel.one.description") }}</span
  183. >
  184. <span
  185. class="text-white md:text-6xl text-1xl sm:text-2xl font-normal"
  186. >{{ t("home.carousel.one.description2") }}</span
  187. >
  188. <span
  189. class="text-cyan-400 md:text-6xl text-1xl sm:text-2xl font-normal"
  190. >{{ t("home.carousel.one.description3") }}</span
  191. >
  192. </div>
  193. <div class="md:flex hidden flex-col gap-2 mt-4">
  194. <div
  195. class="flex items-center gap-2 text-stone-50 text-xl font-normal"
  196. >
  197. <div class="w-2 h-2 bg-white rounded-full"></div>
  198. {{ t("home.carousel.one.description4") }}
  199. </div>
  200. <div
  201. class="flex items-center gap-2 text-stone-50 text-xl font-normal"
  202. >
  203. <div class="w-2 h-2 bg-white rounded-full"></div>
  204. {{ t("home.carousel.one.description5") }}
  205. </div>
  206. </div>
  207. <div
  208. class="md:w-36 w-28 md:h-14 h-10 md:mt-12 mt-2 flex items-center justify-center bg-[#35F1FF] rounded-lg hover:bg-[#35F1FF]/80 transition-colors duration-300"
  209. >
  210. <nuxt-link
  211. :to="`${homepagePath}/products/HE80-2TNLHS`"
  212. class="w-full h-full !flex items-center justify-center text-zinc-900"
  213. >
  214. {{ t("products.view_details") }}
  215. </nuxt-link>
  216. </div>
  217. </div>
  218. </div>
  219. </SwiperSlide>
  220. <div class="max-w-screen-2xl mx-auto relative">
  221. <div
  222. class="swiper-pagination swiper-pagination-1 text-left bottom-1 top-0"
  223. ></div>
  224. </div>
  225. </Swiper>
  226. </section>
  227. <!-- 按推荐产品展示 -->
  228. <section class="max-w-full mb-12 md:mb-32 xl:px-8 lg:px-6 md:px-4 px-4">
  229. <div class="max-w-screen-2xl mx-auto relative">
  230. <div
  231. class="justify-center text-cyan-400 text-base font-normal leading-tight mb-4"
  232. >
  233. {{ t("products.usage") }}
  234. </div>
  235. <div
  236. class="justify-center text-white font-normal mb-8 md:mb-16 text-xl sm:text-2xl md:text-4xl lg:text-6xl"
  237. >
  238. {{ t("products.usage_title") }}
  239. </div>
  240. </div>
  241. <div class="max-w-screen-2xl mx-auto">
  242. <div class="grid grid-cols-2 md:grid-cols-4 gap-4 md:gap-10 w-full">
  243. <nuxt-link
  244. v-for="(recommend, index) in recommendList"
  245. :key="index"
  246. :to="`${homepagePath}/products/${recommend.name}`"
  247. class="w-full h-full"
  248. >
  249. <div
  250. class="w-full h-full bg-zinc-900 rounded-2xl p-4 flex flex-col items-center justify-start relative overflow-hidden group hover:bg-zinc-800 transition-all duration-300 hover:shadow-lg hover:shadow-cyan-400/10"
  251. >
  252. <div
  253. class="w-full aspect-square relative transition-all duration-300 overflow-hidden rounded-lg"
  254. >
  255. <img
  256. :src="recommend?.image"
  257. class="w-full h-full object-cover transition-all duration-500 group-hover:scale-110"
  258. loading="lazy"
  259. alt="Product image"
  260. />
  261. <div
  262. class="absolute inset-0 bg-gradient-to-t from-black/60 via-black/20 to-transparent opacity-0 group-hover:opacity-100 transition-opacity duration-300"
  263. ></div>
  264. <div
  265. class="absolute inset-0 flex items-center justify-center opacity-0 group-hover:opacity-100 transition-all duration-300 transform translate-y-4 group-hover:translate-y-0"
  266. >
  267. <div
  268. class="px-4 py-2 bg-cyan-400/20 backdrop-blur-sm rounded-full text-white text-sm font-medium border border-cyan-400/30 transform transition-transform duration-300 group-hover:scale-105"
  269. >
  270. {{ t("products.view_details") }}
  271. </div>
  272. </div>
  273. </div>
  274. <div
  275. class="w-full mt-4 min-h-[80px] transition-all duration-300 transform"
  276. >
  277. <div
  278. class="text-center text-white text-base font-bold leading-tight mb-2 line-clamp-2 group-hover:text-cyan-400 transition-colors duration-300"
  279. >
  280. {{ recommend.title }}
  281. </div>
  282. <div
  283. class="text-center text-zinc-400 text-sm font-normal leading-tight line-clamp-2 group-hover:text-zinc-300 transition-colors duration-300"
  284. >
  285. {{ recommend.summary }}
  286. </div>
  287. </div>
  288. </div>
  289. </nuxt-link>
  290. </div>
  291. </div>
  292. </section>
  293. <!-- 按分类栏目展示 -->
  294. <section class="max-w-full mb-12 md:mb-32 xl:px-8 lg:px-6 md:px-4 px-4">
  295. <div class="max-w-screen-2xl mx-auto relative">
  296. <div
  297. class="justify-center text-cyan-400 text-base font-normal leading-tight mb-4"
  298. >
  299. {{ t("home.useCategoryTitle") }}
  300. </div>
  301. <div
  302. class="justify-center text-white font-normal mb-8 md:mb-16 text-xl sm:text-2xl md:text-4xl lg:text-6xl"
  303. >
  304. {{ t("home.useCategoryDescription") }}
  305. </div>
  306. </div>
  307. <div class="max-w-screen-2xl mx-auto relative">
  308. <div class="w-full grid grid-cols-1 md:grid-cols-2 gap-8">
  309. <!-- 企业产品 -->
  310. <div class="flex h-[240px] lg:h-[440px] xl:h-[540px] relative group transition-all duration-500 hover:shadow-2xl hover:shadow-cyan-400/20 hover:-translate-y-2">
  311. <div
  312. class="select-none relative w-full overflow-hidden animate-gradient-bg [background:linear-gradient(180deg,#444B55_0%,#98A3B4_95%)] from-zinc-900 to-zinc-800 transition-all duration-700 group-hover:from-zinc-800 group-hover:to-zinc-700 rounded-2xl"
  313. >
  314. <img src="@/assets/images/business.webp" alt="business" class="max-h-[90%] absolute bottom-0 left-0 z-10 transition-transform duration-700 group-hover:scale-105">
  315. <span class="text-transparent bg-clip-text bg-gradient-to-r from-[rgba(255,255,255,0.05)] to-[rgba(255,255,255,0.08)] absolute hidden xl:block z-0 top-[35%] left-[50%] translate-y-[-50%] translate-x-[-50%] text-[170px] font-bold select-none">Business</span>
  316. </div>
  317. <div class="absolute inset-0 bg-black opacity-0 group-hover:opacity-30 transition-opacity duration-300 z-15 pointer-events-none"></div>
  318. <div class="xl:flex flex-1 flex-col gap-10 absolute top-[10%] right-0 z-20">
  319. <div class="w-full p-8">
  320. <div class="text-white text-4xl mb-4 mt-4 select-none hidden lg:block">
  321. {{ t("home.business.title") }}
  322. </div>
  323. <div class="justify-center text-white text-xl font-normal mb-8">
  324. {{ t("home.business.description") }}
  325. </div>
  326. <nuxt-link
  327. :to="`${homepagePath}/products?audiences=1`"
  328. class="h-14 px-8 py-3.5 whitespace-nowrap bg-white/10 hover:bg-white/15 rounded-[10px] outline outline-1 outline-white/20 backdrop-blur-md inline-flex flex-col justify-start items-start gap-3.5"
  329. >
  330. <div class="inline-flex justify-start items-center gap-2.5">
  331. {{ t("home.business.view_details") }}
  332. <i class="icon-arrow-right text-xs ml-2"></i>
  333. </div>
  334. </nuxt-link>
  335. </div>
  336. </div>
  337. </div>
  338. <!-- 个人产品 -->
  339. <div class="flex h-[240px] lg:h-[440px] xl:h-[540px] relative group transition-all duration-500 hover:shadow-2xl hover:shadow-cyan-400/20 hover:-translate-y-2">
  340. <div class="select-none overflow-hidden relative w-full animate-gradient-bg [background:linear-gradient(180deg,#0086f4_0%,#88d5fa_80%)] from-zinc-900 to-zinc-800 rounded-2xl">
  341. <img src="@/assets/images/personal.webp" alt="personal" class="max-h-[90%] absolute bottom-0 right-[-80px] z-10 transition-transform duration-700 group-hover:scale-105">
  342. <span class="text-transparent bg-clip-text bg-gradient-to-r from-[rgba(255,255,255,0.05)] to-[rgba(255,255,255,0.08)] absolute hidden xl:block z-0 top-[35%] left-[50%] translate-y-[-50%] translate-x-[-50%] text-[170px] font-bold select-none">Personal</span>
  343. </div>
  344. <div class="absolute inset-0 bg-black opacity-0 group-hover:opacity-30 transition-opacity duration-300 z-15 pointer-events-none"></div>
  345. <div class="xl:flex flex-1 flex-col gap-10 absolute top-[10%] left-0 z-20">
  346. <div class="w-full p-8">
  347. <div class="text-white text-4xl mb-4 mt-4 select-none hidden lg:block">
  348. {{ t("home.personal.title") }}
  349. </div>
  350. <div class="justify-center text-white text-xl font-normal mb-8">
  351. {{ t("home.personal.description") }}
  352. </div>
  353. <nuxt-link
  354. :to="`${homepagePath}/products?audiences=0`"
  355. class="h-14 px-8 py-3.5 whitespace-nowrap bg-white/10 hover:bg-white/15 rounded-[10px] outline outline-1 outline-white/20 backdrop-blur-md inline-flex flex-col justify-start items-start gap-3.5"
  356. >
  357. <div class="inline-flex justify-start items-center gap-2.5">
  358. {{ t("home.personal.view_details") }}
  359. <i class="icon-arrow-right text-xs ml-2"></i>
  360. </div>
  361. </nuxt-link>
  362. </div>
  363. </div>
  364. </div>
  365. </div>
  366. </div>
  367. </section>
  368. <!-- 核心展示 -->
  369. <section class="max-w-full mb-12 md:mb-32 xl:px-8 lg:px-6 md:px-4 px-4">
  370. <div
  371. class="max-w-screen-2xl mx-auto grid grid-cols-1 lg:grid-cols-3 md:grid-cols-2 sm:grid-cols-2 gap-4"
  372. >
  373. <div class="inline-flex justify-start items-center gap-5">
  374. <div
  375. class="w-12 h-12 md:w-16 md:h-16 relative bg-gradient-to-b from-neutral-600 to-slate-400 rounded-xl border-b-[1.50px] border-neutral-700 overflow-hidden"
  376. >
  377. <div class="w-full h-full flex items-center justify-center">
  378. <i class="icon-h1 text-white text-5xl"></i>
  379. </div>
  380. </div>
  381. <div class="inline-flex flex-col justify-center items-start flex-1">
  382. <div
  383. class="justify-start text-white font-medium text-1xl md:text-lg"
  384. >
  385. {{ t("products.support") }}
  386. </div>
  387. <div
  388. class="justify-start text-zinc-300 text-xs font-normal md:text-sm"
  389. >
  390. {{ t("products.support_description") }}
  391. </div>
  392. </div>
  393. </div>
  394. <div class="inline-flex justify-start items-center gap-5">
  395. <div
  396. class="w-12 h-12 md:w-16 md:h-16 relative bg-gradient-to-b from-neutral-600 to-slate-400 rounded-xl border-b-[1.50px] border-neutral-700 overflow-hidden"
  397. >
  398. <div class="w-full h-full flex items-center justify-center">
  399. <i class="icon-h2 text-white text-5xl"></i>
  400. </div>
  401. </div>
  402. <div class="inline-flex flex-col justify-center items-start flex-1">
  403. <div
  404. class="justify-start text-white font-medium text-1xl md:text-lg"
  405. >
  406. {{ t("products.development") }}
  407. </div>
  408. <div
  409. class="justify-start text-zinc-300 text-xs font-normal md:text-sm"
  410. >
  411. {{ t("products.development_description") }}
  412. </div>
  413. </div>
  414. </div>
  415. <div class="inline-flex justify-start items-center gap-5">
  416. <div
  417. class="w-12 h-12 md:w-16 md:h-16 relative bg-gradient-to-b from-neutral-600 to-slate-400 rounded-xl border-b-[1.50px] border-neutral-700 overflow-hidden"
  418. >
  419. <div class="w-full h-full flex items-center justify-center">
  420. <i class="icon-h3 text-white text-5xl"></i>
  421. </div>
  422. </div>
  423. <div class="inline-flex flex-col justify-center items-start flex-1">
  424. <div
  425. class="justify-start text-white font-medium text-1xl md:text-lg"
  426. >
  427. {{ t("products.develop") }}
  428. </div>
  429. <div
  430. class="justify-start text-zinc-300 text-xs font-normal md:text-sm"
  431. >
  432. {{ t("products.develop_description") }}
  433. </div>
  434. </div>
  435. </div>
  436. </div>
  437. </section>
  438. <!-- 关于我们 -->
  439. <section class="max-w-full mb-12 md:mb-32 xl:px-8 lg:px-6 md:px-4 px-4">
  440. <div class="max-w-screen-2xl mx-auto relative">
  441. <div
  442. class="justify-center text-cyan-400 text-base font-normal leading-tight mb-4"
  443. >
  444. {{ t("products.strong_point") }}
  445. </div>
  446. <div
  447. class="justify-center text-white font-normal mb-8 md:mb-16 text-xl sm:text-2xl md:text-4xl lg:text-6xl"
  448. >
  449. {{ t("products.strong_point_title") }}
  450. </div>
  451. <div
  452. class="absolute right-0 top-1/2 -translate-y-1/2 z-10 lg:block hidden"
  453. >
  454. <div class="flex items-center justify-center gap-4">
  455. <div
  456. class="swiper-button-prev-3 bg-zinc-700 w-10 h-10 rounded-full flex items-center justify-center cursor-pointer hover:bg-zinc-600 transition-colors duration-200"
  457. >
  458. <i class="icon-arrow-left text-zinc-300 text-sm font-normal"></i>
  459. </div>
  460. <div
  461. class="swiper-button-next-3 bg-zinc-700 w-10 h-10 rounded-full flex items-center justify-center cursor-pointer hover:bg-zinc-600 transition-colors duration-200"
  462. >
  463. <i class="icon-arrow-right text-zinc-300 text-sm font-normal"></i>
  464. </div>
  465. </div>
  466. </div>
  467. </div>
  468. <div class="max-w-screen-2xl mx-auto">
  469. <div class="w-full relative max-w-full">
  470. <Swiper
  471. :modules="[Navigation, Pagination]"
  472. slides-per-view="auto"
  473. :space-between="30"
  474. :pagination="{ el: '.swiper-pagination-3', clickable: true }"
  475. :navigation="{
  476. prevEl: '.swiper-button-prev-3',
  477. nextEl: '.swiper-button-next-3',
  478. }"
  479. class="h-auto sm:h-[360px] md:h-[480px] lg:h-[720px] max-w-full"
  480. >
  481. <SwiperSlide class="!max-w-screen-2xl !w-full">
  482. <div
  483. class="w-full h-full flex items-center px-0 md:px-20 rounded-2xl overflow-hidden"
  484. :style="{
  485. backgroundImage: `url(${homeC1Webp})`,
  486. backgroundSize: 'cover',
  487. backgroundPosition: 'center',
  488. backgroundRepeat: 'no-repeat',
  489. }"
  490. >
  491. <div
  492. class="w-[100%] md:w-[60%] h-[100%] md:h-auto bg-white/5 rounded-0 md:rounded-2xl backdrop-blur-[50px] px-4 py-8 md:py-12 md:px-8 flex flex-col gap-8 border border-white/10"
  493. >
  494. <div
  495. class="opacity-90 justify-start text-white text-2xl font-normal md:text-4xl"
  496. >
  497. {{ t("about.companyInfo.name") }}
  498. </div>
  499. <div
  500. class="opacity-70 justify-start text-white text-base md:text-lg font-normal leading-relaxed whitespace-pre-wrap"
  501. >
  502. {{ t("about.companyInfo.description") }}
  503. </div>
  504. </div>
  505. </div>
  506. </SwiperSlide>
  507. </Swiper>
  508. </div>
  509. <div class="max-w-screen-2xl mx-auto relative">
  510. <div class="swiper-pagination swiper-pagination-3"></div>
  511. </div>
  512. </div>
  513. </section>
  514. <!-- 产品咨询 -->
  515. <section class="max-w-full h-[240px] md:h-[480px] bg-black/80 md:block">
  516. <div class="h-full relative">
  517. <div
  518. class="absolute top-0 left-0 w-full h-full flex flex-col gap-6 items-center justify-center z-10"
  519. >
  520. <h1
  521. class="text-center justify-start text-white font-normal text-xl sm:text-xl md:text-3xl px-4 sm:px-2"
  522. >
  523. {{ t("products.consultation") }}
  524. </h1>
  525. <nuxt-link
  526. :to="`${homepagePath}/contact`"
  527. class="w-32 h-10 md:w-40 md:h-11 bg-zinc-300/10 rounded-lg outline outline-1 flex items-center justify-center gap-2 outline-white/20 backdrop-blur-[10px] cursor-pointer hover:bg-zinc-300/20 transition-colors duration-200"
  528. >
  529. <span class="text-base font-normal">{{
  530. t("products.consultation_button")
  531. }}</span>
  532. <i class="icon-arrow-right text-sm font-normal"></i>
  533. </nuxt-link>
  534. </div>
  535. <img
  536. v-if="isMobile"
  537. :src="videoWebp"
  538. alt="video"
  539. class="w-full h-full object-cover opacity-20"
  540. />
  541. <video
  542. v-else
  543. :src="videoSrc"
  544. autoplay
  545. muted
  546. loop
  547. :poster="videoWebp"
  548. class="w-full h-full object-cover opacity-20"
  549. ></video>
  550. </div>
  551. </section>
  552. </div>
  553. </template>
  554. <script setup lang="ts">
  555. import { Swiper, SwiperSlide } from "swiper/vue";
  556. import {
  557. Navigation,
  558. Pagination,
  559. Autoplay,
  560. EffectCreative,
  561. } from "swiper/modules";
  562. import "swiper/css";
  563. import "swiper/css/navigation";
  564. import "swiper/css/pagination";
  565. import { useBreakpoints, breakpointsTailwind } from "@vueuse/core";
  566. import { useI18n, useRoute, useHead, computed, ref, onMounted, watch } from "#imports";
  567. import video from "@/assets/videos/video.mp4";
  568. import videoWebp from "@/assets/videos/video.webp";
  569. import homeA1Webp from "@/assets/images/home-a-1.webp";
  570. import homeA2Webp from "@/assets/images/home-a-2.webp";
  571. import homeA3Webp from "@/assets/videos/banner03.mp4";
  572. import homeC1Webp from "@/assets/images/home-c-1.webp";
  573. // 数据类型定义
  574. interface Product {
  575. id: number;
  576. title: string;
  577. image: string;
  578. link: string;
  579. description?: string;
  580. name?: string;
  581. recommend: boolean;
  582. recommendIndex: number;
  583. summary?: string;
  584. }
  585. // 使用i18n
  586. const { t, locale } = useI18n();
  587. // 默认语言
  588. const defaultLocale = "zh";
  589. // 获取路由
  590. const route = useRoute();
  591. // 断点
  592. const breakpoints = useBreakpoints(breakpointsTailwind);
  593. // 是否移动端
  594. const isMobile = breakpoints.smaller("md");
  595. const videoSrc = ref(video);
  596. /**
  597. * 使用计算属性获取当前语言的数据文件URL
  598. */
  599. const productsDataUrl = computed(() => {
  600. return `/data/products-${locale.value}.json`;
  601. });
  602. const homepagePath = computed(() => {
  603. return locale.value === "zh" ? "" : `/${locale.value}`;
  604. });
  605. const recommendList = ref<Product[]>([]);
  606. const loadRecommendData = async () => {
  607. try {
  608. const productsResponse = await fetch(productsDataUrl.value);
  609. if (!productsResponse.ok) {
  610. console.error("Failed to fetch products data:", productsResponse.statusText);
  611. recommendList.value = [];
  612. return;
  613. }
  614. const productsData = await productsResponse.json();
  615. recommendList.value = productsData
  616. .filter((product: Product) => product.recommend)
  617. .sort((a: Product, b: Product) => b.recommendIndex - a.recommendIndex);
  618. } catch (error) {
  619. console.error("Error loading recommendation data:", error);
  620. recommendList.value = [];
  621. }
  622. };
  623. onMounted(() => {
  624. loadRecommendData();
  625. });
  626. watch(locale, () => {
  627. loadRecommendData();
  628. });
  629. useHead({
  630. title: t("home.title") + " - Hanye",
  631. meta: [
  632. {
  633. name: "description",
  634. content: t("home.description"),
  635. },
  636. {
  637. name: "keywords",
  638. content: t("home.keywords"),
  639. },
  640. ],
  641. });
  642. </script>
  643. <style lang="scss" scoped>
  644. :deep(.swiper-pagination-3) {
  645. margin: auto;
  646. position: static;
  647. padding: 1rem 0;
  648. }
  649. :deep(.swiper-pagination-bullet) {
  650. background-color: var(--color-bg); /* Example color */
  651. border: 2px solid var(--color-text);
  652. }
  653. :deep(.swiper-pagination-bullet-active) {
  654. background-color: var(--color-text); /* Example color */
  655. }
  656. .use-business {
  657. background-image: url("@/assets/images/business.webp");
  658. background-size: auto 548px;
  659. background-position: left top;
  660. background-repeat: no-repeat;
  661. }
  662. .use-personal {
  663. background-image: url("@/assets/images/personal.webp");
  664. background-size: auto 480px;
  665. background-position: right bottom;
  666. background-repeat: no-repeat;
  667. }
  668. // 优化过渡动画
  669. .slide-fade-enter-active,
  670. .slide-fade-leave-active {
  671. transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
  672. position: absolute;
  673. width: 100%;
  674. height: 300px;
  675. }
  676. @media (min-width: 640px) {
  677. .slide-fade-enter-active,
  678. .slide-fade-leave-active {
  679. height: 350px;
  680. }
  681. }
  682. @media (min-width: 768px) {
  683. .slide-fade-enter-active,
  684. .slide-fade-leave-active {
  685. height: 400px;
  686. }
  687. }
  688. @media (min-width: 1024px) {
  689. .slide-fade-enter-active,
  690. .slide-fade-leave-active {
  691. height: 450px;
  692. }
  693. }
  694. .slide-fade-enter-from {
  695. opacity: 0;
  696. transform: translateX(30px);
  697. }
  698. .slide-fade-leave-to {
  699. opacity: 0;
  700. transform: translateX(-30px);
  701. }
  702. // 添加响应式优化
  703. @media (max-width: 640px) {
  704. .slide-fade-enter-from,
  705. .slide-fade-leave-to {
  706. transform: translateX(15px);
  707. }
  708. }
  709. // 优化图片加载动画
  710. @keyframes gradient {
  711. 0% {
  712. background-position: 0% 50%;
  713. }
  714. 50% {
  715. background-position: 100% 50%;
  716. }
  717. 100% {
  718. background-position: 0% 50%;
  719. }
  720. }
  721. .animate-gradient {
  722. background-size: 200% 200%;
  723. animation: gradient 3s ease infinite;
  724. }
  725. // 移除 pagination 相关样式
  726. :deep(.swiper-pagination-2) {
  727. display: none;
  728. }
  729. // 添加导航按钮禁用样式
  730. :deep(.swiper-button-disabled) {
  731. opacity: 0.35;
  732. cursor: not-allowed;
  733. pointer-events: none;
  734. }
  735. // 优化轮播图样式
  736. :deep(.swiper-container-1) {
  737. .swiper-slide {
  738. transition: all 0.5s ease;
  739. transform-origin: center center;
  740. backface-visibility: hidden;
  741. perspective: 1000px;
  742. }
  743. .swiper-pagination-bullet {
  744. width: 12px;
  745. height: 12px;
  746. background: transparent;
  747. border: 2px solid rgba(255, 255, 255, 0.5);
  748. opacity: 1;
  749. transition: all 0.3s ease;
  750. margin: 0 8px !important;
  751. &-active {
  752. background: #fff;
  753. border-color: #fff;
  754. transform: scale(1.2);
  755. }
  756. }
  757. .swiper-pagination {
  758. display: flex;
  759. justify-content: center;
  760. align-items: center;
  761. padding: 20px 0;
  762. }
  763. }
  764. // 优化图片加载动画
  765. @keyframes fadeIn {
  766. from {
  767. opacity: 0;
  768. transform: scale(1.1);
  769. }
  770. to {
  771. opacity: 1;
  772. transform: scale(1);
  773. }
  774. }
  775. .swiper-slide-active {
  776. img {
  777. animation: fadeIn 0.8s ease-out forwards;
  778. }
  779. }
  780. // 优化产品卡片动画和交互
  781. .swiper-slide {
  782. a {
  783. text-decoration: none;
  784. display: block;
  785. height: 100%;
  786. &:hover {
  787. text-decoration: none;
  788. }
  789. > div {
  790. position: relative;
  791. z-index: 1;
  792. cursor: pointer;
  793. transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
  794. &:hover {
  795. transform: translateY(-2px);
  796. box-shadow: 0 10px 20px rgba(0, 0, 0, 0.2);
  797. }
  798. }
  799. }
  800. }
  801. // 移除卡片抖动动画
  802. @keyframes cardHover {
  803. 0% {
  804. transform: translateY(0);
  805. }
  806. 100% {
  807. transform: translateY(-2px);
  808. }
  809. }
  810. // 添加渐变背景动画
  811. @keyframes gradient-bg {
  812. 0% {
  813. background-position: 0% 50%;
  814. opacity: 1;
  815. }
  816. 50% {
  817. background-position: 100% 50%;
  818. opacity: 0.85;
  819. }
  820. 100% {
  821. background-position: 0% 50%;
  822. opacity: 1;
  823. }
  824. }
  825. .animate-gradient-bg {
  826. background-size: 200% 200%;
  827. animation: gradient-bg 15s ease infinite;
  828. }
  829. </style>