20230315----重返学习-动画-轮播图
创始人
2025-05-28 20:41:42

day-028-twenty-eight-20230315-动画-轮播图

动画

动画的处理

  1. css3的动画
    • transform 是变形属性,不是动画

      • translate 位移
      • scale 缩放
      • rotate 旋转
      • skew 倾斜
      • matrix 矩阵
    • transition 过渡动画

      • 步骤: 设置过渡效果,当改变元素样式的时候,会按照过渡效果进行运动
        • transition-property: all;
        • transition-duration: 0.3s;
        • transition-timing-function: linear;
        • transition-delay: 0s;
      • 简写: transition:property duration timing-function delay;
    • animation 帧动画

      • 步骤
        • 首先基于@keyframes设置动画运动的轨迹( 0%[from] -> 100%[to]),即关键帧名称
        • 最后基于animation按照指定的轨迹进行播放运动
          • animation-name: 关键帧名称; 要执行动画的关键帧名称
          • animation-duration: 0s; 动画持续时间
          • animation-timing-function: linear; 动画运动函数,即运动方式
          • animation-delay: 0ms; 动画延迟时间
          • animation-iteration-count: 5; 动画执行次数
          • animation-direction: reverse; 动画执行方向
          • animation-fill-mode: both; 动画填充模式,即动画运动终点与动画运动起点的关系
          • animation-play-state: paused/running; 动画播放状态
          • 简写: animation: name duration timing-function delay iteration-count direction fill-mode;
    • css3动画方案选取规则

      • 简单动画优先使用transition复杂动画使用animation
      • 如果运动轨迹/运动样式需要动态管理的,则使用transition
    • 总原则:

      • 能用CSS3解决的动画,优先使用CSS3 - 性能体验最好
      • CSS3解决不了的,再基于js实现
      • 如果js解决不了,很早之前是基于flash处理。现在应该直接换需求,不行可能是产品经理问题
  • 设置动画
    • JavaScriptcss3组合
      • 一般是用css3先设置过渡用css3先设置动画帧,之后用JavaScript元素的样式
        • JavaScript配合css3先设置过渡

          • 也可以在JS中设置元素的过渡效果

          • 也可以使用ontransitionend()DOM元素对象上监听DOM元素对象运行结束后的事件

            • 几个样式发生过渡效果,则transitionend事件就会被触发几次
            
            
            动画
            
        • JavaScript配合css3先设置动画帧

          1. 设置动画关键帧名称关键帧具体参数

          2. 设置单独的动画类

          3. JavaScriptDOM元素对象设置动画

            • 可以直接设置style的animation属性
            • 也可以给元素设置样式类,来控制播放
            
            动画

animate.css

  • 直接用,用单个粘贴复制
    • 直接用
      1. 引入css文件

      2. 给DOM元素对象设置类名

        • this.className='box animate__animated animate__infinite animate__bounce'
        • 基础类 animate__animated
        • 无限循环 animate__infinite
        • 效果类 animate__bounce
        
        动画
        

原生JavaScript动画

