经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JSJS库框架 » JavaScript » 查看文章
纯JS实现轮播图特效——详解
来源:cnblogs  作者:littleboyck  时间:2018/10/21 20:20:59  对本文有异议
  1. <div id="slider">
  2. <div id="sliderImgs">
  3. <img src="img/mi04.jpg" width="1000px"/>
  4. <img src="img/mi01.jpg" width="1000px" title="oneImg"/>
  5. <img src="img/mi02.jpg" width="1000px" title="twoImg"/>
  6. <img src="img/mi03.jpg" width="1000px" title="threeImg"/>
  7. <img src="img/mi04.jpg" width="1000px" title="fourImg"/>
  8. <img src="img/mi01.jpg" width="1000px"/>
  9. <!--因为要做无缝滚动,所以要克隆第一张和最后一张,放到最后一张后面和最前面-->
  10. </div>
  11. <div id="buttons">
  12. <ul>
  13. <li class="active"></li>
  14. <li></li>
  15. <li></li>
  16. <li></li>
  17. </ul>
  18. </div>
  19. <div>
  20. <span id="prev">&lt;</span>
  21. <span id="next">&gt;</span>
  22. </div>
  23. </div>

CSS部分

  1. <style type="text/css">
  2. *{
  3. margin: 0;
  4. padding: 0;
  5. }
  6. /*禁止html元素别被鼠标选中,必须要写不然会有bug,--start*/
  7. *{
  8. moz-user-select: -moz-none;
  9. -moz-user-select: none;
  10. -o-user-select:none;
  11. -khtml-user-select:none;
  12. -webkit-user-select:none;
  13. -ms-user-select:none;
  14. user-select:none;
  15. }
  16. /*禁止html元素别被鼠标选中--end*/
  17. #slider{
  18. width: 1000px; /*设置为图片宽度*/
  19. height: 376px; /*设置为图片高度*/
  20. margin: 0 auto;
  21. margin-top: 100px;
  22. overflow: hidden;
  23. position: relative;
  24. /*border: 2px solid palegreen;*/
  25. }
  26. #sliderImgs{
  27. width: 600%; /*几张图片就是 6*100% */
  28. position: absolute; /*必须设置绝对定位,才能使用left属性*/
  29. left: -1000px; /*把第一张假图偏移出去*/
  30. /*border: 1px solid blue;*/
  31. }
  32. #sliderImgs img{
  33. float: left;
  34. }
  35. #buttons{
  36. width: 70px;
  37. position: absolute;
  38. z-index: 1; /*设置图片堆叠属性,仅限于定位的元素使用。默认值为0,值越大,优先级越高*/
  39. bottom: 10px;
  40. left: 45%;
  41. background-color: rgba(255,255,255,0.4);
  42. padding-top: 4px;
  43. padding-bottom: 4px;
  44. border-radius: 9px; /*高度一半 = 8px + 10px (li的height) */
  45. /*border: 2px solid red;*/
  46. }
  47. #buttons ul{
  48. list-style-type: none;
  49. }
  50. #buttons ul li{
  51. float: left;
  52. margin-left: 6px;
  53. width: 10px;
  54. height: 10px;
  55. line-height: 10px;
  56. border-radius: 100%;
  57. background-color: #FFFFFF;
  58. }
  59. #buttons ul li:hover{
  60. cursor: pointer; /*手型光标*/
  61. background-color:#FF5000;
  62. }
  63. #buttons .active{
  64. background-color: #FF5000;
  65. }
  66. #next , #prev{
  67. position: absolute;
  68. z-index: 1;
  69. top: 43%;
  70. color: rgba(255,255,255,.9);
  71. font-family: "微软雅黑";
  72. font-size: 25px;
  73. text-align: center;
  74. display: block;
  75. width: 40px ;
  76. height: 40px;
  77. line-height: 40px;
  78. border-radius: 100%;
  79. background-color: rgba(0,0,0,.4);
  80. transition: width 0.3s ,height 0.3s ,line-height 0.3s ,border-radius 0.3s, text-align 0.3s ,ease 0.3s ;
  81. }
  82. #prev{
  83. left: 5%;
  84. }
  85. #next{
  86. right: 5%;
  87. }
  88. #next:hover{
  89. cursor: pointer; /*手型光标*/
  90. width: 44px;
  91. height: 44px;
  92. line-height: 44px;
  93. border-radius:100%;
  94. text-align: center;
  95. }
  96. #prev:hover{
  97. cursor: pointer; /*手型光标*/
  98. width: 44px;
  99. height: 44px;
  100. line-height: 44px;
  101. border-radius:100% ;
  102. text-align: center;
  103. }
  104. </style>

布局效果图:

 

 

