190 lines
6.2 KiB
Vue
190 lines
6.2 KiB
Vue
|
|
<template>
|
|||
|
|
<view class="u-notice-bar-wrap" v-if="isShow" :style="{ borderRadius: props.borderRadius + 'rpx' }">
|
|||
|
|
<block v-if="props.mode === 'horizontal' && props.isCircular">
|
|||
|
|
<u-row-notice
|
|||
|
|
:type="props.type"
|
|||
|
|
:color="props.color"
|
|||
|
|
:bgColor="props.bgColor"
|
|||
|
|
:list="props.list"
|
|||
|
|
:volumeIcon="props.volumeIcon"
|
|||
|
|
:moreIcon="props.moreIcon"
|
|||
|
|
:volumeSize="props.volumeSize"
|
|||
|
|
:closeIcon="props.closeIcon"
|
|||
|
|
:mode="props.mode"
|
|||
|
|
:fontSize="props.fontSize"
|
|||
|
|
:speed="props.speed"
|
|||
|
|
:playState="props.playState"
|
|||
|
|
:padding="props.padding"
|
|||
|
|
@getMore="getMore"
|
|||
|
|
@close="close"
|
|||
|
|
@click="click"
|
|||
|
|
></u-row-notice>
|
|||
|
|
</block>
|
|||
|
|
<block v-if="props.mode === 'vertical' || (props.mode === 'horizontal' && !props.isCircular)">
|
|||
|
|
<u-column-notice
|
|||
|
|
:type="props.type"
|
|||
|
|
:color="props.color"
|
|||
|
|
:bgColor="props.bgColor"
|
|||
|
|
:list="props.list"
|
|||
|
|
:volumeIcon="props.volumeIcon"
|
|||
|
|
:moreIcon="props.moreIcon"
|
|||
|
|
:closeIcon="props.closeIcon"
|
|||
|
|
:mode="props.mode"
|
|||
|
|
:volumeSize="props.volumeSize"
|
|||
|
|
:disable-touch="props.disableTouch"
|
|||
|
|
:fontSize="props.fontSize"
|
|||
|
|
:duration="props.duration"
|
|||
|
|
:playState="props.playState"
|
|||
|
|
:padding="props.padding"
|
|||
|
|
@getMore="getMore"
|
|||
|
|
@close="close"
|
|||
|
|
@click="click"
|
|||
|
|
@end="end"
|
|||
|
|
></u-column-notice>
|
|||
|
|
</block>
|
|||
|
|
</view>
|
|||
|
|
</template>
|
|||
|
|
|
|||
|
|
<script lang="ts">
|
|||
|
|
export default {
|
|||
|
|
name: 'u-notice-bar',
|
|||
|
|
options: {
|
|||
|
|
addGlobalClass: true,
|
|||
|
|
// #ifndef MP-TOUTIAO
|
|||
|
|
virtualHost: true,
|
|||
|
|
// #endif
|
|||
|
|
styleIsolation: 'shared'
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
</script>
|
|||
|
|
|
|||
|
|
<script setup lang="ts">
|
|||
|
|
import { computed } from 'vue';
|
|||
|
|
import { NoticeBarProps } from './types';
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* noticeBar 滚动通知
|
|||
|
|
* @description 该组件用于滚动通告场景,有多种模式可供选择
|
|||
|
|
* @tutorial https://uviewpro.cn/zh/components/noticeBar.html
|
|||
|
|
* @property {Array} list 滚动内容,数组形式,见上方说明
|
|||
|
|
* @property {String} type 显示的主题(默认warning)
|
|||
|
|
* @property {Boolean} volumeIcon 是否显示小喇叭图标(默认true)
|
|||
|
|
* @property {Boolean} moreIcon 是否显示右边的向右箭头(默认false)
|
|||
|
|
* @property {Boolean} closeIcon 是否显示关闭图标(默认false)
|
|||
|
|
* @property {Boolean} autoplay 是否自动播放(默认true)
|
|||
|
|
* @property {String} color 文字颜色
|
|||
|
|
* @property {String|Number} bgColor 背景颜色
|
|||
|
|
* @property {String} mode 滚动模式(默认horizontal)
|
|||
|
|
* @property {Boolean} show 是否显示(默认true)
|
|||
|
|
* @property {String|Number} fontSize 字体大小,单位rpx(默认28)
|
|||
|
|
* @property {String|Number} volumeSize 左边喇叭的大小(默认34)
|
|||
|
|
* @property {String|Number} duration 滚动周期时长,只对步进模式有效,横向衔接模式无效,单位ms(默认2000)
|
|||
|
|
* @property {String|Number} speed 水平滚动时的滚动速度,即每秒移动多少距离,只对水平衔接方式有效,单位rpx(默认160)
|
|||
|
|
* @property {Boolean} isCircular mode为horizontal时,指明是否水平衔接滚动(默认true)
|
|||
|
|
* @property {String} playState 播放状态,play - 播放,paused - 暂停(默认play)
|
|||
|
|
* @property {String|Number} borderRadius 通知栏圆角(默认为0)
|
|||
|
|
* @property {String|Number} padding 内边距,字符串,与普通的内边距css写法一致(默认"18rpx 24rpx")
|
|||
|
|
* @property {Boolean} noListHidden 列表为空时,是否显示组件(默认false)
|
|||
|
|
* @property {Boolean} disableTouch 是否禁止通过手动滑动切换通知,只有mode = vertical,或者mode = horizontal且isCircular = false时有效(默认true)
|
|||
|
|
* @event {Function} click 点击通告文字触发,只有mode = vertical,或者mode = horizontal且isCircular = false时有效
|
|||
|
|
* @event {Function} close 点击右侧关闭图标触发
|
|||
|
|
* @event {Function} getMore 点击右侧向右图标触发
|
|||
|
|
* @event {Function} end 列表的消息每次被播放一个周期时触发,只有mode = vertical,或者mode = horizontal且isCircular = false时有效
|
|||
|
|
* @example <u-notice-bar :more-icon="true" :list="list"></u-notice-bar>
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
const props = defineProps(NoticeBarProps);
|
|||
|
|
|
|||
|
|
const emit = defineEmits<{
|
|||
|
|
(e: 'click', index: number | undefined): void;
|
|||
|
|
(e: 'close'): void;
|
|||
|
|
(e: 'getMore'): void;
|
|||
|
|
(e: 'end'): void;
|
|||
|
|
}>();
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 是否显示组件
|
|||
|
|
* 如果设置show为false,或者设置了noListHidden为true,且list长度又为零的话,隐藏组件
|
|||
|
|
*/
|
|||
|
|
const isShow = computed(() => {
|
|||
|
|
if (!props.show || (props.noListHidden && props.list.length === 0)) return false;
|
|||
|
|
return true;
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 点击通告栏
|
|||
|
|
*/
|
|||
|
|
function click(index?: number) {
|
|||
|
|
emit('click', index);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 点击关闭按钮
|
|||
|
|
*/
|
|||
|
|
function close() {
|
|||
|
|
emit('close');
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 点击更多箭头按钮
|
|||
|
|
*/
|
|||
|
|
function getMore() {
|
|||
|
|
emit('getMore');
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 滚动一个周期结束,只对垂直,或者水平步进形式有效
|
|||
|
|
*/
|
|||
|
|
function end() {
|
|||
|
|
emit('end');
|
|||
|
|
}
|
|||
|
|
</script>
|
|||
|
|
|
|||
|
|
<style lang="scss" scoped>
|
|||
|
|
@import '../../libs/css/style.components.scss';
|
|||
|
|
.u-notice-bar-wrap {
|
|||
|
|
overflow: hidden;
|
|||
|
|
}
|
|||
|
|
.u-notice-bar {
|
|||
|
|
padding: 18rpx 24rpx;
|
|||
|
|
overflow: hidden;
|
|||
|
|
}
|
|||
|
|
.u-direction-row {
|
|||
|
|
@include vue-flex;
|
|||
|
|
align-items: center;
|
|||
|
|
justify-content: space-between;
|
|||
|
|
}
|
|||
|
|
.u-left-icon {
|
|||
|
|
@include vue-flex;
|
|||
|
|
align-items: center;
|
|||
|
|
}
|
|||
|
|
.u-notice-box {
|
|||
|
|
flex: 1;
|
|||
|
|
@include vue-flex;
|
|||
|
|
overflow: hidden;
|
|||
|
|
margin-left: 12rpx;
|
|||
|
|
}
|
|||
|
|
.u-right-icon {
|
|||
|
|
margin-left: 12rpx;
|
|||
|
|
@include vue-flex;
|
|||
|
|
align-items: center;
|
|||
|
|
}
|
|||
|
|
.u-notice-content {
|
|||
|
|
line-height: 1;
|
|||
|
|
white-space: nowrap;
|
|||
|
|
font-size: 26rpx;
|
|||
|
|
animation: u-loop-animation 10s linear infinite both;
|
|||
|
|
text-align: right;
|
|||
|
|
// 这一句很重要,为了能让滚动左右连接起来
|
|||
|
|
padding-left: 100%;
|
|||
|
|
}
|
|||
|
|
@keyframes u-loop-animation {
|
|||
|
|
0% {
|
|||
|
|
transform: translate3d(0, 0, 0);
|
|||
|
|
}
|
|||
|
|
100% {
|
|||
|
|
transform: translate3d(-100%, 0, 0);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
</style>
|