web技术

轮播图实现

2023-07-18 06:24 作者:Admin

一、所用技术

JQuery、CSS、JavaScript

二、实现思路

1、img_ul类里面存放img标签,将需要展示的图片依次排开,在img_url中使用overflow:hidden的方式进行隐藏图片,每次只展示一张,通过控制img_url样式到外容器uls的距离来控制显示的图片。

2、无痕切换。在最后一张图片的后面拼上第一张图片,在第一张图片的后面拼上最后一张图片,以三张为例1.png、2.png、3.png,实际在页面中展示的是3.png、1.png、2.png、3.png、1.png,具体看下文代码。

当图片移动到最后一张的时候3.png,通过动画animate切换到下一张1.png,然后通过CSS样式瞬间切换到第一张1.png,达到无痕切换的效果,当图片移动到第一张的时候,原理相似,具体代码看后文代码。

三、效果图

轮播视频链接:https://6d79-mycloud-m7997-1301347483.tcb.qcloud.la/blogs/swiper.mp4

四、注意事项

1、图片设置宽度是300px,可根据需要自己变动,这个在使用过程中多注意。

2、用户根据需要可在左右切换图片的地方添加防抖节流函数,防止用户持续点击。

五、具体代码

1、HTML代码

<div class="parent">
  <div class="uls">
    <!-- 图片位置 -->
    <ul class="img_ul">
      <img src="images/3.png" />
      <img src="images/1.png" />
      <img src="images/2.png" />
      <img src="images/3.png" />
      <img src="images/1.png" />
    </ul>

    <!-- 原点位置 -->
    <ul class="litCir_ul"></ul>
  </div>

  <!-- 左右切换按钮 -->
  <div class="buttons">
    <span class="left"><</span>
    <span class="right">></span>
  </div>
</div>

2、JS代码

// 切换原点dom
let dotDoms = "";
let timer = undefined;
// 当前所在图片
let currentPage = 1;
// 当前所在点
let currentDot = 0;
// 点的数量总是比图片的数量少两个
for (let index = 0; index < $("img").length - 2; index++) {
  dotDoms += "<span class='dot' data-page=" + index + "></span>";
}
$(".litCir_ul").html(dotDoms);
// 第一个点是激活选中的状态
$(".dot").eq(0).addClass("active-dot");
// 鼠标移入的时候停止轮播图
$(".parent").mouseenter(function () {
  clearInterval(timer);
});
// 鼠标移出的时候开始轮播
$(".parent").mouseleave(function () {
  autoPlay();
});
// 左侧按钮点击事件
$(".left").click(function () {
  currentDot = currentDot === 0 ? $("img").length - 3 : --currentDot;
  if (currentPage <= 1 || currentPage === $("img").length - 1) {
    currentPage = $("img").length - 1;
    // 当切换到第一张图片时,先让图片动画左移,再让图片瞬间右移
    $(".img_ul").animate(
      {
        left: 0
      },
      function () {
        $(".img_ul").css({
          left: --currentPage * -300
        });
      }
    );
  } else {
    // 当不是第一张图片时,然图片动画右移
    $(".img_ul").animate({
      left: --currentPage * -300
    });
  }
  renderDots();
});
// 右侧按钮点击事件
$(".right").click(function () {
  currentDot = currentDot === $("img").length - 3 ? 0 : currentDot + 1;
  if (currentPage >= $("img").length - 1) {
    currentPage = 1;
  }
  $(".img_ul").animate(
    {
      left: ++currentPage * -300
    },
    function () {
      if (currentPage === $("img").length - 1) {
        $(".img_ul").css({
          left: "-300px"
        });
      }
    }
  );
  renderDots();
});

$(".dot").click(function (e) {
  currentPage = parseInt(e.currentTarget.dataset.page) + 1;
  currentDot = parseInt(e.currentTarget.dataset.page);
  console.log(currentPage);
  $(".img_ul").animate({
    left: (currentDot + 1) * -300
  });
  renderDots();
});
autoPlay();
// 自动轮播
function autoPlay() {
  timer = setInterval(function () {
    currentDot = currentDot === $("img").length - 3 ? 0 : currentDot + 1;
    // 当图片移动到最后一张图片的时候,当前图片变为1
    if (currentPage >= $("img").length - 1) {
      currentPage = 1;
    }
    $(".img_ul").animate(
      {
        left: ++currentPage * -300
      },
      function () {
        // 图片移动到最后一张的时候,图片瞬移到第一张1.png
        if (currentPage === $("img").length - 1) {
          $(".img_ul").css({
            left: "-300px"
          });
        }
      }
    );
    renderDots();
  }, 1000);
}

// 轮播圆点渲染
function renderDots() {
  $(".dot").removeClass("active-dot");
  $(".dot").eq(currentDot).addClass("active-dot");
}

3、CSS代码

.parent {
	width: 300px;
	position: relative;
}

ul {
	margin: 0;
	padding: 0;
}

.uls {
	position: relative;
	width: 300px;
	overflow: hidden;
	margin: 0;
	padding: 0;
}

.img_ul {
	width: 1500px;
	position: relative;
        /* 展示图片 */
	left: -300px;
}

img {
	width: 300px;
	float: left;
}

.buttons {
	position: absolute;
	width: 100%;
	top: 50%;
	left: 50%;
	transform: translate(-50%, -50%);
}

.left {
	background: rgba(0, 0, 0, 0.3);
	position: absolute;
	left: 0;
	cursor: pointer;
}

.right {
	background: rgba(0, 0, 0, 0.3);
	position: absolute;
	right: 0;
	cursor: pointer;
}

.litCir_ul {
	position: absolute;
	text-align: center;
	bottom: 0;
	width: 100%;
}

.dot {
	background: white;
	display: inline-block;
	height: 10px;
	width: 10px;
	border-radius: 50%;
	margin: 5px;
}

.active-dot {
	background: turquoise;
}
标签: #轮播图
推荐文章
HTML5 Canvas是一种强大的Web技术,它允许我们使用JavaScript在网页上创建和...
在这个程序中,我们将使用JavaScript创建一个可以在屏幕上放烟花的效果。我...
轮播图在网站中几乎无处不在,占用地方少,交互性好。今天就来聊聊如何用vu...
大部分网站或APP的首页差不多都运用到了轮播图,下边就探讨一下关于轮播图的...
刚学js没多久,这篇博客就当做记录了,以后还会完善的,希望大佬们多多指点...
推荐专题
如何自己建网站?建网站难不难?其实建网站说难不难,说容易也并不容易,难...
本专题精心收集整理了多种HTML+CSS+JS轮播图实现方案,带详细代码和讲解,正...