vue3中web前端JS动画案例(四)侧边栏横幅效果-右下角广告-淘宝案例

myJsAnimation.js, 这里使用了上次封装的动画方法,并进行了改造

/*** 动画的函数* dom 当前对象* JSON 传入元素对象的属性 {"width": 300, "opacity": 50}* * -------------------- 多物体运动,同时运动 ---传入JSON-------------*/
let speed1 = 0
export function startAnimation2(dom, JSON, fn) {// 注意:针对于多物体运动,定时器的返回值要绑定当前的对象中。offsetWidth获取的是包括border的宽度,所以这里使用getComputed获取widthclearInterval(dom.timer)dom.timer = setInterval(() => {let cur = 0let flag = true // 标杆 如果true,证明所有的属性都到达终点值// 0 获取样式属性for (let attr in JSON) {switch (attr) {case 'opacity':cur = Math.round(parseFloat(getStyle(dom, attr)) * 100)break;case 'scrollTop':cur = dom[attr]break;default:cur = parseInt(getStyle(dom, attr))break;}// if (attr === 'opacity') {//   // 求透明度的变化速度,注意!小数需要取整//   cur = Math.round(parseFloat(getStyle(dom, attr)) * 100)// } else {//   // 获取dom宽度或高度等//   cur = parseInt(getStyle(dom, attr))// }// 1、求速度speed1 = (JSON[attr] - cur) / 20speed1 = JSON[attr] > cur ? Math.ceil(speed1) : Math.floor(speed1)// 2、临界处理if (JSON[attr] !== cur) {flag = false}// 3、运动起来switch (attr) {case 'opacity':dom.style[attr] = `alpha(opacity=${cur + speed1})`dom.style[attr] = (cur + speed1) / 100break;case 'scrollTop':dom[attr] = cur + speed1break;default:dom.style[attr] = cur + speed1 + 'px'break;}// if (attr === 'opacity') {//   dom.style[attr] = `alpha(opacity=${cur + speed1})`//   dom.style[attr] = (cur + speed1) / 100// } else {//   dom.style[attr] = cur + speed1 + 'px'// }}if (flag) {clearInterval(dom.timer)if (fn) {fn()}return}}, 30)// dom 是对象, attr 是什么属性// 获取元素属性的方法function getStyle(dom, attr) {if (dom.currentStyle) {// 针对IE浏览器return dom.currentStyle[attr]} else {// 针对 Firefox浏览器return getComputedStyle(dom, null)[attr]}}
}

 index.vue

