nankai-cms-website-gov/components/cms/SpecialColumn.vue
2025-03-13 10:14:57 +08:00

145 lines
3.1 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<div class="special-column">
<div class="title-wrap">
<label>专题专栏</label>
<!-- 箭头 -->
<span/>
</div>
<div class="swiper-wrap">
<swiper
class="swiper-container"
ref="swiper"
:speed="500"
:slidesPerView="4"
:loop="true"
:autoplay="{
delay: 1500,
disableOnInteraction: false // 触摸后是否停止自动移动
}"
:modules="modules"
@mouseenter="$refs.swiper.$el.swiper.autoplay.stop()"
@mouseleave="$refs.swiper.$el.swiper.autoplay.start()"
>
<swiper-slide v-for="(item, index) in getIcons" :key="index">
<nuxt-link target="_blank" :to="JSON.parse(item.value).link">
<img
:src="getImageURL(JSON.parse(item.value).image)"
:alt="item.title"
/>
</nuxt-link>
</swiper-slide>
</swiper>
</div>
</div>
</template>
<script>
import { Swiper, SwiperSlide } from 'swiper/vue'
import { Autoplay } from 'swiper/modules'
import 'swiper/scss'
import 'swiper/scss/free-mode'
import { getImageURL } from '@/utils/util'
export default {
name: 'SpecialColumn',
components: { Swiper, SwiperSlide },
props: {
icons: {
default: () => {
return []
}
}
},
computed: {
// 获取图标
getIcons () {
if (this.icons.length < 5 || this.icons.length > 7) {
return this.icons
}
return [...this.icons, ...this.icons]
}
},
data() {
return {
modules: []
}
},
methods: {
getImageURL
},
created () {
this.modules = [Autoplay]
}
}
</script>
<style lang="scss" scoped>
.special-column {
display: flex;
// 标题
.title-wrap {
height: 100px;
width: 40px;
margin: auto 20px auto 0;
padding: 0 14px;
background: linear-gradient(90deg, var(--primary-color-light) 0%, var(--primary-color) 100%);
border-radius: 10px;
text-align: center;
display: flex;
align-items: center;
position: relative;
// 箭头
& > span {
position: absolute;
right: -12px;
top: calc(50% - 10px);
width: 0;
height: 0;
border-bottom:10px solid transparent;
border-top: 10px solid transparent;
border-left: 12px solid var(--primary-color);
}
// 专题文字
label {
display: block;
color: #ffffff;
font-size: 14px;
font-weight: bold;
}
}
// 轮播列表
.swiper-wrap {
width: calc(100% - 80px);
height: 100px;
flex-grow: 1;
overflow: hidden;
// 轮播项
.swiper-slide {
// 给定最大宽度避免swiper没有计算出width时图片临时性展示过大
max-width: 25%;
height: 100%;
overflow: hidden;
padding: 0 10px;
box-sizing: border-box;
&:first-of-type {
padding-left: 0;
}
&:last-of-type {
padding-right: 0;
}
& > a {
display: block;
height: 100px;
cursor: pointer;
img {
border-radius: 20px;
width: 100%;
height: 100%;
object-fit: cover;
}
}
}
}
}
</style>