当前位置: 首页 > news >正文

Vue3文字实现左右和上下滚动

可自定义设置以下属性:

滚动文字数组(sliderText),类型:Array<{title: string, link?: string}>,必传,默认[]

滚动区域宽度(width),类型:number | string,默认 ‘100%’

滚动区域高度(height),类型:number,单位px,默认 60

滚动区域背景色(backgroundColor),类型:string,默认 ‘#FFF’

滚动区域展示条数,水平滚动时生效(amount),类型:number,默认 4

水平滚动文字各列间距或垂直滚动文字两边的边距(gap),类型:number,单位px,默认 20

是否垂直滚动(vertical),类型:boolean,默认 false

文字滚动时间间隔,垂直滚动时生效(interval),类型:number,单位ms,默认 3000

详见:描述

1:创建文字滚动组件TextScroll.vue:

<script setup lang="ts">
import { ref, computed, onMounted } from 'vue'
import { requestAnimationFrame, cancelAnimationFrame, rafTimeout, cancelRaf } from '../index'
interface Text {title: string // 文字标题link?: string // 跳转链接
}
interface Props {sliderText: Text[] // 滚动文字数组width?: number|string // 滚动区域宽度,单位pxheight?: number // 滚动区域高度,单位pxbackgroundColor?: string // 滚动区域背景色amount?: number // 滚动区域展示条数,水平滚动时生效gap?: number // 水平滚动文字各列间距或垂直滚动文字两边的边距,单位pxvertical?: boolean // 是否垂直滚动interval?: number // 文字滚动时间间隔,单位ms,垂直滚动时生效
}
const props = withDefaults(defineProps<Props>(), {sliderText: () => [],width: '100%',height: 60,backgroundColor:  '#FFF',amount: 4,gap: 20,vertical: false,interval: 3000,
})
// horizon
const left = ref(0)
const fpsRaf = ref(0) // fps回调标识
const moveRaf = ref() // 一个 long 整数,请求 ID ,是回调列表中唯一的标识。是个非零值,没别的意义
const fps = ref(60)
const textData = ref<Text[]>([...props.sliderText])
const horizonRef = ref()
const distance = ref(0) // 每条滚动文字移动距离const step = computed(() => { // 移动参数(120fps: 0.5, 60fps: 1)if (fps.value === 60) {return 1} else {return 60 / fps.value}
})
function getFPS () { // 获取屏幕刷新率// @ts-ignoreconst requestAnimationFrame = window.requestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame || window.msRequestAnimationFramevar start: any = nullfunction timeElapse (timestamp: number) {/*timestamp参数:与performance.now()的返回值相同,它表示requestAnimationFrame() 开始去执行回调函数的时刻*/if (!start) {if (fpsRaf.value > 10) {start = timestamp}fpsRaf.value = requestAnimationFrame(timeElapse)} else {fps.value = Math.floor(1000 / (timestamp - start))console.log('fps', fps.value)distance.value = getDistance() // 获取每列文字宽度onStart() // 开始滚动}}fpsRaf.value = requestAnimationFrame(timeElapse)
}
function getDistance ():number {return parseFloat((horizonRef.value.offsetWidth / props.amount).toFixed(2))
}
function moveLeft () {if (left.value >= distance.value) {textData.value.push(textData.value.shift() as Text) // 将第一条数据放到最后left.value = 0} else {left.value += step.value // 每次移动step(px)}moveRaf.value = requestAnimationFrame(moveLeft)
}const totalWidth = computed(() => { // 文字滚动区域总宽度if (typeof props.width === 'number') {return props.width + 'px'} else {return props.width}
})
const len = computed(() => {return props.sliderText.length
})
onMounted(() => {if (props.vertical) {onStart() // 启动垂直滚动} else {getFPS()}
})
function onStart () {if (props.vertical) {if (len.value > 1) {startMove() // 开始滚动}} else {if (textData.value.length > props.amount) { // 超过amount条开始滚动moveRaf.value = requestAnimationFrame(moveLeft) // 开始动画}}
}
function onStop () {if (props.vertical) {if (len.value > 1) {cancelRaf(timer)}} else {cancelAnimationFrame(moveRaf.value) // 暂停动画}
}
const emit = defineEmits(['click'])
function onClick (title: string) { // 通知父组件点击的标题emit('click', title)
}// vertical
const actIndex = ref(0)
var timer: any = nullfunction startMove () {timer = rafTimeout(() => {if (actIndex.value === len.value - 1) {actIndex.value = 0} else {actIndex.value++}startMove()}, props.interval)
}
</script>
<template><div v-if="!vertical" class="m-slider-horizon" @mouseenter="onStop" @mouseleave="onStart" ref="horizonRef" :style="`height: ${height}px; width: ${totalWidth}; background: ${backgroundColor};`"><a:style="`will-change: transform; transform: translateX(${-left}px); width: ${distance - gap}px; margin-left: ${gap}px;`"class="u-slide-title"v-for="(text, index) in textData":key="index":title="text.title":href="text.link ? text.link:'javascript:;'":target="text.link ? '_blank':'_self'"@click="onClick(text.title)">{{ text.title || '--' }}</a></div><div v-else class="m-slider-vertical" @mouseenter="onStop" @mouseleave="onStart" :style="`height: ${height}px; width: ${totalWidth}; background: ${backgroundColor};`"><TransitionGroup name="slide"><divclass="m-slider":style="`width: calc(${totalWidth} - ${2*gap}px); height: ${height}px;`"v-for="(text, index) in sliderText":key="index"v-show="actIndex===index"><aclass="u-slider":title="text.title":href="text.link ? text.link:'javascript:;'":target="text.link ? '_blank':'_self'"@click="onClick(text.title)">{{ text.title }}</a></div></TransitionGroup></div>
</template>
<style lang="less" scoped>
// 水平滚动
.m-slider-horizon {box-shadow: 0px 0px 5px #D3D3D3;border-radius: 6px;white-space: nowrap;overflow: hidden;text-align: center; // 水平居中&:after { // 垂直居中content: '';height: 100%;display: inline-block;vertical-align: middle;}.u-slide-title {display: inline-block;vertical-align: middle;font-size: 16px;color: #333;font-weight: 400;overflow: hidden;text-overflow: ellipsis;white-space: nowrap;cursor: pointer;&:hover {color: @themeColor;}}
}// 垂直滚动
.slide-enter-active, .slide-leave-active {transition: all 1s ease;
}
.slide-enter-from {transform: translateY(50px) scale(0.6);opacity: 0;
}
.slide-leave-to {transform: translateY(-50px) scale(0.6);opacity: 0;
}
.m-slider-vertical {position: relative;overflow: hidden;border-radius: 6px;.m-slider {position: absolute;left: 0;right: 0;margin: 0 auto;text-align: center; // 水平居中&:after { // 垂直居中content: '';height: 100%;display: inline-block;vertical-align: middle;}.u-slider {max-width: 100%;display: inline-block;vertical-align: middle;font-size: 18px;line-height: 28px;color: #333;overflow: hidden;white-space: nowrap;text-overflow: ellipsis;cursor: pointer;&:hover {color: @themeColor;}}}
}
</style>

2:在要使用的页面引入

<script setup lang="ts">
import TextScroll from './TextScroll.vue'
import { ref } from 'vue'
const sliderText = ref([{title: '美国作家杰罗姆·大卫·塞林格创作的唯一一部长篇小说',link: 'https://www.baidu.com'},{title: '首次出版于1951年'},{title: '塞林格将故事的起止局限于16岁的中学生霍尔顿·考尔菲德从离开学校到纽约游荡的三天时间内,塞林格将故事的起止局限于16岁的中学生霍尔顿·考尔菲德从离开学校到纽约游荡的三天时间内'},{title: '并借鉴了意识流天马行空的写作方法,充分探索了一个十几岁少年的内心世界'},{title: '愤怒与焦虑是此书的两大主题,主人公的经历和思想在青少年中引起强烈共鸣'}])
function onClick (value: string) { // 获取点击的标题console.log('value:', value)
}
</script>
<template><div><h2 class="mb10">TextScroll 横向文字滚动基本使用</h2><TextScroll:sliderText="sliderText"@click="onClick"width="100%":amount="4"backgroundColor="#FFF":height="50" /><h2 class="mt30 mb10">垂直文字滚动基本使用 (vertical)</h2><TextScroll:sliderText="sliderText"@click="onClick"verticalbackgroundColor="#e6f4ff":gap="60":interval="3000"width="100%":height="60" /></div>
</template>
<style lang="less" scoped>
</style>

相关文章:

Vue3文字实现左右和上下滚动

可自定义设置以下属性&#xff1a; 滚动文字数组&#xff08;sliderText&#xff09;&#xff0c;类型&#xff1a;Array<{title: string, link?: string}>&#xff0c;必传&#xff0c;默认[] 滚动区域宽度&#xff08;width&#xff09;&#xff0c;类型&#xff1a…...

Docker Sybase修改中文编码

镜像&#xff1a;datagrip/sybase 镜像默认用户名sa&#xff0c;密码myPassword&#xff0c;服务名MYSYBASE 1.进入容器 docker exec -it <container_name> /bin/bash2.加载Sybase环境变量 source /opt/sybase/SYBASE.sh3.查看是否安装了中文字符集 isql -Usa -PmyP…...

【SpringCloud Alibaba】(六)使用 Sentinel 实现服务限流与容错

今天&#xff0c;我们就使用 Sentinel 实现接口的限流&#xff0c;并使用 Feign 整合 Sentinel 实现服务容错的功能&#xff0c;让我们体验下微服务使用了服务容错功能的效果。 因为内容仅仅围绕着 SpringCloud Alibaba技术栈展开&#xff0c;所以&#xff0c;这里我们使用的服…...

mysql的主从复制

1.主从复制的原理 主从复制的原理是通过基于日志的复制方式实现数据的同步。当主服务器上发生数据变更时&#xff0c;会将这些变更写入二进制日志&#xff08;Binary Log&#xff09;中。从服务器通过连接到主服务器&#xff0c;请求从主服务器获取二进制日志&#xff0c;并将…...

【Golang 接口自动化03】 解析接口返回XML

目录 解析接口返回数据 定义结构体 解析函数&#xff1a; 测试 优化 资料获取方法 上一篇我们学习了怎么发送各种数据类型的http请求&#xff0c;这一篇我们来介绍怎么来解析接口返回的XML的数据。 解析接口返回数据 定义结构体 假设我们现在有一个接口返回的数据resp如…...

Java+bcprov库实现对称和非对称加密算法

BouncyCastle&#xff0c;即BC&#xff0c;其是一款开源的密码包&#xff0c;包含了大量的密码算法。 本篇主要演示BC库引入&#xff0c;对称加密算法AES、SM4和 非对称加密EC算法的简单实现&#xff0c;以下是实现过程。 一、将BC添加到JRE环境 前提&#xff1a;已安装JRE环…...

国内最大Llama开源社区发布首个预训练中文版Llama2

"7月31日&#xff0c;Llama中文社区率先完成了国内首个真正意义上的中文版Llama2-13B大模型&#xff0c;从模型底层实现了Llama2中文能力的大幅优化和提升。毋庸置疑&#xff0c;中文版Llama2一经发布将开启国内大模型新时代&#xff01; | 全球最强&#xff0c;但中文短板…...

Qt应用开发(基础篇)——滑块类 QSlider、QScrollBar、QDial

目录 一、前言 二、QAbstractSlider类 1、invertedAppearance 2、invertedControls 3、maximum 4、minimum 5、orientation 6、pageStep 7、singleStep 8、sliderDown 9、tracking 10、sliderPosition 11、value 12、信号 三、QDial类 1、notchSize 2、notchTa…...

【3-D深度学习:肺肿瘤分割】创建和训练 V-Net 神经网络,并从 3D 医学图像中对肺肿瘤进行语义分割研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

MongoDB文档--架构体系

阿丹&#xff1a; 在开始学习先了解以及目标知识的架构体系。就能事半功倍。 架构体系 MongoDB的架构体系由以下几部分组成&#xff1a; 存储结构&#xff1a;MongoDB采用文档型存储结构&#xff0c;一个数据库包含多个集合&#xff0c;一个集合包含多个文档。存储形式&#…...

GEE学习03-Geemap配置与安装,arcgis pro自带命令提示符位置等

跟着吴秋生老师的视频开展的学习&#xff0c;首先购买了云&#xff0c;用来设置全局。 1、尝试使用arcgis pro自带的conda conda env list查看电脑上环境&#xff0c;我自己电脑上有三个环境&#xff0c;使用的arcgis pro python克隆的环境作为的默认的环境 但是这样的前提…...

软件测试面试总结——http协议相关面试题

前言 在PC浏览器的地址栏输入一串URL&#xff0c;然后按Enter键这个页面渲染出来&#xff0c;这个过程中都发生了什么事?这个是很多面试官喜欢问的一个问题 如果测试只是停留在表面上点点点&#xff0c;不知道背后的逻辑&#xff0c;是无法发现隐藏的bug&#xff0c;只能找一…...

大数据与okcc呼叫中心融合的几种方式

在实际的生产实践中&#xff0c;为提高营销效率&#xff0c;避免骚扰大众&#xff0c;很多呼叫中心业务会与大数据平台进行合作&#xff0c;进行精准营销。 买卖数据是非法的&#xff0c;大数据平台方并不会提供直接的数据&#xff0c;一般情况下&#xff0c;提供的数据都是脱…...

WAF绕过-工具特征-菜刀+冰蝎+哥斯拉

WAF绕过主要集中在信息收集&#xff0c;漏洞发现&#xff0c;漏洞利用&#xff0c;权限控制四个阶段。 1、什么是WAF&#xff1f; Web Application Firewall&#xff08;web应用防火墙&#xff09;&#xff0c;一种公认的说法是“web应用防火墙通过执行一系列针对HTTP/HTTPS的安…...

使代码减半的5个Python装饰器

大家好&#xff0c;到目前为止&#xff0c;Python编程语言由于其语法简单&#xff0c;在机器学习和网络开发等各个领域的应用功能强大。除非绝对必要&#xff0c;装饰器一般很少出现在视野中&#xff0c;比如使用staticmethod装饰器来表示类中的静态方法。装饰器能提供的大量强…...

线程池的线程回收问题

首先&#xff0c;线程池里面分为核心线程和非核心线程。 核心线程是常驻在线程池里面的工作线程&#xff0c;它有两种方式初始化。 向线程池里面添加任务的时候&#xff0c;被动初始化主动调用prestartAllCoreThreads方法 当线程池里面的队列满了的情况下&#xff0c;为了增加…...

盘点那些不想骑车的原因和借口。

在自行车骑行的热潮中&#xff0c;我们都会找到各种千奇百怪的借口来解释我们为什么不想骑。本文将结合当前热点话题和趋势&#xff0c;从心理学、文化等多个角度&#xff0c;深入探讨这些借口背后的原因。 首先&#xff0c;我们不能忽视的是&#xff0c;骑行是一项需要耐力和毅…...

【深度学习Week3】ResNet+ResNeXt

ResNetResNeXt 一、ResNetⅠ.视频学习Ⅱ.论文阅读 二、ResNeXtⅠ.视频学习Ⅱ.论文阅读 三、猫狗大战Lenet网络Resnet网络 四、思考题 一、ResNet Ⅰ.视频学习 ResNet在2015年由微软实验室提出&#xff0c;该网络的亮点&#xff1a; 1.超深的网络结构&#xff08;突破1000层&…...

Visual Studio 2022的MFC框架全面理解

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;今天我们来重新审视一下Visual Studio 2022开发工具下的MFC框架知识。 MFC(Microsoft Foundation Class&#xff0c;微软基础类库&#xff09;是微软为了简化程序员的开发工作所开发的一套C类的集合&#xf…...

C# 消息队列 (MSMQ) 进程之间的通信

2个程序之间使用消息队列进行通信。 该代码只适用.NET Framework 版本&#xff0c;如果是.NET Core 请使用其他第三方消息队列框架&#xff0c;因为.NET Core 对System.Messaging 已经不支持呢。 进程1用于创建消息队列&#xff0c;然后发送消息。 代码如下: using System; u…...

RestClient

什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端&#xff0c;它允许HTTP与Elasticsearch 集群通信&#xff0c;而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级&#xff…...

基于FPGA的PID算法学习———实现PID比例控制算法

基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容&#xff1a;参考网站&#xff1a; PID算法控制 PID即&#xff1a;Proportional&#xff08;比例&#xff09;、Integral&#xff08;积分&…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器

——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的​​一体化测试平台​​&#xff0c;覆盖应用全生命周期测试需求&#xff0c;主要提供五大核心能力&#xff1a; ​​测试类型​​​​检测目标​​​​关键指标​​功能体验基…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例

文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

【决胜公务员考试】求职OMG——见面课测验1

2025最新版&#xff01;&#xff01;&#xff01;6.8截至答题&#xff0c;大家注意呀&#xff01; 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:&#xff08; B &#xff09; A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

ardupilot 开发环境eclipse 中import 缺少C++

目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具

第2章 虚拟机性能监控&#xff0c;故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令&#xff1a;jps [options] [hostid] 功能&#xff1a;本地虚拟机进程显示进程ID&#xff08;与ps相同&#xff09;&#xff0c;可同时显示主类&#x…...

Go 语言并发编程基础:无缓冲与有缓冲通道

在上一章节中&#xff0c;我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道&#xff0c;它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好&#xff0…...