Index.vue 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833
  1. <template>
  2. <DefaultLayout>
  3. <!-- banner -->
  4. <section class="banner-section">
  5. <div class="banner-image animate-fade-in">
  6. <img src="@assets/products-banner.png" alt="" srcset="">
  7. </div>
  8. </section>
  9. <!-- skills section -->
  10. <section class="skills-section" ref="skillsSection">
  11. <!-- 白色背景的标题和菜单部分 -->
  12. <div class="skills-header">
  13. <div class="container">
  14. <h2 class="section-title animate-fade-up" :class="{ 'animate-visible': isSkillsVisible }">为企业打造了一个全面的数字化基础设施
  15. </h2>
  16. <div class="platform-tabs animate-fade-up" :class="{ 'animate-visible': isSkillsVisible }"
  17. style="animation-delay: 0.2s">
  18. <div v-for="(platform, index) in platforms" :key="index" class="tab-item animate-scale-in"
  19. :class="{ active: activePlatform === index, 'animate-visible': isSkillsVisible }"
  20. :style="{ 'animation-delay': `${0.1 * index}s` }" @click="switchPlatform(index)">
  21. {{ platform.name }}
  22. <img v-if="activePlatform === index" src="@assets/products-select.png" alt="" class="select-indicator">
  23. </div>
  24. </div>
  25. </div>
  26. </div>
  27. <!-- 内容部分 -->
  28. <div class="skills-content">
  29. <div class="container">
  30. <div class="content-wrapper animate-fade-up" :class="{ 'animate-visible': isSkillsVisible }"
  31. style="animation-delay: 0.4s" v-if="platforms[activePlatform]">
  32. <h3 class="content-title">{{ platforms[activePlatform].title }}</h3>
  33. <img src="@assets/products-select.png" alt="" class="title-indicator">
  34. <p class="content-subtitle">{{ platforms[activePlatform].subtitle }}</p>
  35. <!-- 图片轮播 -->
  36. <div class="carousel-container animate-scale-in" :class="{ 'animate-visible': isSkillsVisible }"
  37. style="animation-delay: 0.6s" v-if="platforms[activePlatform] && platforms[activePlatform].images">
  38. <div class="carousel-wrapper" @mouseenter="pauseAutoPlay" @mouseleave="resumeAutoPlay">
  39. <div class="carousel-track" :style="{ transform: `translateX(-${currentSlide * 100}%)` }">
  40. <div v-for="(image, index) in platforms[activePlatform].images" :key="index" class="carousel-slide">
  41. <img :src="image" :alt="`轮播图 ${index + 1}`">
  42. </div>
  43. </div>
  44. </div>
  45. <!-- 指示器 -->
  46. <div class="carousel-indicators">
  47. <div v-for="(_, index) in platforms[activePlatform].images" :key="index" class="indicator"
  48. :class="{ active: currentSlide === index }" @click="goToSlide(index)"></div>
  49. </div>
  50. </div>
  51. </div>
  52. </div>
  53. </div>
  54. </section>
  55. <!-- 产品优势 section -->
  56. <section class="advantages-section" ref="advantagesSection">
  57. <div class="container">
  58. <h2 class="section-title animate-fade-up" :class="{ 'animate-visible': isAdvantagesVisible }">产品优势</h2>
  59. <img src="@assets/products-select.png" alt="" class="title-indicator animate-scale-in"
  60. :class="{ 'animate-visible': isAdvantagesVisible }" style="animation-delay: 0.2s">
  61. <div class="advantages-grid animate-fade-up" :class="{ 'animate-visible': isAdvantagesVisible }"
  62. style="animation-delay: 0.3s">
  63. <div v-for="(advantage, index) in advantages" :key="index" class="advantage-item animate-slide-up"
  64. :class="{ 'animate-visible': isAdvantagesVisible }" :style="{ 'animation-delay': `${0.1 * (index % 3)}s` }">
  65. <div class="advantage-content">
  66. <h3 class="advantage-title">{{ advantage.title }}</h3>
  67. <p class="advantage-description">{{ advantage.description }}</p>
  68. </div>
  69. <div class="advantage-image">
  70. <img :src="advantage.image" :alt="advantage.title">
  71. </div>
  72. </div>
  73. </div>
  74. </div>
  75. </section>
  76. </DefaultLayout>
  77. </template>
  78. <script>
  79. import { ref, onMounted, onUnmounted, nextTick } from 'vue'
  80. import DefaultLayout from '@/layouts/DefaultLayout.vue'
  81. import { getProjectClassifyList, getProjectList } from '@/api/modules/home'
  82. import productsBg01 from '@/assets/products-bg01.png'
  83. import productsBg02 from '@/assets/products-bg02.png'
  84. import productsYoushi01 from '@/assets/products-youshi-01.png'
  85. import productsYoushi02 from '@/assets/products-youshi-02.png'
  86. import productsYoushi03 from '@/assets/products-youshi-03.png'
  87. import productsYoushi04 from '@/assets/products-youshi-04.png'
  88. import productsYoushi05 from '@/assets/products-youshi-05.png'
  89. import productsYoushi06 from '@/assets/products-youshi-06.png'
  90. export default {
  91. name: 'ProductsPage',
  92. components: {
  93. DefaultLayout
  94. },
  95. setup() {
  96. // 环境变量
  97. const imgHost = import.meta.env.VITE_APP_IMG_HOST || ''
  98. // 响应式数据
  99. const activePlatform = ref(0)
  100. const currentSlide = ref(0)
  101. let autoPlayTimer = null
  102. // 动画状态管理
  103. const isSkillsVisible = ref(false)
  104. const isAdvantagesVisible = ref(false)
  105. // 元素引用
  106. const skillsSection = ref(null)
  107. const advantagesSection = ref(null)
  108. // 平台数据 - 从API获取
  109. const platforms = ref([])
  110. // 产品列表数据
  111. const productList = ref([])
  112. // 产品优势数据
  113. const advantages = ref([
  114. {
  115. title: '成本节约',
  116. description: '通过优化碳排放和碳资产配置,企业 可以在碳交易市场上卖出多余的碳排 放配额,实现成本节约。此外,提高 能效和采用清洁能源也有助于降低能 源成本。',
  117. image: productsYoushi01
  118. },
  119. {
  120. title: '市场竞争力提升',
  121. description: '积极管理碳资产的企业能够改善其 在绿色市场中的形象,吸引越来越 多注重可持续性的消费者和投资者, 从而提升市场竞争力。',
  122. image: productsYoushi02
  123. },
  124. {
  125. title: '详细合规与风险管理',
  126. description: '碳资产管理帮助企业准确监测和 报告碳排放,确保企业遵守相关 的环境法规和标准,降低因违反 碳排放规定而产生的法律和财务 风险。',
  127. image: productsYoushi03
  128. },
  129. {
  130. title: '技术创新与生产力提升',
  131. description: '碳资产管理促使企业投资于低碳技术和 能源效率改进,这些投资不仅有助于减 少碳排放,还能提高整体生产力和操作 效率。',
  132. image: productsYoushi04
  133. },
  134. {
  135. title: '长远战略规划',
  136. description: '碳资产管理有助于企业制定长期的碳 减排目标和策略,帮助企业在应对气 候变化的全球趋势中占据有利位置。 推动企业的可持续发展。',
  137. image: productsYoushi05
  138. },
  139. {
  140. title: '数据驱动决策支持',
  141. description: '碳资产管理平台提供的数据分析和报告功能, 能够帮助企业管理层做出更加明智的决策优 化资源分配,提高决策的数据驱动性。助力 企业制定长期的碳减排目标和策略。',
  142. image: productsYoushi06
  143. }
  144. ])
  145. // 切换平台
  146. const switchPlatform = async (index) => {
  147. activePlatform.value = index
  148. currentSlide.value = 0 // 切换平台时重置轮播
  149. resetAutoPlay()
  150. // 获取选中分类的产品列表
  151. if (platforms.value[index] && platforms.value[index].id) {
  152. await getProductsByClassify(platforms.value[index].id)
  153. }
  154. }
  155. // 切换轮播图
  156. const goToSlide = (index) => {
  157. currentSlide.value = index
  158. resetAutoPlay()
  159. }
  160. // 自动播放
  161. const startAutoPlay = () => {
  162. autoPlayTimer = setInterval(() => {
  163. if (platforms.value[activePlatform.value] && platforms.value[activePlatform.value].images) {
  164. const maxSlides = platforms.value[activePlatform.value].images.length
  165. currentSlide.value = (currentSlide.value + 1) % maxSlides
  166. }
  167. }, 4000)
  168. }
  169. // 重置自动播放
  170. const resetAutoPlay = () => {
  171. if (autoPlayTimer) {
  172. clearInterval(autoPlayTimer)
  173. }
  174. startAutoPlay()
  175. }
  176. // 暂停自动播放
  177. const pauseAutoPlay = () => {
  178. if (autoPlayTimer) {
  179. clearInterval(autoPlayTimer)
  180. }
  181. }
  182. // 恢复自动播放
  183. const resumeAutoPlay = () => {
  184. startAutoPlay()
  185. }
  186. // 获取产品分类列表
  187. const handleGetProjectClassifyList1 = async () => {
  188. try {
  189. const data = await getProjectClassifyList({ classifyType: 1 })
  190. console.log('产品中心分类列表:', data)
  191. if (data && data.rows && data.rows.length > 0) {
  192. // 处理分类数据,添加默认的展示信息
  193. platforms.value = data.rows.map(item => ({
  194. ...item,
  195. name: item.classifyName || item.name,
  196. title: item.classifyName || item.name,
  197. subtitle: item.classifyDesc || '为您提供专业的解决方案',
  198. images: [productsBg01, productsBg02, productsBg01] // 默认图片,后续可从API获取
  199. }))
  200. console.log('platforms.value', platforms.value)
  201. // 默认选中第一条,获取对应的产品列表
  202. if (platforms.value[0] && platforms.value[0].id) {
  203. await getProductsByClassify(platforms.value[0].id)
  204. }
  205. }
  206. } catch (error) {
  207. console.error('加载产品中心分类列表失败:', error)
  208. }
  209. }
  210. // 根据分类ID获取产品列表
  211. const getProductsByClassify = async (classifyId) => {
  212. try {
  213. const data = await getProjectList({
  214. classifyId: classifyId,
  215. projectType: 1 // 1:产品中心 2:行业案例
  216. })
  217. console.log('产品列表:', data)
  218. if (data && data.rows) {
  219. productList.value = data.rows
  220. // 更新当前选中平台的信息
  221. if (platforms.value[activePlatform.value] && data.rows.length > 0) {
  222. // 更新subtitle为第一条数据的projectProfile
  223. if (data.rows[0].projectProfile) {
  224. platforms.value[activePlatform.value].subtitle = data.rows[0].projectProfile
  225. }
  226. // 使用API返回的产品数据中的projectImage字段
  227. const images = data.rows
  228. .filter(item => item.projectImage) // 过滤掉没有图片的项目
  229. .map(item => imgHost + item.projectImage)
  230. .slice(0, 5) // 最多取5张图片
  231. if (images.length > 0) {
  232. platforms.value[activePlatform.value].images = images
  233. // 重置轮播到第一张
  234. currentSlide.value = 0
  235. } else {
  236. // 如果没有图片,使用默认图片
  237. platforms.value[activePlatform.value].images = [productsBg01, productsBg02, productsBg01]
  238. }
  239. }
  240. }
  241. } catch (error) {
  242. console.error('加载产品列表失败:', error)
  243. }
  244. }
  245. // 设置滚动动画观察器
  246. const setupScrollAnimations = () => {
  247. const observerOptions = {
  248. threshold: 0.2,
  249. rootMargin: '0px 0px -50px 0px'
  250. }
  251. const observer = new IntersectionObserver((entries) => {
  252. entries.forEach(entry => {
  253. if (entry.isIntersecting) {
  254. const target = entry.target
  255. if (target.classList.contains('skills-section')) {
  256. isSkillsVisible.value = true
  257. } else if (target.classList.contains('advantages-section')) {
  258. isAdvantagesVisible.value = true
  259. }
  260. }
  261. })
  262. }, observerOptions)
  263. // 观察各个区域
  264. nextTick(() => {
  265. if (skillsSection.value) observer.observe(skillsSection.value)
  266. if (advantagesSection.value) observer.observe(advantagesSection.value)
  267. })
  268. }
  269. onMounted(() => {
  270. handleGetProjectClassifyList1() // 获取产品分类列表
  271. startAutoPlay()
  272. // 设置滚动动画
  273. nextTick(() => {
  274. setupScrollAnimations()
  275. })
  276. // 延迟显示第一个区域
  277. setTimeout(() => {
  278. isSkillsVisible.value = true
  279. }, 500)
  280. })
  281. onUnmounted(() => {
  282. if (autoPlayTimer) {
  283. clearInterval(autoPlayTimer)
  284. }
  285. })
  286. return {
  287. activePlatform,
  288. currentSlide,
  289. platforms,
  290. productList,
  291. advantages,
  292. switchPlatform,
  293. goToSlide,
  294. pauseAutoPlay,
  295. resumeAutoPlay,
  296. imgHost,
  297. // 动画状态
  298. isSkillsVisible,
  299. isAdvantagesVisible,
  300. // 元素引用
  301. skillsSection,
  302. advantagesSection
  303. }
  304. }
  305. }
  306. </script>
  307. <style lang="scss" scoped>
  308. // 动画定义
  309. @keyframes fadeIn {
  310. from {
  311. opacity: 0;
  312. }
  313. to {
  314. opacity: 1;
  315. }
  316. }
  317. @keyframes fadeUp {
  318. from {
  319. opacity: 0;
  320. transform: translateY(40px);
  321. }
  322. to {
  323. opacity: 1;
  324. transform: translateY(0);
  325. }
  326. }
  327. @keyframes slideUp {
  328. from {
  329. opacity: 0;
  330. transform: translateY(30px);
  331. }
  332. to {
  333. opacity: 1;
  334. transform: translateY(0);
  335. }
  336. }
  337. @keyframes scaleIn {
  338. from {
  339. opacity: 0;
  340. transform: scale(0.8);
  341. }
  342. to {
  343. opacity: 1;
  344. transform: scale(1);
  345. }
  346. }
  347. // 动画类
  348. .animate-fade-in {
  349. animation: fadeIn 1s ease-out;
  350. }
  351. .animate-fade-up {
  352. opacity: 0;
  353. transform: translateY(40px);
  354. transition: all 0.8s cubic-bezier(0.4, 0, 0.2, 1);
  355. &.animate-visible {
  356. opacity: 1;
  357. transform: translateY(0);
  358. }
  359. }
  360. .animate-slide-up {
  361. opacity: 1;
  362. transform: translateY(20px);
  363. transition: all 0.6s cubic-bezier(0.4, 0, 0.2, 1);
  364. &.animate-visible {
  365. opacity: 1;
  366. transform: translateY(0);
  367. }
  368. }
  369. .animate-scale-in {
  370. opacity: 1;
  371. transform: scale(0.95);
  372. transition: all 0.6s cubic-bezier(0.4, 0, 0.2, 1);
  373. &.animate-visible {
  374. opacity: 1;
  375. transform: scale(1);
  376. }
  377. }
  378. // banner区域
  379. .banner-section {
  380. position: relative;
  381. .banner-image {
  382. img {
  383. width: 100%;
  384. }
  385. }
  386. }
  387. // skills区域
  388. .skills-section {
  389. .skills-header {
  390. background: #fff;
  391. padding: 60px 0 40px;
  392. .section-title {
  393. font-size: 36px;
  394. font-weight: 600;
  395. color: #333;
  396. text-align: center;
  397. margin-bottom: 50px;
  398. line-height: 1.4;
  399. }
  400. .platform-tabs {
  401. display: flex;
  402. justify-content: center;
  403. align-items: center;
  404. gap: 60px;
  405. flex-wrap: wrap;
  406. .tab-item {
  407. position: relative;
  408. font-size: 18px;
  409. color: #666;
  410. cursor: pointer;
  411. padding: 10px 0;
  412. transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
  413. overflow: hidden;
  414. &::before {
  415. content: '';
  416. position: absolute;
  417. bottom: 0;
  418. left: 50%;
  419. width: 0;
  420. height: 2px;
  421. background: linear-gradient(90deg, #1890ff, #40a9ff);
  422. transform: translateX(-50%);
  423. transition: width 0.4s ease;
  424. }
  425. &:hover {
  426. color: #1890ff;
  427. transform: translateY(-2px);
  428. &::before {
  429. width: 100%;
  430. }
  431. }
  432. &.active {
  433. color: #1890ff;
  434. font-weight: 600;
  435. transform: translateY(-2px);
  436. &::before {
  437. width: 100%;
  438. }
  439. }
  440. .select-indicator {
  441. position: absolute;
  442. bottom: -35px;
  443. left: 50%;
  444. transform: translateX(-50%);
  445. width: 132px;
  446. height: auto;
  447. }
  448. }
  449. }
  450. }
  451. .skills-content {
  452. background: url('@assets/products-bg01.png') no-repeat center center;
  453. background-size: cover;
  454. background-position: center;
  455. background-repeat: no-repeat;
  456. padding: 80px 0 100px;
  457. position: relative;
  458. // &::before {
  459. // content: '';
  460. // position: absolute;
  461. // top: 0;
  462. // left: 0;
  463. // right: 0;
  464. // bottom: 0;
  465. // background: rgba(0, 0, 0, 0.3);
  466. // z-index: 1;
  467. // }
  468. .container {
  469. position: relative;
  470. z-index: 2;
  471. }
  472. .content-wrapper {
  473. text-align: center;
  474. color: #333;
  475. .content-title {
  476. font-size: 32px;
  477. font-weight: 600;
  478. margin-bottom: 20px;
  479. position: relative;
  480. display: inline-block;
  481. }
  482. .title-indicator {
  483. width: 132px;
  484. height: auto;
  485. margin: 0 auto 20px;
  486. display: block;
  487. }
  488. .content-subtitle {
  489. font-size: 16px;
  490. line-height: 1.6;
  491. margin-bottom: 60px;
  492. max-width: 1200px;
  493. margin-left: auto;
  494. margin-right: auto;
  495. opacity: 0.9;
  496. }
  497. }
  498. }
  499. .carousel-container {
  500. max-width: 1434px;
  501. margin: 0 auto;
  502. .carousel-wrapper {
  503. position: relative;
  504. overflow: hidden;
  505. border-radius: 12px;
  506. box-shadow: 0 20px 40px rgba(0, 0, 0, 0.3);
  507. .carousel-track {
  508. display: flex;
  509. transition: transform 0.5s ease-in-out;
  510. .carousel-slide {
  511. min-width: 100%;
  512. img {
  513. width: 100%;
  514. height: auto;
  515. max-height: 790px;
  516. display: block;
  517. }
  518. }
  519. }
  520. }
  521. .carousel-indicators {
  522. position: relative;
  523. display: flex;
  524. justify-content: center;
  525. gap: 12px;
  526. margin-top: -30px;
  527. .indicator {
  528. width: 8px;
  529. height: 8px;
  530. border-radius: 4px;
  531. background: rgba(0, 0, 0, 0.4);
  532. cursor: pointer;
  533. transition: all 0.3s ease;
  534. &:hover {
  535. background: rgba(255, 255, 255, 0.7);
  536. }
  537. &.active {
  538. width: 24px;
  539. background: #fff;
  540. animation: indicatorExpand 0.3s ease;
  541. }
  542. }
  543. }
  544. }
  545. }
  546. // 产品优势区域
  547. .advantages-section {
  548. background: #f8f9fa;
  549. padding: 80px 0;
  550. position: relative;
  551. &::before {
  552. position: absolute;
  553. content: '';
  554. left: 0;
  555. right: 0;
  556. top: 0;
  557. bottom: -138px;
  558. background: url('@assets/products-bg02.png') no-repeat center center;
  559. background-size: cover;
  560. }
  561. .container {
  562. position: relative;
  563. }
  564. .section-title {
  565. font-size: 36px;
  566. font-weight: 600;
  567. color: #333;
  568. text-align: center;
  569. margin-bottom: 20px;
  570. line-height: 1.4;
  571. }
  572. .title-indicator {
  573. width: 132px;
  574. height: auto;
  575. margin: 0 auto 60px;
  576. display: block;
  577. }
  578. .advantages-grid {
  579. display: grid;
  580. grid-template-columns: repeat(3, 1fr);
  581. gap: 49px;
  582. margin: 0 auto;
  583. .advantage-item {
  584. display: flex;
  585. align-items: center;
  586. background: linear-gradient(0deg, #DCEBFF 0%, #C8DFFF 100%);
  587. border-radius: 16px;
  588. padding: 30px;
  589. box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1);
  590. transition: all 0.3s ease;
  591. position: relative;
  592. overflow: hidden;
  593. &:hover {
  594. transform: translateY(-5px);
  595. box-shadow: 0 20px 40px rgba(0, 0, 0, 0.15);
  596. }
  597. &::before {
  598. content: '';
  599. position: absolute;
  600. top: 0;
  601. left: 0;
  602. right: 0;
  603. bottom: 0;
  604. background: rgba(255, 255, 255, 0.1);
  605. opacity: 0;
  606. transition: opacity 0.3s ease;
  607. }
  608. &:hover::before {
  609. opacity: 1;
  610. }
  611. .advantage-content {
  612. flex: 1;
  613. color: #fff;
  614. margin-right: 30px;
  615. .advantage-title {
  616. font-size: 20px;
  617. font-weight: 600;
  618. margin-bottom: 16px;
  619. line-height: 1.3;
  620. color: #333;
  621. }
  622. .advantage-description {
  623. color: #666;
  624. font-size: 16px;
  625. line-height: 1.6;
  626. opacity: 0.95;
  627. }
  628. }
  629. .advantage-image {
  630. flex-shrink: 0;
  631. img {
  632. width: 208px;
  633. height: 161px;
  634. object-fit: contain;
  635. border-radius: 8px;
  636. }
  637. }
  638. }
  639. }
  640. }
  641. // 指示器动画
  642. @keyframes indicatorExpand {
  643. 0% {
  644. width: 8px;
  645. }
  646. 100% {
  647. width: 24px;
  648. }
  649. }
  650. // 响应式设计
  651. @media (max-width: 768px) {
  652. .skills-section {
  653. .skills-header {
  654. padding: 40px 0 30px;
  655. .section-title {
  656. font-size: 28px;
  657. margin-bottom: 30px;
  658. }
  659. .platform-tabs {
  660. gap: 30px;
  661. .tab-item {
  662. font-size: 16px;
  663. }
  664. }
  665. }
  666. .skills-content {
  667. padding: 60px 0 80px;
  668. .content-wrapper {
  669. .content-title {
  670. font-size: 24px;
  671. }
  672. .content-subtitle {
  673. font-size: 14px;
  674. margin-bottom: 40px;
  675. }
  676. }
  677. }
  678. .carousel-container {
  679. margin: 0 20px;
  680. }
  681. }
  682. .advantages-section {
  683. padding: 60px 0;
  684. .section-title {
  685. font-size: 28px;
  686. margin-bottom: 15px;
  687. }
  688. .title-indicator {
  689. width: 100px;
  690. margin-bottom: 40px;
  691. }
  692. .advantages-grid {
  693. grid-template-columns: 1fr;
  694. gap: 20px;
  695. padding: 0 20px;
  696. .advantage-item {
  697. flex-direction: column;
  698. text-align: center;
  699. padding: 30px 20px;
  700. .advantage-content {
  701. margin-right: 0;
  702. margin-bottom: 20px;
  703. .advantage-title {
  704. font-size: 20px;
  705. margin-bottom: 12px;
  706. }
  707. .advantage-description {
  708. font-size: 13px;
  709. }
  710. }
  711. .advantage-image {
  712. img {
  713. width: 160px;
  714. height: 124px;
  715. }
  716. }
  717. }
  718. }
  719. }
  720. }
  721. </style>