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

本文主要是介绍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>

 

这篇关于vue3中web前端JS动画案例(四)侧边栏横幅效果-右下角广告-淘宝案例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/928809

相关文章

Vue3 的 shallowRef 和 shallowReactive:优化性能

大家对 Vue3 的 ref 和 reactive 都很熟悉,那么对 shallowRef 和 shallowReactive 是否了解呢? 在编程和数据结构中,“shallow”(浅层)通常指对数据结构的最外层进行操作,而不递归地处理其内部或嵌套的数据。这种处理方式关注的是数据结构的第一层属性或元素,而忽略更深层次的嵌套内容。 1. 浅层与深层的对比 1.1 浅层(Shallow) 定义

JS常用组件收集

收集了一些平时遇到的前端比较优秀的组件,方便以后开发的时候查找!!! 函数工具: Lodash 页面固定: stickUp、jQuery.Pin 轮播: unslider、swiper 开关: switch 复选框: icheck 气泡: grumble 隐藏元素: Headroom

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

【 html+css 绚丽Loading 】000046 三才归元阵

前言:哈喽,大家好,今天给大家分享html+css 绚丽Loading!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦 💕 目录 📚一、效果📚二、信息💡1.简介:💡2.外观描述:💡3.使用方式:💡4.战斗方式:💡5.提升:💡6.传说: 📚三、源代码,上代码,可以直接复制使用🎥效果🗂️目录✍️

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

在JS中的设计模式的单例模式、策略模式、代理模式、原型模式浅讲

1. 单例模式(Singleton Pattern) 确保一个类只有一个实例,并提供一个全局访问点。 示例代码: class Singleton {constructor() {if (Singleton.instance) {return Singleton.instance;}Singleton.instance = this;this.data = [];}addData(value)

【区块链 + 人才服务】可信教育区块链治理系统 | FISCO BCOS应用案例

伴随着区块链技术的不断完善,其在教育信息化中的应用也在持续发展。利用区块链数据共识、不可篡改的特性, 将与教育相关的数据要素在区块链上进行存证确权,在确保数据可信的前提下,促进教育的公平、透明、开放,为教育教学质量提升赋能,实现教育数据的安全共享、高等教育体系的智慧治理。 可信教育区块链治理系统的顶层治理架构由教育部、高校、企业、学生等多方角色共同参与建设、维护,支撑教育资源共享、教学质量评估、