Hanye官网
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952
  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/HE80-2TNLHS`"
  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. <!-- 图片容器 -->
  253. <div
  254. class="w-full aspect-square relative transition-all duration-300 overflow-hidden rounded-lg"
  255. >
  256. <img
  257. :src="recommend?.image"
  258. class="w-full h-full object-cover transition-all duration-500 group-hover:scale-110"
  259. loading="lazy"
  260. alt="Product image"
  261. />
  262. <div
  263. 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"
  264. ></div>
  265. <!-- 添加查看详情按钮 -->
  266. <div
  267. 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"
  268. >
  269. <div
  270. 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"
  271. >
  272. {{ t("products.view_details") }}
  273. </div>
  274. </div>
  275. </div>
  276. <!-- 文字内容 -->
  277. <div
  278. class="w-full mt-4 min-h-[80px] transition-all duration-300 transform"
  279. >
  280. <div
  281. 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"
  282. >
  283. {{ recommend.title }}
  284. </div>
  285. <div
  286. class="text-center text-zinc-400 text-sm font-normal leading-tight line-clamp-2 group-hover:text-zinc-300 transition-colors duration-300"
  287. >
  288. {{ recommend.summary }}
  289. </div>
  290. </div>
  291. </div>
  292. </nuxt-link>
  293. </div>
  294. </div>
  295. </section>
  296. <!-- 按分类栏目展示 -->
  297. <section class="max-w-full mb-12 md:mb-32 xl:px-8 lg:px-6 md:px-4 px-4">
  298. <div class="max-w-screen-2xl mx-auto relative">
  299. <div
  300. class="justify-center text-cyan-400 text-base font-normal leading-tight mb-4"
  301. >
  302. {{ t("home.useCategoryTitle") }}
  303. </div>
  304. <div
  305. class="justify-center text-white font-normal mb-8 md:mb-16 text-xl sm:text-2xl md:text-4xl lg:text-6xl"
  306. >
  307. {{ t("home.useCategoryDescription") }}
  308. </div>
  309. </div>
  310. <div class="max-w-screen-2xl mx-auto relative">
  311. <div class="w-full grid grid-cols-1 md:grid-cols-2 gap-8">
  312. <!-- 企业产品 -->
  313. <div class="flex h-[240px] lg:h-[440px] xl:h-[540px] relative">
  314. <div
  315. class="select-none relative w-full animate-gradient-bg [background:linear-gradient(180deg,#444B55_0%,#98A3B4_95%)] from-zinc-900 to-zinc-800"
  316. >
  317. <img
  318. src="@/assets/images/business.webp"
  319. alt="business"
  320. class="max-h-[90%] absolute bottom-0 left-0 z-10"
  321. />
  322. <span
  323. 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"
  324. >Business</span
  325. >
  326. </div>
  327. <div
  328. class="xl:flex flex-1 flex-col gap-10 absolute top-[10%] right-0"
  329. >
  330. <div class="w-full p-8">
  331. <div class="text-white text-4xl mb-4 mt-4 select-none hidden lg:block">
  332. {{ t("home.business.title") }}
  333. </div>
  334. <div class="justify-center text-white text-xl font-normal mb-8">
  335. {{ t("home.business.description") }}
  336. </div>
  337. <nuxt-link
  338. :to="`${homepagePath}/products?audiences=1`"
  339. 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"
  340. >
  341. <div class="inline-flex justify-start items-center gap-2.5">
  342. {{ t("home.business.view_details") }}
  343. <i class="icon-arrow-right text-xs ml-2"></i>
  344. </div>
  345. </nuxt-link>
  346. </div>
  347. </div>
  348. </div>
  349. <div class="flex h-[240px] lg:h-[440px] xl:h-[540px] relative">
  350. <div
  351. 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"
  352. >
  353. <img
  354. src="@/assets/images/personal.webp"
  355. alt="personal"
  356. class="max-h-[90%] absolute bottom-0 right-[-80px] z-10"
  357. />
  358. <span
  359. 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"
  360. >Personal</span
  361. >
  362. </div>
  363. <div
  364. class="xl:flex flex-1 flex-col gap-10 absolute top-[10%] left-0"
  365. >
  366. <div class="w-full p-8">
  367. <div class="text-white text-4xl mb-4 mt-4 select-none hidden lg:block">
  368. {{ t("home.personal.title") }}
  369. </div>
  370. <div class="justify-center text-white text-xl font-normal mb-8">
  371. {{ t("home.personal.description") }}
  372. </div>
  373. <nuxt-link
  374. :to="`${homepagePath}/products?audiences=0`"
  375. 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"
  376. >
  377. <div class="inline-flex justify-start items-center gap-2.5">
  378. {{ t("home.personal.view_details") }}
  379. <i class="icon-arrow-right text-xs ml-2"></i>
  380. </div>
  381. </nuxt-link>
  382. </div>
  383. </div>
  384. </div>
  385. <!-- 个人产品 -->
  386. <div
  387. v-if="false"
  388. class="flex w-full gap-8 relative mb-0 xl:mb-60 flex-col xl:flex-row"
  389. >
  390. <div
  391. class="flex-1 hidden xl:flex flex-col gap-10 relative top-[-80px]"
  392. >
  393. <div class="w-full">
  394. <div
  395. class="justify-center text-white text-6xl whitespace-nowrap mb-4 mt-20 select-none"
  396. >
  397. {{ t("home.personal.title") }}
  398. </div>
  399. <div class="justify-center text-white text-xl font-normal mb-8">
  400. {{ t("home.personal.description") }}
  401. </div>
  402. <nuxt-link
  403. :to="`${homepagePath}/products?audiences=0`"
  404. class="h-14 px-8 py-3.5 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"
  405. >
  406. <div class="inline-flex justify-start items-center gap-2.5">
  407. {{ t("home.personal.view_details") }}
  408. <i class="icon-arrow-right text-xs ml-2"></i>
  409. </div>
  410. </nuxt-link>
  411. </div>
  412. </div>
  413. <div
  414. class="w-full select-none relative z-0 flex justify-end items-end animate-gradient-bg [background:linear-gradient(180deg,#0086f4_0%,#88d5fa_80%)]"
  415. >
  416. <img
  417. src="@/assets/images/personal.webp"
  418. alt="personal"
  419. class="pt-0 md:pt-20 max-h-full relative z-10"
  420. />
  421. <span
  422. class="absolute text-transparent bg-clip-text bg-gradient-to-r from-[rgba(255,255,255,0.08)] to-[rgba(255,255,255,0.05)] hidden xl:block z-0 top-[25%] left-[35%] translate-y-[-50%] translate-x-[-50%] text-[160px] font-bold select-none"
  423. >Personal</span
  424. >
  425. <div
  426. class="flex xl:hidden flex-col gap-10 absolute top-0 left-0 right-0 bottom-0 z-10 justify-center p-4 md:p-8"
  427. >
  428. <div class="w-full">
  429. <div
  430. class="justify-center text-white text-4xl md:text-7xl font-bold mb-2 select-none"
  431. >
  432. {{ t("home.personal.title") }}
  433. </div>
  434. <div
  435. class="justify-center text-white text-xl font-normal mb-8"
  436. >
  437. {{ t("home.personal.description") }}
  438. </div>
  439. <nuxt-link
  440. :to="`${homepagePath}/products?audiences=0`"
  441. class="h-14 px-8 py-3.5 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"
  442. >
  443. <div class="inline-flex justify-start items-center gap-2.5">
  444. {{ t("home.personal.view_details") }}
  445. <i class="icon-arrow-right text-xs ml-2"></i>
  446. </div>
  447. </nuxt-link>
  448. </div>
  449. </div>
  450. </div>
  451. </div>
  452. </div>
  453. </div>
  454. </section>
  455. <!-- 核心展示 -->
  456. <section class="max-w-full mb-12 md:mb-32 xl:px-8 lg:px-6 md:px-4 px-4">
  457. <div
  458. 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"
  459. >
  460. <div class="inline-flex justify-start items-center gap-5">
  461. <div
  462. 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"
  463. >
  464. <div class="w-full h-full flex items-center justify-center">
  465. <i class="icon-h1 text-white text-5xl"></i>
  466. </div>
  467. </div>
  468. <div class="inline-flex flex-col justify-center items-start flex-1">
  469. <div
  470. class="justify-start text-white font-medium text-1xl md:text-lg"
  471. >
  472. {{ t("products.support") }}
  473. </div>
  474. <div
  475. class="justify-start text-zinc-300 text-xs font-normal md:text-sm"
  476. >
  477. {{ t("products.support_description") }}
  478. </div>
  479. </div>
  480. </div>
  481. <div class="inline-flex justify-start items-center gap-5">
  482. <div
  483. 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"
  484. >
  485. <div class="w-full h-full flex items-center justify-center">
  486. <i class="icon-h2 text-white text-5xl"></i>
  487. </div>
  488. </div>
  489. <div class="inline-flex flex-col justify-center items-start flex-1">
  490. <div
  491. class="justify-start text-white font-medium text-1xl md:text-lg"
  492. >
  493. {{ t("products.development") }}
  494. </div>
  495. <div
  496. class="justify-start text-zinc-300 text-xs font-normal md:text-sm"
  497. >
  498. {{ t("products.development_description") }}
  499. </div>
  500. </div>
  501. </div>
  502. <div class="inline-flex justify-start items-center gap-5">
  503. <div
  504. 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"
  505. >
  506. <div class="w-full h-full flex items-center justify-center">
  507. <i class="icon-h3 text-white text-5xl"></i>
  508. </div>
  509. </div>
  510. <div class="inline-flex flex-col justify-center items-start flex-1">
  511. <div
  512. class="justify-start text-white font-medium text-1xl md:text-lg"
  513. >
  514. {{ t("products.develop") }}
  515. </div>
  516. <div
  517. class="justify-start text-zinc-300 text-xs font-normal md:text-sm"
  518. >
  519. {{ t("products.develop_description") }}
  520. </div>
  521. </div>
  522. </div>
  523. </div>
  524. </section>
  525. <!-- 关于我们 -->
  526. <section class="max-w-full mb-12 md:mb-32 xl:px-8 lg:px-6 md:px-4 px-4">
  527. <div class="max-w-screen-2xl mx-auto relative">
  528. <div
  529. class="justify-center text-cyan-400 text-base font-normal leading-tight mb-4"
  530. >
  531. {{ t("products.strong_point") }}
  532. </div>
  533. <div
  534. class="justify-center text-white font-normal mb-8 md:mb-16 text-xl sm:text-2xl md:text-4xl lg:text-6xl"
  535. >
  536. {{ t("products.strong_point_title") }}
  537. </div>
  538. <div
  539. class="absolute right-0 top-1/2 -translate-y-1/2 z-10 lg:block hidden"
  540. >
  541. <div class="flex items-center justify-center gap-4">
  542. <div
  543. 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"
  544. >
  545. <i class="icon-arrow-left text-zinc-300 text-sm font-normal"></i>
  546. </div>
  547. <div
  548. 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"
  549. >
  550. <i class="icon-arrow-right text-zinc-300 text-sm font-normal"></i>
  551. </div>
  552. </div>
  553. </div>
  554. </div>
  555. <div class="max-w-screen-2xl mx-auto">
  556. <div class="w-full relative max-w-full">
  557. <Swiper
  558. :modules="[Navigation, Pagination]"
  559. slides-per-view="auto"
  560. :space-between="30"
  561. :pagination="{ el: '.swiper-pagination-3', clickable: true }"
  562. :navigation="{
  563. prevEl: '.swiper-button-prev-3',
  564. nextEl: '.swiper-button-next-3',
  565. }"
  566. class="h-auto sm:h-[360px] md:h-[480px] lg:h-[720px] max-w-full"
  567. >
  568. <SwiperSlide class="!max-w-screen-2xl !w-full">
  569. <div
  570. class="w-full h-full flex items-center px-0 md:px-20"
  571. :style="{
  572. backgroundImage: `url(${homeC1Webp})`,
  573. backgroundSize: 'cover',
  574. backgroundPosition: 'center',
  575. backgroundRepeat: 'no-repeat',
  576. }"
  577. >
  578. <div
  579. 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"
  580. >
  581. <div
  582. class="opacity-90 justify-start text-white text-2xl font-normal md:text-4xl"
  583. >
  584. {{ t("about.companyInfo.name") }}
  585. </div>
  586. <div
  587. class="opacity-70 justify-start text-white text-base md:text-lg font-normal leading-relaxed whitespace-pre-wrap"
  588. >
  589. {{ t("about.companyInfo.description") }}
  590. </div>
  591. </div>
  592. </div>
  593. </SwiperSlide>
  594. </Swiper>
  595. </div>
  596. <div class="max-w-screen-2xl mx-auto relative">
  597. <div class="swiper-pagination swiper-pagination-3"></div>
  598. </div>
  599. </div>
  600. </section>
  601. <!-- 产品咨询 -->
  602. <section class="max-w-full h-[240px] md:h-[480px] bg-black/80 md:block">
  603. <div class="h-full relative">
  604. <div
  605. class="absolute top-0 left-0 w-full h-full flex flex-col gap-6 items-center justify-center z-10"
  606. >
  607. <h1
  608. class="text-center justify-start text-white font-normal text-xl sm:text-xl md:text-3xl px-4 sm:px-2"
  609. >
  610. {{ t("products.consultation") }}
  611. </h1>
  612. <nuxt-link
  613. :to="`${homepagePath}/contact`"
  614. 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"
  615. >
  616. <span class="text-base font-normal">{{
  617. t("products.consultation_button")
  618. }}</span>
  619. <i class="icon-arrow-right text-sm font-normal"></i>
  620. </nuxt-link>
  621. </div>
  622. <img
  623. v-if="isMobile"
  624. :src="videoWebp"
  625. alt="video"
  626. class="w-full h-full object-cover opacity-20"
  627. />
  628. <video
  629. v-else
  630. :src="videoSrc"
  631. autoplay
  632. muted
  633. loop
  634. :poster="videoWebp"
  635. class="w-full h-full object-cover opacity-20"
  636. ></video>
  637. </div>
  638. </section>
  639. </div>
  640. </template>
  641. <script setup lang="ts">
  642. import { Swiper, SwiperSlide } from "swiper/vue";
  643. import {
  644. Navigation,
  645. Pagination,
  646. Autoplay,
  647. EffectCreative,
  648. } from "swiper/modules";
  649. import "swiper/css";
  650. import "swiper/css/navigation";
  651. import "swiper/css/pagination";
  652. import { useBreakpoints, breakpointsTailwind } from "@vueuse/core";
  653. import { useI18n, useRoute, useAsyncData, queryCollection } from "#imports";
  654. import video from "@/assets/videos/video.mp4";
  655. import videoWebp from "@/assets/videos/video.webp";
  656. import homeA1Webp from "@/assets/images/home-a-1.webp";
  657. import homeA2Webp from "@/assets/images/home-a-2.webp";
  658. import homeA3Webp from "@/assets/videos/banner03.mp4";
  659. import homeC1Webp from "@/assets/images/home-c-1.webp";
  660. // 数据类型定义
  661. interface Product {
  662. id: number;
  663. title: string;
  664. image: string;
  665. link: string;
  666. description?: string;
  667. name?: string;
  668. recommend: boolean;
  669. recommendIndex: number;
  670. summary?: string;
  671. }
  672. // 使用i18n
  673. const { t, locale } = useI18n();
  674. // 默认语言
  675. const defaultLocale = "zh";
  676. // 获取路由
  677. const route = useRoute();
  678. // 断点
  679. const breakpoints = useBreakpoints(breakpointsTailwind);
  680. // 是否移动端
  681. const isMobile = breakpoints.smaller("md");
  682. const videoSrc = ref(video);
  683. /**
  684. * 使用计算属性获取当前语言的数据文件URL
  685. */
  686. const productsDataUrl = computed(() => {
  687. return `/data/products-${locale.value}.json`;
  688. });
  689. const homepagePath = computed(() => {
  690. return locale.value === "zh" ? "" : `/${locale.value}`;
  691. });
  692. const recommendList = ref<Product[]>([]);
  693. const loadRecommendData = async () => {
  694. const productsResponse = await fetch(productsDataUrl.value);
  695. const productsData = await productsResponse.json();
  696. recommendList.value = productsData
  697. .filter((product: Product) => product.recommend)
  698. .sort((a: Product, b: Product) => b.recommendIndex - a.recommendIndex);
  699. };
  700. // 当页面加载或语言改变时加载数据
  701. onMounted(() => {
  702. loadRecommendData();
  703. });
  704. // SEO优化
  705. useHead({
  706. title: t("home.title") + " - Hanye",
  707. meta: [
  708. {
  709. name: "description",
  710. content: t("home.description"),
  711. },
  712. {
  713. name: "keywords",
  714. content: t("home.keywords"),
  715. },
  716. ],
  717. });
  718. </script>
  719. <style lang="scss" scoped>
  720. :deep(.swiper-pagination-3) {
  721. margin: auto;
  722. position: static;
  723. padding: 1rem 0;
  724. }
  725. :deep(.swiper-pagination-bullet) {
  726. background-color: var(--color-bg); /* Example color */
  727. border: 2px solid var(--color-text);
  728. }
  729. :deep(.swiper-pagination-bullet-active) {
  730. background-color: var(--color-text); /* Example color */
  731. }
  732. .use-business {
  733. background-image: url("@/assets/images/business.webp");
  734. background-size: auto 548px;
  735. background-position: left top;
  736. background-repeat: no-repeat;
  737. }
  738. .use-personal {
  739. background-image: url("@/assets/images/personal.webp");
  740. background-size: auto 480px;
  741. background-position: right bottom;
  742. background-repeat: no-repeat;
  743. }
  744. // 优化过渡动画
  745. .slide-fade-enter-active,
  746. .slide-fade-leave-active {
  747. transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
  748. position: absolute;
  749. width: 100%;
  750. height: 300px;
  751. }
  752. @media (min-width: 640px) {
  753. .slide-fade-enter-active,
  754. .slide-fade-leave-active {
  755. height: 350px;
  756. }
  757. }
  758. @media (min-width: 768px) {
  759. .slide-fade-enter-active,
  760. .slide-fade-leave-active {
  761. height: 400px;
  762. }
  763. }
  764. @media (min-width: 1024px) {
  765. .slide-fade-enter-active,
  766. .slide-fade-leave-active {
  767. height: 450px;
  768. }
  769. }
  770. .slide-fade-enter-from {
  771. opacity: 0;
  772. transform: translateX(30px);
  773. }
  774. .slide-fade-leave-to {
  775. opacity: 0;
  776. transform: translateX(-30px);
  777. }
  778. // 添加响应式优化
  779. @media (max-width: 640px) {
  780. .slide-fade-enter-from,
  781. .slide-fade-leave-to {
  782. transform: translateX(15px);
  783. }
  784. }
  785. // 优化图片加载动画
  786. @keyframes gradient {
  787. 0% {
  788. background-position: 0% 50%;
  789. }
  790. 50% {
  791. background-position: 100% 50%;
  792. }
  793. 100% {
  794. background-position: 0% 50%;
  795. }
  796. }
  797. .animate-gradient {
  798. background-size: 200% 200%;
  799. animation: gradient 3s ease infinite;
  800. }
  801. // 移除 pagination 相关样式
  802. :deep(.swiper-pagination-2) {
  803. display: none;
  804. }
  805. // 添加导航按钮禁用样式
  806. :deep(.swiper-button-disabled) {
  807. opacity: 0.35;
  808. cursor: not-allowed;
  809. pointer-events: none;
  810. }
  811. // 优化轮播图样式
  812. :deep(.swiper-container-1) {
  813. .swiper-slide {
  814. transition: all 0.5s ease;
  815. transform-origin: center center;
  816. backface-visibility: hidden;
  817. perspective: 1000px;
  818. }
  819. .swiper-pagination-bullet {
  820. width: 12px;
  821. height: 12px;
  822. background: transparent;
  823. border: 2px solid rgba(255, 255, 255, 0.5);
  824. opacity: 1;
  825. transition: all 0.3s ease;
  826. margin: 0 8px !important;
  827. &-active {
  828. background: #fff;
  829. border-color: #fff;
  830. transform: scale(1.2);
  831. }
  832. }
  833. .swiper-pagination {
  834. display: flex;
  835. justify-content: center;
  836. align-items: center;
  837. padding: 20px 0;
  838. }
  839. }
  840. // 优化图片加载动画
  841. @keyframes fadeIn {
  842. from {
  843. opacity: 0;
  844. transform: scale(1.1);
  845. }
  846. to {
  847. opacity: 1;
  848. transform: scale(1);
  849. }
  850. }
  851. .swiper-slide-active {
  852. img {
  853. animation: fadeIn 0.8s ease-out forwards;
  854. }
  855. }
  856. // 优化产品卡片动画和交互
  857. .swiper-slide {
  858. a {
  859. text-decoration: none;
  860. display: block;
  861. height: 100%;
  862. &:hover {
  863. text-decoration: none;
  864. }
  865. > div {
  866. position: relative;
  867. z-index: 1;
  868. cursor: pointer;
  869. transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
  870. &:hover {
  871. transform: translateY(-2px);
  872. box-shadow: 0 10px 20px rgba(0, 0, 0, 0.2);
  873. }
  874. }
  875. }
  876. }
  877. // 移除卡片抖动动画
  878. @keyframes cardHover {
  879. 0% {
  880. transform: translateY(0);
  881. }
  882. 100% {
  883. transform: translateY(-2px);
  884. }
  885. }
  886. // 添加渐变背景动画
  887. @keyframes gradient-bg {
  888. 0% {
  889. background-position: 0% 50%;
  890. opacity: 1;
  891. }
  892. 50% {
  893. background-position: 100% 50%;
  894. opacity: 0.85;
  895. }
  896. 100% {
  897. background-position: 0% 50%;
  898. opacity: 1;
  899. }
  900. }
  901. .animate-gradient-bg {
  902. background-size: 200% 200%;
  903. animation: gradient-bg 15s ease infinite;
  904. }
  905. </style>