---恢复内容开始---

1.轮播图插件

1.什么是插件:

为已有的程序增加功能

2.插件的特点(为什么要做成一个插件)与注意事项:

1.通用性,可移植性强

2.兼容性:不会对其他代码产生影响

3.创建一个div,给一个基础的宽高属性

outline: 外边框;不会占据盒子空间

border:内边框

盒模型:外边距 - 边框(border会占据空间) - 内边距 - 内容

轮播图插件的实现:

1.插件:

html部分最好只有一个外部的div,确定他在页面中的位置和大小。其余的部分都靠js里面的部分来完成;--------方便使用的人;

  1. <div id="banner">

       </div>

2.通过一个script src引入js部分

3.在页面中执行这个函数;

函数中的参数是页面中的div元素和我轮播图画面有关的东西

如果有多张图片记得要写成一个数组的形式,里面的每个元素都是一个对象

注意,执行函数的部分一定要写在创建函数的script后面,不然会报错

Uncaught ReferenceError: createBannerArea is not defined

4.完成要使用的那个函数

首先,插件分为两部分:图片展示区和下面的圆点区

1.主函数

在js中createElement两个div分别来装他们

部分主函数:

  1. function createBannerArea(areaDom, options){
  2. var imgArea = document.createElement('div'); //初始化图片区
  3. var numberArea = document.createElement('div') //初始化圆点区
  4. }

areaDom:我在html页面中获取的元素;

options:一些配置(我传入的图片等信息)---以数组的形式排列

2.局部函数
1.图片的初始化以及事件:
  1. function initImgs(){
  2. imgArea.style.height ='100%';
  3. imgArea.style.width = '100%';
  4. imgArea.style.display = 'flex';
  5. imgArea.style.overflow = 'hidden';
  6. for(let i = 0; i < options.length ; i++){ //遍历options里面的每个元素,知道图片张数
  7. var obj = options[i]; //方便获取图片的属性
  8. var img = document.createElement('img'); //生成img元素
  9. img.src = obj.imgUrl; //获取图片对象的信息
  10. imgArea.appendChild(img); //img作为imgArea的子元素
  11. img.style.height = '100%'; //设置img元素的宽高等
  12. img.style.width = '100%';
  13. img.style.marginLeft = '0px';
  14. img.addEventListener('click',function(){ //给图片一个点击事件
  15. location.href = options[i].link;
  16. })
  17. // console.log(obj);
  18. }
  19. imgArea.addEventListener('mouseenter',function(){ //鼠标进出入图片的事件
  20. clearInterval(changeTimer);
  21. changeTimer = null;
  22. })
  23. imgArea.addEventListener('mouseleave',function(){
  24. autoChange();
  25. })
  26. areaDom.appendChild(imgArea) //imgArea元素是areaDom的子元素
  27. }
2.小圆点的初始化以及事件
  1. function initNumbers(){
  2. numberArea.style.textAlign = 'center';
  3. numberArea.style.marginTop = '-20px'
  4. for(var i = 0; i < options.length; i++){ //遍历小圆点
  5. var sp = document.createElement('span'); //每个圆点都是一个span元素
  6. sp.style.cursor = 'pointer'; //小圆点的样式
  7. sp.style.display = 'inline-block';
  8. sp.style.height = '8px';
  9. sp.style.width = '8px';
  10. sp.style.background = 'white';
  11. sp.style.borderRadius = '50%';
  12. sp.style.margin = '5px 5px';
  13. (function(index){ //立即执行函数,使得点击的圆点显示的是对应的图片
  14. sp.addEventListener('click',function(){
  15. curIndex = index;
  16. setSatus();
  17. })
  18. })(i);
  19. numberArea.append(sp); //span元素是numberArea的子元素

  20. }
  21. areaDom.appendChild(numberArea) //number元素是areaDom的子元素
  22. }
