js实现网页特效

news2025/1/20 14:54:30

文章目录

  • 一、元素偏移量offest系列
    • 🥇offset与style的区别
    • 🎓案例1
    • 🦹🏽‍♂️案例2
    • 🐼案例3
  • 二、元素可视区client系列
  • 三、元素滚动scroll系列
    • 🏂🏿案例4:
    • 🔭补充 mouseenter事件
  • 四、动画函数封装
    • 💎动画函数简单封装操作
    • ☯️缓动动画原理
    • 🎅🏾缓动动画多个目标之间移动
    • 🍂动画函数添加回调函数
    • 🦦动画函数封装到单独JS文件里面


一、元素偏移量offest系列

offset系列相关属性可以动态的得到该元素的位置(偏移量)、大小等

  • 获取元素举例带有定位父元素的位置
  • 获取元年苏自身的大小(宽度,高度)
  • 注意:返回的数值都不带单位

在这里插入图片描述

实际运用:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style>
      * {
        margin: 0;
        padding: 0;
      }

      .father {
        position: relative;
        width: 200px;
        height: 200px;
        background-color: pink;
        margin: 100px;
      }

      .son {
        width: 100px;
        height: 100px;
        background-color: blue;
        margin-left: 45px;
      }

      .w {
        width: 200px;
        height: 200px;
        background-color: skyblue;
        margin: 0 auto 200px;
        padding: 10px;
        border: 10px solid red;
      }
    </style>
  </head>
  <body>
    <div class="father">
      <div class="son"></div>
    </div>
    <div class="w"></div>
    <script>
      var father = document.querySelector(".father");
      var son = document.querySelector(".son");
      //offset 系列
      console.log(father.offsetTop);
      console.log(father.offsetLeft);
      //以带有定位的父亲为准,如果没有父亲或者没有定位,则以body为准
      console.log(son.offsetLeft);
      //可以得到元素的大小 宽度和高度
      var w = document.querySelector(".w");
      console.log(w.offsetWidth);
      console.log(w.offsetHeight);  //padding和border都会对大小产生影响
      //返回带有定位的父亲,否则返回的是body
      console.log(son.offsetParent);
      console.log(son.parentNode);  //返回最近一级的父亲,不管父亲有没有定位
    </script>
  </body>
</html>

结果如下:

在这里插入图片描述

🥇offset与style的区别

在这里插入图片描述

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .box{
            width: 200px;
            height: 200px;
            background-color: pink;
        }
    </style>
</head>
<body>
    <div class="box"></div>
    <script>
        //offset与style的区别
        var box=document.querySelector('.box')
        console.log(box.offsetWidth);
        console.log(box.style.width);
        //offset是只读属性
        box.style.width="300px" //一定要用引号引起来
    </script>
</body>
</html>

🎓案例1

获取鼠标在盒子内的坐标

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style>
      .box {
        width: 300px;
        height: 300px;
        background-color: pink;
        margin: 200px;
      }
    </style>
  </head>
  <body>
    <div class="box"></div>
    <script>
      var box = document.querySelector(".box");
      box.addEventListener("mousemove", function (e) {
        // console.log(e.pageX);
        // console.log(e.pageY);
        // console.log(box.offsetLeft);
        var x = e.pageX - this.offsetLeft;
        var y = e.pageY - this.offsetTop;
        this.innerHTML = "x的坐标是" + x + "y的坐标是" + y;
      });
    </script>
  </body>
</html>

效果如下:

在这里插入图片描述

🦹🏽‍♂️案例2

模态框拖拽

