原生js模拟实现京东轮播图

系统管理员 2022-09-04 06:48 270阅读 0赞

原生js模拟实现京东轮播图

  • 一、实现原理
        1. 官网发现
        1. opacity和z-index
      • 3.定位
  • 二、文档目录
  • 三、HTML结构
  • 四、css样式
  • 五、js行为_实现自动轮播与点击效果
  • 六、效果展示
  • 总结

一、实现原理

1. 官网发现

我们到京东官网去查看首页的轮播图时,可以发现,它其实是通过改变图片的opacity(透明度)和z-index(层级),再加上过渡效果来实现闪烁效果的。

在这里插入图片描述

2. opacity和z-index

当我们点击左箭头或者右箭头的时候,就去改变当前图片的opacity和z-index为0,上一张或者下一张图片的opacity和z-index为1,并且给以过度效果,就可以实现闪烁轮播的效果。

3.定位

对于装有img的父元素,我们应该给其设置相对定位-position: relative;,子元素设置绝对定位-position: absolute;这样就可以让所有的子元素叠加到一块。


二、文档目录

在这里插入图片描述


三、HTML结构

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>京东轮播图</title>
  8. <link rel="stylesheet" href="css/index.css">
  9. </head>
  10. <body>
  11. <div id="contbox">
  12. <ul id="img_list" class="ani">
  13. <li style="opacity: 1;z-index:1">
  14. <a href="#"><img src="Images/TB1.jpg"></a>
  15. </li>
  16. <li><a href="#"><img src="Images/TB2.jpg"></a></li>
  17. <li><a href="#"><img src="Images/TB3.jpg"></a></li>
  18. <li><a href="#"><img src="Images/TB4.jpg"></a></li>
  19. <li><a href="#"><img src="Images/TB5.jpg"></a></li>
  20. </ul>
  21. <div id="two_rrow">
  22. <a class="arrow left_arrow" href="#"><span></span></a>
  23. <a class="arrow right_arrow" href="#"><span></span></a>
  24. </div>
  25. <div id="dot_list">
  26. <a href="#"><span class="dot cur"></span></a>
  27. <a href="#"><span class="dot"></span></a>
  28. <a href="#"><span class="dot"></span></a>
  29. <a href="#"><span class="dot"></span></a>
  30. <a href="#"><span class="dot"></span></a>
  31. </div>
  32. </div>
  33. <script src="js/Carousel.js"></script>
  34. </body>
  35. </html>

四、css样式

  1. * {
  2. margin: 0;
  3. padding: 0;
  4. }
  5. a {
  6. text-decoration: none;
  7. cursor: pointer;
  8. }
  9. li {
  10. list-style: none;
  11. }
  12. #contbox {
  13. width: 520px;
  14. height: 280px;
  15. margin: 10% auto;
  16. position: relative;
  17. top: 20%;
  18. border-radius: 15px;
  19. overflow: hidden;
  20. }
  21. /* 图片容器 */
  22. #img_list {
  23. position: absolute;
  24. left: 0;
  25. top: 0;
  26. width: 100%;
  27. height: 280px;
  28. }
  29. #img_list>li {
  30. transition: opacity 200ms ease-in-out 0s;
  31. opacity: 0;
  32. width: 520px;
  33. height: 280px;
  34. position: absolute;
  35. left: 0;
  36. top: 0;
  37. }
  38. #img_list>li>a {
  39. position: absolute;
  40. width: 100%;
  41. height: 100%;
  42. }
  43. #img_list>li>a>img {
  44. width: 100%;
  45. height: 100%;
  46. }
  47. /* 指示点 */
  48. #dot_list {
  49. position: absolute;
  50. z-index: 1;
  51. left: 50%;
  52. transform: translateX(-50%);
  53. bottom: 10px;
  54. border-radius: 12px;
  55. height: 18px;
  56. line-height: 18px;
  57. background: rgba(255, 255, 255, 0.4);
  58. }
  59. .dot {
  60. display: inline-block;
  61. width: 10px;
  62. height: 10px;
  63. border-radius: 50%;
  64. background: white;
  65. margin: 0 2.5px;
  66. }
  67. .cur {
  68. background: #ff5000;
  69. cursor: default;
  70. }
  71. /* 左右箭头 */
  72. .arrow {
  73. position: absolute;
  74. width: 30px;
  75. height: 30px;
  76. line-height: 30px;
  77. top: 50%;
  78. background-color: rgba(0, 0, 0, 0.3);
  79. transform: translateY(-15px);
  80. text-align: center;
  81. z-index: 1;
  82. }
  83. .arrow:hover {
  84. background-color: rgba(0, 0, 0, 0.5);
  85. }
  86. .arrow>span {
  87. display: inline-block;
  88. width: 10px;
  89. height: 10px;
  90. position: absolute;
  91. top: 50%;
  92. border-top: 2px solid white;
  93. }
  94. .left_arrow>span {
  95. border-left: 2px solid white;
  96. transform: rotate(-45deg) translateY(-9px);
  97. left: 65%;
  98. }
  99. .right_arrow>span {
  100. border-right: 2px solid white;
  101. transform: rotate(45deg) translateY(-9px);
  102. right: 65%;
  103. }
  104. .left_arrow {
  105. border-top-left-radius: 30%;
  106. border-bottom-left-radius: 30%;
  107. border-top-right-radius: 50%;
  108. border-bottom-right-radius: 50%;
  109. left: -8px;
  110. }
  111. .right_arrow {
  112. border-top-left-radius: 50%;
  113. border-bottom-left-radius: 50%;
  114. border-top-right-radius: 30%;
  115. border-bottom-right-radius: 30%;
  116. right: -8px;
  117. }

