微信小程序:公告字幕滚动播放(文字跑马灯效果)

本文详细介绍如何在微信小程序中实现公告文字滚动动画,包括需求分析、解决思路、具体实现步骤及代码示例,适用于公告内容长度变化的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、需求

  • 公告文字仅限200字
  • 公告内容仅限一行文字显示
  • 公告内容持续滚动

二、解决思路

  • 使用动画API(Animation.translate),完成移动动画
  • 使用定时器API(setInterval),完成循环播放动画

注意:

  1. 微信小程序的动画APItranslate,只有动画效果还原后,才能进行第二次动画
  2. 根据第一条,需要两个定时器:
    第一个定时器:用于循环复原动画效果
    第二个定时器:用于循环播放动画效果
  3. 两个定时器的执行回调函数之间的时间间隔不能相同,否则会导致动画无法正常播放
  4. 优化上述两个步骤为只用一个定时器来循环两个动画,采用中间睡眠一段时间,错开两个动画的播放开始时间
  5. 因为动画的偏移距离由公告内容长度决定,造成了动画播放速度与公告内容相关。
    (动画的duration: 1000:表示在该时间段内播放完整组动画)

三、实现效果

1.字幕第一次开始公告旁边(从右向左)滚动
字幕第一次开始公告旁边(从右向左)滚动
2.字幕第二次从屏幕左边从右向左)滚动
字幕第二次从屏幕左边从右向左)滚动

三、实现代码

1.wxml

    <view class='width border-box f-pl30 f-pr30 f-mt30 f-mb30'>
        <form report-submit="true" bindsubmit="bindOpenAnnouncement">
            <button class='btn-reset flex announcement order-box f-pl25 f-pr25' form-type="submit">
                <view class='f-pl25 f-font24 f-pr25'>公告</view>
                <view class='f-font24 s-32 announcement-context'>
                    <view animation="{{animationData}}" class="f-font24 s-32 announcement-text f-text-left">{{announcementText}}</view>
                </view>
            </button>
        </form>
    </view>

2.wxss(此处只展示关键样式,其余为基本样式不做展示)

.announcement {
    color: #a0a0a0;
    background: #fff0e3;
    border-radius: 6rpx;
    line-height: 66rpx;
    height: 66rpx;
}
.announcement-context {
    width: 580rpx;
    /* 偏移出文本框的内容隐藏掉 */
    overflow: hidden;
}
.announcement-text {
    width: 570rpx;
    /* 文字内容只做一行显示 */
    white-space: nowrap;
}

3.js

   data: {
        animationData: {}, //公告动画
        announcementText: "营业时间从早上10点到晚上8点,支持预先下单,祝用餐愉快",//公告内容
    },

    onLoad: function(options) {
        var that = this;
        //创建动画实例
        var animation = wx.createAnimation({
            //此处以公告最长内容来设置动画持续时间(duration:决定整个动画播放的速度)
            duration: 90000,
            timingFunction: 'linear'
        });
        //偏移距离为公告内容的长度*字体大小(若字体大小使用rpx需要换算成px)
        animation.translate(-Number(this.data.announcementText.length * 12),0).step();
        this.setData({
            animationData: animation.export()
        });
        // 循环播放动画关键步骤(使用两个定时器)
        // 第一个定时器:将字幕恢复到字幕开始点(为屏幕左边)
        this.recoveraAnimation = setInterval(function() {
            animation.translate(255,0).step({duration:0});
            this.setData({
                animationData: animation.export()
            });
        }.bind(this), 90000);
        // 第二个定时器:重新开始移动动画
        this.restartAnimation = setInterval(function() {
            animation.translate(-Number(this.data.announcementText.length * 12),0).step();
            this.setData({
                animationData: animation.export()
            });
        }.bind(this), 90001);
    },
    onUnload: function(){
        //清除定时器
        clearInterval(this.recoveraAnimation);
        clearInterval(this.restartAnimation);
    },

优化后的js

