JavaScript仿京东轮播图效果


Posted in Javascript onFebruary 25, 2021

本文实例为大家分享了JavaScript实现京东轮播图效果展示的具体代码,供大家参考,具体内容如下

做了一个仿京东的轮播图,当然没有人家官网的精美啦。

JavaScript仿京东轮播图效果

主要技术点:

  • 每隔3秒自动切换图片;
  • 鼠标移入图片自动暂停切换,鼠标移出则继续;
  • 点击左右方向按钮手动切换图片;
  • 鼠标移到灰色圆点,显示对应的图片,并加亮显示。

HTML代码:

<body>
 <h1>轮播图展示</h1>
 <div id="did">

 <!-- 图片 -->
 <div id="img-div" onmouseover="doStop()" onmouseout="doStart()">
  <img src="./1.jpg">
  <img src="./2.jpg">
  <img src="./3.jpg">
  <img src="./4.jpg">
  <img src="./5.jpg">
  <img src="./6.jpg">
  <img src="./7.jpg">
  <img src="./8.jpg">
 </div>

 <!-- 左右按钮 -->
 <div id="btn-div">
  <div id="left-btn" onclick="doLeftClick()">
  <h3> < </h3>
  </div>
  <div id="right-btn" onclick="doRightClick()">
  <h3> > </h3>
  </div>
 </div>

 <!-- 圆点 -->
 <div id="cir-div">
  <div onmouseover="doMove(1)"></div>
  <div onmouseover="doMove(2)"></div>
  <div onmouseover="doMove(3)"></div>
  <div onmouseover="doMove(4)"></div>
  <div onmouseover="doMove(5)"></div>
  <div onmouseover="doMove(6)"></div>
  <div onmouseover="doMove(7)"></div>
  <div onmouseover="doMove(8)"></div>
 </div>
 </div>

</body>

CSS代码:

<style>
 * {
 margin: 0px;
 padding: 0px;
 }

 body {
 background-color: rgb(255, 249, 249);
 }

 h1 {
 text-align: center;
 padding-top: 40px;
 color: rgba(250, 54, 129, 0.562);
 }

 #did {
 position: relative;
 width: 590px;
 height: 470px;
 margin: 30px auto;
 }

 #img-div {
 position: absolute;
 }

 #img-div img {
 width: 590px;
 display: none;
 cursor: pointer;
 z-index: -1;
 }

 /* 这两段可不加 */
 /* 显示第一张图片 */
 #img-div img:first-child {
 display: block;
 }

 /* 点亮第一个圆点 */
 #cir-div div:first-child {
 background: #fff;
 }

 #cir-div {
 position: absolute;
 /* 相对于图片的位置 */
 left: 40px;
 bottom: 25px;
 }

 /* 下方圆点 */
 #cir-div div {
 width: 8px;
 height: 8px;
 float: left;
 /* 50%时为圆形 */
 border-radius: 50%;
 margin-right: 6px;
 border: 1px solid rgba(0, 0, 0, .05);
 background: rgba(255, 255, 255, .4);
 }

 #left-btn {
 position: absolute;
 /* 相对于图片的位置 */
 top: 45%;

 /* 左半圆按钮 */
 width: 27px;
 height: 38px;
 background: rgba(119, 119, 119, 0.5);
 border-radius: 0 20px 20px 0;
 /* 动画效果,放在变化前,当鼠标移动上面时,会缓慢变色 */
 transition: background-color 0.3s ease-out;
 }

 #right-btn {
 position: absolute;
 /* 相对于图片的位置 */
 top: 45%;
 right: 0px;

 /* 右半圆按钮 */
 width: 27px;
 height: 38px;
 background-color: rgba(119, 119, 119, 0.5);
 border-radius: 20px 0 0 20px;
 /* 动画效果,放在变化前,当鼠标移动上面时,会缓慢变色 */
 transition: background-color 0.3s ease-out;
 }

 #left-btn:hover {
 background-color: rgba(32, 32, 32, 0.5);
 cursor: pointer;
 }

 #right-btn:hover {
 background-color: rgba(32, 32, 32, 0.5);
 cursor: pointer;
 }

 #left-btn h3 {
 color: #fff;
 margin-top: 4px;
 margin-left: 2px;
 }

 #right-btn h3 {
 color: #fff;
 margin-top: 4px;
 margin-left: 8px;
 }