<script setup>
import { ref, onMounted, onUnmounted, nextTick, watch, reactive } from 'vue'
import { startAnimation2 } from './MyJSAnimation/myJsAnimation2'
// ----------------------- 08 联动效果 ---------------------
// 1、联动效果
// 2、侧边栏横幅
// 3、滚动监听
// 4、轮播图// ------------- 1 右下角联动效果 ------------------
const adRef = ref(null)
const close = () => {startAnimation2(adRef.value, { "height": 160 }, () => {startAnimation2(adRef.value, { "width": 0 }, () => {adRef.value.style.display = 'none'})})
}// ---------------- 2 左侧边栏横幅 --滚动效果----------------
const asideRef = ref(null)
let aside_top = 0
const raside = ref(null)
const handleScroll = (e) => {const lis = raside.value.querySelectorAll('li')const scrollTop = window.scrollY || document.documentElement.scrollTop;console.log('页面滚动距离:', scrollTop);startAnimation2(asideRef.value, { "top": scrollTop + aside_top })// 监听页面滚动,选中右边侧边栏if (!list.isClick) {// 获取页面滚动的高度const scrollTop = window.scrollY || document.documentElement.scrollTop;for (let i = 0; i < lis.length; i++) {if (scrollTop >= list.box[i].offsetTop) {list.currentType = list.items[i].type}}}
}// ----------------3 淘宝案例---------------------
const list = reactive({items: [{ id: 1, name: '爱逛好货', type: '1' },{ id: 2, name: '好店主播', type: '2' },{ id: 3, name: '品质特色', type: '3' },{ id: 4, name: '猜你喜欢', type: '4' }],currentType: '1',isClick: false, // 是否点击右侧边栏box: null, // 所有的大盒子
})
const boxRef = ref(null)
const getStyle = () => {// 上色const color = ['skyblue', 'orange', 'blue', 'purple']for (let index = 0; index < list.box.length; index++) {list.box[index].style.backgroundColor = color[index];}
}// 监听右导航器按钮的点击
const handleClickItem = (item, index) => {list.isClick = truelist.currentType = item.typenextTick(() => {// 文档的顶部到视口顶部的距离 = indx * 文档高度// document.documentElement.scrollTop = index * document.body.clientHeight// console.log(document.documentElement.scrollTop);// 页面动画startAnimation2(document.documentElement, { "scrollTop": index * document.body.clientHeight }, () => {list.isClick = false})})
}onMounted(() => {aside_top = asideRef?.value?.offsetTop // 左侧边栏举例顶部的距离list.box = boxRef.value.querySelectorAll('div')window.addEventListener('scroll', handleScroll);getStyle()
})
onUnmounted(() => {window.removeEventListener('scroll', handleScroll);
});</script><template><div class="info" id="info"><div class="main" id="box" ref="boxRef"><div class="current">爱逛好货</div><div>好店主播</div><div>品质特色</div><div>猜你喜欢</div></div><!-- 右导航器 --><ul class="r-aside" ref="raside"><li v-for="(item, index) in list.items" :key="item.id":class="`${item.type === list.currentType ? 'active' : ''}`" @click="handleClickItem(item, index)"><a href="javascript:void(0)">{{ item.name }}</a></li></ul><!-- 01 右下角广告联动效果 --><div id="ad" ref="adRef"><img src="../assets/vue.svg" alt=""><span id="close" @click="close">X</span></div><!-- 左侧边栏横幅效果 --><div id="aside" ref="asideRef"><img src="../assets/vue.svg" alt=""></div></div>
</template><style scoped lang="less">
.info {display: flex;flex-direction: column;position: relative;.main {width: 1190px;height: 5000px;margin: 0 auto;&>div {width: 100%;height: 100%;text-align: center;font-size: 30px;}}// 01 联动效果#ad {position: fixed;bottom: 0;right: 0;background-color: pink;img {width: 200px;height: 200px;}#close {position: absolute;top: 0;right: 0;width: 20px;height: 20px;text-align: center;line-height: 20px;cursor: pointer;// background-color: skyblue;z-index: 5;}}#aside {position: absolute;top: 200px;left: 0;// transform: translateY(-50%);background-color: pink;img {width: 100px;height: 100px;}}ul {list-style: none;}a {text-decoration: none;}.r-aside {position: fixed;right: 0;top: 50%;transform: translateY(-50%);width: 40px;font-size: 16px;font-weight: 700;text-align: center;li {height: 50px;border-bottom: 1px solid #ddd;a {color: peru;}&.active {background-color: coral;a {color: #fff;}}}}
}
</style>

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/2104.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Nodejs 第六十七章(OpenAI)

OpenAI OpenAI是一个人工智能研究实验室和技术公司&#xff0c;致力于推动人工智能的发展和应用 OpenAI最著名的项目之一是GPT&#xff08;Generative Pre-trained Transformer&#xff09;系列模型&#xff0c;其中包括了GPT-3&#xff0c;它是迄今为止最大规模的语言模型之…

Python | Leetcode Python题解之第43题字符串相乘

题目&#xff1a; 题解&#xff1a; class Solution:def multiply(self, num1: str, num2: str) -> str:if num1 "0" or num2 "0":return "0"m, n len(num1), len(num2)ansArr [0] * (m n)for i in range(m - 1, -1, -1):x int(num1[i…

BI建设案例:FineBI大数据分析平台助力工程机械行业降本增效

工程机械行业作为国民经济的重要支柱&#xff0c;产品多样化、应用广泛&#xff0c;市场集中度高。其上游涉及原材料和核心零部件&#xff0c;下游则与房地产、基建工程和采矿等行业紧密相连。 如今&#xff0c;中国已崛起为全球工程机械制造大国&#xff0c;各类机械产品产量…

Macs Fan Control Pro for Mac:全面优化Mac风扇控制软件

Macs Fan Control Pro for Mac是一款专为苹果电脑用户设计的风扇控制软件&#xff0c;旨在通过精确的风扇速度调节&#xff0c;全面优化Mac的散热性能&#xff0c;确保系统始终运行在最佳状态。 Macs Fan Control Pro for Mac中文版下载 该软件具备实时监控功能&#xff0c;能够…

【CSS】grid 布局一行自动填充,每行最大限定px

<div class"model-plat-content"><div class"mode-card" v-for"i in 30"></div></div>.model-plat-content {display: grid;// 解释&#xff1a; repeat(auto-fit, minmax(250px, 1fr)) 自动填充&#xff0c;每行最大25…

ubuntu apt update:The repository ‘xxx‘ is not signed.报错解决办法(未解决)

文章目录 报错原因及解决办法 报错 rootjax:~# apt update Get:1 file:/var/cuda-repo-l4t-11-4-local InRelease [1575 B] Get:2 file:/var/cudnn-local-repo-ubuntu2004-8.4.1.50 InRelease [1575 B] Get:1 file:/var/cuda-repo-l4t-11-4-local InRelease [1575 B] Get:2 …

通过创新的MoE架构插件缓解大型语言模型的世界知识遗忘问题

在人工智能领域&#xff0c;大型语言模型&#xff08;LLM&#xff09;的微调是提升模型在特定任务上性能的关键步骤。然而&#xff0c;一个挑战在于&#xff0c;当引入大量微调数据时&#xff0c;模型可能会遗忘其在预训练阶段学到的世界知识&#xff0c;这被称为“世界知识遗忘…

vue 脚手架创建

脚手架创建 介绍 脚手架是什么呢&#xff0c;就是vue自动创建脚手架的项目模板&#xff0c;用于搭建项目的整体骨架&#xff0c;就比如后端开发时&#xff0c;咱们可以创建一个空项目&#xff0c;一步步创建为mvc项目&#xff0c;但是vs封装了mvc的框架&#xff0c;我们可以直…

【Python-Pygame】

Python-Pygame ■ Pygame-简介■ Pygame-安装■ Pygame-Rect区域位置■ Pygame-Draw绘图函数■ Pygame-■ Pygame-■ Pygame-■ Pygame-事件监听■ Pygame-Event事件模块■ Pygame-游戏循环■ Pygame-Display显示模块■ Pygame-Time时间控制■ Pygame-Font文本和字体■ Pygame-…

计算机网络-IS-IS链路状态数据库同步

在建立IS-IS邻接关系之后&#xff0c;路由器开始发送LSP报文进行链路状态数据库进行同步。 一、链路状态数据库同步 LSP&#xff08; Link State PDU&#xff0c;链路状态报文&#xff09; 用于交换链路状态信息。LSP分为两种&#xff1a;Level–1 LSP和Level–2 LSP。Level–1…

一文学会Amazon transit GateWay

这是一个中转网关&#xff0c;使用时候需要在需要打通的VPC内创建一个挂载点&#xff0c;TGW会管理一张路由表来决定流量的转发到对应的挂载点上。本质上是EC2的请求路由到TGW&#xff0c;然后在查询TGW的路由表来再来决定下一跳&#xff0c;所以需要同时修改VPC 内子网的路由表…

力扣刷题学习python(跟随视频学着刷)

使用入门 视频链接 【手把手带你刷Leetcode力扣&#xff5c;各个击破数据结构和算法&#xff5c;大厂面试必备技能【已完结】-哔哩哔哩】 https://b23.tv/vIcRT61 时空复杂度 时间&#xff1a; 空间&#xff1a;主要有O(1)和O(n)两种 数组 特点&#xff1a;适合读多写少 操作…

阿赵UE学习笔记——29、Niagara制作火焰效果

阿赵UE学习笔记目录 大家好&#xff0c;我是阿赵。   继续学习虚幻引擎&#xff0c;之前简单介绍了Niagara粒子系统&#xff0c;这次用Niagara系统做一个火焰的效果。 一、创建发射器 和之前介绍的一样&#xff0c;先创建一个空白的发射器&#xff1a; 我把这个发射器命名为…

货代是什么?如何选择靠谱的FBA头程货代公司?

在全球化的浪潮中&#xff0c;跨境电商业务如雨后春笋般蓬勃发展&#xff0c;货代公司作为连接卖家与市场的关键桥梁&#xff0c;其重要性也愈发凸显。货代公司不仅提供从起始地到目的地的货物运输服务&#xff0c;还在复杂的物流流程中发挥着不可或缺的作用。特别是在亚马逊等…

报错The chromedriver version cannot be discovered以及下载chromedriver.exe和查看其版本的命令

python3.8.10&#xff0c;win10。 谷歌浏览器版本&#xff08;我写代码的时候还是123.0.x.x&#xff0c;没几天就自动更新到124.0.x.x了&#xff09;&#xff1a; 在使用selenium的时候&#xff0c;出现报错&#xff0c;The chromedriver version cannot be discovered。 &am…

面试宝典(1)——数据库篇(MySQL)

面试宝典&#xff08;1&#xff09;——数据库篇&#xff08;MySQL&#xff09; 1.什么是索引&#xff1f; 索引是一种用于加快数据库查询速度的数据结构。 索引可以帮助数据库快速定位到数据库表中特定列的记录&#xff0c;从而加快数据检索和查询的速度。 通过在表的列上…

基于51单片机的宠物自动喂食语音播报,有实物

1. 51仿真&#xff1a; LCD第一屏显示食物重量&#xff0c;当前时间&#xff0c;温湿度。第二屏显示喂食时间&#xff0c;第三屏显示喂食重量。可通过点击查看喂食时间翻转屏幕显示。 点击查看喂食时间后&#xff0c;显示喂食时间&#xff0c;可以设置三个时间&#xff0c;再点…

【Flume】简介、安装和入门案例(一)

Flume 简介 概述 Flume本身是由Cloudera公司开发的后来贡献给了Apache的一套针对日志数据进行收集(collecting)、汇聚(aggregating)和传输(moving)的机制 Flume本身提供了简单且灵活的结构来完成日志数据的传输 Flume有两大版本&#xff1a; Flume0.X&#xff1a;又称之为…

HTML 如何实现一个带间隙的圆环

实际效果&#xff1a; ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/5e634cedded9424d96fbe6d46f34f61a.png#pic_center 代码实现&#xff1a; HTML部分&#xff1a; <svg width"500" height"500" viewBox"0 0 100 100">&…

《精准表达》让你的方案在最短的时间内打动人心 - 三余书屋 3ysw.net

精准表达&#xff1a;让你的方案在最短的时间内打动人心 大家好&#xff0c;今天我们要解读的书名为《精准表达》&#xff0c;其副标题是“让你的方案在最短的时间内打动人心”。在工作中&#xff0c;人们经常需要提交各种方案&#xff0c;例如销售人员向大客户介绍公司产品时…