PartnershipSection.vue 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. <template>
  2. <section
  3. id="partnership"
  4. ref="partnershipRef"
  5. class="partnership transition-all duration-1000 ease-out"
  6. :class="[isPartnershipVisible ? 'opacity-100 translate-y-0' : 'opacity-0 translate-y-100px']"
  7. >
  8. <div class="partnership-header">
  9. <div class="partnership-line-left"></div>
  10. <div class="partnership-title pf-sc-regular">与合作伙伴携手,深入产业共创价值</div>
  11. <div class="partnership-line-right"></div>
  12. </div>
  13. <div class="partnership-content">
  14. <InspiraMarquee class="partnership-marquee-row1">
  15. <div v-for="partner in partnersRow1" :key="partner" class="partner-item">
  16. <img :src="partner" alt="" class="wh-full object-contain" />
  17. </div>
  18. </InspiraMarquee>
  19. <InspiraMarquee reverse class="partnership-marquee-row2">
  20. <div v-for="partner in partnersRow2" :key="partner" class="partner-item">
  21. <img :src="partner" alt="" class="wh-full object-contain" />
  22. </div>
  23. </InspiraMarquee>
  24. <div class="partnership-mask-left"></div>
  25. <div class="partnership-mask-right"></div>
  26. </div>
  27. </section>
  28. </template>
  29. <script setup lang="ts">
  30. import { partnersRow1, partnersRow2 } from '@/constants/common'
  31. const partnershipRef = ref<HTMLElement | null>(null)
  32. const isPartnershipVisible = ref(false)
  33. onMounted(() => {
  34. const observer = new IntersectionObserver(
  35. (entries) => {
  36. entries.forEach((entry) => {
  37. if (!entry.isIntersecting) return
  38. isPartnershipVisible.value = true
  39. observer.unobserve(entry.target)
  40. })
  41. },
  42. { threshold: 0.1 }
  43. )
  44. if (partnershipRef.value) {
  45. observer.observe(partnershipRef.value)
  46. }
  47. })
  48. </script>
  49. <style scoped lang="scss">
  50. .partnership {
  51. @extend %landing-container;
  52. @media screen and (min-width: 1480px) {
  53. padding-left: calc((100vw - 1480px) / 2);
  54. padding-right: calc((100vw - 1480px) / 2);
  55. }
  56. @apply py-60px overflow-hidden;
  57. @apply lt-sm:py-60px lt-sm:px-0;
  58. }
  59. .partnership-header {
  60. @apply flex-center gap-32px mb-40px;
  61. @apply lt-sm:mb-40px lt-sm:gap-30px;
  62. }
  63. .partnership-line-left {
  64. @apply h-2px w-320px bg-[linear-gradient(90deg,transparent_0%,#E5E9F5_100%)];
  65. @apply lt-sm:w-85px;
  66. }
  67. .partnership-title {
  68. @apply text-center font-s-18px lh-21px text-#9CA0A7 whitespace-nowrap;
  69. @apply lt-sm:font-s-28px;
  70. }
  71. .partnership-line-right {
  72. @apply h-2px w-320px bg-[linear-gradient(90deg,#E5E9F5_0%,transparent_100%)];
  73. @apply lt-sm:w-85px;
  74. }
  75. .partnership-content {
  76. @apply relative flex flex-col gap-0px -mt-24px;
  77. }
  78. .partnership-marquee-row1 {
  79. @apply [--duration:80s] [--gap:24px] mb--31px;
  80. }
  81. .partnership-marquee-row2 {
  82. @apply [--duration:80s] [--delay:-20s] [--gap:24px];
  83. }
  84. .partnership-mask-left {
  85. @apply pointer-events-none absolute inset-y-0 left-0 w-1/4 bg-[linear-gradient(to_right,#fff,transparent)];
  86. }
  87. .partnership-mask-right {
  88. @apply pointer-events-none absolute inset-y-0 right-0 w-1/4 bg-[linear-gradient(to_left,#fff,transparent)];
  89. }
  90. .partner-item {
  91. @apply flex-center h-80px w-200px bg-white rounded-8px shadow-[0_2px_8px_2px_rgba(0,0,0,0.06)] px-24px;
  92. @apply lt-sm:h-105px lt-sm:w-290px;
  93. }
  94. </style>