CSS实现公告栏文字跑马灯特效(VUE组件)

文章展示了如何在Vue中封装一个名为NoticeBar的组件,该组件用于创建一个从右往左滚动的跑马灯效果。组件接受内容、颜色、字体大小、滚动速度和背景属性,允许自定义显示文本的样式和行为。当鼠标悬停时,滚动会暂停。示例代码提供了组件的完整结构,包括模板、脚本和样式,以及如何在应用中引入和使用该组件。
摘要由CSDN通过智能技术生成

效果图

在这里插入图片描述

VUE组件封装

<template>
    <div class="marquee" :style="{ backgroundColor: bgColor, height: height + 'px' }">
        <span class="marquee__title" ref="marqueeTitle" :style="{ color, fontSize: fontSize + 'px', animationDuration: speed + 's', '--speed': speed }" v-html="title"></span>
    </div>
</template>

<script>
/**
 * NoticeBar 公告栏跑马灯
 * @description 从右往左的跑马灯
 * @property {String} content 显示的内容,支持html
 * @property {String} color 文字颜色,默认#EFF0DB
 * @property {Number} fontSize 文字大小,默认40
 * @property {Number} speed 滚动速度,单位s(播放一次所用时间,默认根据内容宽度计算时间)
 * @property {String} bgColor 背景颜色,默认#CC2529
 * @property {Number} height 背景高度,默认78
 */
export default {
    name: 'NoticeBar',
    props: {
        content: {
            type: String,
            default: ''
        },
        color: {
            type: String,
            default: '#EFF0DB'
        },
        fontSize: {
            type: Number,
            default: 40
        },
        speed: {
            type: Number,
            default: 0
        },
        bgColor: {
            type: String,
            default: '#CC2529'
        },
        height: {
            type: Number,
            default: 78
        }
    },
    data() {
        return {
            DEFAULT_SPEED: 143, // 默认速度,每秒跑的距离,单位:px/s
            title: ''
        };
    },
    watch: {
        content(value) {
            this.title = value;
            this.calcSpeed();
        }
    },
    created() {
        if (this.content) {
            this.title = this.content;
            this.calcSpeed();
        }
    },
    methods: {
        calcSpeed() {
            if (this.title !== '' && this.speed === 0) {
                this.$nextTick(() => {
                    let width = this.$refs.marqueeTitle.clientWidth;
                    this.speed = Number(width / this.DEFAULT_SPEED).toFixed(2);
                });
            }
        }
    }
};
</script>

<style scoped="scoped">
.marquee {
    display: flex;
    align-items: center;
    box-sizing: border-box;
    word-break: break-all;
    white-space: nowrap;
    overflow: hidden;
}
.marquee__title {
    letter-spacing: 3px;
    cursor: default;
    display: inline-block;
    padding-left: 100%;
    animation: marqueeMove calc(var(--speed) * 1s) linear infinite;
}
.marquee:hover .marquee__title {
    animation-play-state: paused;
}
@keyframes marqueeMove {
    0% {
        transform: translateX(0);
    }

    100% {
        transform: translateX(-100%);
    }
}
</style>

使用方式

<template>
    <div id="app">
        <NoticeBar v-if="marquee.cont" :content="marquee.cont"></NoticeBar>
    </div>
</template>

<script>
import NoticeBar from './components/NoticeBar.vue';

export default {
    name: 'app',
    components: {
        NoticeBar
    },
    data() {
        return {
            marquee: {
                cont: '祝大家兔年快乐,身体健康!'
            }
        };
    }
};
</script>

<style>
#app {
    font-family: 'Avenir', Helvetica, Arial, sans-serif;
    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;
    position: fixed;
    top: 0;
    bottom: 0;
    left: 0;
    right: 0;
}
</style>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值