成品效果如下图所示:

因为博客园限制图片上传大小被我删了一些帧数,所以图片看起来会有一点卡,现实运行是不会的

搭建HTML和CSS结构

HTML代码如下:

 1 <div class="wrapper">
 2         <ul class="sliderPage">
 3             <li>
 4                 <img src="data:images/1.jpg">
 5             </li>
 6             <li>
 7                 <img src="data:images/2.jpg">
 8             </li>
 9             <li>
10                 <img src="data:images/3.jpg">
11             </li>
12             <li>
13                 <img src="data:images/1.jpg">
14             </li>
15         </ul>
16         <div class="btn leftBtn">&lt;</div>
17         <div class="btn rightBtn">&gt;</div>
18         <div class="sliderIndex">
19             <span class="active"></span>
20             <span></span>
21             <span></span>
22         </div>
23     </div>

CSS代码如下:

 1 * {
 2             padding: 0px;
 3             margin: 0px;
 4             list-style: none;
 5         }
 6
 7         .wrapper {
 8             margin: 50px auto 0px;
 9             width: 480px;
10             height: 640px;
11             overflow: hidden;
12             position: relative;
13         }
14
15         .wrapper .sliderPage {
16             height: 640px;
17             width: 2400px;
18             position: absolute;
19             left: 0px;
20             top: 0px;
21         }
22
23         .wrapper .sliderPage li {
24             width: 480px;
25             height: 640px;
26             float: left;
27         }
28
29         .wrapper .sliderPage li img {
30             width: 100%;
31             height: 100%;
32         }
33
34         .wrapper .btn {
35             position: absolute;
36             top: 50%;
37             margin-top: -20px;
38             width: 40px;
39             height: 40px;
40             color: #fff;
41             background-color: #000;
42             text-align: center;
43             line-height: 40px;
44             opacity: 0.3;
45             cursor: pointer;
46         }
47
48         .wrapper:hover .btn {
49             opacity: 0.7;
50         }
51
52         .wrapper .leftBtn {
53             left: 15px;
54         }
55
56         .wrapper .rightBtn {
57             right: 15px;
58         }
59
60         .wrapper .sliderIndex {
61             position: absolute;
62             width: 100%;
63             bottom: 15px;
64             text-align: center;
65         }
66
67         .wrapper .sliderIndex span {
68             display: inline-block;
69             width: 8px;
70             height: 8px;
71             background-color: #ccc;
72             border-radius: 50%;
73             margin-right: 10px;
74             cursor: pointer;
75         }
76
77         .wrapper .sliderIndex .active {
78             background-color: #f40;
79         }

搭建好后的效果如下:

传入(调用写好的运动函数)

 1 //获取样式
 2         function getStyle(dom, attr) {
 3             if (window.getComputedStyle) {
 4                 return window.getComputedStyle(dom, null)[attr];
 5             } else {
 6                 return dom.currentStyle[attr];
 7             }
 8         }
 9
10         //运动函数
11         function startMove(dom, attr, func) {
12             clearInterval(dom.timer);
13             var iSpeed = null, //速度
14                 iCur = null;  //当前值
15             dom.timer = setInterval(function () {
16                 for (var i in attr) {
17                     if (i == 'opacity') { //判断是否为 透明 属性,是的话,特殊处理;
18                         iCur = parseFloat(getStyle(dom, i)) * 100;
19                     } else {
20                         iCur = parseInt(getStyle(dom, i));
21                     }
22                     iSpeed = (attr[i] - iCur) / 7;
23                     iSpeed = iSpeed > 0 ? Math.ceil(iSpeed) : Math.floor(iSpeed);
24
25                     if (i == 'opacity') {
26                         dom.style.opacity = (iCur + iSpeed) / 100;
27                     } else {
28                         dom.style[i] = iCur + iSpeed + 'px';
29                     }
30                     if (iCur == attr[i]) {
31                         clearInterval(dom.timer);
32                         func();
33                     }
34                 }
35             }, 30)
36         }

开始写轮播图代码
  

 1         var timer = null;
 2         var sliderPage = document.getElementsByClassName('sliderPage')[0];
 3         var moveWidth = sliderPage.children[0].offsetWidth;   //sliderPage的子节点第n位的width等于movewidth
 4         var num = sliderPage.children.length - 1;  //li的长度减去1,相当于4-1=3;刚好到了第三张也就是最后一张
 5         var leftBtn = document.getElementsByClassName('leftBtn')[0]; // 获取左按钮事件
 6         var rightBtn = document.getElementsByClassName('rightBtn')[0];    //获取右按钮事件
 7         var lock = true;  //设置一个锁使定时器不发生冲突,true的时候可以进入,false就把锁锁上;
 8                           //相当于一个厕所,很多人在排队, 没进入前等于true,第一个进去之后把锁锁上(也就是等于false)这样别人就进不去,
 9                           //出来的时候把锁打开(也就是等于true)方便下一个进入
