vue3+ts-数据自动滚动效果

 html

<template>
	<div class="background">
		<div class="border">
			<div class="lt"></div>
			<div class="rt"></div>
			<div class="lb"></div>
			<div class="rb"></div>
		</div>
	</div>
	<div class="screen">
		<div class="mask"></div>
		<div class="innerbg">
			<table cellspacing="0">
				<tr>
					<td>IP 196.168.123.134 以游客访问该网站</td>
				</tr>
				<tr>
					<td>IP 110.168.123.134 以游客访问该网站</td>
				</tr>
				<tr>
					<td>IP 106.168.123.134 以游客访问该网站</td>
				</tr>
				<tr>
					<td>IP 186.168.123.134 以游客访问该网站</td>
				</tr>
				<tr>
					<td>IP 161.168.123.134 以游客访问该网站</td>
				</tr>
				<tr>
					<td>IP 116.168.123.134 以游客访问该网站</td>
				</tr>
				<tr>
					<td>IP 145.168.123.134 以游客访问该网站</td>
				</tr>
				<tr>
					<td>IP 126.168.123.134 以游客访问该网站</td>
				</tr>
				<tr>
					<td>IP 196.168.123.134 以游客访问该网站</td>
				</tr>
				<tr>
					<td>IP 161.168.123.134 以游客访问该网站</td>
				</tr>
				<tr>
					<td>IP 116.168.123.134 以游客访问该网站</td>
				</tr>
				<tr>
					<td>IP 145.168.123.134 以游客访问该网站</td>
				</tr>
				<tr>
					<td>IP 126.168.123.134 以游客访问该网站</td>
				</tr>
				<tr>
					<td>IP 196.168.123.134 以游客访问该网站</td>
				</tr>
				<tr>
					<td>IP 196.168.123.134 以老板访问该网站</td>
				</tr>
			</table>
		</div>
	</div>
</template>

css

<style scoped lang="less">
	* {
		margin: 0;
		padding: 0;
	}

	.background {
		position: absolute;
		width: 500px;
		height: 140px;
		box-sizing: border-box;
		top: 250px;
		background-color: rgb(162, 112, 112);
		left: 50%;
		transform: translate(-50%);
		z-index: -3;
	}

	.border {
		position: absolute;
		top: -5px;
		left: -5px;
		width: 510px;
		height: 150px;
		background-color: rgb(225, 255, 254);
		/* z-index: -4; */
		border: 2px solid rgb(72, 99, 255);
		box-sizing: border-box;
	}

	.lt {
		position: absolute;
		width: 30px;
		height: 30px;
		background-color: rgb(72, 99, 255);
		top: -4px;
		left: -4px;
		z-index: -10;
	}

	.rt {
		position: absolute;
		width: 30px;
		height: 30px;
		background-color: rgb(72, 99, 255);
		top: -4px;
		right: -4px;
		z-index: -10;
	}

	.lb {
		position: absolute;
		width: 30px;
		height: 30px;
		background-color: rgb(72, 99, 255);
		bottom: -4px;
		left: -4px;
		z-index: -10;
	}

	.rb {
		position: absolute;
		width: 30px;
		height: 30px;
		background-color: rgb(72, 99, 255);
		bottom: -4px;
		right: -4px;
		z-index: -10;
	}

	.screen {
		position: relative;
		width: 500px;
		height: 140px;
		box-sizing: border-box;
		margin: 250px auto;
		background-color: transparent;
		overflow: hidden;
		cursor: pointer;
	}

	.innerbg {
		position: absolute;
		top: 0px;
		width: 100%;
		background-color: rgb(0, 8, 229);
		z-index: -2;
	}

	table {
		width: 100%;
		border: 1px solid grey;
	}

	tr {
		width: 100%;
		// height: 20px;
	}

	td {
		width: 100%;
		height: 30px;
		border-bottom: 1px solid grey;
		text-align: center;
		color: #fff;
	}

	.mask {
		position: absolute;
		top: 0;
		left: 0;
		width: 500px;
		height: 140px;
		background-image: linear-gradient(
			to bottom,
			rgba(29, 29, 29, 0.726),
			rgba(62, 62, 62, 0.448),
			rgba(255, 255, 255, 0),
			rgba(60, 60, 60, 0.505),
			rgba(31, 31, 31, 0.764)
		);
	}
</style>

js

<script setup lang="ts">
	import { onMounted } from 'vue'

	const state = reactive({
		inner: null as unknown as HTMLElement,
		screen: null as unknown as HTMLElement,
		mask: null as unknown as HTMLElement,
	})

	const { inner, screen, mask } = toRefs(state)

	onMounted(() => {
		inner.value = document.querySelector('.innerbg') as HTMLElement
		screen.value = document.querySelector('.screen') as HTMLElement
		mask.value = document.querySelector('.mask') as HTMLElement
		let timer = window.setInterval(animate, 16)

		mask.value.addEventListener('mouseover', function () {
			window.clearInterval(timer)
		})
		mask.value.addEventListener('mouseout', function () {
			timer = window.setInterval(animate, 16)
		})
	})
	function animate() {
		// 467 - 140
		if (inner.value.offsetTop === -(inner.value.offsetHeight - screen.value.offsetHeight + 10)) {
			inner.value.style.top = 0 + 'px'
		} else {
			let l = inner.value.offsetTop
			l = l - 1
			inner.value.style.top = l + 'px'
		}
	}

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值