1、滚动字幕的效果,文字是动态加载的,长度是不定。
2、利用 animation 写个动画好写,但是animation中需要文字滚动位移的距离,transform: translateX(200px);但是由于文字的长度不知道,200px到底是多少呢?不确定。
3、原生js的写法,肯定就是操作dom对象,利用document.get.......获取dom对象,获取文字的宽度,利用文字的宽度,减去父元素可以显示的宽度,就是需要滚动的距离了。
4、在微信小程序中,没有dom对象,获取部分dom信息需要使用 boundingClientRect 方法
let companyWidth = 0
let prjDeptWidth = 0
let detailsWidth = 0
const query = wx.createSelectorQuery()
query.select('#company').boundingClientRect()
query.exec(function (res) {
companyWidth = res[0].width
})
const query1 = wx.createSelectorQuery()
const query2 = wx.createSelectorQuery()
query1.select('#prjDept').boundingClientRect()
query1.exec(function (res) {
prjDeptWidth = res[0].width
})
query2.select('#detailsWidth').boundingClientRect()
query2.exec(function (res) {
detailsWidth = res[0].width
})
5、公司距离的变化就是 文字的长度 - 父元素的宽度
// 公司名称变化的距离
const conpanyPositionWidth = `translateX(-${ companyWidth - detailsWidth + 5}px)`
// 公司部门变化的距离
const prjDeptPositionWidth = `translateX(-${ prjDeptWidth - detailsWidth + 5}px)`
that.setData({
conpanyPositionWidth,
prjDeptPositionWidth
})
6、数据知道了,接下来就是把data中的数据放在wxss中。在wxml里面
<view class="details-cont">
<view id="prjDept" wx:if="{{flagAnimate}}" style="--prjDeptPositionWidth--:{{prjDeptPositionWidth}};--setPrjDeptTime--:{{setPrjDeptTime}}" class="animatePrjDept">
{{userHealthData.prjDept}}
</view>
</view>
7、请仔细看 --prjDeptPositionWidth--:{{prjDeptPositionWidth}}; 写在style中,然后
8.在wxss页面中,这样使用
.animatePrjDept {
position: absolute;
left: 0;
top: 0;
white-space:nowrap;
height: 36rpx;
animation: var(--setPrjDeptTime--);
}
@keyframes wordsLoopPrjDept {
0% {
transform: translateX(0);
}
50% {
transform: var(--prjDeptPositionWidth--);
}
100% {
transform: translateX(0);
}
}
最后看看控制台中显示的数据