3.初始状态和事件的设置
  1. function setSatus(){
  2. for(var i = 0; i < numberArea.children.length; i++){ //遍历每一个sapn
  3. if( i == curIndex){ //判断是否是当前的索引
  4. numberArea.children[i].style.background = '#336699' //是的画span显示一种颜色
  5. }else{
  6. numberArea.children[i].style.background = 'white' //不是显示另一种颜色
  7. }
  8. }
  9. var start = parseInt(imgArea.children[0].style.marginLeft);//开始时左边的margin值
  10. var end = curIndex * -100; //目标margin-left的值
  11. var dis = end - start; //两者间的距离
  12. var duration = 500; //切换两者间的时间
  13. var speed = dis / duration; //切换的速度
  14. if(timer){
  15. clearInterval(timer); //如果我点击圆点的时候有定时,及时清除
  16. }
  17. var timer = setInterval(function(){
  18. start += 20 * speed; //Margin left的变化
  19. imgArea.children[0].style.marginLeft = start + '%'; //img的变化
  20. if(Math.abs(end - start) < 1){ //当变化后的像素小于1像素以后,直接切换到准确的值
  21. imgArea.children[0].style.marginLeft = end + '%';
  22. clearInterval(timer); //每变化一次,清理一次定时器
  23. }
  24. },20) //每隔20毫秒改变一次
4.图片自动轮播的设置
  1. function autoChange(){
  2. if(changeTimer) {
  3. return} ;
  4. changeTimer = setInterval(function(){
  5. if(curIndex == options.length -1){
  6. //如果切换的curIndex是最后一张图片了,那么下一张是第一张
  7. curIndex = 0;
  8. }else{
  9. curIndex++; //否则自增
  10. }
  11.  
  12. setSatus();
  13. }, changeDuration); //自动切换的事件
  14. }

4.完整HTML:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  7. <title>banner</title>
  8. </head>
  9. <style>
  10. html,body{
  11. height: 100%;
  12. width: 100%;
  13. }
  14. #banner{
  15. position: absolute;
  16. top: 50%;
  17. left: 50%;
  18. transform: translate(-50%,-50%);
  19. width: 300px;
  20. height:200px;
  21. /* width: 63%;
  22. height: 50%; */
  23. /* border: 10px solid #ccc; */
  24. outline: 2px solid rgb(211, 103, 103)
  25. }
  26. </style>
  27. <body>
  28. <div id="banner">

  29. </div>
  30. <script src="./plugin/banner.js"></script>
  31. <script>
  32. var bannerDiv = document.getElementById('banner');
  33. createBannerArea(bannerDiv,[
  34. {imgUrl:'./plugin/img/banner1.jpg',link:'http://www.baidu.com'},
  35. {imgUrl:'./plugin/img/banner2.jpg',link:'http://www.taobao.com'},
  36. {imgUrl:'./plugin/img/banner3.jpg',link:'http://www.jingdong.com'}
  37. ])
  38.  
  39. </script>
  40. </body>
  41. </html>

