哈喽,大家好呀!我又来咯!相信大家在翻网页的时候都会看到首页的轮播图!今天讲讲实现原理,感觉有用就收藏吧!

轮播图主要是利用缓冲运动来实现图片的切换,这样看起来比较有画面感哈!

那么什么叫做缓冲运动呢???

实际上就是图片的运动曲线:慢--快-慢

实现目标:添加轮播图实现图片默认进行缓冲运动,点击左右按钮实现图片的切换!

运动原理:运动元素都要绝对定位,根据动态设置left值或者top值进行运动

实现步骤:

1.html部分,一个轮播图视口box,一个li标签容器ul,以及图片容器li标签,以及左右两个按钮,li标签宽高要和图片一样哟!

 <div class="box"><ul><li><img src="../images/b1.png" alt=""></li><li><img src="../images/b2.png" alt=""></li><li><img src="../images/b3.png" alt=""></li><li><img src="../images/b4.png" alt=""></li></ul><div class="left"></div><div class="right"></div></div>

2.给以上标签设置css(内容简单,不做过多介绍,直接上代码了哦!)

<style>img {width: 960px;height: 500px;}li {list-style: none;width: 960px;height: 500px;float: left;}ul {height: 500px;position: relative;width: 3840px;padding: 0;}.box {width: 960px;height: 500px;margin: 0 auto;margin: 0;padding: 0;overflow: hidden;position: relative;}.left,.right {width: 50px;height: 50px;position: absolute;background-color: rgba(0, 0, 0, .3);z-index: 2;top: 50%;transform: translateY(-50%);/* display: none; */}.left {left: 0;}.right {right: 0;}</style>

3.获取节点

在script中获取对应的BOM节点,并克隆ul中的第一个li标签,添加到ul的末尾处,这样实现轮播图的无缝运动,并且根据li标签的个数动态设置ul容器的宽度,如果宽度不够的话,li标签浮动不起来!这里注意,一定要先克隆,再设置ul宽度!给每个li标签声明一个自定义属性index,代表的是第几张图片!

var ul = document.querySelector("ul");var lis = document.querySelectorAll("li")var liWidth = document.querySelectorAll("li")[0].offsetWidth;var left = document.querySelector(".left");var right = document.querySelector(".right");var index = 1, timer = null;var box = document.querySelector(".box");var copyLi = lis[0].cloneNode(true);ul.appendChild(copyLi);ul.style.width = (lis.length + 1) * liWidth + "px";

4.封装缓冲运动函数,留作备用!

每句话后面都有详细的注释,方面初学者学习理解!

//obj:运动对象
//target:目标位置
//style:运动对象的样式,比如left,top,width,height等
//callback:回调函数,当运动结束时调用,执行回调函数内部的代码段function move(obj, target, style,callback) {                       // 对象移动封装clearInterval(obj.timer)                             //再重复点击时,清除上一次的计时器,这样计时器不会叠加obj.timer = setInterval(function () {                //给每一个对象添加一个计时器var cur = parseInt(getComputedStyle(obj)[style]);//获取当前对象的偏移量;var speed = (target - cur) / 8;                                   //定义速度变量if (speed < 1) {                              //判断当前对象的目标位置如果小于当前对象的偏移量,则速度变成负值speed = Math.ceil(speed);                                //也就是当前对象向左移动的left值逐渐缩小,否则就是正常向右移动}if (speed >= 0 && cur + speed >= target || speed < 0 && cur + speed < target) {      //如果速度变量大于0,并且当前对象的偏移量加上速度变量大于对象的目标位置obj.style[style] = target + "px";                                              //或者速度变量小于0,并且当前对象的偏移量减去速度变量小于对象的目标位置时clearInterval(obj.timer);if (callback) {callback();}                                                     //当前对象的偏移量等于目标位置并且清除计时器} else {                                                                          //否则就正常执行对象的移动obj.style[style] = cur + speed + "px";                                         //当前对象的偏移量等于当前对象的偏移量加上速度变量(一直运动)}},30)
}

5.创建一个有名无参函数;

函数内部开启计时器,规定切换图片的间隔时间(时间不要太短),调用缓冲运动函数,并且传入参数,并且在函数内部进行判断,当图片等于最后一张时,秒换回第一张继续进行缓冲运动!

start()function start() {timer = setInterval(function () {if (index == lis.length + 1) {index = 1;ul.style.left = "0px"}move(ul, -liWidth * index, "left");index++;console.log(index);}, 2000)}

6.设置鼠标移入轮播视口时,左右两个按钮显示,移出时进行隐藏,css设置默认隐藏;

建议使用添加类名,这样可以设置透明度以及平移,效果会比这个要好些,因为每天要敲很多代码,所以没有找到,不会的可以关注我私聊告诉你原理!

 box.onmouseover = function () {clearInterval(timer);left.style.display = "block"right.style.display = "block"}box.onmouseout = function () {start();left.style.display = "none"right.style.display = "none"};

7.点击左按钮进行左切换,点击右按钮进行右切换

这里就用到上面设置的自定义属性了,是根据li标签的属性值进行的切换,

例如:右按钮点击事件;

