vue3使用平移+过渡实现消息滚动,鼠标移入停止移出继续(动画动态设置偏移量太麻烦,定时器性能太差)

这段代码展示了一个在Vue.js中实现的文本滚动效果。当内联<span>元素的宽度超过其外层<div>容器时,会触发过渡动画,使文本平移自身宽度以隐藏超出部分。通过监听鼠标enter、mouseout和transitionend事件,控制过渡的开始、暂停和重置,实现了用户交互式的文本滚动展示。
摘要由CSDN通过智能技术生成

模板代码

外面的div用来限定显示宽度和隐藏超出区域,里面的span让文本把宽度撑起来

<div style="overflow: hidden;white-space: nowrap;">
<span :style="messageViewStyle"ref="messageView">{{ message }}</span>
</div>

js代码

获取文本盒子对象,比较它的宽度与它父盒子的宽度,宽度小于父盒子消息就不用滚动,宽度大于父盒子就给文本盒子绑上移入、移出、过渡结束事件和动态修改它的样式,给自己的innerText翻个倍,让它平移自己宽度的身位,设置计算过渡时间(字越多过渡时间越长),在过渡结束事件里重新设置平移开始新的过渡,在移入事件里重新设置平移和设置过渡延迟(只要够大就是暂停),在移出事件里重新设置平移和移除延迟

import { onMounted, ref } from 'vue'

const message = ref('')
message.value =
	'-------------------------------------------------------考试成绩公式:2023年第一批次考核成绩公式,公式时间截止:2023年9月24日18点30分------------------------------------------------------------------------------------------------------------------'
const messageView = ref(null)
const messageViewStyle = reactive({
	display: 'inline-block',
	cursor: 'pointer'
})
let nowStatus = 0
let offset = 0
let time
const stopTransition = () => {
	messageViewStyle['transform'] = `translateX(0px)`
	messageViewStyle['transition-delay'] = `100000s`
}
const conTransition = () => {
	messageViewStyle['transition-delay'] = `0s`
	messageViewStyle['transform'] = `translateX(${nowStatus}px)`
}
onMounted(() => {
	if (messageView.value.parentNode.offsetWidth < messageView.value.offsetWidth) {
		offset = 0 - messageView.value.offsetWidth
		messageView.value.innerText = message.value + message.value
		nowStatus = offset
		messageViewStyle['transform'] = `translateX(${nowStatus}px)`
		time = Math.floor(-offset / 60)
		messageViewStyle['transition-property'] = `transform`
		messageViewStyle['transition-duration'] = `${time}s`
		messageViewStyle['transition-timing-function'] = 'linear'
		messageView.value.addEventListener('mouseenter', stopTransition)
		messageView.value.addEventListener('mouseout', conTransition)
		messageView.value.addEventListener('transitionend', () => {
			if (nowStatus != 0) {
				messageViewStyle['transition-duration'] = `1ms`
				nowStatus = 0
			} else {
				messageViewStyle['transition-duration'] = `${time}s`
				nowStatus = offset
			}
			messageViewStyle['transform'] = `translateX(${nowStatus}px)`
		})
	}
})

总结

主要是过渡的特性就是尽管一个元素处于过渡状态中,新的过渡动画也会立即从当前样式开始,而不是直接跳转到 CSS 的最终状态。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值