5.完整js

  1. /**
  2. *
  3. * @param {*} areaDom 轮播图区域
  4. * @param {*} options 轮播图配置
  5. */
  6. function createBannerArea(areaDom, options){
  7. var imgArea = document.createElement('div');
  8. var numberArea = document.createElement('div')
  9. var curIndex = 2;
  10. var changeTimer = null;
  11. var changeDuration = 1000;
  12. var timer = 0;

  13. initImgs();
  14. initNumbers();
  15. setSatus();
  16. autoChange();

  17. function initImgs(){
  18. imgArea.style.height ='100%';
  19. imgArea.style.width = '100%';
  20. imgArea.style.display = 'flex';
  21. imgArea.style.overflow = 'hidden';
  22. for(let i = 0; i < options.length ; i++){
  23. var obj = options[i];
  24. var img = document.createElement('img');
  25. img.src = obj.imgUrl;
  26. imgArea.appendChild(img);
  27. img.style.height = '100%';
  28. img.style.width = '100%';
  29. img.style.marginLeft = '0px';
  30. img.addEventListener('click',function(){
  31. location.href = options[i].link;
  32. })
  33. // console.log(obj);
  34. }
  35. imgArea.addEventListener('mouseenter',function(){
  36. clearInterval(changeTimer);
  37. changeTimer = null;
  38. })
  39. imgArea.addEventListener('mouseleave',function(){
  40. autoChange();
  41. })
  42. areaDom.appendChild(imgArea)
  43. }
  44.  
  45. function initNumbers(){
  46. numberArea.style.textAlign = 'center';
  47. numberArea.style.marginTop = '-20px'
  48. for(var i = 0; i < options.length; i++){
  49. var sp = document.createElement('span');
  50. sp.style.cursor = 'pointer';
  51. sp.style.display = 'inline-block';
  52. sp.style.height = '8px';
  53. sp.style.width = '8px';
  54. sp.style.background = 'white';
  55. sp.style.borderRadius = '50%';
  56. sp.style.margin = '5px 5px';
  57. (function(index){
  58. sp.addEventListener('click',function(){
  59. curIndex = index;
  60. setSatus();
  61. })
  62. })(i);
  63. numberArea.append(sp);

  64. }
  65. areaDom.appendChild(numberArea)
  66. }

  67. function setSatus(){
  68. for(var i = 0; i < numberArea.children.length; i++){
  69. if( i == curIndex){
  70. numberArea.children[i].style.background = '#336699'
  71. }else{
  72. numberArea.children[i].style.background = 'white'
  73. }
  74. }
  75. var start = parseInt(imgArea.children[0].style.marginLeft);
  76. var end = curIndex * -100;
  77. var dis = end - start;
  78. var duration = 500;
  79. var speed = dis / duration;
  80. if(timer){
  81. clearInterval(timer);
  82. }
  83. var timer = setInterval(function(){
  84. start += 20 * speed;
  85. imgArea.children[0].style.marginLeft = start + '%';
  86. if(Math.abs(end - start) < 1){
  87. imgArea.children[0].style.marginLeft = end + '%';
  88. clearInterval(timer);
  89. }
  90. },20)
  91.  

  92. }

  93. function autoChange(){
  94. if(changeTimer) {
  95. return} ;
  96. changeTimer = setInterval(() => {
  97. if(curIndex == options.length -1){
  98. curIndex = 0;
  99. }else{
  100. curIndex++;
  101. }
  102.  
  103. setSatus();
  104. }, changeDuration);
  105. }
  106.  
  107. }

  108. //全局函数

  109. // 附着在window上,可能会造成全局变量污染。
  1.  
  1.  

