〖大前端 - 基础入门三大核心之JS篇㊻〗- JS + CSS实现动画

  • 说明:该文属于 大前端全栈架构白宝书专栏,目前阶段免费如需要项目实战或者是体系化资源,文末名片加V!
  • 作者:不渴望力量的哈士奇(哈哥),十余年工作经验, 从事过全栈研发、产品经理等工作,目前在公司担任研发部门CTO。
  • 荣誉:2022年度博客之星Top4、2023年度超级个体得主、谷歌与亚马逊开发者大会特约speaker全栈领域优质创作者

  • 🏆 白宝书系列
    • 🏅 启示录 - 攻城狮的自我修养
    • 🏅 Python全栈白宝书
    • 🏅 ChatGPT实践指南白宝书
    • 🏅 产品思维训练白宝书
    • 🏅 全域运营实战白宝书
    • 🏅 大前端全栈架构白宝书


文章目录

  • ⭐ JS+CSS实现动画
  • ⭐ 无缝连续滚动特效开发
  • ⭐ 跑马灯轮播图特效开发
  • ⭐ 呼吸轮播图特效开发

⭐ JS+CSS实现动画

我们已经知道CSS3的transition过渡属性可以实现动画,而JavaScript可以利用这一属性轻松的实现元素的动画,并且JSS和CSS3结合可以规避利用定时器实现动画的缺点。

示例代码:

<!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: 100px;height: 100px;background-color: orange;position: absolute;top: 100px;left: 100px;}</style>
</head>
<body><button id="btn">开始运动</button><div id="box"></div><script>var oBtn = document.getElementById('btn');var oBox = document.getElementById('box');var pos = 1; //1左边,2右边oBtn.onclick = function () {//加上过渡属性,即可实现缓动效果oBox.style.transition = 'all 2s linear 0s';if (pos == 1) {//如果盒子在左边,让它的移动到右边oBox.style.left = 500 + 'px';pos = 2;}else {//如果盒子在右边,让它移动到左边oBox.style.left = 100 + 'px';pos = 1;};};</script>
</body>
</html>

20230424_18410820234241842351

上述案例可以看到,每次点击“开始运动”按钮,不管盒子有没有移动到重点,盒子的运动方向都会改变。在很多情况下,我们需要控制当某个“动作”结束后,才能进行下一次的点击。这就需要用到函数节流

**函数节流:**一个函数执行一次后,只有大于设定的执行周期才允许执行第二次。

函数节流需要借助延时器:setTimeout()

函数节流的公式:

var lock = true;function 需要节流的函数() {//如果锁是关闭状态,则不执行if (!lock) return;//函数核心语句//关锁lock = false;//指定毫秒数后将锁打开setTimeout(function () {lock = true;}, 2000);
}

利用函数节流优化一下上面案例中的代码:

<body><button id="btn">开始运动</button><div id="box"></div><script>var oBtn = document.getElementById('btn');var oBox = document.getElementById('box');var pos = 1; //1左边,2右边var lock = true; //函数节流锁oBtn.onclick = function () {//判断如果锁是关闭的,则直接return,不执行下面的程序if (!lock) return;oBox.style.transition = 'all 2s linear 0s';if (pos == 1) {//如果盒子在左边,让它的移动到右边oBox.style.left = 500 + 'px';pos = 2;}else {//如果盒子在右边,让它移动到左边oBox.style.left = 100 + 'px';pos = 1;};//关锁lock = false;//2s后将锁打开,因为过渡的时间是2s,所以2s后盒子会到到达终点setTimeout(function name(params) {lock = true;}, 2000);};</script>

20230424_1901552023424198382

使用函数节流优化了代码之后,在盒子还没有运动到终点时,再次点击按钮不会改变盒子的运动方向,只有盒子运动到终点,再次点击盒子才能返回。

⭐ 无缝连续滚动特效开发

比如下面这个网站上就有一个“无缝连续滚动特效”,“最新播报”栏目中的新闻点连续不断的持续从右向左循环滚动。下面就来动手实现一个这样的案例。

image-20230425101336629

案例: 实现下面的无缝连续滚动特效,

题目分析:滚动其实就是元素在盒子内向左移动,盒子设置overflow:hidden使盒子外侧的部分隐藏。要达到无缝连续滚动的效果,不可能设置无限多的元素,这里用到一个视觉欺骗的小技巧,用js复制一组元素,当第一组元素完全移出盒子时,把第一组的元素的位置再调整回来继续向左移动,这样就实现了“连续滚动”的效果。用定时器就可以实现。

