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.

careers.vue 25KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724
  1. <template>
  2. <div class="careers-page bg-stone-950 min-h-screen">
  3. <div class="relative z-10">
  4. <!-- 顶部间距 -->
  5. <div class="w-full h-[55px] sm:h-[72px]"></div>
  6. <!-- 面包屑导航 -->
  7. <div class="max-w-full xl:px-2 lg:px-2 md:px-4 px-4 mt-6 mb-1">
  8. <div class="max-w-screen-2xl mx-auto">
  9. <nuxt-link
  10. :to="homepagePath"
  11. class="justify-start text-white/60 text-base font-normal"
  12. >{{ t("common.breadcrumb.home") }}</nuxt-link
  13. >
  14. <span class="text-white/60 text-base font-normal px-2"> / </span>
  15. <span class="text-white text-base font-normal">{{
  16. t("common.careers")
  17. }}</span>
  18. </div>
  19. </div>
  20. <!-- 错误边界 -->
  21. <ErrorBoundary :error="pageError">
  22. <!-- 页面标题区域 (无蒙层,保持原样) -->
  23. <section class="hero-section">
  24. <div class="w-full py-40 relative overflow-hidden">
  25. <!-- 视频背景 -->
  26. <!-- <div class="absolute inset-0 z-0">
  27. <video
  28. src="/assets/videos/about.mp4"
  29. autoplay
  30. loop
  31. muted
  32. playsinline
  33. poster="/assets/videos/about.webp"
  34. class="w-full h-full object-cover opacity-10 absolute z-10 left-0 right-0 top-0 bottom-0"
  35. ></video>
  36. </div> -->
  37. <div
  38. class="max-w-screen-2xl mx-auto px-4 sm:px-6 lg:px-8 relative z-10"
  39. >
  40. <!-- 标题 -->
  41. <div class="text-center space-y-6">
  42. <div
  43. class="inline-flex items-center px-4 py-2 bg-[#35F1FF]/10 rounded-xl border border-[#35F1FF]/20 backdrop-blur-sm"
  44. >
  45. <span
  46. class="text-[#35F1FF] text-xs font-bold tracking-[0.2em] uppercase"
  47. >
  48. {{ t("careers.sectionTitle") }}
  49. </span>
  50. </div>
  51. <h1
  52. class="text-white text-4xl md:text-6xl font-bold tracking-wider leading-tight"
  53. >
  54. <span
  55. class="bg-gradient-to-r from-white to-zinc-300 bg-clip-text text-transparent"
  56. >
  57. {{ t("careers.title") }}
  58. </span>
  59. </h1>
  60. <div class="w-20 h-px bg-[#35F1FF] mx-auto"></div>
  61. <p
  62. class="text-zinc-300/80 text-lg md:text-xl max-w-4xl mx-auto leading-relaxed"
  63. >
  64. {{ t("careers.subtitle") }}
  65. </p>
  66. <!-- 统计数据 -->
  67. <div
  68. class="grid grid-cols-2 md:grid-cols-4 gap-8 pt-12 max-w-3xl mx-auto"
  69. >
  70. <div class="text-center space-y-2">
  71. <div class="text-2xl md:text-3xl font-bold text-[#35F1FF]">
  72. 20+
  73. </div>
  74. <div class="text-sm text-zinc-400"> {{ t("careers.CompanyHistory") }}</div>
  75. </div>
  76. <div class="text-center space-y-2">
  77. <div class="text-2xl md:text-3xl font-bold text-[#35F1FF]">
  78. 50+
  79. </div>
  80. <div class="text-sm text-zinc-400">{{ t("careers.TeamMembers") }}</div>
  81. </div>
  82. <div class="text-center space-y-2">
  83. <div class="text-2xl md:text-3xl font-bold text-[#35F1FF]">
  84. 100+
  85. </div>
  86. <div class="text-sm text-zinc-400">{{ t("careers.ProductModel") }}</div>
  87. </div>
  88. <div class="text-center space-y-2">
  89. <div class="text-2xl md:text-3xl font-bold text-[#35F1FF]">
  90. 24/7
  91. </div>
  92. <div class="text-sm text-zinc-400">{{ t("careers.technicalSupport") }}</div>
  93. </div>
  94. </div>
  95. </div>
  96. </div>
  97. </div>
  98. </section>
  99. <!-- 企业文化区域 (靛蓝主题, 无背景色) -->
  100. <section class="culture-section">
  101. <div
  102. class="section-block w-full py-32 relative"
  103. >
  104. <div
  105. class="max-w-screen-2xl mx-auto px-4 sm:px-6 lg:px-8 relative z-10"
  106. >
  107. <div class="text-center mb-20">
  108. <div
  109. class="inline-flex items-center px-4 py-2 bg-indigo-500/10 rounded-xl border border-indigo-400/20 backdrop-blur-sm mb-6"
  110. >
  111. <span
  112. class="text-indigo-400 text-xs font-bold tracking-[0.2em] uppercase"
  113. >
  114. {{ t("careers.culture.sectionTitle") }}
  115. </span>
  116. </div>
  117. <h3
  118. class="text-white text-3xl md:text-4xl font-bold mb-6 tracking-wider"
  119. >
  120. {{ t("careers.culture.title") }}
  121. </h3>
  122. <div class="w-20 h-px bg-indigo-400 mx-auto"></div>
  123. </div>
  124. <div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-8">
  125. <!-- 创新驱动 -->
  126. <div class="culture-card group">
  127. <div
  128. class="relative p-8 bg-zinc-800/30 backdrop-blur-sm border border-zinc-700/30 rounded-xl transition-all duration-700 hover:border-indigo-400/50 hover:bg-zinc-800/50 hover:shadow-2xl hover:shadow-indigo-500/10 hover:transform hover:scale-105"
  129. >
  130. <div
  131. class="absolute inset-0 bg-gradient-to-br from-indigo-500/5 to-transparent opacity-0 group-hover:opacity-100 transition-opacity duration-700 rounded-xl"
  132. ></div>
  133. <div class="relative">
  134. <div
  135. class="w-16 h-16 bg-indigo-500/10 rounded-xl flex items-center justify-center mb-6 group-hover:bg-indigo-500/20 transition-all duration-500 group-hover:rotate-12 group-hover:scale-110"
  136. >
  137. <svg
  138. class="w-8 h-8 text-indigo-400"
  139. fill="none"
  140. stroke="currentColor"
  141. viewBox="0 0 24 24"
  142. >
  143. <path
  144. stroke-linecap="round"
  145. stroke-linejoin="round"
  146. stroke-width="2"
  147. d="M13 10V3L4 14h7v7l9-11h-7z"
  148. ></path>
  149. </svg>
  150. </div>
  151. <h4
  152. class="text-white text-xl font-semibold mb-4 group-hover:text-indigo-400 transition-colors duration-500"
  153. >
  154. {{ t("careers.culture.innovation.title") }}
  155. </h4>
  156. <p class="text-zinc-300/80 text-sm leading-relaxed">
  157. {{ t("careers.culture.innovation.description") }}
  158. </p>
  159. </div>
  160. </div>
  161. </div>
  162. <!-- 团队协作 -->
  163. <div class="culture-card group">
  164. <div
  165. class="relative p-8 bg-zinc-800/30 backdrop-blur-sm border border-zinc-700/30 rounded-xl transition-all duration-700 hover:border-indigo-400/50 hover:bg-zinc-800/50 hover:shadow-2xl hover:shadow-indigo-500/10 hover:transform hover:scale-105"
  166. >
  167. <div
  168. class="absolute inset-0 bg-gradient-to-br from-indigo-500/5 to-transparent opacity-0 group-hover:opacity-100 transition-opacity duration-700 rounded-xl"
  169. ></div>
  170. <div class="relative">
  171. <div
  172. class="w-16 h-16 bg-indigo-500/10 rounded-xl flex items-center justify-center mb-6 group-hover:bg-indigo-500/20 transition-all duration-500 group-hover:rotate-12 group-hover:scale-110"
  173. >
  174. <svg
  175. class="w-8 h-8 text-indigo-400"
  176. fill="none"
  177. stroke="currentColor"
  178. viewBox="0 0 24 24"
  179. >
  180. <path
  181. stroke-linecap="round"
  182. stroke-linejoin="round"
  183. stroke-width="2"
  184. d="M12 4.354a4 4 0 110 5.292M15 21H3v-1a6 6 0 0112 0v1zm0 0h6v-1a6 6 0 00-9-5.197M13 7a4 4 0 11-8 0 4 4 0 018 0z"
  185. ></path>
  186. </svg>
  187. </div>
  188. <h4
  189. class="text-white text-xl font-semibold mb-4 group-hover:text-indigo-400 transition-colors duration-500"
  190. >
  191. {{ t("careers.culture.teamwork.title") }}
  192. </h4>
  193. <p class="text-zinc-300/80 text-sm leading-relaxed">
  194. {{ t("careers.culture.teamwork.description") }}
  195. </p>
  196. </div>
  197. </div>
  198. </div>
  199. <!-- 品质第一 -->
  200. <div class="culture-card group">
  201. <div
  202. class="relative p-8 bg-zinc-800/30 backdrop-blur-sm border border-zinc-700/30 rounded-xl transition-all duration-700 hover:border-indigo-400/50 hover:bg-zinc-800/50 hover:shadow-2xl hover:shadow-indigo-500/10 hover:transform hover:scale-105"
  203. >
  204. <div
  205. class="absolute inset-0 bg-gradient-to-br from-indigo-500/5 to-transparent opacity-0 group-hover:opacity-100 transition-opacity duration-700 rounded-xl"
  206. ></div>
  207. <div class="relative">
  208. <div
  209. class="w-16 h-16 bg-indigo-500/10 rounded-xl flex items-center justify-center mb-6 group-hover:bg-indigo-500/20 transition-all duration-500 group-hover:rotate-12 group-hover:scale-110"
  210. >
  211. <svg
  212. class="w-8 h-8 text-indigo-400"
  213. fill="none"
  214. stroke="currentColor"
  215. viewBox="0 0 24 24"
  216. >
  217. <path
  218. stroke-linecap="round"
  219. stroke-linejoin="round"
  220. stroke-width="2"
  221. d="M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z"
  222. ></path>
  223. </svg>
  224. </div>
  225. <h4
  226. class="text-white text-xl font-semibold mb-4 group-hover:text-indigo-400 transition-colors duration-500"
  227. >
  228. {{ t("careers.culture.quality.title") }}
  229. </h4>
  230. <p class="text-zinc-300/80 text-sm leading-relaxed">
  231. {{ t("careers.culture.quality.description") }}
  232. </p>
  233. </div>
  234. </div>
  235. </div>
  236. <!-- 共同成长 -->
  237. <div class="culture-card group">
  238. <div
  239. class="relative p-8 bg-zinc-800/30 backdrop-blur-sm border border-zinc-700/30 rounded-xl transition-all duration-700 hover:border-indigo-400/50 hover:bg-zinc-800/50 hover:shadow-2xl hover:shadow-indigo-500/10 hover:transform hover:scale-105"
  240. >
  241. <div
  242. class="absolute inset-0 bg-gradient-to-br from-indigo-500/5 to-transparent opacity-0 group-hover:opacity-100 transition-opacity duration-700 rounded-xl"
  243. ></div>
  244. <div class="relative">
  245. <div
  246. class="w-16 h-16 bg-indigo-500/10 rounded-xl flex items-center justify-center mb-6 group-hover:bg-indigo-500/20 transition-all duration-500 group-hover:rotate-12 group-hover:scale-110"
  247. >
  248. <svg
  249. class="w-8 h-8 text-indigo-400"
  250. fill="none"
  251. stroke="currentColor"
  252. viewBox="0 0 24 24"
  253. >
  254. <path
  255. stroke-linecap="round"
  256. stroke-linejoin="round"
  257. stroke-width="2"
  258. d="M13 7h8m0 0v8m0-8l-8 8-4-4-6 6"
  259. ></path>
  260. </svg>
  261. </div>
  262. <h4
  263. class="text-white text-xl font-semibold mb-4 group-hover:text-indigo-400 transition-colors duration-500"
  264. >
  265. {{ t("careers.culture.growth.title") }}
  266. </h4>
  267. <p class="text-zinc-300/80 text-sm leading-relaxed">
  268. {{ t("careers.culture.growth.description") }}
  269. </p>
  270. </div>
  271. </div>
  272. </div>
  273. </div>
  274. </div>
  275. </div>
  276. </section>
  277. <!-- 职位列表区域 (翠绿主题, 无背景色) -->
  278. <section class="jobs-section">
  279. <div
  280. class="section-block w-full py-32 relative"
  281. >
  282. <!-- 背景网格pattern -->
  283. <div class="absolute inset-0 opacity-5">
  284. <div
  285. class="absolute inset-0 bg-[linear-gradient(rgba(52,211,153,0.1)_1px,transparent_1px),linear-gradient(90deg,rgba(52,211,153,0.1)_1px,transparent_1px)] bg-[size:100px_100px]"
  286. ></div>
  287. </div>
  288. <div
  289. class="max-w-screen-2xl mx-auto px-4 sm:px-6 lg:px-8 relative z-10"
  290. >
  291. <div class="text-center mb-20">
  292. <div
  293. class="inline-flex items-center px-4 py-2 bg-emerald-400/10 rounded-xl border border-emerald-400/20 backdrop-blur-sm mb-6"
  294. >
  295. <span
  296. class="text-emerald-400 text-xs font-bold tracking-[0.2em] uppercase"
  297. >
  298. {{ t("careers.jobs.sectionTitle") }}
  299. </span>
  300. </div>
  301. <h3
  302. class="text-white text-3xl md:text-4xl font-bold mb-6 tracking-wider"
  303. >
  304. {{ t("careers.jobs.title") }}
  305. </h3>
  306. <div class="w-20 h-px bg-emerald-400 mx-auto mb-8"></div>
  307. <p
  308. class="text-zinc-300/80 text-base md:text-lg max-w-3xl mx-auto leading-relaxed"
  309. >
  310. {{ t("careers.jobs.description") }}
  311. </p>
  312. <!-- 职位统计 -->
  313. <div v-if="totalJobs > 0" class="mt-8">
  314. <div
  315. class="inline-flex items-center px-4 py-2 bg-emerald-400/5 rounded-xl border border-emerald-400/10"
  316. >
  317. <svg
  318. class="w-4 h-4 mr-2 text-emerald-400"
  319. fill="none"
  320. stroke="currentColor"
  321. viewBox="0 0 24 24"
  322. >
  323. <path
  324. stroke-linecap="round"
  325. stroke-linejoin="round"
  326. stroke-width="2"
  327. d="M21 13.255A23.931 23.931 0 0112 15c-3.183 0-6.22-.62-9-1.745M16 6V4a2 2 0 00-2-2h-4a2 2 0 00-2-2v2m8 0H8m8 0v2a2 2 0 002 2M8 6V4h8V6M8 6v2a2 2 0 002 2h4a2 2 0 002-2V6"
  328. ></path>
  329. </svg>
  330. <span class="text-emerald-400 text-sm font-medium">
  331. {{ t("careers.CurrentlyOpen") }} {{ jobsList.length }} {{ t("careers.Aposition") }}
  332. </span>
  333. </div>
  334. </div>
  335. </div>
  336. <!-- 加载状态 -->
  337. <div v-if="jobsLoading" class="flex justify-center py-20">
  338. <div
  339. class="animate-spin h-8 w-8 border-4 border-emerald-400 rounded-full border-t-transparent"
  340. ></div>
  341. </div>
  342. <!-- 职位列表 -->
  343. <div v-else-if="jobsList.length > 0">
  344. <!-- 职位卡片网格 -->
  345. <div class="grid grid-cols-1 lg:grid-cols-2 gap-8">
  346. <JobCard
  347. v-for="job in jobsList"
  348. :key="job.id"
  349. :job="job"
  350. @click="handleJobClick"
  351. />
  352. </div>
  353. </div>
  354. <!-- 无职位状态 -->
  355. <div v-else class="text-center py-20">
  356. <div
  357. class="relative inline-flex items-center justify-center w-24 h-24 mb-8"
  358. >
  359. <svg
  360. class="w-12 h-12 text-zinc-500"
  361. fill="none"
  362. stroke="currentColor"
  363. viewBox="0 0 24 24"
  364. >
  365. <path
  366. stroke-linecap="round"
  367. stroke-linejoin="round"
  368. stroke-width="2"
  369. d="M21 13.255A23.931 23.931 0 0112 15c-3.183 0-6.22-.62-9-1.745M16 6V4a2 2 0 00-2-2h-4a2 2 0 00-2-2v2m8 0H8m8 0v2a2 2 0 002 2M8 6V4h8V6M8 6v2a2 2 0 002 2h4a2 2 0 002-2V6"
  370. ></path>
  371. </svg>
  372. </div>
  373. <h4 class="text-zinc-400 text-xl font-medium mb-3">
  374. {{ t("careers.jobs.noPositions") }}
  375. </h4>
  376. <p
  377. class="text-zinc-500 text-base max-w-md mx-auto leading-relaxed"
  378. >
  379. {{ t("careers.jobs.checkLater") }}
  380. </p>
  381. </div>
  382. </div>
  383. </div>
  384. </section>
  385. <!-- 底部CTA区域 (玫瑰色主题, 无背景色) -->
  386. <section class="cta-section">
  387. <div
  388. class="section-block w-full py-32 relative"
  389. >
  390. <!-- 图片背景 -->
  391. <img
  392. src="/assets/images/careers.webp"
  393. alt="CTA Background"
  394. class="absolute inset-0 w-full h-full object-cover opacity-40 z-0"
  395. />
  396. <div
  397. class="max-w-screen-2xl mx-auto px-4 sm:px-6 lg:px-8 relative z-10 text-center"
  398. >
  399. <div class="max-w-3xl mx-auto space-y-8">
  400. <h3
  401. class="text-white text-3xl md:text-4xl font-bold leading-tight"
  402. >
  403. {{ t("careers.cta.title") }}
  404. </h3>
  405. <p class="text-zinc-300/80 text-lg md:text-xl leading-relaxed">
  406. {{ t("careers.cta.description") }}
  407. </p>
  408. <div class="pt-4">
  409. <nuxt-link
  410. :to="`${homepagePath}/contact`"
  411. class="inline-flex w-28 h-9 md:w-40 md:h-11 bg-zinc-300/10 rounded-lg outline outline-1 items-center justify-center gap-2 outline-white/20 backdrop-blur-[10px] cursor-pointer hover:bg-zinc-300/20 transition-colors duration-200"
  412. >
  413. <span class="text-sm md:text-base font-normal text-white">{{
  414. t("careers.cta.button")
  415. }}</span>
  416. <i class="icon-arrow-right text-xs md:text-sm font-normal text-white"></i>
  417. </nuxt-link>
  418. </div>
  419. </div>
  420. </div>
  421. </div>
  422. </section>
  423. </ErrorBoundary>
  424. </div>
  425. </div>
  426. </template>
  427. <script setup lang="ts">
  428. import type { Job, JobsApiResponse } from "~/data/jobs";
  429. import { localJobs } from "~/data/jobs";
  430. const { t, locale } = useI18n();
  431. // 计算首页路径
  432. const homepagePath = computed(() => {
  433. return locale.value === "zh" ? "/" : `/${locale.value}`;
  434. });
  435. // SEO和页面元数据
  436. useSeoMeta({
  437. title: `${t("careers.title")} - Hanye`,
  438. description: t("careers.subtitle"),
  439. keywords: t("careers.keywords"),
  440. });
  441. // 响应式数据
  442. const pageError = ref<Error | null>(null);
  443. const jobsLoading = ref(false);
  444. const jobsList = ref<Job[]>([]);
  445. const totalJobs = ref(0);
  446. // API配置
  447. const API_BASE_URL = "https://digital.sohomall.jp/prod-api/system/workInfo";
  448. /**
  449. * 从API获取职位数据
  450. * @param pageNum 页码
  451. * @param pageSize 页面大小
  452. * @returns Promise<JobsApiResponse>
  453. */
  454. const fetchJobsFromApi = async (
  455. pageNum: number = 1,
  456. pageSize: number = 10
  457. ): Promise<JobsApiResponse> => {
  458. const response = await $fetch<JobsApiResponse>(
  459. `${API_BASE_URL}/noVerifyList`,
  460. {
  461. params: {
  462. pageNum,
  463. pageSize,
  464. },
  465. timeout: 10000, // 10秒超时
  466. }
  467. );
  468. if (response.code !== 200) {
  469. throw new Error(response.msg || "获取职位信息失败");
  470. }
  471. return response;
  472. };
  473. /**
  474. * 初始化职位数据
  475. */
  476. const initializeJobs = async () => {
  477. try {
  478. jobsLoading.value = true;
  479. pageError.value = null;
  480. // 尝试从API获取数据
  481. const apiResponse = await fetchJobsFromApi();
  482. console.log(apiResponse);
  483. // 过滤掉已禁用的职位
  484. const availableJobs = apiResponse.rows.filter(
  485. (job: Job) => job.isDisabled !== "0"
  486. );
  487. jobsList.value = availableJobs;
  488. totalJobs.value = apiResponse.total;
  489. console.log(`成功加载 ${availableJobs.length} 个职位信息`);
  490. } catch (error) {
  491. console.warn("API获取失败,使用本地数据:", error);
  492. // API失败时使用本地数据作为fallback
  493. jobsList.value = localJobs;
  494. totalJobs.value = localJobs.length;
  495. // 不设置pageError,因为有fallback数据
  496. } finally {
  497. jobsLoading.value = false;
  498. }
  499. };
  500. /**
  501. * 处理职位点击事件
  502. * @param job 职位信息
  503. */
  504. const handleJobClick = (job: Job) => {
  505. // 这里可以添加职位详情页面跳转或弹窗逻辑
  506. console.log("Job clicked:", job);
  507. };
  508. /**
  509. * 处理联系按钮点击
  510. */
  511. const handleContactClick = () => {
  512. navigateTo("/contact");
  513. };
  514. /**
  515. * 刷新职位数据
  516. */
  517. const refreshJobs = async () => {
  518. await initializeJobs();
  519. };
  520. // 组件挂载时初始化数据
  521. onMounted(async () => {
  522. await initializeJobs();
  523. // 添加页面加载动画
  524. nextTick(() => {
  525. const cards = document.querySelectorAll(".culture-card, .job-card");
  526. cards.forEach((card, index) => {
  527. setTimeout(() => {
  528. (card as HTMLElement).style.opacity = "1";
  529. (card as HTMLElement).style.transform = "translateY(0)";
  530. }, 100 * index);
  531. });
  532. // 面包屑动画
  533. const breadcrumb = document.querySelector("nav");
  534. if (breadcrumb) {
  535. setTimeout(() => {
  536. breadcrumb.classList.remove("opacity-0");
  537. breadcrumb.classList.add("opacity-100");
  538. }, 200);
  539. }
  540. });
  541. });
  542. </script>
  543. <style scoped>
  544. .careers-page {
  545. scroll-behavior: smooth;
  546. }
  547. .culture-card,
  548. .job-card {
  549. opacity: 0;
  550. transform: translateY(20px);
  551. transition: opacity 0.8s ease, transform 0.8s ease;
  552. }
  553. @keyframes fade-in {
  554. from {
  555. opacity: 0;
  556. transform: translateY(10px);
  557. }
  558. to {
  559. opacity: 1;
  560. transform: translateY(0);
  561. }
  562. }
  563. .animate-fade-in {
  564. animation: fade-in 0.6s ease-out forwards;
  565. }
  566. @media (max-width: 768px) {
  567. .hero-section h1 {
  568. font-size: 2.5rem;
  569. }
  570. .culture-section,
  571. .jobs-section,
  572. .cta-section {
  573. padding: 2rem 1rem;
  574. }
  575. .job-card {
  576. margin-bottom: 1rem;
  577. }
  578. }
  579. /* 自定义滚动条 */
  580. ::-webkit-scrollbar {
  581. width: 6px;
  582. }
  583. ::-webkit-scrollbar-track {
  584. background: rgba(0, 0, 0, 0.1);
  585. }
  586. ::-webkit-scrollbar-thumb {
  587. background: #35f1ff;
  588. border-radius: 3px;
  589. }
  590. ::-webkit-scrollbar-thumb:hover {
  591. background: #35f1ff;
  592. }
  593. /* 动画关键帧 */
  594. @keyframes float {
  595. 0%,
  596. 100% {
  597. transform: translateY(0px);
  598. }
  599. 50% {
  600. transform: translateY(-10px);
  601. }
  602. }
  603. @keyframes pulse-glow {
  604. 0%,
  605. 100% {
  606. box-shadow: 0 0 5px rgba(53, 241, 255, 0.3);
  607. }
  608. 50% {
  609. box-shadow: 0 0 20px rgba(53, 241, 255, 0.6);
  610. }
  611. }
  612. .animate-float {
  613. animation: float 6s ease-in-out infinite;
  614. }
  615. .animate-pulse-glow {
  616. animation: pulse-glow 2s ease-in-out infinite;
  617. }
  618. /* 蒙层和光泽效果 */
  619. .section-block {
  620. position: relative;
  621. transition: all 0.5s ease;
  622. overflow: hidden;
  623. }
  624. .section-block::before {
  625. content: "";
  626. position: absolute;
  627. inset: 0;
  628. opacity: 0;
  629. transition: opacity 0.5s ease;
  630. pointer-events: none;
  631. z-index: 5;
  632. }
  633. .section-block:hover::before {
  634. opacity: 1;
  635. }
  636. /* 为每个模块单独定义蒙层颜色 */
  637. .culture-section .section-block::before {
  638. background: linear-gradient(
  639. 45deg,
  640. transparent,
  641. rgba(99, 102, 241, 0.1), /* Indigo */
  642. transparent
  643. );
  644. }
  645. .jobs-section .section-block::before {
  646. background: linear-gradient(
  647. 45deg,
  648. transparent,
  649. rgba(52, 211, 153, 0.1), /* Emerald */
  650. transparent
  651. );
  652. }
  653. .cta-section .section-block::before {
  654. background: linear-gradient(
  655. 45deg,
  656. transparent,
  657. rgba(255, 255, 255, 0.1), /* Rose */
  658. transparent
  659. );
  660. }
  661. </style>