<!DOCTYPE html>
<html>
  <head lang="en">
    <meta charset="UTF-8" />
    <title></title>
    <style>
      .login-header {
        width: 100%;
        text-align: center;
        height: 30px;
        font-size: 24px;
        line-height: 30px;
      }

      ul,
      li,
      ol,
      dl,
      dt,
      dd,
      div,
      p,
      span,
      h1,
      h2,
      h3,
      h4,
      h5,
      h6,
      a {
        padding: 0px;
        margin: 0px;
      }

      .login {
        display: none;
        width: 512px;
        height: 280px;
        position: fixed;
        border: #ebebeb solid 1px;
        left: 50%;
        top: 50%;
        background: #ffffff;
        box-shadow: 0px 0px 20px #ddd;
        z-index: 9999;
        transform: translate(-50%, -50%);
      }

      .login-title {
        width: 100%;
        margin: 10px 0px 0px 0px;
        text-align: center;
        line-height: 40px;
        height: 40px;
        font-size: 18px;
        position: relative;
        cursor: move;
      }

      .login-input-content {
        margin-top: 20px;
      }

      .login-button {
        width: 50%;
        margin: 30px auto 0px auto;
        line-height: 40px;
        font-size: 14px;
        border: #ebebeb 1px solid;
        text-align: center;
      }

      .login-bg {
        display: none;
        width: 100%;
        height: 100%;
        position: fixed;
        top: 0px;
        left: 0px;
        background: rgba(0, 0, 0, 0.3);
      }

      a {
        text-decoration: none;
        color: #000000;
      }

      .login-button a {
        display: block;
      }

      .login-input input.list-input {
        float: left;
        line-height: 35px;
        height: 35px;
        width: 350px;
        border: #ebebeb 1px solid;
        text-indent: 5px;
      }

      .login-input {
        overflow: hidden;
        margin: 0px 0px 20px 0px;
      }

      .login-input label {
        float: left;
        width: 90px;
        padding-right: 10px;
        text-align: right;
        line-height: 35px;
        height: 35px;
        font-size: 14px;
      }

      .login-title span {
        position: absolute;
        font-size: 12px;
        right: -20px;
        top: -30px;
        background: #ffffff;
        border: #ebebeb solid 1px;
        width: 40px;
        height: 40px;
        border-radius: 20px;
      }
    </style>
  </head>

  <body>
    <div class="login-header">
      <a id="link" href="javascript:;">点击,弹出登录框</a>
    </div>
    <div id="login" class="login">
      <div id="title" class="login-title">
        登录会员
        <span
          ><a id="closeBtn" href="javascript:void(0);" class="close-login"
            >关闭</a
          ></span
        >
      </div>
      <div class="login-input-content">
        <div class="login-input">
          <label>用户名:</label>
          <input
            type="text"
            placeholder="请输入用户名"
            name="info[username]"
            id="username"
            class="list-input"
          />
        </div>
        <div class="login-input">
          <label>登录密码:</label>
          <input
            type="password"
            placeholder="请输入登录密码"
            name="info[password]"
            id="password"
            class="list-input"
          />
        </div>
      </div>
      <div id="loginBtn" class="login-button">
        <a href="javascript:void(0);" id="login-button-submit">登录会员</a>
      </div>
    </div>
    <!-- 遮盖层 -->
    <div id="bg" class="login-bg"></div>
    <script>
      // 1. 获取元素
      var login = document.querySelector(".login");
      var mask = document.querySelector(".login-bg");
      var link = document.querySelector("#link");
      var closeBtn = document.querySelector("#closeBtn");
      var title = document.querySelector("#title");
      // 2. 点击弹出层这个链接 link  让mask 和login 显示出来
      link.addEventListener("click", function () {
        mask.style.display = "block";
        login.style.display = "block";
      });
      // 3. 点击 closeBtn 就隐藏 mask 和 login
      closeBtn.addEventListener("click", function () {
        mask.style.display = "none";
        login.style.display = "none";
      });
      // 4. 开始拖拽
      // (1) 当我们鼠标按下, 就获得鼠标在盒子内的坐标
      title.addEventListener("mousedown", function (e) {
        var x = e.pageX - login.offsetLeft;
        var y = e.pageY - login.offsetTop;
        // (2) 鼠标移动的时候,把鼠标在页面中的坐标,减去 鼠标在盒子内的坐标就是模态框的left和top值
        document.addEventListener("mousemove", move);

        function move(e) {
          login.style.left = e.pageX - x + "px";
          login.style.top = e.pageY - y + "px";
        }
        // (3) 鼠标弹起,就让鼠标移动事件移除
        document.addEventListener("mouseup", function () {
          document.removeEventListener("mousemove", move);
        });
      });
    </script>
  </body>
</html>

效果如下:

