小程序两种滚动公告栏的实现方法


Posted in Javascript onSeptember 17, 2019

先上效果图:

小程序两种滚动公告栏的实现方法

小程序两种滚动公告栏的实现方法

横向滚动栏实现:
网上的几种方案或多或少都有一些问题:
1.setData定时器更新text view的margin-left方法,由于setData的毫秒延时,动画播放起来一卡一卡;
2.纯CSS实现,keyframe等,无法实现循环播放的设置;
3.使用string.length*font-size的方法获取字符串像素长度,不够精确,多次循环播放后误差会累积变大。
我采用的animate动画方法,实测动画流畅,循环播放无误差。

横向滚动代码如下所示

// wxml
<view class='notice'>
 <view class="left">
  <text class='iconfont icon-labagonggao voice'></text>
   <view class="left-box">
    <view class="left-text"></view>
    <view class='content-box'>
     <view class='content-text' animation="{{animationData}}"><text id="text">{{text}}</text></view>
    </view>
    <view class="right-text"></view>
   </view>
 </view>
 <view class="right" bindtap="goApp">
  <!-- <image class="app" mode="aspectFit" src="/assets/images/app.png" style="width:{{widthrpx}}rpx" bindload="imageLoad"></image> -->
  <text class="more">更多应用></text>
 </view>
</view>

// wxss
.notice {
 display: flex;
 align-content: center;
 justify-content: space-between;
 padding: 10rpx 25rpx;
 background: #f1f1f1;
}

.left {
 display: flex;
 align-items: center;
}

.voice {
 margin-right: 5rpx;
 margin-top: 2rpx;
 color: #fa6016;
}

.left-box {
 position: relative;
 display: flex;
 align-items: center;
}

.left-text {
 position: absolute;
 left: 0;
 width: 40rpx;
 height: 100%;
 background: linear-gradient(to left,rgba(241,241,241,0),rgba(241,241,241,1));
 z-index: 99;
}

.right-text {
 position: absolute;
 right: -1rpx;
 width: 40rpx;
 height: 100%;
 background: linear-gradient(to left,rgba(241,241,241,1),rgba(241,241,241,0));
 z-index: 99;
}

.content-box {
 overflow: hidden;
 width: 350rpx;
}

.content-text {
 color: #5e5e5e;
 white-space: nowrap;
 font-size: 28rpx;
}

.right {
 display: flex;
 align-items: center;
}

.app {
 height: 48rpx;
}

.more {
 margin-left: 5rpx;
 color: #aaa;
 font-size: 32rpx;
}

// js
 data: {
  text: "1.【评分标准】页可以查看不同年龄段的评分标准,通过首页选择对应的性别、类别和年龄。2.【单项成绩】页包含了详细的单项打分情况及成绩雷达图,直观地看出自己的弱项和强项。",
  animation: null,
  timer: null,
  duration: 0,
  textWidth: 0,
  wrapWidth: 0
 },
 onShow() {
  this.initAnimation(this.data.text)
 },
 onHide() {
  this.destroyTimer()
  this.setData({
   timer: null
  })
 },
 onUnload() {
  this.destroyTimer()
  this.setData({
   timer: null
  })
 },
destroyTimer() {
  if (this.data.timer) {
   clearTimeout(this.data.timer);
  }
 },
 /**
  * 开启公告字幕滚动动画
  * @param {String} text 公告内容
  * @return {[type]} 
  */
 initAnimation(text) {
  let that = this
  this.data.duration = 15000
  this.data.animation = wx.createAnimation({
   duration: this.data.duration,
   timingFunction: 'linear'  
  })
  let query = wx.createSelectorQuery()
  query.select('.content-box').boundingClientRect()
  query.select('#text').boundingClientRect()
  query.exec((rect) => {
   that.setData({
    wrapWidth: rect[0].width,
    textWidth: rect[1].width
   }, () => {
    this.startAnimation()
   })
  })
 },
 // 定时器动画
 startAnimation() {
  //reset
  // this.data.animation.option.transition.duration = 0
  const resetAnimation = this.data.animation.translateX(this.data.wrapWidth).step({ duration: 0 })
  this.setData({
   animationData: resetAnimation.export()
  })
  // this.data.animation.option.transition.duration = this.data.duration
  const animationData = this.data.animation.translateX(-this.data.textWidth).step({ duration: this.data.duration })
  setTimeout(() => {
   this.setData({
    animationData: animationData.export()
   })
  }, 100)
  const timer = setTimeout(() => {
   this.startAnimation()
  }, this.data.duration)
  this.setData({
   timer
  })
 },

sipwer滚动方式代码如下所示

swiper默认为横向滚动,vertical为true,则纵向滚动