/**
     * 开启公告字幕滚动动画
     * @param  {String} announcementText 公告内容
     * @return {[type]}                  [description]
     */
    initAnimation: function(announcementText) {
        var that = this;
        //初始化动画
        var animation = wx.createAnimation({
            duration: 22500,
            timingFunction: 'linear'
        });
        animation.translate(-Number(announcementText.length * 12), 0).step();
        that.setData({
            animationData: animation.export()
        });
        
		/****************************优化部分*******************************/
        // 重新开始动画
        that.restartAnimation = setInterval(function() {
            animation.translate(255, 0).step({
                duration: 0
            });
            that.setData({
                animationData: animation.export()
            });
            // 延迟5再执行下个动画
            that.sleep(5);
            animation.translate(-Number(announcementText.length * 12), 0).step();
            that.setData({
                animationData: animation.export()
            });
        }.bind(this), 22500);
    },
    
    /**
     * 睡眠时间
     * @param  {Number} num 需要延迟的时间长度
     */
    sleep: function(num){
        var nowTime = new Date();
        var exitTime = nowTime.getTime() + num;
        while(true){
            nowTime = new Date();
            if(nowTime.getTime() > exitTime)
            return;
        }
    },
### 微信小程序实现从下到上滚动字幕效果 为了实现在微信小程序中的从下到上滚动字幕效果,可以采用`<scroll-view>`组件并配合CSS动画来完成这一需求。下面是一个具体的实例说明如何创建这种类型的滚动字幕。 #### WXML结构设计 首先,在页面对应的`.wxml`文件里构建基本框架,这里使用了`<scroll-view>`标签作为容器,并设置了方向属性为纵向(`vertical`)以便于控制内部元素沿竖直轴移动: ```html <view class="marquee-container"> <scroll-view scroll-y="{{true}}" bindscrolltoupper="onScrollToUpper" style="height:{{itemHeight}}rpx;" class="marquee-box"> <!-- 动态绑定数据 --> <block wx:for="{{marqueeItems}}" wx:key="index"> <text class="marquee-item">{{item}}</text> </block> </scroll-view> </view> ``` #### WXSS样式编写 接着是在关联的`.wxss`文件中定义具体外观以及关键帧动画规则,通过调整`.marquee-box`的高度和单个项目占据的空间大小,能够改变显示区域内的可见项数量;同时利用`animation`属性让内容按照设定的速度持续向上滑动[^1]。 ```css .marquee-container { overflow: hidden; } .marquee-box { padding-top: {{itemHeight}}rpx; /* 预留顶部空间 */ animation-name: marqueeUp; animation-duration: 8s; /* 单次循环耗时 */ animation-timing-function: linear; animation-iteration-count: infinite;/* 设置无限重复播放 */ } @keyframes marqueeUp{ from { transform: translateY(0); } to { transform: translateY(-100%);} } /* 调整每一行的具体表现形式 */ .marquee-item { line-height: {{lineHeight}}rpx; font-size: 32rpx; color: #fff; white-space: nowrap; } ``` #### JS逻辑处理 最后,在JavaScript部分初始化一些必要的参数值,比如每条记录之间的间距、整个视窗能容纳多少条目等,并监听到达顶端事件以重置位置防止溢出[^2]。 ```javascript Page({ data: { itemHeight: 60, // 每一项高度(px) lineHeight: 60, // 行高(px),通常等于itemHeight marqueeItems: [ '这是第一条滚动的消息', '第二条消息的内容更长一点哦~', ... ] }, onScrollToUpper(){ const query = wx.createSelectorQuery(); let that = this; query.select('.marquee-box').boundingClientRect(function(rect){ if (rect.top <= -that.data.itemHeight){ var tempArr = [...this.data.marqueeItems]; tempArr.push(tempArr.shift()); // 将第一个元素移到数组末尾形成循环 this.setData({marqueeItems :tempArr}); } }).exec() } }) ``` 上述代码片段展示了怎样在一个简单的微信小程序项目内制作具有从底部向顶部连续流动特性的跑马灯式文本展示区。值得注意的是,实际应用过程中可能还需要考虑更多细节上的优化,例如性能调优、兼容性测试等问题[^3]。
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值