<!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;}.box {width: 1000px;height: 200px;border: 1px solid #000;margin: 50px auto;overflow: hidden;}.box ul {width: 3000px;list-style: none;position: relative;}.box ul li {float: left;margin-right: 10px;}</style>
</head><body><div id="box" class="box"><ul id="list"><li><img src="/images/husky1_little.png" alt=""></li><li><img src="/images/husky2_little.jpg" alt=""></li><li><img src="/images/husky3_little.jpg" alt=""></li><li><img src="/images/husky4_little.jpg" alt=""></li></ul></div><script>var oBox = document.getElementById('box');var oList = document.getElementById('list');oList.innerHTML += oList.innerHTML;  //复制一份图片插入ul里面//定义全局变量var left = 0;var timer;move(); //一开始先进行滚动//将滚动封装成函数,方便调用function move() {//设表先关(设置一个定时器,先关掉它)clearInterval(timer);//设置定时器timer = setInterval(function () {left -= 2;//当到达最左侧时,返回到原点继续移动,制造滚动的视觉效果if (left <= -857) {left = 0;};oList.style.left = left + 'px';}, 20);};//鼠标移动到上面,停止滚动oBox.onmouseover = function () {clearInterval(timer);};//鼠标移开,继续滚动oBox.onmouseleave = function () {move();};</script>
</body>
</html>

20230425_11362020234251137511

记住一个口诀:设表先关,即设置定时器前,先调用clearInterval()方法关闭定时器,防止用户频繁的触发定时器 ,导致定时器出现叠加现象。

⭐ 跑马灯轮播图特效开发

实现下面效果的轮播图,点击左右两边的按钮,实现图片左右滚动循环切换

20230425_1549142023425155122

题目分析:给左右两个按钮添加事件监听,类似上篇中的无缝连续滚动特效,点击按钮时更改ul的left属性,实现图片向左/向右移动。

难点:

  1. 向右切换到最后一张图片,再次点击时,如果无缝切换到第一张图片。
  2. 第一张图片向左切换时,如果无缝切换到最后一张图片。

示例代码:

<!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;}.carousel {width: 1202px;height: 800px;border: 1px solid #000;margin: 100px auto;position: relative;overflow: hidden;}.carousel ul {position: absolute;left: 0;width: 8000px;}.carousel ul li {float: left;}.carousel a {width: 100px;height: 100px;background-color: orange;border-radius: 50%;position: absolute;top: 50%;margin-top: -50px;}.carousel #leftbtn {left: 50px;}.carousel #rightbtn {right: 50px;}</style>
</head><body><div class="carousel"><ul id="list"><li><img src="/images/spring.jpg" alt=""></li><li><img src="/images/summer.jpg" alt=""></li><li><img src="/images/autumn.jpg" alt=""></li><li><img src="/images/winter.jpg" alt=""></li></ul><a href="javascript:;" id="leftbtn"></a><a href="javascript:;" id="rightbtn"></a></div><script>//得到ul 左右按钮var leftbtn = document.getElementById('leftbtn');var rightbtn = document.getElementById('rightbtn');var oList = document.getElementById('list');//克隆第一个li放到ul的最后var cloneli = oList.firstElementChild.cloneNode(true);oList.appendChild(cloneli);//设置全局变量var idx = 0;  //代表第几张图片var lock = true;  //函数节流锁//右边按钮事件监听rightbtn.onclick = function () {if (!lock) return;lock = false;idx++;oList.style.left = idx * -1200 + 'px';oList.style.transition = 'left .5s ease 0s';setTimeout(function () {if (idx >= 4) {oList.style.left = 0 + 'px';idx = 0;oList.style.transition = 'none';}}, 500);setTimeout(function () {lock = true;}, 500);};//左边按钮事件监听leftbtn.onclick = function () {if (!lock) return;lock = false;if (idx <= 0) {//让图片瞬间移动到最后一张克隆的图片上idx = 4;oList.style.left = idx * -1200 + 'px';oList.style.transition = 'none';}//小技巧:设置一个延时时间为0的延时器,虽然延时时间是0s,但可以让当过渡先瞬间取消,然后再加上setTimeout(function name(params) {idx--;oList.style.left = idx * -1200 + 'px';oList.style.transition = 'left .5s ease 0s'}, 0);setTimeout(function () {lock = true;}, 500);}</script></body></html>

⭐ 呼吸轮播图特效开发

实现下面效果的轮播图,点击左右两边的按钮,实现图片淡出、淡入切换:

20230425_16492520234251651153

**题目分析:**重点是点击按钮时,老图淡出、新图淡入,更改opacity属性就可以实现。

示例代码:

<!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;}.carousel {width: 1202px;height: 800px;border: 1px solid #000;margin: 100px auto;position: relative;}.carousel ul {list-style: none;}.carousel ul li {/*图片透明度是0*/opacity: 0;position: absolute;top: 0;left: 0;transition: opacity 1s ease 0s;}.carousel ul li:first-child {/*第一张图片的透明度是1*/opacity: 1;}.carousel a {width: 100px;height: 100px;background-color: orange;border-radius: 50%;position: absolute;top: 50%;margin-top: -50px;}.carousel #leftbtn {left: 50px;}.carousel #rightbtn {right: 50px;}</style>
</head><body><div class="carousel"><ul id="list"><li><img src="/images/spring.jpg" alt=""></li><li><img src="/images/summer.jpg" alt=""></li><li><img src="/images/autumn.jpg" alt=""></li><li><img src="/images/winter.jpg" alt=""></li></ul><a href="javascript:;" id="leftbtn"></a><a href="javascript:;" id="rightbtn"></a></div><script>var leftbtn = document.getElementById('leftbtn');var rightbtn = document.getElementById('rightbtn');var oList = document.getElementById('list');var lis = oList.getElementsByTagName('li');var idx = 0; //代表第几张图片var lock = true;  //函数节流锁//右边按钮事件监听rightbtn.onclick = function () {if (!lock) return;lock = false;//老图淡出lis[idx].style.opacity = 0;idx++;if (idx > 3) idx = 0;  //如果是最后一张图片了,则第一张图片是新图//新图淡入lis[idx].style.opacity = 1;setTimeout(function () {lock = true;}, 1000);};//左边按钮事件监听leftbtn.onclick = function () {if (!lock) return;lock = false;//老图淡出lis[idx].style.opacity = 0;idx--;if (idx < 0) idx = 3;  //如果是第一张图片,则最后最后一张是新图//新图淡入lis[idx].style.opacity = 1;setTimeout(function () {lock = true;}, 1000);};</script>
</body></html>

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

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

相关文章

MDETR 论文翻译及理解

题目Abstract1. Introduction2. Method2.1. Background2.2. MDETR2.2.1 Architecture2.2.2 Training 3. Experiments3.1. Pre-training Modulated Detection 预训练调制检测3.2. Downstream Tasks3.2.1 Few-shot transfer for long-tailed detection 4. Related work5. Conclus…

微机原理——定时器8253(8254)学习1

目录 定时类型 8253内部结构框图 8253命令字 六种工作方式及输出波形 计数初值的计算与装入 8253的初始化 定时类型 可编程定时器8253&#xff1a;&#xff08;内部采用的是16位 减法计数器&#xff09; 8253内部结构框图 8253命令字 8253有三个命令字&#xff1a;方式命…

HGNN+笔记

1.Title HGNN: General Hypergraph Neural Networks&#xff08;Yue Gao; Yifan Feng; Shuyi Ji; Rongrong Ji&#xff09;【IEEE Transactions on Pattern Analysis and Machine Intelligence 2023】 2.Conclusion This paper extend the original conference version HGNN,…

大数据-hive

简介 hive是基于Hadoop的一个数据仓库工具&#xff0c;用来进行数据提取、转化、加载&#xff0c;这是一种可以存储、查询和分析存储在Hadoop中的大规模数据的机制。hive数据仓库工具能将结构化的数据文件映射为一张数据库表&#xff0c;并提供SQL查询功能&#xff0c;能将SQL…

C语言练习题

C语言练习题 文章目录 C语言练习题题目一题目二题目三题目四题目五题目六题目八 题目一 #include <stdio.h> //VS2022,默认对齐数为8字节 union Un {short s[7];int n; };int main() {printf("%zd", sizeof(union Un));return 0; }代码运行结果:> 16 sizeo…

基于Springboot + vue的汽车资讯网站

qq&#xff08;2829419543&#xff09;获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;springboot 前端&#xff1a;采用vue技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xf…

基于springboot实现的垃圾分类管理系统

一、系统架构 前端&#xff1a;html | layer | jquery | css 后端&#xff1a;springboot | mybatis 环境&#xff1a;jdk1.8 | mysql | maven 二、 代码及数据库 三、功能介绍 01. 登录页 02. 系统设置-用户管理 03. 系统设置-页面管理 04. 系统设置-角色管…

【Openstack Train安装】一、虚拟机创建

Openstack是一个云平台管理的项目&#xff0c;它不是一个软件。这个项目由几个主要的组件组合起来完成一些具体的工作。Openstack是一个旨在为公共及私有云的建设与管理提供软件的开源项目。它的社区拥有超过130家企业及1350位开发者&#xff0c;这些机构与个人将 Openstack作为…

使用AOS实现网页动画效果

在现代Web开发中&#xff0c;动画效果是提升用户体验和页面交互性的重要因素之一。而AOS&#xff08;Animate On Scroll&#xff09;作为一个强大的动画库&#xff0c;可以帮助我们轻松地实现网页元素的滚动动画效果。 什么是AOS&#xff1f; AOS是一个基于CSS3和JavaScript的…

Transformer

目录 Encoder Add&Norm:&#xff08;LayerNorm&#xff09;Transformer中的归一化(五)&#xff1a;Layer Norm的原理和实现 & 为什么Transformer要用LayerNorm - 知乎 (zhihu.com) LayerNorm怎么做的&#xff1f; Feed Forward: FeedForward代码&#xff1a; 公式…

Android 12 及以上授权精确位置和模糊位置

请求位置信息权限 为了保护用户隐私&#xff0c;使用位置信息服务的应用必须请求位置权限。 请求位置权限时&#xff0c;请遵循与请求任何其他运行时权限相同的最佳做法。请求位置权限时的一个重要区别在于&#xff0c;系统中包含与位置相关的多项权限。具体请求哪项权限以及…

栈和队列的OJ题——14.用栈实现队列

14.用栈实现队列 232. 用栈实现队列 - 力扣&#xff08;LeetCode&#xff09; /* 解题思路&#xff1a; 此题可以用两个栈实现&#xff0c;一个栈进行入队操作&#xff0c;另一个栈进行出队操作 出队操作&#xff1a; 当出队的栈不为空是&#xff0c;直接进行出栈操作&#xff…

算法通关村第七关—迭代实现二叉树的遍历(黄金)

迭代实现二叉树的遍历 迭代法实现前序遍历 前序遍历是中左右&#xff0c;如果还有左子树就一直向下找。完了之后再返回从最底层逐步向上向右找。不难写出如下代码&#xff1a;&#xff08;注意代码中&#xff0c;空节点不入栈&#xff09; public List<Integer>preorde…

VSCode 中将头文件和头文件函数分离,编译主函数跳出 undefined reference to 的问题解决

VSCode 编写 C &#xff08;.h&#xff0c;.cpp 文件分离&#xff09;代码&#xff0c;编写完成后&#xff0c;编译遇到了编译错误 undefined reference to xxx。 开始还以为使用了 -stdc20 而不能使用 #include “xxx.h" 方式头文件&#xff0c;但仔细一想虽然引入了 im…

基于YOLOv7算法的的高精度实时通用目标检测识别系统(PyTorch+Pyside6+YOLOv7)

摘要&#xff1a;基于YOLOv7算法的高精度实时检测识别系统可用于日常生活中检测与定位多种目标&#xff0c;此系统可完成对输入图片、视频、文件夹以及摄像头方式的目标检测与识别&#xff0c;同时本系统还支持检测结果可视化与导出。本系统采用YOLOv7目标检测算法来训练数据集…

OpenHarmony 应用(HarmonyOS 原生应用)- 写一个 Hello World 并在华为手机上跑起来

OpenHarmony 简介 ArkUI 开发框架 OpenHarmony 提供了一套UI开发框架&#xff0c;即方舟开发框架&#xff08;ArkUI 框架&#xff09;。 两种开发范式 支持两种开发范式&#xff0c;分别是基于ArkTS的声明式开发范式&#xff08;简称“声明式开发范式”&#xff09;和兼容J…

【Leetcode题单】(01 数组篇)刷题关键点总结03【数组的改变、移动】

【Leetcode题单】&#xff08;01 数组篇&#xff09;刷题关键点总结03【数组的改变、移动】&#xff08;3题&#xff09; 数组的改变、移动453. 最小操作次数使数组元素相等 Medium665. 非递减数列 Medium283. 移动零 Easy 大家好&#xff0c;这里是新开的LeetCode刷题系列&…

弦理论的技术探索

弦理论的技术探索 一、引言 弦理论,作为现代物理学中的一个重要分支,旨在揭示宇宙的终极规律。它认为,宇宙中的一切物质和能量都是由微小的弦振动产生的。本文将深入探讨弦理论的技术层面,包括其数学基础、物理应用以及计算机模拟等方面。 二、弦理论的数学基础 弦理论的…

Go连接mysql数据库

package main import ("database/sql""fmt"_ "github.com/go-sql-driver/mysql" ) //go连接数据库示例 func main() {// 数据库信息dsn : "root:roottcp(192.168.169.11:3306)/sql_test"//连接数据库 数据库类型mysql,以及数据库信息d…

【Tkinter 入门教程】

【Tkinter 入门教程】 1. Tkinter库的简介&#xff1a;1.1 GUI编程1.2 Tkinter的定位 2. Hello word! 程序起飞2.1 第⼀个程序2.2 字体颜色主题 3. 组件讲解3.1 tkinter 的核⼼组件3.2 组件的使⽤3.3 标签Label3.3.1 标签显示内容3.3.2 多标签的应⽤程序3.3.3 总结 3.4 按钮but…