</style>

JavaScript代码:

<script>
 //显示第几张图片
 var count = 1;
 //时间
 var time = null;
 //图片列表
 var imglist = document.getElementById("img-div").getElementsByTagName("img");
 //圆点列表
 var cirlist = document.getElementById("cir-div").getElementsByTagName("div");

 //展示对应的图片和点亮对应的圆点
 function show(x) {
 for (var i = 0; i < imglist.length; i++) {
  if (x == i + 1) {
  //显示图片
  imglist[i].style.display = "block";
  //圆点点亮
  cirlist[i].style.backgroundColor = "#fff";
  } else {
  imglist[i].style.display = "none";
  cirlist[i].style.background = "rgba(255, 255, 255, .4)";
  }
 }
 }

 //定时轮播图片(每3秒切换一张图片)
 function doStart() {
 if (time == null) {
  time = setInterval(function () {
  count++;
  show(count);
  if (count >= 8) {
   count = 0;
  }
  }, 3000);
 }
 }

 //停止轮播图片
 function doStop() {
 if (time != null) {
  clearInterval(time);
  time = null;
 }
 }

 //鼠标移到圆点上图片会相应切换,并且之后会点亮下一个圆点 而不是未移到圆点前的下一个圆点
 function doMove(x) {
 show(x);
 //将位置赋给count,图片就会从该图片的下一张开始切换
 count = x;
 //当鼠标移到最后一个圆点时,需要将count变为0,不然执行doStart()里的count++,count就会变为9,越界了
 if (count == 8) {
  count = 0;
 }
 }

 /*
 对于i 、count和show(x)里x的关系:
  i = [0,7];
  x = [1,8];
  count = [1,8];
 */
 //点击左边按钮向左切换图片
 function doLeftClick() {
 for (var i = 0; i < imglist.length; i++) {
  //判断当前在展示的是哪张图片
  if (imglist[i].style.display == "block") {
  if (i == 0) {
   show(8);
   // 忘掉这句后,break会直接退出,当左按钮按到最右的圆点,会直接忽略圆点1,直接跳到圆点2
   count = 0;
   //保证切换是3秒钟
   doStop();
   doStart();
   break;
  }
  show(i);
  count = i;
  //保证切换是3秒钟
  doStop();
  doStart();
  break;
  }
 }
 }

 //点击右边按钮向右切换图片
 function doRightClick() {
 for (var i = 0; i < imglist.length; i++) {
  //判断当前在展示的是哪张图片
  if (imglist[i].style.display == "block") {
  if (i == 7) {
   show(1);
   count = 1;
   doStop();
   doStart();
   break;
  }
  show(i + 2);
  count = i + 2;
  //就不会出现切换到没有图片的情况
  if (count >= 8) {
   count = 0;
  }
  doStop();
  doStart();
  break;
  }
 }
 }

 doStart();
 //默认打开页面显示的是第一张图片
 //(不加,会出现第1个圆点亮也就是刚打开页面时,左按钮没反应)
 doMove(1);
</script>

遇到的难点:

虽说轮播图看起来还蛮简单的,但实现起来还挺多问题的。不过我发现的都解决掉了。

  • 圆点与按钮放置在图片上
  • 自动切换图片了但对应的圆点没有点亮
  • 鼠标移到圆点上图片切换了,但下一个自动点亮的圆点却是未移到圆点前的下一个
  • 第1个圆点亮也就是刚打开页面时,左按钮没反应
  • 当左按钮按到最右的圆点,会直接忽略圆点1,直接跳到圆点2
  • 在最后一个圆点时点击右按钮时,会出现切换到没有图片的情况
  • 点左按钮切换时间大概2秒,点右按钮切换时间大概5秒,时间并没有达到标准的3秒

不过我都解决啦!