原生JavaScript(js)手把手教你写轮播图插件(banner)的更多相关文章

  1. 基于js的自适应、多样式轮播图插件(兼容IE8+、FF、chrome等主流浏览器)

    插件github地址:https://github.com/pomelott/slider-plug_in 使用方式: slider plug-in 左右滑动的自适应.多样式全能插件.多次调用时只需传 ...

  2. 原生js写一个无缝轮播图插件(支持vue)

    轮播图插件(Broadcast.js) 前言:写这个插件的原因 前段时间准备用vue加上网易云的nodejs接口,模拟网易云音乐移动端.因为想自己写一遍所有的代码以及加固自己的flex布局,所以没有使 ...

  3. 封装一个简单的原生js焦点轮播图插件

    轮播图实现的效果为,鼠标移入左右箭头会出现,可以点击切换图片,下面的小圆点会跟随,可以循环播放(为了方便理解,没有补2张图做无缝轮播).本篇文章的主要目的是分享封装插件的思路. 轮播图我一开始是写成非 ...

  4. js 原生轮播图插件

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. JS封装动画框架,网易轮播图,旋转轮播图

    JS封装动画框架,网易轮播图,旋转轮播图 1. JS封装运动框架 // 多个属性运动框架 添加回调函数 function animate(obj,json,fn) { clearInterval(ob ...

  6. 学习笔记: js插件 —— SuperSlide 2 (轮播图插件,PC用)

    SuperSlide 2  轮播图插件,较老.但还好用. 适用于PC,是绑定到jquery上的方法: $.slide(); 如果在实际中找不到.slide方法,请检查jquery等.js文件的引入次序 ...

  7. jquery, js轮播图插件Swiper3

    轮播图插件Swiper3 HTML代码 如果只是简单的使用轮播图,直接复制我的html代码就可以. 如果想要高级一些,就自己去看文档吧 <!DOCTYPE html> <html l ...

  8. 第124天:移动web端-Bootstrap轮播图插件使用

    Bootstrap JS插件使用 > 对于Bootstrap的JS插件,我们只需要将文档实例中的代码粘到我们自己的代码中> 然后作出相应的样式调整 Bootstrap中轮播图插件叫作Car ...

  9. jquery的fadeTo方法的淡入淡出轮播图插件

    由于对基于jquery的简单插件开发有了一定的了解,慢慢的也对基于jquery的插件开发有了兴趣,在上班结束之后就研究各种插件的思路逻辑.最近开发了一款基于jquery的fadeTo方法的轮播图插件, ...

随机推荐

  1. python 中的__name__ == "__main__"(转)

    有句话经典的概括了这段代码的意义: “Make a script both importable and executable” 意思就是说让你写的脚本模块既可以导入到别的模块中用,另外该模块自己也可 ...

  2. CDQZ集训DAY0 日记

    貌似没发生什么事…… 按照教练员的交代,写一下流水账…… 早上5:30到了机场,然后就默默地坐着飞机到了成都.然后就按预定好的被GXY的父亲的朋友接机(貌似因为觉得GXY和他爸的同学挺像被批判一番). ...

  3. Junit简单的案例

    Calculator: public class Calculator { public double add(double number1, double number2) { return num ...

  4. 《ElasticSearch6.x实战教程》之简单的API

    第三章-简单的API 万丈高楼平地起 ES提供了多种操作数据的方式,其中较为常见的方式就是RESTful风格的API. 简单的体验 利用Postman发起HTTP请求(当然也可以在命令行中使用curl ...

  5. UVA1152- 枚举 /二分查找

    The SUM problem can be formulated as follows: given four lists A,B,C,D of integer values, compute ho ...

  6. 一文带你了解git

    git简介 什么是git? git是当今世界上最先进的分布式的版本控制系统. 版本控制系统分集中式的和分布式的,集中式的主要代表有CVS.SVN,而Git是分布式版本控制系统的佼佼者. 那什么是集中式 ...

  7. C#使用CLR/C++的DLL间接调用Native C++的DLL

    C#使用CLR/C++的DLL间接调用Native C++的DLL 开发环境:win 7  VS2010 简介:C#的exe使用CLR/C++间接调用Native C++的DLL. 第一步:创建一个C ...

  8. 数据库---T-SQL语句:查询语句(二)

    >查询: 一.查询所有数据: select * from Info    ---查询所有数据(行) select Name from Info  ---查询特定列(Name列) select N ...

  9. 浅谈CMDB

    CMDB和运维自动化 一.运维 运维,指的是对已经搭建好的网络,软件,硬件进行维护.运维领域也是细分的,有硬件运维和软件运维 硬件运维主要包括对基础设施的运维,比如机房的设备,主机的硬盘,内存这些物理 ...

  10. vue+ elementUI 打包发布到服务器后,element-icons.woff文件404

    vue项目打包部署到服务器,静态资源文件404 js文件404问题        原因:打包的项目静态资源的路径需要设置为绝对路径.如果是相对路径会出错 解决办法:修改config/index.js文 ...