10
11         var index = 0; //小圆点初始值等于0
12         var oSpanArray = document.getElementsByClassName('sliderIndex')[0].getElementsByTagName('span');//选出sliderIndex下面的所有span标签
13
14
15         // 点击向左
16         leftBtn.onclick = function () {
17             autoMove('right->left');   //当点击leftBtn的时候传入'right->left'这个实参
18         }
19
20
21
22         // 点击向右
23         rightBtn.onclick = function () {
24             autoMove('left->right');   //当点击rightBtn的时候传入'left->right'这个实参
25         }
26
27
28         //点击小圆点跳转至相应的图片和小圆点位置
29         for (var i = 0; i < oSpanArray.length; i++) {   //先循环拿到3个span标签,也就是每个小圆点的位置
30             (function (myIndex) {
31                 oSpanArray[i].onclick = function () { //给每一个小圆点注册一个点击事件
32                     lock = false;  //点击后关闭锁,防止没执行完再次运行点击事件
33                     clearInterval(timer); //清理定时器,防止没执行完再次开启定时器
34                     index = myIndex; //myIndex和i形参实参相统一,myIndex付给index
35                     startMove(sliderPage,{ left: - index * moveWidth }, //执行函数让sliderPage(也就是ul)移动
36
37                               function () { //再执行回调函数
38                                 lock = true; //执行完再次开启锁,方便下次开启点击事件
39                                 timer = setInterval(autoMove, 1500); //开启定时器,让图片继续运动
40                                 changeIndex(index); //执行小圆点函数,让小圆点每次点击同步
41                     })
42                 }
43             })(i)
44         }
45
46         function autoMove(dierction) {  // 函数形参传入dierction
47
48             if (lock) {  //lock = true时进入判断
49                 lock = false;   //进来后等于false,判断之后再次开启锁
50                 clearInterval(timer);  // 每次进入autoMove函数的时候立即关闭定时器,执行下面代码之后再次开启定时器。
51                                         // 相当于执行一次轮播一张图片之后再次开启一次定时器,再次轮播一张图片,无限循环。
52                 if (!dierction || dierction == 'left->right') {     //不传入参数时dierction等于undefined !undfined时等于true,进入if语句。
53                                                                     //点击左右函数的时候传入实参
54                     index++; //小圆点位置每次加1
55                     startMove(sliderPage,{ left: sliderPage.offsetLeft - moveWidth },  //执行函数startMove,sliderPage里面left当前值减去li的宽度,所以图片移动
56                              function () {  //再执行回调函数
57                                 if (parseInt(getStyle(sliderPage, 'left')) == -num * moveWidth) {  // 判断当前left的值是否等于最后一个,也就是到了最后一张图片
58                                     index = 0; // 当到了最后一张的时候,小圆点跳转到第一张,小圆点下角标为0,也就是等于第一张图片。
59                                     sliderPage.style.left = '0px';  // 如果等于到了最后一张图片的话,就当前left值等于0。 === 回到第一张图片
60                                 }
61                                 timer = setInterval(autoMove, 1500);  // 每次执行结束之后再次开启定时器
62                                 lock = true; //出去前等于true,方便下次进入,使定时器不会发生冲突同时运行多个定时器
63                                 changeIndex(index); //执行小圆点
64                         });
65
66                 } else if (dierction == 'right->left') { //当点击right按钮后实参传入'right->left',进入if语句执行以下代码
67                     if (sliderPage.offsetLeft == 0) {  //如果开始执行的时候当前位置等于0
68                         sliderPage.style.left = - num * moveWidth + 'px';  //那就把最后一张的位置付给他,让他跳转至最后一张
69                         index = num;   //如果刚开始的时候,当前位置等于0点击向left那么跳转到最后一张图片的位置,所以直接index的下角标直接等于最后一张的位置
70                     }
71                     index--;  //小圆点位置每次减1
72                     startMove(sliderPage,{ left: sliderPage.offsetLeft + moveWidth },
73                             function () {
74                             timer = setInterval(autoMove, 1500); //每次执行之后再次开启定时器
75                             lock = true; //出去前等于true,方便下次进入,使定时器不会发生冲突同时运行多个定时器
76                             changeIndex(index); //执行小圆点
77                         })
78                 }
79             }
80         }
81         function changeIndex(_index) {
82             for (var i = 0; i < oSpanArray.length; i++) {
83                 oSpanArray[i].className = ''; //循环小圆点让每个位置的classname等于空
84             }
85             oSpanArray[_index].className = 'active'; //因为原始值是0,所以第一个有classname样式,每次index加数,下角标改变时classname也同步改变
86         }
87         timer = setInterval(autoMove, 1500); // 设置一个定时器,每1500毫秒运行一次autoMove函数

