JS实现自动轮播图效果

逃离我推掉我的手 2022-01-27 09:34 833阅读 0赞

现在很多网站都有轮播图,这篇文章主要为大家详细介绍了js实现轮播图的完整代码及原理,需要的小伙伴可以参考一下。
轮播图主要功能:
1、 图片自动轮播(主图切换同时下面导航图片也会跟着变化)
2、 鼠标悬停的时候,图片轮播停止,鼠标离开后继续
3、 单击左右按钮切换图片
4、 鼠标移入后左右按钮出现,移出消失
工作原理:
具体效果如下:
image.png
image.png
轮播图片数量、css样式等,小伙伴也可根据自己的需求做相应调整。
具体实现部分
特别重要的是,在我们写任何动态效果之前,我们应该先把静态页面写出来,在考虑动态效果的实现。
HTML代码:

  1. <div id="div1">
  2. <ul class="big_pic">//主图部分
  3. <div class="prev">
  4. <a class="mark_left" href="#"></a>
  5. </div>
  6. <div class="next">
  7. <a class="mark_right" href="#"></a>
  8. </div>
  9. <div class="text">图片1详情</div>
  10. <div class="length">1/6</div>
  11. <li style="z-index: 1"><img src="images/flash_1.jpg" /></li>
  12. <li><img src="images/flash_2.jpg" /></li>
  13. <li><img src="images/flash_3.jpg" /></li>
  14. <li><img src="images/flash_4.jpg" /></li>
  15. <li><img src="images/flash_5.jpg" /></li>
  16. <li><img src="images/flash_6.jpg" /></li>
  17. </ul>
  18. <ul class="small_pic" >//下部导航
  19. <li><img src="images/flash_1.jpg" /></li>
  20. <li><img src="images/flash_2.jpg" /></li>
  21. <li><img src="images/flash_3.jpg" /></li>
  22. <li><img src="images/flash_4.jpg" /></li>
  23. <li><img src="images/flash_5.jpg" /></li>
  24. <li><img src="images/flash_6.jpg" /></li>
  25. </ul>
  26. </div>

Css样式:

  1. @charset "utf-8";
  2. * {
  3. margin: 0;
  4. padding: 0;
  5. list-style: none;
  6. }
  7. #div1 {
  8. width: 500px;
  9. height: 420px;
  10. margin: 100px auto;
  11. position: relative;
  12. cursor: pointer;
  13. overflow: hidden;
  14. }
  15. #div1 ul.big_pic {
  16. position: relative;
  17. height: 320px;
  18. }
  19. #div1 ul.big_pic div.prev {
  20. opacity: 0;
  21. -webkit-transition: all .3s linear;
  22. transition: all .3s linear;
  23. position: absolute;
  24. left: 0;
  25. top: 0;
  26. bottom: 0;
  27. right: 50%;
  28. z-index: 100;
  29. }
  30. #div1 ul.big_pic div.prev a.mark_left {
  31. position: absolute;
  32. width: 60px;
  33. height: 60px;
  34. top: 50%;
  35. left: 10px;
  36. background: url("../images/btn.gif");
  37. }
  38. #div1 ul.big_pic div.next {
  39. opacity: 0;
  40. -webkit-transition: all .5s linear;
  41. transition: all .5s linear;
  42. position: absolute;
  43. left: 50%;
  44. top: 0;
  45. bottom: 0;
  46. right: 0;
  47. z-index: 100;
  48. }
  49. #div1 ul.big_pic div.next a.mark_right {
  50. position: absolute;
  51. width: 60px;
  52. height: 60px;
  53. top: 50%;
  54. right: 10px;
  55. background: url("../images/btn.gif") left -60px;
  56. }
  57. #div1 ul.big_pic div.text {
  58. position: absolute;
  59. bottom: 0;
  60. left: 0;
  61. line-height: 26px;
  62. color: white;
  63. background-color: rgba(0, 0, 0, 0.51);
  64. width: 70%;
  65. height: 26px;
  66. z-index: 200;
  67. font-size: 14px;
  68. padding-left: 20px;
  69. -webkit-box-sizing: border-box;
  70. box-sizing: border-box;
  71. }
  72. #div1 ul.big_pic div.length {
  73. position: absolute;
  74. bottom: 0;
  75. right: 0;
  76. line-height: 26px;
  77. color: white;
  78. background-color: rgba(0, 0, 0, 0.51);
  79. width: 30%;
  80. height: 26px;
  81. z-index: 200;
  82. font-size: 14px;
  83. text-align: center;
  84. }
  85. #div1 ul.big_pic li {
  86. position: absolute;
  87. top: 0;
  88. left: 0;
  89. width: 500px;
  90. height: 320px;
  91. overflow: hidden;
  92. }
  93. #div1 ul.big_pic li img {
  94. width: 100%;
  95. height: 320px;
  96. }
  97. #div1 ul.small_pic {
  98. display: -webkit-box;
  99. display: -ms-flexbox;
  100. display: flex;
  101. background-color: #b0b0b0;
  102. height: 100px;
  103. padding: 6px 5px 6px 8px;
  104. -webkit-box-sizing: border-box;
  105. box-sizing: border-box;
  106. position: absolute;
  107. }
  108. #div1 ul.small_pic li {
  109. width: calc(500px / 3);
  110. }
  111. #div1 ul.small_pic li img {
  112. width: calc(488px / 3);
  113. height: 100%;
  114. }
  115. #div1 ul.small_pic li:not(:last-child) img {
  116. padding-right: 4px;
  117. -webkit-box-sizing: border-box;
  118. box-sizing: border-box;
  119. }

