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

uniapp小程序中实现无缝衔接滚动效果

组件滚动通知只能实现简单的滚动效果,不能实现滚动内容中的字进行不同颜色的更改,下面实现一个无缝衔接的滚动动画,可以根据自己的需要进行艺术化的更改需要滚动的内容,也可以自定义更改滚动速度。

<template><view class="container"><!-- 文字滚动条 --><view v-for="(item, index) in scrollItems" :key="'text-' + index"class="scroll" :style="{'--t': item.duration + 's'}"><view class="scroll-row"><text v-for="(skill, i) in skills" :key="i"class="skill-tag"@click="handleSkillClick(skill)">{{ skill }}</text></view><view class="scroll-row"><text v-for="(skill, i) in skills" :key="i + 'copy'"class="skill-tag"@click="handleSkillClick(skill)">{{ skill }}</text></view></view><!-- 彩色方块滚动条 --><view class="scroll img-box" style="--t: 25s"><view class="scroll-row"><view v-for="n in 9" :key="n"class="color-box" :style="{'--r': (n-1)*40}"@click="changeBoxColor(n)">{{ n }}</view></view><view class="scroll-row"><view v-for="n in 9" :key="n + 'copy'"class="color-box" :style="{'--r': (n-1)*40}"@click="changeBoxColor(n)">{{ n }}-1</view></view></view></view>
</template>
<script setup>
import { ref } from 'vue'const skills = ref(['HTML', 'CSS', 'JavaScript', 'Vue', 'React', 'Figma', 'Photoshop'
])const scrollItems = ref([{ duration: 20 },{ duration: 30 },{ duration: 10 },{ duration: 35 }
])const handleSkillClick = (skill) => {uni.showToast({title: `点击了: ${skill}`,icon: 'none'})
}const changeBoxColor = (n) => {// 在实际应用中,你可能需要找到对应的DOM元素来修改样式// 这里只是演示点击事件uni.showToast({title: `点击了方块 ${n}`,icon: 'none'})
}
</script>
<style>
/* 基础样式 */
.container {min-height: 100vh;background-color: #222;color: #fff;display: flex;flex-direction: column;justify-content: center;align-items: center;padding: 20px;
}/* 滚动容器 */
.scroll {position: relative;display: flex;width: 700px;overflow: hidden;-webkit-mask-image: linear-gradient(90deg, transparent, #fff 20%, #fff 80%, transparent);mask-image: linear-gradient(90deg, transparent, #fff 20%, #fff 80%, transparent);margin: 15px 0;
}/* 滚动行 */
.scroll-row {white-space: nowrap;will-change: transform;
}/* 技能标签 */
.skill-tag {display: inline-block;margin: 10px;padding: 8px 15px;background-color: #333;border-radius: 5px;letter-spacing: 0.2em;text-transform: uppercase;transition: all 0.3s ease;box-shadow: 0 4px 8px rgba(0,0,0,0.2);
}.skill-tag:active {background-color: #4caf50;transform: scale(1.05);box-shadow: 0 6px 12px rgba(0,0,0,0.3);
}/* 彩色方块 */
.img-box {display: flex;column-gap: 10px;
}.color-box {width: 150px;height: 150px;background-color: #ff3e3e;filter: hue-rotate(calc(var(--r) * 1deg));display: flex;justify-content: center;align-items: center;font-weight: bold;font-size: 1.5em;border-radius: 8px;margin: 0 10px;transition: all 0.5s ease;
}.color-box:active {transform: rotate(15deg) scale(1.1);box-shadow: 0 8px 16px rgba(0,0,0,0.3);
}/* 动画效果 */
.scroll-row:first-child {animation: animate var(--t) linear infinite;animation-delay: calc(var(--t) * -1);
}.scroll-row:nth-child(2) {animation: animate2 var(--t) linear infinite;animation-delay: calc(var(--t) / -2);
}@keyframes animate {0% { transform: translateX(100%); }100% { transform: translateX(-100%); }
}@keyframes animate2 {0% { transform: translateX(0); }100% { transform: translateX(-200%); }
}/* 响应式设计 */
@media screen and (max-width: 768px) {.scroll {width: 95vw;}.skill-tag {padding: 5px 10px;font-size: 0.8em;}.color-box {width: 20vw;height: 20vw;font-size: 1em;}
}
</style>

相关文章:

  • Nginx高级配置
  • 用go从零构建写一个RPC(仿gRPC,tRPC)--- 版本2
  • 宝蓝德中间件部署war包时,配置的绝对路径读取错误。
  • LabVIEW多通道并行数据存储系统
  • llama.cpp无法使用gpu的问题
  • 基于CNN卷积神经网络的带频偏QPSK调制信号检测识别算法matlab仿真
  • Redis 集群
  • 视觉革命来袭!ComfyUI-LTXVideo 让视频创作更高效
  • Java常用类概述
  • 【STM32 学习笔记】USART串口
  • 【验证码】⭐️集成图形验证码实现安全校验
  • Skyvern:用 AI+视觉驱动浏览器自动化
  • Flink 实时数据一致性与 Exactly-Once 语义保障实战
  • 安装或更新 CUDA Toolkit - Ubuntu - RuntimeError
  • 翻转数位题目解释和代码
  • Pandas:数据处理与分析
  • 金融学知识笔记
  • 学习适应对智能软件对对象的属性进行表征、计算的影响
  • 深入了解 ArkTS:HarmonyOS 开发的关键语言与应用实践
  • 什么是向量数据库?向量数据库和关系数据库有什么区别?
  • 刘元春在《光明日报》撰文:以法治护航民营经济高质量发展
  • 卢正已任上海市司法局党委委员、副局长
  • 重温经典|开播20周年,仙剑的那些幕后你知道吗?
  • 印方称所有敌对行动均得到反击和回应,不会升级冲突
  • 新修订的《婚姻登记条例》明起施行,领证不用户口本了
  • 明星同款撕拉片,为何能炒到三四百一张?