判断当图片在最后一张时,秒换回第一张(index属性赋值为第一张,ul的left值为0即可),否则就是正常的切换,左按钮的原理一样

right.onclick = function () {if(index == lis.length+1){index = 1;ul.style.left = "0px"}index++;move(ul, -liWidth * (index - 1), "left")}
left.onclick = function(){if(index == 1){index = lis.length + 1;ul.style.left = lis[0].offsetWidth -  ul.offsetWidth   + "px";}index--;move(ul,-liWidth*(index - 1),"left")}

8.最后给大家留个小作业

动态根据li标签的个数添加轮播导航条,实现点击对应导航条实现图片的切换

方法提示:

1.利用for循环得到长度个数,创建dl>dd

2.根据index的值以及缓冲运动进行切换

javascript轮播图(缓冲运动)相关推荐

  1. JavaScript轮播图代码

    JavaScript轮播图代码 <html><head><meta charset="utf-8"><title>轮播图</t ...

  2. JavaScript轮播图(面向对象)

    步骤 轮播图1 HTML+CSS 轮播图2 动态生成页面 通过 JavaScript程序 生成 div标签中 所有 轮播图需要的标签 生成 ul ol div 标签节点 根据数组动态生成 原始 ul& ...

  3. 原生JavaScript轮播图效果实现

    原生JavaScript实现轮播图切换效果的实现过程 本文所用代码仅供个人学习.此部分代码系按原腾讯电脑管家首页的轮播图效果,采用原生JS技术予以实现(原网页采用jQurey等技术). 1. 文件准备 ...

  4. 阶段二 网页搭建入门之javaScript与前端案例 javaScript轮播图

    加粗样式## 效果图 图片素材 html <!doctype html> <html lang="en"> <head><meta cha ...

  5. js原生 JavaScript轮播图【渐变淡入淡出】效果实现(附代码)

    目录 前言 轮播图的组成以及实现思想 左右按钮的隐藏与显示 核心思想 代码实现 动态生成底部小圆圈 核心思想 代码实现 右左按钮实现 核心思想 代码实现 实现自动播放 核心思想 代码实现 整体代码(复 ...

  6. JavaScript 轮播图案例

    前言 一名刚刚入坑前端的小白,如有错误还望指出,谢谢您的查阅 提示:以下是本篇文章正文内容,下面案例可供参考 轮播图案例(仅供参考) <!DOCTYPE html> <html la ...

  7. html 轮播图自适应,JavaScript 自适应轮播图

    JavaScript 自适应轮播图 代码 话不多说,先上代码,方便复制粘贴.演示 轮播图 *{ margin: 0; padding: 0; } ul{ list-style: none; } img ...

  8. HTML+CSS+JavaScript实现轮播图效果

    前言 先奉上本文需要的所有资源,免费下载,代码有详细注释,可搭配本文使用: 前端JavaScript实现轮播图效果 百度网盘:百度网盘 请输入提取码 提取码:slbt 没有添加动画效果,添加了自动切换 ...

  9. 2021-3-2打砖块游戏,轮播图,swiper,自执行函数

    文章目录 打砖块 测试碰撞 完全体 轮播图 轮播图缓冲 缓冲测试 swiper 自执行函数 打砖块 <!DOCTYPE html> <html lang="en" ...

最新文章

  1. ls和find命令查找的一些小技巧
  2. layer的一种用法,自己画出弹出框样式
  3. [SDOI2008]沙拉公主的困惑 线性筛 素数+欧拉
  4. simulink中s-function使用
  5. 一起来造一个RxJava,揭秘RxJava的实现原理
  6. 基于.NET平台常用的框架整理(转)
  7. mysql 10进制转2进制_Oracle 10进制转换2进制
  8. 更新鸿蒙系统运行评价,全球首批!升级使用鸿蒙OS真实反馈评价出炉:差评/好评都很真实...
  9. Mysql索引优化实例讲解
  10. java对xml解析_Java中对xml的解析
  11. 使用Python快速压缩目录中图片
  12. v-pre让Vue直接显示{{}}不编译
  13. 树莓派上3g模块的使用
  14. 干掉卫星、无人机?只用气球就能获取10厘米分辨率遥感影像
  15. 管外磁水处理器的简单介绍
  16. 多元线性回归分析(Stata)
  17. 机器学习笔记(10)——逻辑回归算法优化之随机梯度下降法
  18. 基于springboot手工diy网站 毕业设计-附源码 310226
  19. 【精通内核】Linux内核自旋锁实现原理与源码解析
  20. iphone,ipad,关于icon图标的那些事(必须1024啦~~)

热门文章

  1. sql数据库表添加、删除字段
  2. python处理excel表格教程视频_用Python这样操作Excel?值得一学,总有一天用得上!...
  3. 解决递归求阶乘问题时间复杂度计算
  4. 练习:柱状图中最大矩形
  5. 手表+眼镜 绝对是手机概念的替代品
  6. linux安装xamp遇到的问题
  7. 盲盒app如何运营推广
  8. oracle二级索引,Oracle Index-organized table (IOT)概述
  9. Docker容器中文件与本地相互复制拷贝
  10. 超过2t硬盘分区_大于2T的磁盘分区方法