<template> <view class="tn-column-notice-class tn-column-notice" :class="[backgroundColorClass]" :style="[noticeStyle]" > <!-- 左图标 --> <view class="tn-column-notice__icon"> <view v-if="leftIcon" class="tn-column-notice__icon--left" :class="[`tn-icon-${leftIconName}`,fontColorClass]" :style="[fontStyle('leftIcon')]" @tap="clickLeftIcon"></view> </view> <!-- 滚动显示内容 --> <swiper class="tn-column-notice__swiper" :style="[swiperStyle]" :vertical="vertical" circular :autoplay="autoplay && playStatus === 'play'" :interval="duration" @change="change"> <swiper-item v-for="(item, index) in list" :key="index" class="tn-column-notice__swiper--item"> <view class="tn-column-notice__swiper--content tn-text-ellipsis" :class="[fontColorClass]" :style="[fontStyle()]" @tap="click(index)" >{{ item }}</view> </swiper-item> </swiper> <!-- 右图标 --> <view class="tn-column-notice__icon"> <view v-if="rightIcon" class="tn-column-notice__icon--right" :class="[`tn-icon-${rightIconName}`,fontColorClass]" :style="[fontStyle('rightIcon')]" @tap="clickRightIcon"></view> <view v-if="closeBtn" class="tn-column-notice__icon--right" :class="[`tn-icon-close`,fontColorClass]" :style="[fontStyle('close')]" @tap="close"></view> </view> </view> </template> <script> import componentsColorMixin from '../../libs/mixin/components_color.js' export default { name: 'tn-column-notice', mixins: [componentsColorMixin], props: { // 显示的内容 list: { type: Array, default() { return [] } }, // 是否显示 show: { type: Boolean, default: true }, // 播放状态 // play -> 播放 paused -> 暂停 playStatus: { type: String, default: 'play' }, // 滚动方向 // horizontal -> 水平滚动 vertical -> 垂直滚动 mode: { type: String, default: 'horizontal' }, // 是否显示左边图标 leftIcon: { type: Boolean, default: true }, // 左边图标的名称 leftIconName: { type: String, default: 'sound' }, // 左边图标的大小 leftIconSize: { type: Number, default: 34 }, // 是否显示右边的图标 rightIcon: { type: Boolean, default: false }, // 右边图标的名称 rightIconName: { type: String, default: 'right' }, // 右边图标的大小 rightIconSize: { type: Number, default: 26 }, // 是否显示关闭按钮 closeBtn: { type: Boolean, default: false }, // 圆角 radius: { type: Number, default: 0 }, // 内边距 padding: { type: String, default: '18rpx 24rpx' }, // 自动播放 autoplay: { type: Boolean, default: true }, // 滚动周期 duration: { type: Number, default: 2000 } }, computed: { fontStyle() { return (type) => { let style = {} style.color = this.fontColorStyle ? this.fontColorStyle : '' style.fontSize = this.fontSizeStyle ? this.fontSizeStyle : '' if (type === 'leftIcon' && this.leftIconSize) { style.fontSize = this.leftIconSize + 'rpx' } if (type === 'rightIcon' && this.rightIconSize) { style.fontSize = this.rightIconSize + 'rpx' } if (type === 'close') { style.fontSize = '24rpx' } return style } }, noticeStyle() { let style = {} style.backgroundColor = this.backgroundColorStyle ? this.backgroundColorStyle : 'transparent' if (this.padding) style.padding = this.padding return style }, swiperStyle() { let style = {} style.height = this.fontSize ? this.fontSize + 6 + this.fontUnit : '32rpx' style.lineHeight = style.height return style }, // 标记是否为垂直 vertical() { if (this.mode === 'horizontal') return false else return true } }, data() { return { } }, watch: { }, methods: { // 点击了通知栏 click(index) { this.$emit('click', index) }, // 点击了关闭按钮 close() { this.$emit('close') }, // 点击了左边图标 clickLeftIcon() { this.$emit('clickLeft') }, // 点击了右边图标 clickRightIcon() { this.$emit('clickRight') }, // 切换消息时间 change(event) { let index = event.detail.current if (index === this.list.length - 1) { this.$emit('end') } } } } </script> <style lang="scss" scoped> .tn-column-notice { width: 100%; display: flex; flex-direction: row; align-items: center; justify-content: center; flex-wrap: nowrap; overflow: hidden; &__swiper { height: auto; flex: 1; display: flex; flex-direction: row; align-items: center; margin-left: 12rpx; &--item { display: flex; flex-direction: row; align-items: center; overflow: hidden; } &--content { overflow: hidden; } } &__icon { &--left { display: inline-flex; align-items: center; } &--right { margin-left: 12rpx; display: inline-flex; align-items: center; } } } </style>