在这里插入图片描述

中间模块可拖动

🐼案例3

京东放大镜(是前两个案例的综合实现)

需要可以去该地址下载

https://download.csdn.net/download/qq_39321234/87376880

二、元素可视区client系列

作用:获取元素的大小,边框的大小

在这里插入图片描述

client和offset最大的区别就是不包含边框

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        div{
            width: 200px;
            height: 200px;
            background-color: pink;
        }
    </style>
</head>
<body>
    <div></div>
    <script>
        var div=document.querySelector('div')
        console.log(div.clientWidth);
    </script>
</body>
</html>

立即执行函数:

不需要调用,能够了立马自己执行

立即执行函数最大的作用就算独立创建了一个作用域,里面所有的变量都是局部变量,不会有命名冲突的情况

语法1:

    <script>
        //写法1
        (function() {
            console.log();
        })()
    </script>

语法2:

    <script>
    //语法2:
        (function sum(){

        }())
    </script>

示例:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script>
      //也可以传递参数
      (function (a, b) {	//匿名函数
        console.log(a + b);
      })(1, 2);
      
      (function sum(a, b) {
        console.log(a + b);
      })(2, 3);
    </script>
  </body>
</html>

三、元素滚动scroll系列

作用:可以动态的得到元素的大小,滚动举例等

在这里插入图片描述

示例:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style>
      div {
        width: 200px;
        height: 200px;
        background-color: pink;
        border: 10px solid red;
        padding: 10px;
        overflow: auto;
      }
    </style>
  </head>
  <body>
    <div>
      我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容
      我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容
      我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容
      我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容
      我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容
      我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容
      我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容
      我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容
      我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容
      我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容
      我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容
      我是内容 我是内容 我是内容 我是内容 我是内容 我是内容
    </div>
    <script>
      var div = document.querySelector("div");
      console.log(div.scrollHeight);
      console.log(div.clientHeight);
      console.log(div.scrollTop);
      //滚动事件当我们滚动条发生变化会触发的事件
    </script>
  </body>
</html>

🏂🏿案例4:

仿淘宝固定侧边栏(有兼容性问题)

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>Document</title>
    <style>
      .slider-bar {
        position: absolute;
        left: 50%;
        top: 300px;
        margin-left: 600px;
        width: 45px;
        height: 130px;
        background-color: pink;
      }

      .w {
        width: 1200px;
        margin: 10px auto;
      }

      .header {
        height: 150px;
        background-color: purple;
      }

      .banner {
        height: 250px;
        background-color: skyblue;
      }

      .main {
        height: 1000px;
        background-color: yellowgreen;
      }

      span {
        display: none;
        position: absolute;
        bottom: 0;
      }
    </style>
  </head>

  <body>
    <div class="slider-bar">
      <span class="goBack">返回顶部</span>
    </div>
    <div class="header w">头部区域</div>
    <div class="banner w">banner区域</div>
    <div class="main w">主体部分</div>
    <script>
      //1. 获取元素
      var sliderbar = document.querySelector(".slider-bar");
      var banner = document.querySelector(".banner");
      // banner.offestTop 就是被卷去头部的大小 一定要写到滚动的外面
      var bannerTop = banner.offsetTop;
      // 当我们侧边栏固定定位之后应该变化的数值
      var sliderbarTop = sliderbar.offsetTop - bannerTop;
      // 获取main 主体元素
      var main = document.querySelector(".main");
      var goBack = document.querySelector(".goBack");
      var mainTop = main.offsetTop;
      // 2. 页面滚动事件 scroll
      document.addEventListener("scroll", function () {
        // console.log(11);
        // window.pageYOffset 页面被卷去的头部
        // console.log(window.pageYOffset);
        // 3 .当我们页面被卷去的头部大于等于了 172 此时 侧边栏就要改为固定定位
        if (window.pageYOffset >= bannerTop) {
          sliderbar.style.position = "fixed";
          sliderbar.style.top = sliderbarTop + "px";
        } else {
          sliderbar.style.position = "absolute";
          sliderbar.style.top = "300px";
        }
        // 4. 当我们页面滚动到main盒子,就显示 goback模块
        if (window.pageYOffset >= mainTop) {
          goBack.style.display = "block";
        } else {
          goBack.style.display = "none";
        }
      });
    </script>
  </body>
