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.
214 lines
6.8 KiB
214 lines
6.8 KiB
<template> |
|
<main class="w-full bg-[#0C0C16] lg:min-w-[1200px]"> |
|
<div |
|
class="relative h-[428px] w-full bg-gradient-to-b from-[#0C0C16] to-[#080809] lg:h-[888px]" |
|
> |
|
<div class="size-full mx-auto overflow-hidden relative" ref="emblaNode"> |
|
<div class="size-full flex"> |
|
<div v-for="(slide, idx) in slides" :key="idx" class="size-full flex-[0_0_100%]"> |
|
<div class="size-full relative flex overflow-hidden items-center sm:items-start"> |
|
<NuxtImg |
|
:src="slide.bgLg" |
|
class="size-full object-cover sm:hidden" |
|
format="webp" |
|
loading="lazy" |
|
:fetchpriority="idx === 0 ? 'high' : 'low'" |
|
/> |
|
<NuxtImg |
|
:src="slide.bgSm" |
|
class="size-full object-cover hidden sm:block" |
|
format="webp" |
|
loading="lazy" |
|
:fetchpriority="idx === 0 ? 'high' : 'low'" |
|
/> |
|
<div |
|
class="w-[1440px] md:w-[870px] sm:w-[258px] sm:top-19 absolute inset-0 mx-auto flex overflow-hidden items-center sm:items-start" |
|
> |
|
<div class="swiper-banner-info"> |
|
<h6 class="text-2xl md:text-lg lg:text-xl sm:text-xs font-bold"> |
|
{{ slide.title }} |
|
</h6> |
|
<h2 |
|
class="text-4xl lg:text-3xl md:text-2xl sm:text-base overflow-hidden font-bold text-ellipsis whitespace-pre-line break-words" |
|
> |
|
{{ slide.subtitle }} |
|
</h2> |
|
<div v-if="slide.tags" class="flex text-lg lg:text-base md:text-base sm:text-sm"> |
|
<p |
|
v-for="(tag, index) in slide.tags" |
|
:key="index" |
|
:class="tag.clx" |
|
class="bg-cover bg-no-repeat bg-center bg-size-full flex items-center justify-center" |
|
:style="{ |
|
backgroundImage: `url(${tag.bg})`, |
|
}" |
|
> |
|
{{ tag.name }} |
|
</p> |
|
</div> |
|
</div> |
|
</div> |
|
</div> |
|
</div> |
|
</div> |
|
|
|
<div |
|
class="absolute bottom-[4%] left-1/2 -translate-x-1/2 flex gap-2 md:gap-[6px] sm:gap-1 z-10 bg-red" |
|
> |
|
<button |
|
v-for="(_, index) in slides" |
|
:key="index" |
|
:class="{ 'active-slide': emblaState.selectedIndex == index }" |
|
class="w-12 h-2 md:w-9 md:h-[6px] sm:w-3 sm:h-1 bg-[#818897] opacity-30" |
|
@click="scrollTo(index)" |
|
/> |
|
</div> |
|
</div> |
|
</div> |
|
<Serve /> |
|
<Device /> |
|
<Middle /> |
|
<ElectricPower /> |
|
<Scenarios /> |
|
<CloudData /> |
|
<Operation /> |
|
<About /> |
|
</main> |
|
</template> |
|
|
|
<script setup lang="ts"> |
|
import Device from '@/components/pageLayout/device.vue' |
|
import Serve from '@/components/pageLayout/serce.vue' |
|
import Middle from '@/components/pageLayout/midele.vue' |
|
import Scenarios from '@/components/pageLayout/scenarios.vue' |
|
import ElectricPower from '@/components/pageLayout/electricPower.vue' |
|
import CloudData from '@/components/pageLayout/cloudData.vue' |
|
import Operation from '@/components/pageLayout/operation.vue' |
|
import About from '@/components/pageLayout/abuot.vue' |
|
import EmblaCarousel from 'embla-carousel' |
|
const emblaNode = ref<any>(null) |
|
const embla = ref<any>(null) |
|
// 添加SEO元信息 |
|
useSeoMeta({ |
|
title: '比特电科 - 智能边缘网关解决方案', |
|
ogTitle: '比特电科 - 智能边缘网关解决方案', |
|
description: '比特电科提供高可靠性智能边缘网关解决方案,帮助客户实现工业控制系统的智能化升级', |
|
ogDescription: '比特电科提供高可靠性智能边缘网关解决方案,帮助客户实现工业控制系统的智能化升级', |
|
ogImage: '/images/banner/bk1000.png', |
|
}) |
|
|
|
const slides = [ |
|
{ |
|
bgLg: '/images/banner/bk1000.png', |
|
bgSm: '/images/banner/bk1000_sm.png', |
|
title: '储能工业控制主机 BK-1000', |
|
subtitle: '超高性价比|开发周期缩短50%|电力四级防护', |
|
tags: [ |
|
{ |
|
name: '低成本', |
|
bg: '/images/banner/tag1.png', |
|
clx: 'w-[126px] h-[38px] md:w-[100px] md:h-[30px] sm:w-[80px] sm:h-[24px]', |
|
}, |
|
{ |
|
name: '高可靠性', |
|
bg: '/images/banner/tag2.png', |
|
clx: 'w-[126px] h-[38px] md:w-[100px] md:h-[30px] sm:w-[80px] sm:h-[24px]', |
|
}, |
|
{ |
|
name: '全场景适配', |
|
bg: '/images/banner/tag3.png', |
|
clx: 'w-[148px] h-[38px] md:w-[116px] md:h-[30px] sm:w-[94px] sm:h-[24px]', |
|
}, |
|
], |
|
}, |
|
{ |
|
bgLg: '/images/banner/bk2000.png', |
|
bgSm: '/images/banner/bk2000_sm.png', |
|
title: '储能工业控制主机 BK-2000', |
|
subtitle: '超高性价比|开发周期缩短50%|电力四级防护', |
|
tags: [ |
|
{ |
|
name: '低成本', |
|
bg: '/images/banner/tag1.png', |
|
clx: 'w-[126px] h-[38px] md:w-[100px] md:h-[30px] sm:w-[80px] sm:h-[24px]', |
|
}, |
|
{ |
|
name: '高可靠性', |
|
bg: '/images/banner/tag2.png', |
|
clx: 'w-[126px] h-[38px] md:w-[100px] md:h-[30px] sm:w-[80px] sm:h-[24px]', |
|
}, |
|
{ |
|
name: '全场景适配', |
|
bg: '/images/banner/tag3.png', |
|
clx: 'w-[148px] h-[38px] md:w-[116px] md:h-[30px] sm:w-[94px] sm:h-[24px]', |
|
}, |
|
], |
|
}, |
|
] |
|
|
|
const emblaState = reactive({ |
|
selectedIndex: 0, |
|
}) |
|
|
|
const scrollTo = (index: number) => embla.value?.scrollTo(index) |
|
function updateOnSelect() { |
|
emblaState.selectedIndex = embla.value.selectedScrollSnap() |
|
// state.canScrollPrev = embla.value.canScrollPrev() |
|
// state.canScrollNext = embla.value.canScrollNext() |
|
} |
|
onMounted(() => { |
|
embla.value = EmblaCarousel(emblaNode.value, { loop: true }, [createAutoplay(4000)]) |
|
embla.value.on('select', updateOnSelect) |
|
}) |
|
|
|
function createAutoplay(delay = 4000) { |
|
let embla: any = null |
|
let timer: any = null |
|
|
|
function autoplay() { |
|
stop() |
|
if (!embla) return |
|
timer = setInterval(() => { |
|
if (!embla) return |
|
if (!embla.canScrollNext()) { |
|
embla.scrollTo(0) // 回到第一张 |
|
} else { |
|
embla.scrollNext() |
|
} |
|
}, delay) |
|
} |
|
|
|
function stop() { |
|
if (timer) clearInterval(timer) |
|
} |
|
|
|
return { |
|
name: 'autoplay', |
|
options: {}, |
|
init(emblaApi: any) { |
|
embla = emblaApi |
|
autoplay() |
|
embla.on('pointerDown', stop) |
|
embla.on('pointerUp', autoplay) |
|
embla.on('destroy', stop) |
|
}, |
|
destroy() { |
|
stop() |
|
embla = null |
|
}, |
|
} |
|
} |
|
</script> |
|
|
|
<style> |
|
.swiper-banner-info { |
|
@apply relative flex flex-col justify-center sm:justify-normal gap-16 md:gap-4 sm:gap-2 |
|
text-white; |
|
} |
|
.title-font { |
|
@apply text-5xl md:text-4xl sm:text-lg font-bold text-center text-white; |
|
} |
|
.active-slide { |
|
opacity: 1; |
|
} |
|
</style>
|
|
|