// wxml
<!-- 公告 -->
<text class='swiper-notice'>公告:</text>
<swiper class='swiper-container' autoplay='true' vertical='true' circular='true' interval='2000'>
  <block wx:for='{{msgList}}'>
    <navigator url='/pages/notice/notice?title={{item.url}}' open-type='navigate'>
      <swiper-item>
        <view class='swiper-item'>{{item.title}}</view>
      </swiper-item>
    </navigator>
  </block>
</swiper>
<!-- 公告 end -->
// wxss
/* 公告start */
.swiper-notice {
 font-size: 28rpx;
 color:  #fa6016;
}

.swiper-container {
 margin-left: 10rpx;
 width: 400rpx;
 height: 100%;
}

.swiper-item {
 position: absolute;
 top: 50%;
 transform: translateY(-50%);
 width: 100%;
 font-size: 28rpx;
 overflow: hidden;
 text-overflow: ellipsis;
 white-space: nowrap;
 letter-spacing: 2rpx;
}
/* 公告end */

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js关闭模态窗口刷新父页面或跳转页面
Dec 13 Javascript
jqGrid增加时--判断开始日期与结束日期(实例解析)
Nov 08 Javascript
javascript删除option选项的多种方法总结
Nov 22 Javascript
JavaScript实现存储HTML字符串示例
Apr 21 Javascript
node.js中的path.isAbsolute方法使用说明
Dec 08 Javascript
jQuery打字效果实现方法(附demo源码下载)
Dec 18 Javascript
node.js入门教程之querystring模块的使用方法
Feb 27 Javascript
简单的JS控制button颜色随点击更改的实现方法
Apr 17 Javascript
webpack实用小功能介绍
Jan 02 Javascript
深入理解 JS 垃圾回收
Jun 03 Javascript
js数组中去除重复值的几种方法
Aug 03 Javascript
Vue 禁用浏览器的前进后退操作
Sep 04 Javascript
Vue Extends 扩展选项用法完整实例
Sep 17 #Javascript
react native 仿微信聊天室实例代码
Sep 17 #Javascript
Vue 自定义指令功能完整实例
Sep 17 #Javascript
JS扁平化输出数组的2种方法解析
Sep 17 #Javascript
JS代码屏蔽F12,右键,粘贴,复制,剪切,选中,操作实例
Sep 17 #Javascript
uni app仿微信顶部导航条功能
Sep 17 #Javascript
layui 关闭open弹出框 刷新table表格页面的方法
Sep 16 #Javascript
You might like
终于听上了直流胆调频
2021/03/02 无线电
PHP4实际应用经验篇(7)
2006/10/09 PHP
php获取POST数据的三种方法实例详解
2016/12/20 PHP
IE JS编程需注意的内存释放问题
2009/06/23 Javascript
javascript 跳转代码集合
2009/12/03 Javascript
js 数据类型转换总结笔记
2011/01/17 Javascript
详解JS 比较两个Json对象的值是否相等的实例
2013/11/20 Javascript
jQuery自定义事件的简单实现代码
2014/01/27 Javascript
判断一个对象是否为jquery对象的方法
2014/03/12 Javascript
JavaScript中合并数组的N种方法
2014/09/16 Javascript
javascript匿名函数实例分析
2014/11/18 Javascript
WordPress中鼠标悬停显示和隐藏评论及引用按钮的实现
2016/01/12 Javascript
jQuery 判断是否包含在数组中Array[]的方法
2016/08/03 Javascript
vue.js 使用v-if v-else发现没有执行解决办法
2017/05/15 Javascript
ES6入门教程之Array.from()方法
2019/03/23 Javascript
vue实现弹幕功能
2019/10/25 Javascript
JS前端面试必备——基本排序算法原理与实现方法详解【插入/选择/归并/冒泡/快速排序】
2020/02/24 Javascript
在python的WEB框架Flask中使用多个配置文件的解决方法
2014/04/18 Python
详解Python中的文本处理
2015/04/11 Python
python使用opencv按一定间隔截取视频帧
2018/03/06 Python
Python 列表去重去除空字符的例子
2019/07/20 Python
python 叠加等边三角形的绘制的实现
2019/08/14 Python
python爬虫开发之PyQuery模块详细使用方法与实例全解
2020/03/09 Python
使用Python绘制台风轨迹图的示例代码
2020/09/21 Python
Senreve官网:美国旧金山的奢侈手袋品牌
2019/03/21 全球购物
New Balance德国官方网站:购买鞋子和服装
2019/08/31 全球购物
资产经营总监岗位职责范文
2013/12/01 职场文书
《老王》教学反思
2014/02/23 职场文书
竞聘书怎么写,如何写?
2014/03/31 职场文书
大学共青团员个人自我评价
2014/04/16 职场文书
个人安全承诺书
2014/05/22 职场文书
出生公证书
2015/01/23 职场文书
女方离婚起诉书
2015/05/18 职场文书
认识实习感想
2015/08/10 职场文书
股东协议书范本2016
2016/03/21 职场文书
关于React Native使用axios进行网络请求的方法
2021/08/02 Javascript