</html>

存在侧边栏文字显示不出来的问题,可以通过封装自定义函数解决

🔭补充 mouseenter事件

当鼠标移动到元素上就会触发mouseenter事件
类似mouseover,两者事件的区别是
mouseenter鼠标经过自身盒子会触发,经过子盒子还会触发,mouseenter只会经过自身盒子触发

四、动画函数封装

核心原理:

通过定时器setInterval()不断移动盒子位置

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style>
      div {
        position: absolute;
        left: 0;
        width: 100px;
        height: 100px;
        background-color: pink;
      }
    </style>
  </head>
  <body>
    <div></div>
    <script>
      var div = document.querySelector("div");
      var timer = setInterval(function () {
        if (div.offsetLeft >= 400) {    //实现停止动画
          clearInterval(timer);
        }
        div.style.left = div.offsetLeft + 1 + "px";	//不要忘记单位
      }, 10);
    </script>
  </body>
</html>

💎动画函数简单封装操作

动画函数封装的好处
可以个模块同时使用,不相互冲突

示例:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style>
      /* 动画中必须加定位 */
      div {
        position: absolute;
        left: 0;
        width: 100px;
        height: 100px;
        background-color: pink;
      }

      span {
        position: absolute;
        left: 0;
        top: 200px;
        display: block;
        width: 150px;
        height: 150px;
        background-color: purple;
      }
    </style>
  </head>
  <body>
    <div></div>
    <span></span>
    <script>
      function animate(obj, target) {
        var timer = setInterval(function () {
          if (obj.offsetLeft >= target) {
            //实现停止动画
            clearInterval(obj.timer);
          }
          obj.style.left = obj.offsetLeft + 1 + "px";
        }, 10);
      }
      var div = document.querySelector("div");
      var span = document.querySelector("span");
      //调用函数
      animate(div, 300);
      animate(span, 800);
    </script>
  </body>
</html>

具体效果为两个小块同向匀速运动

动画中必须加定位,absolute和relative都可以

利用给对象添加属性的方法对函数进行赋值操作

但程序存在一个小bug
例如下面这段代码:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style>
      /* 动画中必须加定位 */
      div {
        position: absolute;
        left: 0;
        width: 100px;
        height: 100px;
        background-color: pink;
      }

      span {
        position: absolute;
        left: 0;
        top: 200px;
        display: block;
        width: 150px;
        height: 150px;
        background-color: purple;
      }
    </style>
  </head>
  <body>
    <button>点击下面</button>
    <div></div>
    <span></span>
    <script>
      function animate(obj, target) {
        //给不同的元素指定了不同的定时器
        obj.timer = setInterval(function () {
          if (obj.offsetLeft >= target) {
            //实现停止动画
            clearInterval(obj.timer);
          }
          obj.style.left = obj.offsetLeft + 1 + "px";
        }, 10);
      }

      var div = document.querySelector("div");
      var span = document.querySelector("span");
      var btn = document.querySelector("button");
      //调用函数
      animate(div, 300);
      btn.addEventListener("click", function () {
        animate(span, 1800);
      });
    </script>
  </body>
</html>

点击次数越多,紫块走得越快

在这里插入图片描述

解决方法就是每次调用函数前清除以前的定时器,保留当前的定时器执行

添加如下代码:

clearInterval(obj.timer)

☯️缓动动画原理

缓动动画就是让元素的运动速度有变化,最常见的是让速度慢慢停下来

