web技术

js实现图片轮播图(一)

2023-06-30 10:26 作者:Admin

一.实现原理

(1)将所有图片放在一个父容器div里面,通过display属性来设置图片的出现与隐藏;

(2)轮播图分为手动轮播和自动轮播;
手动轮播的重点是每次点击图片下方的小圆圈,获得它的索引号,并让与之对应索引号的图片显示,并且此时的小圆圈为高亮显示;
自动轮播:利用定时器setInterval(),来每隔一定的时间来播放一次图片。

(3)所有的基础知识:dom操作,定时器,事件运用。

二.轮播图页面布局:

<div id="content">
  <!-- 总的父容器 -->

  <div class="carousel-inner">
    <!-- 包含图片的容器 -->
    <div class="item"><img src="./img/lunbo1.jpg" alt="第一张图片" /></div>
    <div class="item"><img src="./img/lunbo2.jpg" alt="第二张图片" /></div>
    <div class="item"><img src="./img/lunbo3.jpg" alt="第三张图片" /></div>
  </div>

  <!-- 图片下方的指示圆圈-->
  <ul class="carousel-indicators">
    <li id="pic1">●</li>
    <li id="pic2">●</li>
    <li id="pic3">●</li>
  </ul>

  <!-- 图片左右方来回滚动图片的左右箭头-->
  <a href="#" class="carousel-control prev"><span><</span></a>
  <a href="#" class="carousel-control next"><span>></span></a>
</div>

三.轮播图的css样式:

#content {
	width: 100%;
	height: 500px;
	position: relative;
}

.carousel-inner {
	position: relative;
	width: 100%;
	overflow: hidden;
	height: 500px;
}

.carousel-inner>.item>img {
	display: block;
	line-height: 1;
	z-index: 1;
}

.carousel-indicators {
	position: absolute;
	bottom: 10px;
	left: 45%;
	z-index: 2;
	list-style-type: none;
}

.carousel-indicators li {
	display: inline-block;
	padding: 0 15px;
	font-size: 24px;
	color: #999;
	cursor: pointer;
	z-index: 2;
}

.active1 {
	font-size: 28px;
	color: #fff;
}

.carousel-control {
	position: absolute;
	text-decoration: none;
	color: #999;
	font-weight: bold;
	opacity: .5;
	font-size: 40px;
	z-index: 3;
}

.carousel-control:hover {
	color: fff;
	text-decoration: none;
	opacity: .9;
	outline: none;
	font-size: 42px;
}

.prev {
	top: 30%;
	left: 20px;
}

.next {
	top: 30%;
	right: 20px;
}

四.轮播图的js实现代码:

window.onload = function () {
  //轮播初始化
  var lunbo = document.getElementById("content");
  var imgs = lunbo.getElementsByTagName("img");
  var uls = lunbo.getElementsByTagName("ul");
  var lis = lunbo.getElementsByTagName("li");

  //初始状态下,一个圆圈为高亮模式

  lis[0].style.fontSize = "26px";
  lis[0].style.color = "#fff";

  //定义一个全局变量,用来进行自动轮播图片顺序的变化
  var pic_index = 1;

  //自动轮播.使用pic_time记录播放,可以随时使用clearInterval()清除掉。
  var pic_time = setInterval(autobofang, 3000);

  //手动轮播
  for (var i = 0; i < lis.length; i++) {
    lis[i].addEventListener("mouseover", change, false);
  }

  function change(event) {
    var event = event || window.event;
    var target = event.target || event.srcElement;
    var children = target.parentNode.children;
    for (var i = 0; i < children.length; i++) {
      if (target == children[i]) {
        picChange(i);
      }
    }
  }
  //图片切换函数
  function picChange(i) {
    //让所有图片都不显示,所有圆圈都为普通样式
    for (var j = 0; j < imgs.length; j++) {
      imgs[j].style.display = "none";
      lis[j].style.fontSize = "24px";
      lis[j].style.color = "#999";
    }

    //让选中的索引的图片显示,对应的圆圈高亮
    imgs[i].style.display = "block";
    lis[i].style.fontSize = "26px";
    lis[i].style.color = "#fff";
  }

  //自动播放的事件处理
  function autobofang() {
    if (pic_index >= lis.length) {
      pic_index = 0;
    }

    change1(pic_index);
    pic_index++;
  }
  //自动播放的图片转化中的事件
  function change1(index) {
    picChange(index);

    //鼠标移入ul标签,自动播放图片暂停

    uls[0].addEventListener("mouseover", pause, false);

    //鼠标移出ul标签,自动播放图片继续

    uls[0].addEventListener("mouseout", go, false);
  }

  //自动播放暂停函数

  function pause(event) {
    var event = event || window.event;
    var target = event.target || event.srcElement;
    switch (target.id) {
      case "pic1":
        clearInterval(pic_time);

        break;
      case "pic2":
        clearInterval(pic_time);

        break;
      case "pic3":
        clearInterval(pic_time);

        break;
    }
  }

  //自动播放图片继续函数

  function go(event) {
    var event = event || window.event;
    var target = event.target || event.srcElement;
    switch (target.id) {
      case "pic1":
        pic_index = 1;
        pic_time = setInterval(autobofang, 3000);

        break;
      case "pic2":
        pic_index = 2;
        pic_time = setInterval(autobofang, 3000);

        break;
      case "pic3":
        pic_index = 3;
        pic_time = setInterval(autobofang, 3000);

        break;
    }
  }
};

五.效果图:

六.遇到的问题与不足

问题:当鼠标第一次移入ul标签时,自动轮播图片停止,鼠标移出,自动轮播继续,但是随着运行,轮播图片的变化速度越来越快,而且这时点击ul标签已经不起作用了。

    

问题原因:在后面停止轮播后再次轮播开始使用定时器的时候,没有给赋值给pic_time来记录,也就没有再次鼠标移到ul标签而清除定时器,因此导致再次点击ul标签不能暂停自动轮播播放,而且速度 越来越快。

不足:没有实现类似淘宝轮播图那样平滑过渡的无现滚动的效果,左右箭头的指示作用也没有完成。这些在后期会继续学习,继续来完善,来分享.

标签: #轮播图 #JavaScript
推荐文章
HTML5 Canvas是一种强大的Web技术,它允许我们使用JavaScript在网页上创建和...
在这个程序中,我们将使用JavaScript创建一个可以在屏幕上放烟花的效果。我...
轮播图在网站中几乎无处不在,占用地方少,交互性好。今天就来聊聊如何用vu...
大部分网站或APP的首页差不多都运用到了轮播图,下边就探讨一下关于轮播图的...
轮播图实现思路:1、img_ul类里面存放img标签,将需要展示的图片依次排开,在...
推荐专题
如何自己建网站?建网站难不难?其实建网站说难不难,说容易也并不容易,难...
本专题精心收集整理了多种HTML+CSS+JS轮播图实现方案,带详细代码和讲解,正...