<template> <div class="mobile-page" :style="{ marginTop: `${mTOP}px` }"> <div class="bg" :style="{ background: `linear-gradient(180deg,${bgColor[0].item},${bgColor[1].item})`, }" v-if="bgColor.length > 0 && isShow" ></div> <div class="banner" :class="bgColor.length > 0 && isShow?'on':''" :style="{ paddingLeft: edge + 'px', paddingRight: edge + 'px', }" > <img :class="{ doc: imgStyle }" :src="imgSrc" alt="" v-if="imgSrc" /> <div class="empty-box" :class="{ on: imgStyle }" v-else> <span class="iconfont-diy icontupian"></span> </div> </div> <div> <div class="dot" :style="{paddingLeft: edge+10 + 'px',paddingRight: edge+10 + 'px',justifyContent: (dotPosition===1?'center':dotPosition===2?'flex-end':'flex-start')}" v-if="docStyle == 0"> <div class="dot-item" style="background: #fff;"></div> <div class="dot-item"></div> <div class="dot-item"></div> </div> <div class="dot line-dot" :style="{paddingLeft: edge+10 + 'px',paddingRight: edge+10 + 'px',justifyContent: (dotPosition===1?'center':dotPosition===2?'flex-end':'flex-start')}" v-if="docStyle == 1"> <div class="line_dot-item" style="background: #fff;"></div> <div class="line_dot-item"></div> <div class="line_dot-item"></div> </div> </div> </div> </template> <script> import { mapState } from "vuex"; export default { name: "banner", // 组件名称 cname: "轮播图", // 标题名称 icon: "iconlunbotu", defaultName: "swiperBg", // 外面匹配名称 configName: "c_banner", // 右侧配置名称 type: 0, // 0 基础组件 1 营销组件 2工具组件 props: { index: { type: null, }, num: { type: null, }, }, computed: { ...mapState("mobildConfig", ["defaultArray"]), }, watch: { pageData: { handler(nVal, oVal) { this.setConfig(nVal); }, deep: true, }, num: { handler(nVal, oVal) { let data = this.$store.state.mobildConfig.defaultArray[nVal]; this.setConfig(data); }, deep: true, }, defaultArray: { handler(nVal, oVal) { let data = this.$store.state.mobildConfig.defaultArray[this.num]; this.setConfig(data); }, deep: true, }, }, data() { return { // 默认初始化数据禁止修改 defaultConfig: { name: "swiperBg", timestamp: this.num, setUp: { tabVal: '0' }, // 图片列表 swiperConfig: { title: "最多可添加20张图片,建议宽度750*345px;鼠标拖拽左侧圆点可调整图片 顺序", maxList: 20, list: [ { img: "", info: [ { title: "标题", value: "今日推荐", tips: "选填,不超过4个字", max: 4, }, { title: "链接", value: "", tips: "请输入链接", max: 100, }, ], }, ], }, isShow: { title: '是否显示背景色', val: true }, // 背景颜色 bgColor: { title: "背景颜色(渐变)", default: [ { item: "#FFFFFF", }, { item: "#FFFFFF", }, ], color: [ { item: "#FFFFFF", }, { item: "#FFFFFF", }, ], }, // 左右间距 lrConfig: { title: "左右边距", val: 10, min: 0, }, // 页面间距 mbConfig: { title: "页面间距", val: 0, min: 0, }, // 轮播图点样式 docConfig: { cname: "swiper", title: "指示器样式", type: 0, list: [ { val: "圆形", icon: "iconDot", }, { val: "直线", icon: "iconSquarepoint", }, { val: "无指示器", icon: "iconjinyong", }, ], }, txtStyle: { title: '指示器位置', type: 0, list: [ { val: '居左', icon:'icondoc_left' }, { val: '居中', icon:'icondoc_center' }, { val: '居右', icon:'icondoc_right' } ] }, // 图片样式 imgConfig: { cname: "docStyle", title: "轮播图样式", type: 0, list: [ { val: "圆角", icon: "iconPic_fillet", }, { val: "直角", icon: "iconPic_square", }, ], }, }, pageData: {}, bgColor: [], mTOP: 0, edge: 0, imgStyle: 0, imgSrc: "", docStyle: 0, dotPosition: 0, isShow:true, }; }, mounted() { this.$nextTick(() => { this.pageData = this.$store.state.mobildConfig.defaultArray[ this.num ]; this.setConfig(this.pageData); }); }, methods: { setConfig(data) { if (!data) return; if(data.mbConfig){ this.isShow = data.isShow.val; this.bgColor = data.bgColor.color; this.mTOP = data.mbConfig.val; this.edge = data.lrConfig.val; this.imgStyle = data.imgConfig.type; this.imgSrc = data.swiperConfig.list.length ? data.swiperConfig.list[0].img : ""; this.docStyle = data.docConfig.type; this.dotPosition = data.txtStyle.type; } }, }, }; </script> <style scoped lang="scss"> .empty-box{ height: 170px; } .mobile-page { position: relative; width: auto; .banner { width: 100%; // height: 150px; margin-top: 0; &.on{ margin-top: -150px; } img { width: 100%; height: 100%; border-radius: 10px; &.doc { border-radius: 0; } } } .bg { width: 100%; height: 150px; background: linear-gradient(90deg, #F62C2C 0%, #F96E29 100%); } } .dot { position: absolute; left: 0; bottom: 20px; width: 100%; display: flex; align-items: center; &.number{ bottom: 4px; } .num{ width: 25px; height: 18px; line-height: 18px; background-color: #000; color: #fff; opacity: 0.3; border-radius: 8px; font-size: 12px; text-align: center; } .dot-item { width: 5px; height: 5px; background: #AAAAAA; border-radius: 50%; margin: 0 3px; } &.line-dot { bottom: 20px; .line_dot-item { width: 8px; height: 2px; background: #AAAAAA; margin: 0 3px; } } } </style>