原生js实现简单的移动端轮播图效果

叁歲伎倆 2022-05-11 12:40 303阅读 0赞

近期接触了移动端html5和css3,想加入些轮播图,于是在网上搜集整理了一些资料,经自己补充改进使之较为完善


原生JavaScript 移动端web轮播图片

实现功能

  1. 索引小圆点
  2. 过渡滑动动画的定时轮播
  3. 移动端可以滑动切换图片
  4. 滑动距离不够则吸附回去

效果图

7070 1

代码

  1. slideshow.html

    1. <!DOCTYPE html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <meta name="viewport"
    6. content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    7. <title>移动端-轮播图</title>
    8. <link rel="stylesheet" href="slideshow.css">
    9. </head>
    10. <body>
    11. <div class="layout">
    12. <div class="banner">
    13. <ul class="swipe" id="swipe">
    14. <li><a href="#"><img src="images/l5.jpg"></a></li>
    15. <li><a href="#"><img src="images/l1.jpg"></a></li>
    16. <li><a href="#"><img src="images/l2.jpg"></a></li>
    17. <li><a href="#"><img src="images/l3.jpg"></a></li>
    18. <li><a href="#"><img src="images/l4.jpg"></a></li>
    19. <li><a href="#"><img src="images/l5.jpg"></a></li>
    20. <li><a href="#"><img src="images/l1.jpg"></a></li>
    21. </ul>
    22. <ul class="swipe-btn-list" id="swipe-btn-list">
    23. <li class="now"></li>
    24. <li></li>
    25. <li></li>
    26. <li></li>
    27. <li></li>
    28. </ul>
    29. </div>
    30. </div>
    31. <script src="base.js"></script>
    32. <script src="slideshow.js"></script>
    33. </body>
    34. </html>
  1. slideshow.css

    1. *,
    2. ::before,
    3. ::after{
    4. padding: 0;
    5. margin: 0;
    6. -webkit-box-sizing: border-box;/*兼容移动端主流浏览器*/
    7. box-sizing: border-box;
    8. -webkit-tap-highlight-color: transparent;/*清除移动端点击高亮效果*/
    9. }
    10. body{
    11. font-family:Microsoft YaHei,sans-serif;
    12. font-size: 14px;
    13. color: #333;
    14. }
    15. ol,ul{
    16. list-style: none;
    17. }
    18. /*清除浮动*/
    19. .swipe::before,
    20. .swipe::after{
    21. content: "";
    22. display: block;
    23. height: 0;
    24. line-height: 0;
    25. visibility: hidden;
    26. clear: both;
    27. }
    28. .layout{
    29. width: 100%;
    30. max-width: 750px;
    31. min-width: 320px;
    32. margin: 0 auto;
    33. position: relative;
    34. }
    35. .banner{
    36. width: 100%;
    37. overflow: hidden;
    38. position: relative;
    39. }
    40. .swipe{
    41. width: 1000%;
    42. -webkit-transform: translateX(-10%);
    43. transform: translateX(-10%);
    44. }
    45. .swipe li{
    46. width: 10%;
    47. float: left;
    48. }
    49. .swipe li a{
    50. display: block;
    51. width: 100%;
    52. }
    53. .swipe li a img{
    54. width: 100%;
    55. display: block;
    56. }
    57. .swipe-btn-list{
    58. position: absolute;
    59. bottom: 6px;
    60. width: 100%;
    61. text-align: center;
    62. }
    63. .swipe-btn-list li{
    64. width: 6px;
    65. height: 6px;
    66. border: 1px solid #fff;
    67. border-radius: 50%;
    68. display: inline-block;
    69. margin-left: 10px;
    70. }
    71. .swipe-btn-list li:first-child{
    72. margin-left: 0;
    73. }
    74. .swipe-btn-list li.now{
    75. background: #fff;
    76. }
  1. base.js

    1. /**
    2. * Improved by yanzuyue on 2018/10/20.
    3. */
    4. /*封装一些公用的事件或者公用的方法*/
    5. /*定义的一个命名空间*/
    6. window.my = {};
    7. /*封装一个事件 过渡结束事件*/
    8. my.transitionEnd = function(dom,callback){
    9. //1.给谁加事件
    10. //2.事件触发后处理什么业务
    11. if(!dom || typeof dom != 'object'){
    12. //没dom的时候或者不是一个对象的时候 程序停止
    13. return false;
    14. }
    15. dom.addEventListener('transitionEnd', function(){
    16. callback && callback();
    17. });
    18. dom.addEventListener('webkitTransitionEnd', function(){
    19. callback && callback();
    20. });
    21. }
  1. slideshow.js

    1. /**
    2. * Improved by yanzuyue on 2018/10/20.
    3. */
    4. window.onload = function(){
    5. /*
    6. * 1.设置定时器 自动轮播 无缝衔接
    7. * 2.点需要随着轮播的滚动改变对应的点 改变当前样式
    8. * 3.手指滑动的时候让轮播图滑动 touch事件 记录坐标轴的改变 改变轮播图的定位(位移css3)
    9. * 4.当滑动的距离不超过一定的距离的时候 需要吸附回去
    10. * 5.当滑动超过了一定的距离 需要跳到下一张或者上一张
    11. * */
    12. var imageCount = 5; //页面中用来轮播的图片有5张
    13. var banner = document.querySelector('.banner');//轮播图大盒子
    14. var width = banner.offsetWidth;//图片的宽度
    15. var imageBox = document.getElementById("swipe");//图片盒子
    16. var pointBox = document.getElementById("swipe-btn-list");//点盒子
    17. var points = pointBox.querySelectorAll('li');//所有的点
    18. //公用方法
    19. //加过渡滑动动画(CSS3 transition 属性)(根据需要可添加ease,linear等属性)
    20. var addTransition = function(){
    21. imageBox.style.transition = "all 0.3s";
    22. imageBox.style.webkitTransition = "all 0.3s";
    23. };
    24. //清除过渡(清除图片的 transition 属性)
    25. var removeTransition = function(){
    26. imageBox.style.transition = "none";
    27. imageBox.style.webkitTransition = "none";
    28. }
    29. //设置图片的位置,定位(CSS3 transform 属性)
    30. var setTranslateX = function(translateX){
    31. imageBox.style.transform = "translateX("+translateX+"px)";
    32. imageBox.style.webkitTransform = "translateX("+translateX+"px)";
    33. }
    34. //自动轮播 定时器 无缝衔接 动画结束瞬间定位
    35. var index = 1;
    36. var timer = setInterval(function(){
    37. index++; //自动轮播到下一张
    38. //改变定位 动画的形式去改变 transition transform translate
    39. addTransition(); //加过渡动画
    40. setTranslateX(-index * width); //定位
    41. if(index > imageCount)
    42. index = 1;
    43. setPoint();
    44. },3500);//设置每隔3.5秒切换一次
    45. //等过渡结束之后来做无缝衔接
    46. my.transitionEnd(imageBox, function(){
    47. removeTransition(); //清除过渡
    48. setTranslateX(-index * width); //定位
    49. });
    50. //改变当前样式 当前图片的索引(小圆点)
    51. var setPoint = function(){
    52. //清除上一次的now
    53. for(var i = 0 ; i < points.length ; i++){
    54. points[i].className = " ";
    55. }
    56. //给图片对应的点加上样式
    57. points[index-1].className = "now";
    58. }
    59. /*
    60. 手指滑动的时候让轮播图滑动 touch事件 记录坐标轴的改变 改变轮播图的定位(位移css3)
    61. 当滑动的距离不超过一定的距离的时候 需要吸附回去 过渡的形式去做
    62. 当滑动超过了一定的距离 需要 跳到 下一张或者上一张 (滑动的方向) 一定的距离(屏幕的三分之一)
    63. */
    64. //touch事件
    65. var startX = 0; //记录起始 刚刚触摸的点的位置 x的坐标
    66. var moveX = 0; //滑动的时候x的位置
    67. var distanceX = 0; //滑动的距离
    68. var isMove = false; //是否滑动过
    69. imageBox.addEventListener('touchstart', function(e){
    70. clearInterval(timer); //清除定时器
    71. startX = e.touches[0].clientX; //记录起始X
    72. });
    73. imageBox.addEventListener('touchmove',function(e){
    74. moveX = e.touches[0].clientX; //滑动时候的X
    75. distanceX = moveX - startX; //计算移动的距离
    76. //计算当前定位 -index*width+distanceX
    77. removeTransition(); //清除过渡
    78. setTranslateX(-index * width + distanceX); //实时的定位
    79. isMove = true; //证明滑动过
    80. });
    81. //在模拟器上模拟的滑动会有问题 丢失的情况 最后在模拟器的时候用window
    82. imageBox.addEventListener('touchend', function(e){
    83. // 滑动超过 1/4 即为滑动有效,否则即为无效,则吸附回去
    84. if(isMove && Math.abs(distanceX) > width/4){
    85. //5.当滑动超过了一定的距离 需要 跳到 下一张或者上一张 (滑动的方向)*/
    86. if(distanceX > 0){ //上一张
    87. index --;
    88. }
    89. else{ //下一张
    90. index ++;
    91. }
    92. }
    93. addTransition(); //加过渡动画
    94. setTranslateX(-index * width); //定位
    95. if(index > imageCount ){
    96. index = 1;
    97. }else if(index <= 0){
    98. index = imageCount;
    99. }
    100. setPoint();
    101. //重置参数
    102. startX = 0;
    103. moveX = 0;
    104. distanceX = 0;
    105. isMove = false;
    106. //加定时器
    107. clearInterval(timer); //严谨 再清除一次定时器
    108. timer = setInterval(function(){
    109. index++;
    110. addTransition();
    111. setTranslateX(-index * width);
    112. if(index > imageCount)
    113. index = 1;
    114. setPoint();
    115. },3500);
    116. });
    117. };

发表评论

表情:
评论列表 (有 0 条评论,303人围观)

还没有评论,来说两句吧...

相关阅读

    相关 原生JS实现简单

    注意 我们用原生JS来做一个简单的无缝轮播图,首先需要准备几张**图片作为材料**,图片的链接需要自己设置,所以这边我的代码中图片链接的位置请大家自己添加图片。 ...