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

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

/**
 * 动画的函数
 * dom 当前对象
 * JSON 传入元素对象的属性 {"width": 300, "opacity": 50}
 * 
 * -------------------- 多物体运动,同时运动 ---传入JSON-------------
 */
let speed1 = 0
export function startAnimation2(dom, JSON, fn) {
  // 注意:针对于多物体运动,定时器的返回值要绑定当前的对象中。offsetWidth获取的是包括border的宽度,所以这里使用getComputed获取width
  clearInterval(dom.timer)
  dom.timer = setInterval(() => {
    let cur = 0
    let 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) / 20
      speed1 = 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) / 100
          break;
        case 'scrollTop':
          dom[attr] = cur + speed1
          break;
        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 = true
  list.currentType = item.type
  nextTick(() => {
    // 文档的顶部到视口顶部的距离 = 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>

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

爬虫零基础学习,第一天,安装环境,requests库常用命令的讲解

Python爬虫 爬虫学习思路 URL内容获取,requests的基本常用语法 import requests # 先向目标网站发送请求 url = "http://www.baidu.com" r

【TensorFlow深度学习】人工智能绪论与深度学习前瞻

人工智能绪论与深度学习前瞻 【引言】人工智能的起源与发展机器学习与深度学习的关系深度学习的兴衰与复兴深度学习的特点与前瞻 【引言】 在信息技术蓬勃发展的今天&#xff0c;人工智能已成为推动科技革新和社会进步的关键驱动力。从最初的计算机辅助人类处理信息&#xff0…

UDP文件传输工具之UDP传输的优点和缺点

在当今快节奏的网络通信时代&#xff0c;UDP以其独特的优势&#xff0c;在众多应用场景中扮演着关键角色。本文将深入探讨UDP的优缺点及其应用场景&#xff0c;并重点介绍镭速软件如何通过技术创新&#xff0c;显著提升UDP传输的效率和可靠性。 UDP传输的优点 UDP的显著优势在…

从奇门WMS-A到金蝶云星空通过接口配置打通数据

从奇门WMS-A到金蝶云星空通过接口配置打通数据 接入系统&#xff1a;奇门WMS-A 用于菜鸟的仓库&#xff08;使用其他支持奇门的仓库同理&#xff09;&#xff0c;故而希望能和仓库的wms系统打通&#xff0c;这样我们采购收货&#xff0c;采购入库&#xff0c;销售出库&#xff…

HTML随机点名程序

案例要求 1.点击点名按钮&#xff0c;名字界面随机显示&#xff0c;按钮文字由点名变为停止 2.再次点击点名按钮&#xff0c;显示当前被点名学生姓名&#xff0c;按钮文字由停止变为点名 案例源码 <!DOCTYPE html> <html lang"en"> <head> <m…

流量反作弊算法简介

参考&#xff1a;流量反作弊算法实践 1. 背景 阅读记录阿里流量作弊的风控文章。甄别阿里妈妈逾千亿商业流量中作弊 与 低质量的部分&#xff0c;保护广告主和平台的利益是风控团队的核心工作之一。 2. 广告风控流程 广告主投放内容与风控团队、下游业务团队的简易交互流程如…

ArrayList与顺序表(2)

前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; hellohello~&#xff0c;大家好&#x1f495;&#x1f495;&#xff0c;这里是E绵绵呀✋✋ &#xff0c;如果觉得这篇文章还不错的话还请点赞❤️❤️收藏&#x1f49e; &#x1f49e; 关注&#x1f4a5;&#x1…

JavaScript中的map()方法详解

1. map() 的返回值是一个新的数组&#xff0c;新数组中的元素为 “原数组调用函数处理过后的值” 2. 简单使用&#xff1a;遍历整个数组&#xff0c;将大于4的元素乘以2 const array [2, 3, 4, 4, 5, 6]console.log("array",array) const map array.map(x > {…

nfs网络存储配置

准备&#xff1a;yum install rpcbind yum install nfs-server 一台服务器&#xff1a;192.168.220.131 一台客户端&#xff1a;192.168.220.220 服务器&#xff1a; 先启动rpcbind服务&#xff1a;systemctl restart rpcbind 在启动…

B站下行CDN架构的探索与应用

本期作者 背景介绍 B站的下行CDN旧架构如下图所示&#xff0c;可以看到边缘CDN节点与中心调度服务有紧密协作&#xff0c;简单说是先由调度服务进行流量调度(负责均衡的调度到每个网关组件节点&#xff09;&#xff0c;再由回源组件进行集群内的回源收敛&#xff0c;最终到对应…

Rust-01 Hello Rust 10分钟上手编写第一个Rust程序 背景介绍 发展历史 环境配置 升级打怪的必经之路

背景介绍 Rust 是一种多范式、通用的编程语言&#xff0c;强调性能、类型安全和并发性。它通过一个称为“借用检查器”的机制在编译时追踪所有引用的对象生命周期&#xff0c;以强制实现内存安全&#xff0c;即确保所有引用都指向有效的内存&#xff0c;而不需要垃圾收集器。 …

Qwen1.5微调

引子 由于工作上需要&#xff0c;一直在用Qwen做大模型推理&#xff0c;有个再训练的需求&#xff0c;特此琢磨下Qwen的训练。OK&#xff0c;我们开始吧。 一、安装环境 查看显卡驱动版本 根据官网推荐 OK&#xff0c;docker在手&#xff0c;天下我有。 docker pull qwenll…

白酒:馥郁香型白酒的香气特点与生产工艺

云仓酒庄的豪迈白酒介绍到&#xff0c;馥郁香型白酒以其与众不同的香气特点和杰出的生产工艺赢得了消费者的青睐。馥郁香型白酒以其香气浓郁、口感醇厚、回味悠长而著称。下面云仓酒庄豪迈白酒将深入探讨馥郁香型白酒的香气特点与生产工艺。 云仓酒庄豪迈白酒讲诉&#xff0c;馥…

go语言并发实战——日志收集系统(六) 编写日志收集系统客户端

上节回顾 在上一篇文章中我们介绍了编写客户端的四个步骤&#xff0c;分别是&#xff1a; 读取配置文件&#xff0c;寻找日志路径初始化服务根据日志路径l来收集日志将收集到的日志发送Kafka中 关于上述的内容博主画了一个思维导图(有点丑&#xff0c;大家勉强看看&#xff0…

flutter 设置启屏页 flutter_native_splash 坑记录

flutter_native_splash | Flutter packageCustomize Flutters default white native splash screen with background color and splash image. Supports dark mode, full screen, and more.https://pub.dev/packages/flutter_native_splash 发现一直白屏 原因是 代码中 下面…

关于Developers网站的一些使用分享

Android Developers 官网使用分享 语音切换android studio 版本下载最新版本下载位置历史版本下载位置 android studio 版本和 AGP 对应关系API 和 android studio 版本和 AGP 对应关系android studio 版本android 版本API levelandroid.hardware.camera2 语音切换 Developers…

要养生也要时尚,益百分满足你的所有需求

要养生也要时尚&#xff0c;益百分满足你的所有需求 艾灸是个好东西&#xff0c;尤其是在近几年的时候&#xff0c;艾灸就像一阵浪潮席卷进了人们的日常生活之中&#xff0c;我们可以在街边看到大大小小的艾灸馆&#xff0c;有些评价比较高的艾灸馆门前甚至还排起了长长的队伍…

在数字化转型过程中,企业的资产管理需要做出哪些调整?

在数字化转型过程中&#xff0c;企业的资产管理做出调整的常见于以下几个方面&#xff1a; 1、提高工作效率&#xff1a;数字化转型能够让员工在部门与部门之间的沟通更加顺畅&#xff0c;节省时间&#xff0c;提高效率。这要求企业在资产管理中采用数字化工具和流程&#xff…

《Chain-of-Thought Prompting Elicits Reasoning in Large Language Models》【大模型思维链】

目录 前言一、思维链介绍1-1、指令1-2、逻辑依据1-3、示例 二、Cot一般分类2-1、Zero-Shot-CoT2-2、Few-Shot-CoT 三、Cot的好处&缺陷&适用3-1、Cot的好处3-2、Cot的缺陷3-3、Cot的适用 四、变体4-1、自我验证&#xff08;self-consistency checking&#xff09; 总结 …

【剪映专业版】03立体自动翻页

【剪映专业版】立体自动翻页制作 1.导入素材&#xff0c;图片或视频均可 2.将素材2拖动至素材1的上方&#xff0c;点击蒙版&#xff0c;选择线性蒙版&#xff0c;并旋转为90度。 3.复制素材1&#xff0c;并拖动到素材2上方&#xff0c;分割并删除后半部分&#xff0c;点击蒙版…