微信小程序自定义组件——跑马灯

微信小程序自定义组件——跑马灯

引言

基于小程序一直没有跑马灯的组件,自己在抽空的时候做了个跑马灯,效果还不错,可以直接使用。

组件布局

<view class="marquee-wrap" style="width: {{parentWidth - 20}}rpx;">
  <view class="marquee-text" style="width: {{contentWidth}}rpx;font-size: {{fontSize}}rpx;color: {{color}};left: {{left}}rpx;">{{content}}</view>
</view>

组件效果配置

.marquee-wrap {
  position: relative;
  display: flex;
  flex-direction: column;
  height: 60rpx;
  overflow: hidden;
  padding: 10rpx;
  background-color: #3b7df5b0;
  align-items: center;
  border-radius: 20rpx;
}
.marquee-text {
  position: absolute;
  top: 10rpx;
  left: 0rpx;
  overflow: hidden;
}

组件代码

// components/marquee/index.js

let marqueeTask = null;

Component({
  pageLifetimes: {
    show: function() {
      // 页面被展示
      this.startMarquee();
    },
    hide: function() {
      // 页面被隐藏
      this.stopMarquee();
    },
    resize: function(size) {
      // 页面尺寸变化
    }
  },
  /**
   * 组件的属性列表
   */
  properties: {
    content: {
      type: String,
      value: ''
    },
    contentWidth: {// text组件的宽度
      type: Number,
      value: 0
    },
    fontSize: { // 字体大小
      type: Number,
      value: 24
    },
    color: { // 字体颜色
      type: String|Number,
      value: '#333333'
    },
    parentWidth: { // text父组件的宽度
      type: Number,
      value: 0
    },
    left: { // text组件的偏移量
      type: Number,
      value: 0
    },
    timeInterval: { // 移动间隔时间,单位ms
      type: Number,
      value: 180
    },
    distance: { // 每次移动的距离, 单位rpx
      type: Number,
      value: 24
    }
  },

  /**
   * 组件的初始数据
   */
  data: {

  },

  /**
   * 组件的方法列表
   */
  methods: {
    startMarquee() {
      console.log('startMarquee parentWidth =' + this.data.parentWidth + '  contentWidth = ', this.data.contentWidth);
      if (this.data.parentWidth >= this.data.contentWidth) {
        return;
      }
      this.stopMarquee();
      marqueeTask = setInterval(() => {
        let left = this.data.left;
        const distance = this.data.distance;
        const width = -this.data.contentWidth;
        left -= distance;
        if (left - distance <= width) {
          left = -width;
        }
        // console.log('startMarquee left = ', left)
        this.setData({
          left
        })
      }, this.data.timeInterval);
    },
    stopMarquee() {
      if (marqueeTask == 0 || marqueeTask) {
        clearInterval(marqueeTask);
        marqueeTask = null;
      }
    }
  }
})

转载请写明原著地址

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jjr_1984

谢谢您的鼓励!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值