核心算法:
(目标值-现在的位置)/10 作为每次移动的步长

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style>
      /* 动画中必须加定位 */
      div {
        position: absolute;
        left: 0;
        width: 100px;
        height: 100px;
        background-color: pink;
      }

      span {
        position: absolute;
        left: 0;
        top: 200px;
        display: block;
        width: 150px;
        height: 150px;
        background-color: purple;
      }
    </style>
  </head>
  <body>
    <button>点击下面</button>
    <div></div>
    <span></span>
    <script>
      function animate(obj, target) {
        //给不同的元素指定了不同的定时器
        clearInterval(obj.timer);
        obj.timer = setInterval(function () {
          //步长值写到定时器内部
          var step = (target - obj.offsetLeft) / 10;
          if (obj.offsetLeft >= target) {
            //实现停止动画
            clearInterval(obj.timer);
          }
          //把每次加1的步长值,改为一个慢慢变小的值
          obj.style.left = obj.offsetLeft + step + "px";
        }, 30);
      }

      var div = document.querySelector("div");
      var span = document.querySelector("span");
      var btn = document.querySelector("button");
      //调用函数
      animate(div, 300);
      btn.addEventListener("click", function () {
        animate(span, 1800);
      });
    </script>
  </body>
</html>

🎅🏾缓动动画多个目标之间移动

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style>
      /* 动画中必须加定位 */
      div {
        position: absolute;
        left: 0;
        width: 100px;
        height: 100px;
        background-color: pink;
      }

      span {
        position: absolute;
        left: 0;
        top: 200px;
        display: block;
        width: 150px;
        height: 150px;
        background-color: purple;
      }
    </style>
  </head>
  <body>
    <button class="btn500">500</button>
    <button class="btn800">800</button>
    <div></div>
    <span></span>
    <script>
      function animate(obj, target) {
        //给不同的元素指定了不同的定时器
        clearInterval(obj.timer);
        obj.timer = setInterval(function () {
          //步长值写到定时器内部
          var step = Math.ceil((target - obj.offsetLeft) / 10);
          if (obj.offsetLeft >= target) {
            //实现停止动画
            clearInterval(obj.timer);
          }
          //把每次加1的步长值,改为一个慢慢变小的值
          obj.style.left = obj.offsetLeft + step + "px";
        }, 30);
      }

      var div = document.querySelector("div");
      var span = document.querySelector("span");
      var btn500 = document.querySelector(".btn500");
      var btn800 = document.querySelector(".btn800");
      //调用函数
      animate(div, 300);
      btn500.addEventListener("click", function () {
        animate(span, 500);
      });
      btn800.addEventListener("click", function () {
        animate(span, 800);
      });
    </script>
  </body>
</html>

因为小数的原因不会回到原位
所以需要一个判断条件

step = step > 0 ? Math.ceil(step) : Math.floor(step);

🍂动画函数添加回调函数

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>Document</title>
    <style>
      div {
        position: absolute;
        left: 0;
        width: 100px;
        height: 100px;
        background-color: pink;
      }

      span {
        position: absolute;
        left: 0;
        top: 200px;
        display: block;
        width: 150px;
        height: 150px;
        background-color: purple;
      }
    </style>
  </head>

  <body>
    <button class="btn500">点击夏雨荷到500</button>
    <button class="btn800">点击夏雨荷到800</button>
    <span>夏雨荷</span>
    <script>
      // 缓动动画函数封装obj目标对象 target 目标位置
      // 思路:
      // 1. 让盒子每次移动的距离慢慢变小, 速度就会慢慢落下来。
      // 2. 核心算法:(目标值 - 现在的位置) / 10 做为每次移动的距离 步长
      // 3. 停止的条件是: 让当前盒子位置等于目标位置就停止定时器
      function animate(obj, target, callback) {
        // console.log(callback);  callback = function() {}  调用的时候 callback()

        // 先清除以前的定时器,只保留当前的一个定时器执行
        clearInterval(obj.timer);
        obj.timer = setInterval(function () {
          // 步长值写到定时器的里面
          // 把我们步长值改为整数 不要出现小数的问题
          // var step = Math.ceil((target - obj.offsetLeft) / 10);
          var step = (target - obj.offsetLeft) / 10;
          step = step > 0 ? Math.ceil(step) : Math.floor(step);
          if (obj.offsetLeft == target) {
            // 停止动画 本质是停止定时器
            clearInterval(obj.timer);
            // 回调函数写到定时器结束里面
            if (callback) {
              // 调用函数
              callback();
            }
          }
          // 把每次加1 这个步长值改为一个慢慢变小的值  步长公式:(目标值 - 现在的位置) / 10
          obj.style.left = obj.offsetLeft + step + "px";
        }, 15);
      }
      var span = document.querySelector("span");
      var btn500 = document.querySelector(".btn500");
      var btn800 = document.querySelector(".btn800");

      btn500.addEventListener("click", function () {
        // 调用函数
        animate(span, 500);
      });
      btn800.addEventListener("click", function () {
        // 调用函数
        animate(span, 800, function () {
          // alert('你好吗');
          span.style.backgroundColor = "red";
        });
      });
      // 匀速动画 就是 盒子是当前的位置 +  固定的值 10
      // 缓动动画就是  盒子当前的位置 + 变化的值(目标值 - 现在的位置) / 10)
    </script>
  </body>