接下来是最重要的js代码:

  1. var oDiv=document.getElementById('div1');
  2. var oPrv=oDiv.querySelector('div.prev');
  3. var oNext=oDiv.querySelector('div.next');
  4. var oBtnPrev=oPrv.querySelector('a.mark_left');
  5. var oBtnNext=oNext.querySelector('a.mark_right');
  6. var oText=oDiv.querySelector('div.text');
  7. var oLength=oDiv.querySelector('div.length');
  8. var aUl=oDiv.querySelectorAll('ul');
  9. var aBigLi=aUl[0].querySelectorAll('li');
  10. var aSmallLi=aUl[1].querySelectorAll('li'); //获取标签
  11. var zIndex=1,now=0;//zIndex:主图Z轴层级,now:下面导航图片的下标(从0开始)
  12. oBtnNext.onclick=function () {//单击右键切换图片
  13. now++;
  14. if(now===aSmallLi.length) now=0;//当now等于导航图片的长度时,把导航图片换成第一张
  15. opublic();
  16. };
  17. oBtnPrev.onclick=function () {//单击左边按钮切换图片
  18. now--;
  19. if(now===-1) now=aSmallLi.length-1;//当now等于-1,把主图片换成最后
  20. opublic();
  21. };
  22. for (var i=0;i<aSmallLi.length;i++){
  23. aSmallLi[i].style.opacity=.6;//统一设置下面导航图片透明度为0.6
  24. aSmallLi[0].style.opacity=1;//初始化第一个导航图片透明度为1
  25. aSmallLi[i].index=i;//为每一个导航图加一个index的自定义属性
  26. aSmallLi[i].onclick=function () {//添加单击事件
  27. now=this.index;//当单击图片后,主图切换为对应图片
  28. opublic();
  29. };
  30. }
  31. function opublic(){//公共部分
  32. aBigLi[now].style.zIndex=zIndex++;//图片切换改变Z轴层级
  33. aBigLi[now].style.height=0;
  34. startMove(aBigLi[now],'height',320);//图片高度从0->360,实现图片动态叠加效果
  35. oText.innerHTML='图片'+(now+1)+'详情';
  36. oLength.innerHTML=(now+1)+'/'+aBigLi.length;
  37. for(var i=0;i<aSmallLi.length;i++)
  38. {
  39. startMove(aSmallLi[i], 'opacity', 60);
  40. }
  41. startMove(aSmallLi[now], 'opacity', 100);
  42. if(now===0){
  43. startMove(aUl[1], 'left', 0);
  44. }
  45. else if(now===aSmallLi.length-1){//当当前导航图片为最后一张时,固定最后一张图片位置
  46. startMove(aUl[1], 'left', -(now-2)*aSmallLi[0].offsetWidth);
  47. }
  48. else{//下面导航图片的轮播效果
  49. startMove(aUl[1], 'left', -(now-1)*aSmallLi[0].offsetWidth);
  50. }
  51. }
  52. oPrv.onmouseover=oNext.onmouseover=function () {//鼠标移入左右按钮出现
  53. this.style.opacity=1;
  54. };
  55. oPrv.onmouseout=oNext.onmouseout=function () {//鼠标移出左右按钮消失
  56. this.style.opacity=0;
  57. };
  58. var timer=setInterval(oBtnNext.onclick, 3000);//设置一个定时器,每3秒钟模拟一次右边按钮的单击事件
  59. oDiv.onmouseenter=function () {//鼠标移入后,定时器取消
  60. clearInterval(timer);
  61. };
  62. oDiv.onmouseleave=function () {//鼠标离开后开启定时器
  63. timer=setInterval(oBtnNext.onclick, 3000);
  64. }
  65. function startMove(obj, attr, iTarget)//运动框架
  66. //obj:运动的对象,attr:运动的属性,iTarget:目标值
  67. {
  68. clearInterval(obj.timer);
  69. obj.timer=setInterval(function (){
  70. var cur=0;
  71. if(attr==='opacity')
  72. {
  73. cur=Math.round(parseFloat(getStyle(obj, attr))*100);
  74. }
  75. else
  76. {
  77. cur=parseInt(getStyle(obj, attr));
  78. }
  79. var speed=(iTarget-cur)/10;
  80. speed=speed>0?Math.ceil(speed):Math.floor(speed);
  81. if(cur==iTarget)
  82. {
  83. clearInterval(obj.timer);
  84. }
  85. else
  86. {
  87. if(attr=='opacity')
  88. {
  89. obj.style.filter='alpha(opacity:'+(cur+speed)+')';
  90. obj.style.opacity=(cur+speed)/100;
  91. }
  92. else
  93. {
  94. obj.style[attr]=cur+speed+'px';
  95. }
  96. }
  97. }, 30);
  98. }

发表评论

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

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

相关阅读