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.
306 lines
8.2 KiB
306 lines
8.2 KiB
<template>
|
|
<section :class="['tw-relative xl:tw-max-w-[1246px] xl:tw-mx-auto']">
|
|
<div class="tw-relative tw-grid tw-grid-cols-2 tw-gap-[10px] tw-float-right tw-top-[4px]">
|
|
<div :class="[
|
|
'swiper-button-prev highlightExhibitions tw-relative tw-text-black tw-w-[40px] tw-h-[40px] tw-left-0 tw-text-center tw-border-solid tw-border tw-border-neutrals-300 tw-rounded-[10px] tw-p-[8px] tw-hidden md:tw-block',
|
|
]"></div>
|
|
<div :class="[
|
|
'swiper-button-next highlightExhibitions tw-relative tw-text-black tw-w-[40px] tw-h-[40px] tw-right-0 tw-text-center tw-border-solid tw-border tw-border-neutrals-300 tw-rounded-[10px] tw-p-[8px] tw-hidden md:tw-block',
|
|
]"></div>
|
|
</div>
|
|
<div class="swiper-container highlightExhibitions" ref="highlightExhibitions">
|
|
<div :class="[
|
|
'swiper-wrapper tw-grid tw-grid-cols-2 tw-gap-y-[25px] md:tw-flex md:tw-grid-cols-none md:tw-gap-0',
|
|
]">
|
|
<template v-for="(item, index) in exhibitions">
|
|
<div :key="index" :class="['swiper-slide']" v-if="index <= useSwiper">
|
|
<skeletonSlot>
|
|
<template #default>
|
|
<hightlightExhibitionsCard :item="item"></hightlightExhibitionsCard>
|
|
</template>
|
|
<template #fallback>
|
|
<sk></sk>
|
|
</template>
|
|
</skeletonSlot>
|
|
</div>
|
|
</template>
|
|
<template v-for="n in exhibitionsLength" >
|
|
<div :key="n" :class="['swiper-slide']" v-if="windewWidth >= 1366">
|
|
</div>
|
|
</template>
|
|
</div>
|
|
</div>
|
|
<a class="tw-block tw-border tw-border-solid tw-text-black tw-text-center tw-border-black tw-bg-white tw-py-[9px] tw-w-full tw-rounded-[12px] tw-mt-[44px] md:tw-hidden"
|
|
:href="localePath('/exhibition')">
|
|
{{ $t("See more") }}
|
|
</a>
|
|
</section>
|
|
</template>
|
|
<script>
|
|
import { dateCountDown } from "~/utils/assist";
|
|
import skeletonSlot from "~/components/newComponent/skeleton/skeletonSlot.vue";
|
|
import hightlightExhibitionsCard from "~/components/home/HightlightExhibitionsCard.vue";
|
|
import sk from '~/components/newComponent/skeleton/homeExhibitionCardSkeleton.vue';
|
|
import TrendingServiceVue from "./TrendingService.vue";
|
|
import Swiper from "swiper/bundle";
|
|
export default {
|
|
components: {
|
|
hightlightExhibitionsCard,
|
|
sk,
|
|
skeletonSlot,
|
|
Swiper
|
|
},
|
|
data() {
|
|
return {
|
|
highlightExhibitionsSwiper: undefined,
|
|
carousel: 0,
|
|
carouselPagesNum: 3,
|
|
exhibitions: [],
|
|
windewWidth: "",
|
|
};
|
|
},
|
|
async created() {
|
|
// await this.getData();
|
|
this.exhibitions = [
|
|
{
|
|
id: '1',
|
|
name: 'VISA',
|
|
logo: require('/assets/img/thems/Frame33.png'),
|
|
startdate: '2023-03-01',
|
|
enddate: '2023-03-30',
|
|
region:{
|
|
name: 'Vietnam'
|
|
},
|
|
country:{
|
|
name: 'Vietnam'
|
|
},
|
|
city:{
|
|
name: 'Vietnam'
|
|
}
|
|
},
|
|
{
|
|
id: '1',
|
|
name: 'VISA',
|
|
logo: require('/assets/img/thems/Frame33.png'),
|
|
startdate: '2023-03-01',
|
|
enddate: '2023-03-30',
|
|
region:{
|
|
name: 'Vietnam'
|
|
},
|
|
country:{
|
|
name: 'Vietnam'
|
|
},
|
|
city:{
|
|
name: 'Vietnam'
|
|
}
|
|
},{
|
|
id: '1',
|
|
name: 'VISA',
|
|
logo: require('/assets/img/thems/Frame33.png'),
|
|
startdate: '2023-03-01',
|
|
enddate: '2023-03-30',
|
|
region:{
|
|
name: 'Vietnam'
|
|
},
|
|
country:{
|
|
name: 'Vietnam'
|
|
},
|
|
city:{
|
|
name: 'Vietnam'
|
|
}
|
|
}
|
|
];
|
|
if (process.browser) {
|
|
window.addEventListener("resize", this.handleResize);
|
|
}
|
|
this.handleResize();
|
|
},
|
|
mounted() {
|
|
let vm = this;
|
|
vm.$nextTick(function () {
|
|
vm.initSwiper();
|
|
});
|
|
},
|
|
destroyed() {
|
|
if (process.browser) {
|
|
window.removeEventListener("resize", this.handleResize);
|
|
}
|
|
},
|
|
computed: {
|
|
useSwiper() {
|
|
if (this.windewWidth < 768) {
|
|
return 5;
|
|
} else {
|
|
return this.exhibitions.length;
|
|
}
|
|
},
|
|
exhibitionsLength() {
|
|
if (this.exhibitions.length > 6 && this.exhibitions.length < 12) {
|
|
return 12 - this.exhibitions.length;
|
|
}
|
|
if (this.exhibitions.length > 9 && this.exhibitions.length < 18) {
|
|
return 18 - this.exhibitions.length;
|
|
}
|
|
},
|
|
},
|
|
methods: {
|
|
async getData() {
|
|
let langQuery = "?lang=" + this.$i18n.localeProperties["langQuery"] + "&";
|
|
this.$axios
|
|
.get("/trending/exhibitions" + langQuery)
|
|
.then((res) => {
|
|
this.exhibitions = res.data.exhibitions;
|
|
this.exhibitions = this.exhibitions.filter((item) => {
|
|
let day = this.dateCountDown(item.startdate);
|
|
return day > 0;
|
|
})
|
|
})
|
|
.catch((err) => {
|
|
console.error(err);
|
|
});
|
|
},
|
|
handleResize() {
|
|
if (process.browser) {
|
|
this.windewWidth = window.innerWidth;
|
|
this.initSwiper();
|
|
}
|
|
},
|
|
initSwiper() {
|
|
let vm = this;
|
|
vm.$nextTick(function () {
|
|
vm.highlightExhibitionsSwiper = new Swiper(
|
|
".swiper-container.highlightExhibitions",
|
|
{
|
|
direction: "horizontal",
|
|
initialSlide: 0,
|
|
slidesPerView: 2,
|
|
slidesPerColumn: 3,
|
|
// slidesPerGroup: 3,
|
|
slidesPerColumnFill: 'row',
|
|
allowTouchMove: false,
|
|
grabCursor: true,
|
|
observer: true, //修改swiper自己或子元素时,自动初始化swiper
|
|
observeParents: true, //修改swiper的父元素时,自动初始化swiper
|
|
rebuildOnUpdate: true,
|
|
preloadImages: false,
|
|
spaceBetween: 10,
|
|
lazy: {
|
|
loadPrevNext: true,
|
|
loadOnTransitionStart: true,
|
|
loadPrevNextAmount: 6,
|
|
},
|
|
navigation: {
|
|
prevEl: ".swiper-button-prev.highlightExhibitions",
|
|
nextEl: ".swiper-button-next.highlightExhibitions",
|
|
},
|
|
breakpoints: {
|
|
768: {
|
|
slidesPerView: 1,
|
|
slidesPerColumn: 6,
|
|
slidesPerGroup: 1,
|
|
spaceBetween: 20,
|
|
allowTouchMove: true,
|
|
lazy: {
|
|
loadPrevNext: true,
|
|
loadOnTransitionStart: true,
|
|
loadPrevNextAmount: 10,
|
|
},
|
|
},
|
|
1366: {
|
|
slidesPerView: 2,
|
|
slidesPerColumn: 3,
|
|
slidesPerGroup: 2,
|
|
spaceBetween: 20,
|
|
slidesPerColumnFill: 'row',
|
|
allowTouchMove: true,
|
|
},
|
|
},
|
|
}
|
|
);
|
|
vm.highlightExhibitionsSwiper.init();
|
|
vm.highlightExhibitionsSwiper.update();
|
|
});
|
|
},
|
|
dateCountDown
|
|
},
|
|
};
|
|
</script>
|
|
<style lang="scss" scoped>
|
|
.swiper-container {
|
|
width: 100% !important;
|
|
}
|
|
|
|
.swiper-slide {
|
|
margin-right: 20px;
|
|
|
|
// @media screen and (min-width:768px) {
|
|
// &:first-child {
|
|
// margin-bottom: 20px;
|
|
// }
|
|
// }
|
|
}
|
|
|
|
.swiper-button {
|
|
&-prev.highlightExhibitions {
|
|
z-index: 4;
|
|
|
|
&:focus-visible {
|
|
outline: none;
|
|
}
|
|
|
|
&::after {
|
|
font-size: 24px;
|
|
font-weight: bold;
|
|
text-align: center;
|
|
color: transparent;
|
|
background-image: url('~/assets/svg/u-angle-left-b.svg');
|
|
background-position: center;
|
|
background-repeat: no-repeat;
|
|
background-size: cover;
|
|
}
|
|
|
|
&:focus-visible,
|
|
&:focus {
|
|
outline: none;
|
|
}
|
|
}
|
|
|
|
&-next.highlightExhibitions {
|
|
z-index: 4;
|
|
|
|
&:focus-visible {
|
|
outline: none;
|
|
}
|
|
|
|
&::after {
|
|
font-size: 24px;
|
|
font-weight: bold;
|
|
text-align: center;
|
|
color: transparent;
|
|
background-image: url('~/assets/svg/u-angle-right-b.svg');
|
|
background-position: center;
|
|
background-repeat: no-repeat;
|
|
background-size: cover;
|
|
}
|
|
|
|
&:focus-visible,
|
|
&:focus {
|
|
outline: none;
|
|
}
|
|
}
|
|
}
|
|
|
|
.active {
|
|
position: relative;
|
|
|
|
&::after {
|
|
content: "";
|
|
display: block;
|
|
position: absolute;
|
|
bottom: -12px;
|
|
width: 100%;
|
|
height: 2px;
|
|
background-color: #f48800;
|
|
}
|
|
}
|
|
</style>
|