</html>

🦦动画函数封装到单独JS文件里面

因为以后经常使用动画特效,可以单独封装到一个JS文件里面,使用的时候引用这个JS文件

在此处下载资料

https://download.csdn.net/download/qq_39321234/87378744

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

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

相关文章

大数据分析案例-基于KNN算法对茅台股票进行预测

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

一个精美的主界面窗口功能的设计和实现原来如此简单,万字肝爆

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 秩沅 原创 收录于专栏 玩归玩闹归闹&#xff0c;别拿java开玩笑 —————————————————— ⭐相关文章⭐ -通过窗口看…

数据结构与算法:栈和队列的学习

1.栈 1.栈的定义 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO&#xff08;Last In First Out&#xff09;的原则。 压栈&am…

AirServer2023免费无线Mac和PC电脑屏幕镜像投屏工具

AirServer2023是适用于 Mac 和 PC 的先进的屏幕镜像接收器。 它允许您接收 AirPlay 和 Google Cast 流&#xff0c;类似于 Apple TV 或 Chromecast 设备。AirServer 可以将一个简单的大屏幕或投影仪变成一个通用的屏幕镜像接收器 &#xff0c;是一款十分强大的投屏软件。AirSer…

Ansys Zemax | 眼科镜片设计

本文介绍了眼科镜片的设计原理&#xff0c;并讨论了镜片、眼睛和视觉环境中对镜片设计十分关键的参数&#xff0c;其中包括了常见镜片材料&#xff08;涵盖了玻璃和聚合物&#xff09;的玻璃目录。本文不包括渐进式镜片设计&#xff0c;尽管渐进式镜片时常根据一般的镜片曲率原…

【实际开发04】- XxxMapper.xml/java - 批量处理

目录 1. Model : XxxMapper.xml 1. IotTypeMapper.xml 基础 3 tips 2. Model : XxxMapper.java 1. IotTypeMapper.java 基础 3 tips 3. Others info 1. 模糊查询 2. 模糊查询 name 导致的异常 --> name 3. 连接查询 Where 限制主表 , 谨慎 : 使用副表限制 - ★ 4…

Java程序员如何使用代码来计算最大公约数和最小公倍数?

沉淀、分享、成长&#xff0c;让自己和他人都能有所收获&#xff01;&#x1f604; 一、前言 嘿&#xff0c;怎么突然讲到最大公约数了&#xff1f; 因为RSA算法&#xff0c;对于与欧拉结果计算的互为质数的公钥e&#xff0c;其实就需要使用到辗转相除法来计算出最大公约数。…

Java文件IO操作

目录 一、了解什么是文件 狭义的文件&#xff1a; 广义的文件&#xff1a; 二、文件的路径 ①文件的绝对路径 ②文件的相对路径 三、Java对于文件的操作 File类的构造方法 File类的普通方法 四、对于文件的内容操作 ①FileInputStream&#xff08;文件输入流&#xf…

ES索引备份还原

ES索引备份还原一、规划二、备份方案一&#xff1a;备份到集群共享目录方案二&#xff1a;备份到HDFSES还原一、规划 es数据出于线上数据安全考虑&#xff0c;对于es已有的索引数据可以进行安全备份&#xff0c;通常可以将es备份到共享文件目录或者一些其它的数据存储的文件系…

Splashtop Personal 安装教程

splashtop Personal 安装教程1. Splashtop Personal 概述2. splashtop Personal 安装步骤2.1 主控端&#xff08;Splashtop Business app&#xff09;2.2 被控端&#xff08;Splashtop Streamer&#xff09;2.3 打开主控端结束语1. Splashtop Personal 概述 Splashtop Persona…