JS部分

  1. <script type="text/javascript">
  2. var doc = document;
  3. var sliderId = doc.getElementById('slider');
  4. var sliderImgsId = doc.getElementById('sliderImgs');
  5. var imgs = sliderImgsId.getElementsByTagName('img');
  6. var btnLi = doc.getElementById('buttons').getElementsByTagName('li');
  7. var btnPrev = doc.getElementById('prev');
  8. var btnNext = doc.getElementById('next');
  9. var imgsLength = imgs.length-2; //减去2个假图
  10. var btnLiLength = btnLi.length;
  11. var imgWidth = sliderId.clientWidth; //获取图片宽度
  12. var imgAnimateTimer = null; //图片animate定时器
  13. var aotuPlayTimer = null; //自动播放定时器
  14. var index = 0; //当前图片默认为第一张
  15. var speed = 0; //动画速度,这个数必须是能被图片宽度500整除的。正负表示偏移方向
  16. /*非常重要*/
  17. var isAnimate = false; //图片是否在动画状态。若在动画状态,此时动画没结束, 则不执行下一个动画。
  18. sliderImgsId.style.left = -imgWidth+"px"; //初始化为第一张真图
  19. btnPrev.onclick = function(){
  20. if(isAnimate == false){ //图片不在动画状态才执行
  21. imgAnimate(imgWidth);
  22. index--;
  23. if(index<0){
  24. index = imgsLength-1;
  25. }
  26. selectBtn();
  27. }
  28. }
  29. btnNext.onclick = function(){
  30. if(isAnimate == false){
  31. imgAnimate(-imgWidth);
  32. index++;
  33. if(index>imgsLength-1){
  34. index = 0;
  35. }
  36. selectBtn();
  37. }
  38. }
  39. for(var i = 0 ; i<btnLiLength;i++){
  40. btnLi[i].index = i;
  41. btnLi[i].onclick = function(){
  42. var toTargetImgOffset = (index - this.index)*imgWidth; //负数sliderimgsId向左偏转,反之,向右
  43. if(toTargetImgOffset == 0){return;}
  44. if(isAnimate == false){
  45. imgAnimate(toTargetImgOffset); //方法的参数是局部参数
  46. index = this.index;
  47. selectBtn();
  48. }
  49. }
  50. }
  51. function selectBtn(){
  52. for(var i = 0; i < btnLiLength; i++){
  53. if(btnLi[i].className == "active"){
  54. btnLi[i].className = "";
  55. break;
  56. }
  57. }
  58. btnLi[index].className = 'active';
  59. }
  60. /*动画函数*/
  61. function imgAnimate(offset){
  62. var newLeft = parseInt(sliderImgsId.style.left) + offset; //sliderImgsId.style.left永远获取都是当前图片偏移量
  63. var allTime = 400; //完成offset偏移量,总共所用时间。offset路程一定,时间越短,速度越快。此时间必须小于autoPlay间隔时间,否则,图片运动还没结束,ImgAnimate()再次被调用
  64. var interval = 20; //定时器的间隔时间,值越小越好,因为越大,动画越卡
  65. var speed = offset/(allTime/interval); //speed正负由offset决定
  66. isAnimate = true; //图片动画开始
  67. clearInterval(imgAnimateTimer);
  68. imgAnimateTimer = setInterval(function(){
  69. sliderImgsId.style.left = parseInt(sliderImgsId.style.left)+speed +"px";
  70. /* 第一种情况:当speed<0时,(即图片向左运动时)
  71. * 如果当前图片left值 , left只会越来越小 , 当小于等于newLeft , 则停止图片运动
  72. * 第二种情况:当speed>0时,(即图片向右运动时)
  73. * 如果当前图片的left , left只会越来越大 , 大于等于newLeft , 则停止图片运动
  74. * */
  75. if( speed<0 && parseInt(sliderImgsId.style.left)<= newLeft || speed>0 && parseInt(sliderImgsId.style.left) >= newLeft){
  76. clearInterval(imgAnimateTimer); //到达指定newleft位置停止动画
  77. isAnimate = false; //动画执行结束
  78. /*重新定位-- 让图片无限循环 --start*/
  79. if(newLeft > -imgWidth){
  80. sliderImgsId.style.left = -imgsLength*imgWidth +"px" ;
  81. return;
  82. }
  83. if(newLeft < -imgsLength*imgWidth){
  84. sliderImgsId.style.left = -imgWidth +"px" ;
  85. return;
  86. }
  87. sliderImgsId.style.left = newLeft+"px";
  88. /*重新定位-- 让图片无限循环 --end*/
  89. /*图片运动结束后。清除上一次定时器时间*/
  90. window.onload();
  91. }
  92. },interval);
  93. }
  94. window.onload = function(){
  95. if(isAnimate==false){
  96. clearInterval(aotuPlayTimer);
  97. aotuPlayTimer = setInterval(function(){
  98. btnNext.onclick();
  99. },5000); //图片每格5s移动一次
  100. }
  101. }
  102. /*鼠标移入sliderId事件*/
  103. sliderImgsId.onmouseover = function(){
  104. clearInterval(aotuPlayTimer);
  105. }
  106. /*鼠标移出sliderId事件*/
  107. sliderImgsId.onmouseout =function(){
  108. window.onload();
  109. }
  110. </script>
 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号