转载于:https://www.cnblogs.com/yangpeixian/p/10771970.html

原生javascript之实战 轮播图相关推荐

  1. 用原生JavaScript实现简单轮播图

    html代码 <div id="banner"><ul><li><img src="images/1.jpg"> ...

  2. 原生js+css 实现轮播图 完整代码

    利用原生的js实现轮播图,可以添加到自己的UI库中,在以后的项目中对其进行修改然后添加到已有项目中. 先写出css部分和html部分,直接上代码 <!DOCTYPE html> <h ...

  3. 原生js进阶版轮播图实现(走马灯效果,无缝衔接)

    原生js进阶版轮播图实现(走马灯效果,无缝衔接) 利用原生js手写一个轮播图,是上一篇文章的简易版的一个进阶,本次轮播图主要是利用定位和定时器实现了走马灯效果,并且是左右轮播.实现过程与代码也是很简单 ...

  4. php cms 轮播图,原生JS运动实现轮播图

    原生JS运动实现轮播图 **基本原理:**通过控制包含n张图片的ul的left值来实现图片自动运动的效果,其中列表中li元素的个数为n,第一个li和最后一个li里存放的图片应为同一张图片,当图片运动到 ...

  5. 蓝懿IOS学习UICollectionView实战轮播图

    今天刘国斌老师讲了关于JSON数据源的获取与利用,通过微博的实战项目进行练习,获取的数据都是网络上请求的真实数据,这种方式学起来很轻松,很容易理解. 刘国斌老师把今天做的练习题UICollection ...

  6. 单机按钮来图片轮播_原生js如何实现轮播图效果?

    第一种: 这个是之前写的,比较草率,没有注释,如果这个看不懂就去看第二个,比较仔细,主要是了解他,后面都会有一些插件来使用,很方便,只要几行代码就可写出各种各样的代码,所以,不懂的话,不要太在意, 第 ...

  7. JavaScript实现网页轮播图

    轮播图也成为焦点图,是网页中比较常见的网页特效 一.功能: 1.鼠标经过轮播图模块,左右两边的按钮显示,鼠标离开轮播图模块,就隐藏左右按钮. 2.点击右(左)侧按钮一次,图片往左(右)播放一张,一以此 ...

  8. 【JavaScript】网页轮播图

    目录 HTML搭建 功能实现 小圆圈事件 左右按钮事件 自动播放 轮播图也叫焦点图,是网页中比较常见的网页特效. 功能: 鼠标经过轮播图模块,左右按钮显示,离开隐藏左右按钮. 点击右侧按钮一次,图片往 ...

  9. 用javascript做网页轮播图

    文章目录 网页轮播图: 功能需求: 动图展示: 代码分析: 主题结构部分: 样式设置: 交互效果: 引用缓动动画(图片滚动的效果) 网页轮播图: 轮播图也称为焦点图,是网页中比较常见的网页特效. 功能 ...

最新文章

  1. 万字长文,值得收藏/参考的OpenCV C++基础代码
  2. @autowired注入mapper_Intellij IDEA中Mybatis Mapper自动注入警告的6种解决方案
  3. Python爬虫学习二
  4. android ifw 启动广告,使用 IFW 完全控制 Android 应用行为 | 实用技巧
  5. mac json格式化工具_简洁好用的工具都是相似的
  6. HTML如何做个播放器图表,Web绘图神器之ECharts-ts文件播放器
  7. oracle set ansi_nulls off,sqlserver存储过程转换成oracle存储过程
  8. fork函数_Linux中子进程回收函数:wait和waitpid
  9. 麟龙指标通达信指标公式源码_麟龙四量图通达信指标公式源码
  10. SQL 数据库 学习 004 预备知识
  11. 基于M0 MCU的无感FOC航模电机控制
  12. 另辟蹊径,挑战网络战争
  13. 【个人记录|环境配置等】
  14. 【NLP】句法分析一
  15. 【LeetCode】买卖股票的最佳时机含手续费 [M](动态规划)
  16. [Slides notes] Other notes using Excel
  17. 常见噪声及其消除的方式
  18. Gitlab统计代码的贡献量指标
  19. 华为的操作系统即将发布?
  20. Java中在指定范围内生成整型、长整型、双精度随机数流

热门文章

  1. Mysql半双工主从复制
  2. 旋转数组—leetcode189
  3. 几种嵌入式RTOS的分析与比较
  4. BZOJ-2440 (莫比乌斯函数)
  5. Redis的设计与实现之对象
  6. C++ stringstream 实现字符与数字之间的转换
  7. 网关和路由器的区别是什么?
  8. php 文档转html格式文件,php学习笔记之将word文档转化为HTML文件
  9. Leetcode题库 728.自除数(C实现)
  10. Leetcode题库 11.盛水最多的容器(双指针法 C实现)