最大的感触就是刚解决掉一个bug正沾沾自喜时,又来一个bug。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
基于jQuery的仿flash的广告轮播
Nov 05 Javascript
嵌入式iframe子页面与父页面js通信的方法
Jan 20 Javascript
JavaScript制作简单分页插件
Sep 11 Javascript
JavaScript 身份证号有效验证详解及实例代码
Oct 20 Javascript
ES6中Math对象新增的方法实例详解
Apr 25 Javascript
jQuery 改变P标签文本值方法
Feb 24 jQuery
基于Vue实现关键词实时搜索高亮显示关键词
Jul 21 Javascript
vue 纯js监听滚动条到底部的实例讲解
Sep 03 Javascript
浅谈Angular 观察者模式理解
Nov 01 Javascript
Typescript的三种运行方式(小结)
Sep 18 Javascript
聊聊Vue中provide/inject的应用详解
Nov 10 Javascript
javascript浅层克隆、深度克隆对比及实例解析
Feb 09 Javascript
Vue基本指令实例图文讲解
Feb 25 #Vue.js
使用webpack和rollup打包组件库的方法
Feb 25 #Javascript
vue常用高阶函数及综合实例
Feb 25 #Vue.js
原生JS实现音乐播放器的示例代码
Feb 25 #Javascript
详解vite2.0配置学习(typescript版本)
Feb 25 #Javascript
详解vite+ts快速搭建vue3项目以及介绍相关特性
Feb 25 #Vue.js
利用 Chrome Dev Tools 进行页面性能分析的步骤说明(前端性能优化)
Feb 24 #Javascript
You might like
php中对2个数组相加的函数
2011/06/24 PHP
php计算数组不为空元素个数的方法
2014/01/27 PHP
php阻止页面后退的方法分享
2014/02/17 PHP
php 伪造ip以及url来路信息方法汇总
2014/11/25 PHP
PHP实现163邮箱自动发送邮件
2016/03/29 PHP
PHP操作XML中XPath的应用示例
2019/07/04 PHP
jquery+json实现数据二级联动的方法
2015/11/28 Javascript
NodeJs——入门必看攻略
2016/06/27 NodeJs
js HTML5 Canvas绘制转盘抽奖
2020/09/13 Javascript
JavaScript页面实时显示当前时间实例代码
2016/10/23 Javascript
详解js的六大数据类型
2016/12/27 Javascript
12306 刷票脚本及稳固刷票脚本(防挂)
2017/01/04 Javascript
NodeJS实现微信公众号关注后自动回复功能
2017/05/31 NodeJs
MvcPager分页控件 适用于Bootstrap
2017/06/03 Javascript
详解JavaScript中的坐标和距离
2019/05/27 Javascript
详解JavaScript的this指向和绑定
2020/09/08 Javascript
vue 授权获取微信openId操作
2020/11/13 Javascript
[01:09:16]DOTA2-DPC中国联赛 正赛 SAG vs Dynasty BO3 第一场 1月25日
2021/03/11 DOTA
Python基于QRCode实现生成二维码的方法【下载,安装,调用等】
2017/07/11 Python
python的unittest测试类代码实例
2017/12/07 Python
python 中pyqt5 树节点点击实现多窗口切换问题
2019/07/04 Python
Django配置文件代码说明
2019/12/04 Python
基于python调用psutil模块过程解析
2019/12/20 Python
Pycharm 2020最新永久激活码(附最新激活码和插件)
2020/09/17 Python
python 非线性规划方式(scipy.optimize.minimize)
2020/02/11 Python
pycharm快捷键汇总
2020/02/14 Python
Python如何避免文件同名产生覆盖
2020/06/09 Python
html5 标签
2009/07/16 HTML / CSS
C#公司笔试题
2014/03/28 面试题
Prototype如何更新局部页面
2013/03/03 面试题
药学专业大学生自荐信
2013/09/28 职场文书
纠纷协议书
2014/04/16 职场文书
党的群众路线批评与自我批评范文
2014/10/16 职场文书
小学语文教学反思范文
2016/03/03 职场文书
话题作文之生命的旋律
2019/12/17 职场文书
详解CSS故障艺术
2021/05/25 HTML / CSS