java跳出循环的几种方式

在java中可以使用break、continue、return语句跳出for循环。break用于完全结束一个循环&#xff0c;跳出循环体&#xff1b;continue只是中止本次循环&#xff0c;接着开始下一次循环&#xff1b;return的功能是结束一个方法。 break语句 break用于完全结束一个循环&#xff0…

4.5 集成运放的种类及选择

一、集成运放的发展概述 集成运放自 20 世纪 60 年代问世以来&#xff0c;飞速发展&#xff0c;目前已经历了四代产品。 第一代产品基本沿用了分立元件放大电路的设计思想&#xff0c;采用了集成数字电路的制造工艺&#xff0c;利用了少量横向 PNP 管&#xff0c;构成以电流源…

Axure 原型设计的三步进阶法

平时跟很多同学朋友的交流过程中&#xff0c;对于axure的需要做到怎样&#xff0c;众说纷纭。总结了一下大家的意见&#xff0c;分别有以下几种&#xff1a; 1、掌握基本的搭建方法即可&#xff0c;不需要做交互&#xff1b; 2、既然做就要做到尽善尽美&#xff0c;页面和交互…

【Python百日进阶-数据分析】Day221 - plotly使用日期类型轴的时间序列 2

文章目录九、具有自定义日期范围的时间序列图9.1 使用plotly.express9.2 使用graph_objects9.3 手动设置日期范围十、带范围滑块的时间序列十一、带范围选择器按钮的时间序列十二、按缩放级别自定义刻度标签格式十三、隐藏周末和假期13.1 隐藏正常周末13.2 隐藏周末和指定日期1…

Windows 11关闭系统更新的方法有哪些?

之前问的最多的就是Win10关闭更新的方法&#xff0c;现在轮到了Windows11&#xff0c;下面我们就具体来看看如何关闭Windows11的系统更新。方案一&#xff1a;使用注册表编辑器关闭Win11更新Windows注册表实质上是一个庞大的数据库&#xff0c;存储着各种各样的计算机数据与配置…

Windows系统下Python安装教程

Python安装环境为Windows10系统&#xff08;64&#xff09; 1.Python下载 选择Python官网进行下载&#xff08;Welcome to Python.org&#xff09;&#xff0c;进入网站&#xff0c;点击Downloads&#xff0c;进入下载模块&#xff0c;鼠标指针放到Download&#xff0c;选择Wi…

聚焦行业,2022巨杉客户案例及产品荣获多项殊荣

2022年&#xff0c;巨杉客户实践案例及产品 广受肯定&#xff0c;荣获多项殊荣 荣誉不仅属于巨杉 它源自于每一位客户的信任和支持 感谢每一位客户对巨杉产品的选择和认可 客户创新实践案例 巨杉联合江阴农商行获评爱分析银行数字化创新实践案例 9月&#xff0c;在“2022…

InstallShield 制作INF驱动安装程序

题外话&#xff1a; 使用INF文件制作经过签名的CAT文件可以参考如下博文&#xff1a; https://blog.csdn.net/qq_29729577/article/details/113537243 回归正题&#xff1a; 本例使用InstallShield 2020版本 驱动文件准备 将INF、CAT、SYS等驱动相关文件放至同一目录下&…

【动态内存管理】C语言

前言&#xff1a; 为什么会存在动态内存分配 我们以前学过的开辟空间的方式有两个特点&#xff1a; 1 空间开辟大小是固定的&#xff1b; 2.数组在申明的时候&#xff0c;必须指定数组的长度&#xff0c;它所需要的内存在编译时分配&#xff1b; 但是对于空间的需求&#xff0c…

Qt基于CTK Plugin Framework搭建插件框架--插件通信【注册接口调用】

文章目录一、前言二、插件完善2.1、添加接口文件2.2、添加接口实现类2.3、服务注册&#xff08;Activator注册服务&#xff09;三、接口调用四、接口 - 插件 - 服务的关系4.1、1对14.2、多对14.3、1对多一、前言 通过Qt基于CTK Plugin Framework搭建插件框架–创建插件一文&am…