JavaScript的动画基于定时器处理

  • 定时器

    • setTimeout(callback,interval)

      • 到达时间只执行一次定时器结束了,后续不再触发执行
        • 但是结束不代表清除
    • setInterval(callback,interval)

      • 轮询定时器,每间隔一段时间,都会把定时器触发执行,直至手动清除定时器
      • callback 回调函数-定时器到时间后执行的回调函数
      • interval 时间因子-需要等待的时间
    • clearTimeout()/clearInterval() 清除定时器

    • 定时器的返回值: 数字,代表当前设置的定时器系统中的第几个定时器

      • 每一次定时器结束后,最好手动从系统中移除该定时器
        • clearTimeout()传递一个数字,就是把系统中编号为这个数字的定时器移除掉
          • 不论是setTimeout()还是setInterval(),只要设置定时器编号就会累积,所以基于任何一种清除定时器的方法(clearTimeout()/clearInterval()),只要把编号传递进来,都可以清除指定编号的定时器
    • 把控定时器是否已经设置

      //只有等上一次点击创建的定时器被清除后,都会创建新的定时器
      //依据 timer是否为null,如果是null,就认为已经清除了。但是需要我们在每一次从系统中移除定时器后,手动把timer赋值为null才可以。
      let timer = null;
      document.onclick = function () {console.log("console");if (timer === null) {timer = setTimeout(function () {console.log("定时器");clearTimeout(timer);//从系统中移除了编号为timer的定时器,但是此时timer的值还是数字。timer = null//手动赋值timer为初始值}, 1000);//定时器编号数字}
      };
      
      • 用一个初始值为null的变量来存储定时器返回的编号
      • 定时器执行后,手动清除定时器后把变量手动设置为null
      • 之后判断变量是否为null,来判断是否已经设置了定时器
    • 养成习惯: 定时器一旦设置了,就用变量存储定时器编号定时器执行完就要清除定时器,并手动把变量设置为初始值null

      • 每一个定时器执行完毕,我们都最好把从系统中移除掉

        // 需求:每隔1秒中,让数字累加1,但是累加到5后,则结束累加操作let timer = null;
        let num = 0;
        timer = setInterval(() => {num++;console.log(num);// 累加到了5,则结束定时器if (num === 5) {clearInterval(timer);timer = null;}
        }, 1000);/* // 思路:循环设置5个定时器,但是执行的时间需要间隔开
        let num = 0;
        for (let i = 1; i <= 5; i++) {let timer = null;timer = setTimeout(() => {num++;console.log(num);// 每一个定时器处理完毕,我们都最好把其从系统中移除掉clearTimeout(timer);timer = null;}, i * 1000);
        } *//* // 基于递归操作,还是设置5个定时器
        let num = 0,timer = null;
        const sum = function sum() {// 每一次执行sum,首先清除上一次设置的定时器clearTimeout(timer);num++;console.log(num);if (num === 5) {timer = null; //当递归结束,不再设置新的定时器的时候,再把timer赋值为null即可return;};timer = setTimeout(sum, 1000);
        };
        timer = setTimeout(sum, 1000); */
        
  • requestAnimationFrame(指定的回调函数)

    • 类似于setTimeout()定时器,只不过不需要指定等待的时间
      • 电脑有一个屏幕刷新率: 1秒内屏幕刷新了多少次
        • 一般都是60次,但还有120次
          • 60次(60HZ)计,大概16.666...毫秒刷新一次
    • 它会自动按照电脑屏幕刷新率的时间进行处理
      • 会等待到每次屏幕刷新的时候,把指定的回调函数执行一次

        requestAnimationFrame(() => {console.log('哇咔咔');
        });
        

DOM元素样式

  • 设置DOM元素的样式
    • 元素.style.xxx = xxx样式设置在元素的行内
      • 优势: 这样设置样式优先级
    • 样式类名
      • 元素.className='xxx'
      • 元素.classList.add('xxx')/元素.classList.remove('xxx')
      • 样式表先把样式写好,最后在JavaScript中,基于操作样式类名,来管理DOM元素的样式
  • 获取DOM元素的样式
    • 元素.style.xxx 只能获取写在元素行内上的样式
      • 不常用,因为一般很少把样式写在行内上
    • window.getComputedStyle(元素,伪类) 获取元素(或者其伪元素{::after/::before})所有经过浏览器计算过的样式
      • 只要DOM元素浏览器渲染了,那么其所有的样式都是经过计算的,不管我们以何种方式编写的样式,即不管是用JavaScript写的还是css样式表的
      • 即便不写样式浏览器也会为被渲染的DOM元素设置默认样式

JavaScript写动画步骤

  • 方案一: 固定步长匀速运动

    • setTimeout()setInterval()

      • 设置定时器,每间隔16ms一步

      • 首先获取现在元素的样式

      • 每一步都是在当前样式的基础上加步长即可

      • 最新的样式赋值给现在元素

      • 最后做一个边界处理

    • requestAnimationFrame()

      • 基于它实现动画,只能固定步长,不能固定时间

        
        动画
        
  • 方案二: 固定时间匀速运动

    • 真实项目中的动画,一般都是固定时间的动画

      
      动画
      
  • 方案三:

jQuery动画

  • 少用或者没人用了,但它的api好用。

    • 有蛮多第三方库参考了它的设计
    • 代码少简洁
  • jQuery中的动画都是基于JS/定时器实现的匀速运动动画

    • 不如CSS3动画性能

动画

轮播图

  • swiper

    1. 引入css文件js文件
    2. 建立HTML骨架使用swiper的类名来做
    3. jsnew Swiper()建立一个swiper实例,并配置好。
      • 最好用一个变量保存这个实例,以便后面进行操作
    4. 浏览器控制台查看swiper实例html骨架,复制想要改的样式类名,在本地的css中改对应样式类名的样式
    
    基于Swiper实现轮播图
    

进阶参考

  1. 牛X轰轰的帧动画库:animate.css - 帧动画库- css动画库,用类名控制动画效果
  2. 查询JavaScript函数的兼容性
  3. swiper - 轮播图
  4. animejs.com - JavaScript实际上真正常用的动画库
  5. animejs官方文档-英文的 - JavaScript实际上真正常用的动画库
  6. dynamicsjs.com - 物理效果的动画 - 引入方法,并对DOM元素设置JavaScript动画效果,用法类似于jQuery动画
  7. parallax.js - 偏向于视差的JavaScript动画效果
  8. CreateJS - 游戏引擎 - 用来做h5小游戏的-自然也可以做JavaScript动画效果

相关内容

热门资讯

Echart:入门可视化科研人... 1. 简介 最近参加一个数据分析大赛,鉴于研一师妹对R不是很擅长,用 g...
LeetCode 每日一题 2... 记录了初步解题思路 以及本地实现代码;并不一定为最优 也希望大家能一起探讨 一起进步 ...
初始Mybatis 1.什么是mybatis          1.  mybatis是一个优秀的持久层框架      ...
pytorch实现深度神经网络... 目录 1. 随机梯度下降算法 2.优化器 3. 损失函数 3.1 均方误差损失 3.2 交叉熵损失 ...
5月份逾10家*ST公司“脱星... 【深圳商报讯】(记者 陈燕青)随着年报披露完毕,近期*ST东园、*ST科新等多家ST公司申请摘帽。根...
窦靖童伦敦演唱会上给19岁李嫣... (来源:三湘都市报) 5月27日,窦靖童在伦敦举行了个人演唱会,而巧合的是,这天同时也是妹妹李嫣19...
css实现文字大小自适应 在页面编写中经常会碰到页面自适应的问题,也就是页面内部的元素会随着窗口的放大缩小而放大...
ST Visual Devel...   1.双击打开sttoolset应用程序 2.点击 Next 3.选择同意,再点击...
【数据结构】万字深入浅出讲解单... 🚀write in front🚀 📝个人主页...
Qt MSVC配置OpenCV... 文章目录1:软件准备Qt 下载OpenCV Download2:使用 ...
为什么文件删除了但磁盘空间没有... 1.案例现象 这天,监控系统发来一条告警消息,内容说某台服务器根目录磁盘...
5个高清图片素材网站,免费商用... 本期给大家推荐6个超好用的高清图片素材网站,免费下载,还可以商用...
【AI 工具】文心一言内测记录 文章目录一、申请内测二、收到内测邀请三、激活内测四、开始使用1、普通对话2、生成图片3、生成代码4、...
【论文笔记】Neural Im... 原文链接:https://ieeexplore.ieee.org/document/9...
C/S和B/S架构 1.C/S架构 (1)C/S架构是指Client / Server&#x...
世纪互联一季度营收增长18.3... 5月28日,科创型数字新基建企业世纪互联发布2025年第一季度未经审计的财务业绩。期内,公司总营收同...
【一】案例练习JavaScri... 需求:该函数接收一个布尔类型参数,表示颜色的格式是十六进制还是rgb格式...
Spring Boot实现前后... Spring Boot实现前后端实时通信 WebSocketSSELong Polling S...
『OPEN3D』1.5 KDT... 目录 1 KDTree knn_search radius_search hybrid search...
CentOS8服务篇9:Sam... 一、安装Samba服务器 执行“su -”命令到“#”提示符下(安装软件要在系统中写...
HTML文本框参考样式及常见操... 在网页设计中,常常要使用 html 文本框来收集一些用户信息或是制作登录页࿰...
MATLAB算法实战应用案例精... 目录 前言 知识储备 Lévy 飞行 布朗运动 算法原理 算法思想 数学模型
C#实现身份证校验代码 调用方法调用代码 bool result_out = smart_common_plus.c...
重构数据-Replace Da... 重构数据-Replace Data Value with Object以对象取代数据值二 1.以对象...
swagger-ui增强功能模... 背景介绍Swagger相关的网站推荐为https://swagger.io/和https://git...
又一家!光大银行拟不再设立监事... 北京商报讯(记者 宋亦桐)5月29日,光大银行发布《第九届董事会第二十八次会议决议公告》指出,该行第...
VI的常用命令 VI的常用命令 文章目录VI的常用命令vi/vim是什么?VI普通模式命令VI编辑模式...
内核中的高精度定时器 标准的定时器不够精确,不适合对时间精度要求比较高的场景,比如说实时应用。...
Vue2.x源码:new Vu... vue源码版本vue2.5.2 new Vue()做了啥? new Vue()会执行_init方法&...
linux console快捷... Ctrl + C:终止当前正在运行的程序。Ctrl + D࿱...