Index.vue 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487
  1. <template>
  2. <div id="News">
  3. <!-- Banner -->
  4. <div class="banner-wrapper">
  5. <div class="banner-bg"></div>
  6. <div class="banner-content">
  7. <div class="section-tag">
  8. <span class="tag-dot"></span>
  9. <span>NEWS & EVENTS</span>
  10. </div>
  11. <h1 class="banner-title">公司动态</h1>
  12. <p class="banner-subtitle">Latest News & Updates</p>
  13. </div>
  14. </div>
  15. <!-- 新闻列表 - 时间轴形式 -->
  16. <div class="l-container">
  17. <div class="news-section">
  18. <div class="timeline">
  19. <div class="timeline-line"></div>
  20. <div
  21. v-for="(item, index) in newsList"
  22. :key="index"
  23. class="timeline-item wow fadeInUp"
  24. :class="index % 2 === 0 ? 'left' : 'right'"
  25. :style="{ animationDelay: index * 0.15 + 's' }"
  26. >
  27. <div class="timeline-dot">
  28. <span class="dot-pulse"></span>
  29. </div>
  30. <div class="timeline-card">
  31. <div class="news-date">
  32. <span class="date-day">{{ item.date }}</span>
  33. <span class="date-year">{{ item.year }}</span>
  34. </div>
  35. <div class="news-content">
  36. <h3 class="news-title">{{ item.title || '新闻动态' }}</h3>
  37. <p class="news-desc">{{ item.introduce }}</p>
  38. </div>
  39. </div>
  40. </div>
  41. </div>
  42. </div>
  43. </div>
  44. </div>
  45. </template>
  46. <script>
  47. import {WOW} from 'wowjs';
  48. export default {
  49. name: 'News',
  50. data() {
  51. return {
  52. newsList: [
  53. {
  54. id: '001',
  55. title: 'AI应用定制化业务',
  56. introduce: '成功入围多家企业的AI系统供应线,为多家大型企业定制化开发人工智能应用平台',
  57. date: '3月',
  58. year: '2025 年'
  59. }, {
  60. id: '002',
  61. title: '轨道交通行业服务',
  62. introduce: '服务于上海轨道交通建设业务的无人机自动化巡检,为客户安装配置多台大疆机场2,成功实现了地铁轨道交通的无人机常态化巡检',
  63. date: '2月',
  64. year: '2024 年'
  65. }, {
  66. id: '003',
  67. title: '数字化转型合作',
  68. introduce: '配合和参与上海测绘院及上海建科集团数字化转型发展,推荐大疆产品在测绘及工程建设城市运维领域的应用',
  69. date: '07-18',
  70. year: '2023 年'
  71. }, {
  72. id: '004',
  73. title: '智能无人系统应用',
  74. introduce: '完成上海化工区智能无人系统应用监管研究课题,帮助园区管委会和相关企业规范开展无人系统应用服务业务',
  75. date: '09-27',
  76. year: '2022 年'
  77. }, {
  78. id: '005',
  79. title: '工业园区无人机应用',
  80. introduce: '参与上海宝武吴淞园、上海化工区等大型工业园区无人机应用项目的实验和监管论证,推广大疆行业应用产品和服务',
  81. date: '03-16',
  82. year: '2020 年'
  83. }, {
  84. id: '006',
  85. title: '创客空间示范项目建设',
  86. introduce: '完成对口支援日喀则和果乐地区创客空间示范项目建设,设立创客师资上海培训基地,推广 3D 打印和无人机课程',
  87. date: '06-08',
  88. year: '2018 年'
  89. }, {
  90. id: '007',
  91. title: '公司成立',
  92. introduce: '公司由北航和复旦校友发起创立,推出飞天网创客空间,成为上海众创空间联盟首批会员单位,服务航空科技爱好者',
  93. date: '05-24',
  94. year: '2014 年'
  95. }
  96. ]
  97. }
  98. },
  99. mounted() {
  100. var wow = new WOW();
  101. wow.init();
  102. },
  103. }
  104. </script>
  105. <style scoped>
  106. /* ===== CSS 变量 ===== */
  107. #News {
  108. --primary-color: #1e73be;
  109. --primary-gradient: linear-gradient(135deg, #1e73be 0%, #3b82f6 100%);
  110. --tech-gradient: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
  111. --text-primary: #1a1a1a;
  112. --text-secondary: #555;
  113. --text-muted: #999;
  114. --bg-light: #f8f9fa;
  115. --card-bg: #ffffff;
  116. --shadow-sm: 0 2px 8px rgba(0, 0, 0, 0.08);
  117. --shadow-md: 0 8px 24px rgba(0, 0, 0, 0.1);
  118. --shadow-lg: 0 16px 48px rgba(0, 0, 0, 0.12);
  119. --radius-md: 12px;
  120. --radius-lg: 16px;
  121. --transition-base: all 0.3s ease;
  122. --transition-bounce: all 0.4s cubic-bezier(0.175, 0.885, 0.32, 1.275);
  123. }
  124. #News {
  125. width: 100%;
  126. min-height: 100vh;
  127. background: var(--bg-light);
  128. }
  129. /* ===== Banner 区域 ===== */
  130. .banner-wrapper {
  131. position: relative;
  132. height: 350px;
  133. overflow: hidden;
  134. display: flex;
  135. align-items: center;
  136. justify-content: center;
  137. }
  138. .banner-bg {
  139. position: absolute;
  140. top: 0;
  141. left: 0;
  142. width: 100%;
  143. height: 100%;
  144. background-image: url("~@/assets/img/dji.jpg");
  145. background-size: cover;
  146. background-position: center;
  147. background-repeat: no-repeat;
  148. }
  149. .banner-bg::after {
  150. content: '';
  151. position: absolute;
  152. top: 0;
  153. left: 0;
  154. width: 100%;
  155. height: 100%;
  156. background: linear-gradient(
  157. 135deg,
  158. rgba(15, 23, 42, 0.8) 0%,
  159. rgba(30, 58, 95, 0.6) 100%
  160. );
  161. }
  162. .banner-content {
  163. position: relative;
  164. z-index: 10;
  165. text-align: center;
  166. padding: 40px;
  167. }
  168. .section-tag {
  169. display: inline-flex;
  170. align-items: center;
  171. gap: 8px;
  172. padding: 8px 20px;
  173. background: rgba(255, 255, 255, 0.1);
  174. border: 1px solid rgba(255, 255, 255, 0.2);
  175. border-radius: 20px;
  176. backdrop-filter: blur(10px);
  177. margin-bottom: 20px;
  178. }
  179. .tag-dot {
  180. width: 8px;
  181. height: 8px;
  182. background: #fff;
  183. border-radius: 50%;
  184. animation: blink 2s ease-in-out infinite;
  185. }
  186. @keyframes blink {
  187. 0%, 100% { opacity: 1; }
  188. 50% { opacity: 0.4; }
  189. }
  190. .section-tag span {
  191. font-size: 12px;
  192. font-weight: 600;
  193. color: #fff;
  194. letter-spacing: 2px;
  195. }
  196. .banner-title {
  197. font-size: 48px;
  198. font-weight: 700;
  199. color: #fff;
  200. margin: 0 0 16px;
  201. letter-spacing: 4px;
  202. }
  203. .banner-subtitle {
  204. font-size: 18px;
  205. color: rgba(255, 255, 255, 0.8);
  206. margin: 0;
  207. letter-spacing: 2px;
  208. }
  209. /* ===== 时间轴区域 ===== */
  210. .l-container {
  211. max-width: 1000px;
  212. margin: 0 auto;
  213. padding: 80px 20px;
  214. }
  215. .news-section {
  216. width: 100%;
  217. }
  218. .timeline {
  219. position: relative;
  220. padding: 40px 0;
  221. }
  222. /* 中间时间轴线 */
  223. .timeline-line {
  224. position: absolute;
  225. top: 0;
  226. left: 50%;
  227. transform: translateX(-50%);
  228. width: 2px;
  229. height: 100%;
  230. background: linear-gradient(180deg,
  231. var(--primary-color) 0%,
  232. rgba(30, 115, 190, 0.5) 50%,
  233. transparent 100%
  234. );
  235. border-radius: 2px;
  236. }
  237. /* 时间轴项目 */
  238. .timeline-item {
  239. position: relative;
  240. width: 50%;
  241. padding: 0 40px;
  242. margin-bottom: 50px;
  243. box-sizing: border-box;
  244. }
  245. .timeline-item.left {
  246. left: 0;
  247. text-align: right;
  248. }
  249. .timeline-item.right {
  250. left: 50%;
  251. text-align: left;
  252. }
  253. /* 时间轴圆点 */
  254. .timeline-dot {
  255. position: absolute;
  256. top: 24px;
  257. width: 16px;
  258. height: 16px;
  259. background: var(--primary-gradient);
  260. border: 3px solid #fff;
  261. border-radius: 50%;
  262. box-shadow: 0 0 0 3px rgba(30, 115, 190, 0.2);
  263. z-index: 10;
  264. transition: var(--transition-base);
  265. }
  266. .timeline-item.left .timeline-dot {
  267. right: -8px;
  268. }
  269. .timeline-item.right .timeline-dot {
  270. left: -8px;
  271. }
  272. .timeline-item:hover .timeline-dot {
  273. transform: scale(1.3);
  274. box-shadow: 0 0 0 6px rgba(30, 115, 190, 0.3);
  275. }
  276. .dot-pulse {
  277. position: absolute;
  278. top: 50%;
  279. left: 50%;
  280. transform: translate(-50%, -50%);
  281. width: 6px;
  282. height: 6px;
  283. background: #fff;
  284. border-radius: 50%;
  285. animation: pulse 2s ease-in-out infinite;
  286. }
  287. @keyframes pulse {
  288. 0%, 100% { opacity: 1; transform: translate(-50%, -50%) scale(1); }
  289. 50% { opacity: 0.5; transform: translate(-50%, -50%) scale(1.5); }
  290. }
  291. /* 时间轴卡片 */
  292. .timeline-card {
  293. position: relative;
  294. background: var(--card-bg);
  295. border-radius: var(--radius-lg);
  296. padding: 24px 28px;
  297. box-shadow: var(--shadow-md);
  298. transition: var(--transition-bounce);
  299. border: 1px solid rgba(0, 0, 0, 0.05);
  300. }
  301. .timeline-card::before {
  302. content: '';
  303. position: absolute;
  304. top: 20px;
  305. width: 12px;
  306. height: 12px;
  307. background: var(--card-bg);
  308. border: 1px solid rgba(0, 0, 0, 0.05);
  309. transform: rotate(45deg);
  310. }
  311. .timeline-item.left .timeline-card::before {
  312. right: -6px;
  313. border-right: none;
  314. border-bottom: none;
  315. }
  316. .timeline-item.right .timeline-card::before {
  317. left: -6px;
  318. border-left: none;
  319. border-top: none;
  320. }
  321. .timeline-card:hover {
  322. transform: translateY(-5px);
  323. box-shadow: var(--shadow-lg);
  324. }
  325. /* 日期样式 */
  326. .news-date {
  327. display: inline-flex;
  328. align-items: baseline;
  329. gap: 10px;
  330. margin-bottom: 16px;
  331. padding-bottom: 12px;
  332. border-bottom: 1px solid #eee;
  333. }
  334. .timeline-item.left .news-date {
  335. flex-direction: row-reverse;
  336. }
  337. .date-day {
  338. font-size: 24px;
  339. font-weight: 700;
  340. color: var(--primary-color);
  341. line-height: 1;
  342. }
  343. .date-year {
  344. font-size: 13px;
  345. color: var(--text-muted);
  346. font-weight: 500;
  347. }
  348. /* 新闻内容 */
  349. .news-content {
  350. display: flex;
  351. flex-direction: column;
  352. gap: 10px;
  353. }
  354. .news-title {
  355. font-size: 17px;
  356. font-weight: 600;
  357. color: var(--text-primary);
  358. margin: 0;
  359. line-height: 1.4;
  360. }
  361. .news-desc {
  362. font-size: 14px;
  363. line-height: 1.8;
  364. color: var(--text-secondary);
  365. margin: 0;
  366. display: -webkit-box;
  367. -webkit-line-clamp: 3;
  368. -webkit-box-orient: vertical;
  369. overflow: hidden;
  370. }
  371. /* ===== 响应式设计 ===== */
  372. @media screen and (max-width: 996px) {
  373. .banner-wrapper {
  374. height: 280px;
  375. }
  376. .banner-title {
  377. font-size: 36px;
  378. }
  379. .banner-subtitle {
  380. font-size: 16px;
  381. }
  382. .l-container {
  383. padding: 60px 20px;
  384. }
  385. .timeline-item {
  386. padding: 0 30px;
  387. }
  388. }
  389. @media screen and (max-width: 768px) {
  390. .banner-wrapper {
  391. height: 240px;
  392. }
  393. .banner-title {
  394. font-size: 28px;
  395. }
  396. .banner-subtitle {
  397. font-size: 14px;
  398. }
  399. .l-container {
  400. padding: 40px 16px;
  401. }
  402. /* 手机端改为单侧时间轴 */
  403. .timeline-line {
  404. left: 20px;
  405. }
  406. .timeline-item {
  407. width: 100%;
  408. left: 0 !important;
  409. padding-left: 50px;
  410. padding-right: 0;
  411. text-align: left !important;
  412. }
  413. .timeline-item.left .timeline-dot,
  414. .timeline-item.right .timeline-dot {
  415. left: 12px !important;
  416. right: auto;
  417. }
  418. .timeline-item.left .timeline-card::before,
  419. .timeline-item.right .timeline-card::before {
  420. left: -6px !important;
  421. right: auto;
  422. border-left: none;
  423. border-top: none;
  424. }
  425. .timeline-item.left .news-date {
  426. flex-direction: row;
  427. }
  428. .news-desc {
  429. -webkit-line-clamp: 2;
  430. }
  431. }
  432. </style>