五、js行为_实现自动轮播与点击效果

  1. var contbox = document.querySelector('#contbox');
  2. //img
  3. var img_ul = document.querySelector('#img_list');
  4. var img_li = document.querySelectorAll('#img_list>li');
  5. var img_listlen = img_li.length;
  6. //切换按钮
  7. var left_arrow = document.querySelector('.left_arrow');
  8. var right_arrow = document.querySelector('.right_arrow');
  9. //指示点
  10. var dot_list = document.querySelector('#dot_list');
  11. var dot_a = document.querySelectorAll('.dot');
  12. //other
  13. var curidx = 0;
  14. var timer = null;
  15. // 隐藏函数----实现关键
  16. function hide_Myself() {
  17. img_li[curidx].style.opacity = 0;
  18. img_li[curidx].style.zIndex = 0;
  19. }
  20. // 显示函数----实现关键
  21. function show_Myself() {
  22. img_li[curidx].style.opacity = 1;
  23. img_li[curidx].style.zIndex = 1;
  24. }
  25. // 左滑按钮
  26. left_arrow.onclick = function () {
  27. hide_Myself()
  28. curidx == 0 ? curidx = 4 : curidx--;//边界判断
  29. show_Myself()
  30. changdot()
  31. };
  32. // 右滑按钮
  33. right_arrow.onclick = function () {
  34. hide_Myself()
  35. curidx == 4 ? curidx = 0 : curidx++;//边界判断
  36. show_Myself()
  37. changdot()
  38. };
  39. //自动轮播
  40. function running() {
  41. timer = setInterval(function () { //timer用于清除定时器
  42. right_arrow.onclick()
  43. changdot()//同时改变指示点
  44. }, 2500)//每2.5秒自动轮播一次
  45. }
  46. running();
  47. //细节处理
  48. contbox.onmouseenter = function () {
  49. clearInterval(timer)//鼠标移动到容器上时,停止自动轮播
  50. }
  51. contbox.onmouseleave = function () {
  52. running()//鼠标移开容器之外,开始自动轮播
  53. }
  54. //指示点
  55. function changdot() {
  56. for (let i = 0; i < dot_a.length; i++) {
  57. if (dot_a[i].classList.contains('cur')) {
  58. dot_a[i].classList.remove('cur')
  59. break;//如果找到cur类了,就删除cur类,并且立即退出循环
  60. }
  61. }
  62. dot_a[curidx].classList.add('cur');//所有的指示点都没有cur类了,那么给当前指示点添加cur
  63. }
  64. // 为dot自定义属性:data_order(自命名)
  65. for (let i = 0; i < dot_a.length; i++) {
  66. dot_a[i].data_order = i;
  67. dot_a[i].onclick = function () {
  68. curidx = this.data_order;
  69. changdot()
  70. Jump()
  71. // console.log(this.data_order + ":" + curidx);
  72. }
  73. }
  74. // 底部原点跳转方法:
  75. function Jump() {
  76. //当前curidx的li(既img_li[curidx]),设置到最顶层,其余的被覆盖
  77. show_Myself()
  78. for (let j = 0; j < img_li.length; j++) {
  79. if (curidx == j) {
  80. continue;
  81. }
  82. img_li[j].style.opacity = 0;
  83. img_li[j].style.zIndex = 0;
  84. // console.log(curidx);
  85. // hide_Myself();此处不能直接写函数,因为需要引用j的值作为curidx,循环结束会改变curidx的值
  86. }
  87. }

六、效果展示

在这里插入图片描述

总结

  1. 以上就是今天要讲的内容,在这里并没有用京东的图片,所以图片尺寸不一样。但是实现原理是一样的。
  2. 本文仅仅介绍了京东轮播图的简单实现,而真正的实际开发中,我们的需要关注的细节会更多,这样才会让用户的体验更好。好啦,这就是今天的分享咯。886~

发表评论

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

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

相关阅读

    相关 原生JS实现

    本人前端小白一枚,代码可能比较冗余,在优化方面还有很大的提升空间,欢迎各位大佬指出。 先来看看实现效果吧 ![在这里插入图片描述][watermark_type_ZmF

    相关 原生js实现

    如何使用原生js实现轮播图效果呢,现在带着大家做一个小小的例子   先说一下这次的轮播图需要实现的功能点:      1.3s自动切换图片,图片切换时提示点跟随切换

    相关 原生js实现

            很多很多网站经常会用到一个特效,那就是轮播图,对于日新月异的前端技术来说其实就是一个框架一个接口的事,但轮播的原理是什么?用最原始的javascript来写又是

    相关 原生js实现

    轮播图基本上是前端所必须面临的一个功能。而且在网上可以找到各种各样的插件或者写法。 但是我个人觉得还是写一下比较好。这里用到的是原生JS、CSS3相结合的写法。 对IE 8

    相关 原生js实现

    原生js实现轮播图  很多网站上都有轮播图,但却很难找到一个系统讲解的,因此这里做一个简单的介绍,希望大家都能有所收获,如果有哪些不正确的地方,希望大家可以指出。  [