252 lines
5.9 KiB
Vue
252 lines
5.9 KiB
Vue
<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>
|