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 相关文章推荐
javascript function调用时的参数检测常用办法
Feb 26 Javascript
Google排名中的10个最著名的 JavaScript库
Apr 27 Javascript
学习并汇集javascript匿名函数
Nov 25 Javascript
兼容ie、firefox的图片自动缩放的css跟js代码分享
Jan 21 Javascript
JS实现下拉框的动态添加(附效果)
Apr 03 Javascript
根据身份证号自动输出相关信息(籍贯,出身日期,性别)
Nov 15 Javascript
js控制再次点击按钮之间的间隔时间可防止重复提交
Aug 01 Javascript
通过原生JS实现为元素添加事件的方法
Nov 23 Javascript
jQuery插件ContextMenu自定义图标
Mar 15 Javascript
JavaScript仿微信(电话)联系人列表滑动字母索引实例讲解(推荐)
Aug 16 Javascript
VUE解决 v-html不能触发点击事件的问题
Oct 28 Javascript
vue项目中使用多选框的实例代码
Jul 22 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中检查文件或目录是否存在的代码小结
2012/10/22 PHP
php中使用preg_replace函数匹配图片并加上链接的方法
2013/02/06 PHP
PHP5各个版本的新功能和新特性总结
2014/03/16 PHP
ThinkPHP中自定义错误页面和提示页面实例
2014/11/22 PHP
PHP响应post请求上传文件的方法
2015/12/17 PHP
PHP会话操作之cookie用法分析
2016/09/28 PHP
PHP不使用递归的无限级分类简单实例
2016/11/05 PHP
探究Laravel使用env函数读取环境变量为null的问题
2016/12/06 PHP
初试jQuery EasyUI 使用介绍
2010/04/01 Javascript
用js写了一个类似php的print_r输出换行功能
2013/02/18 Javascript
js实现照片墙功能实例
2015/02/05 Javascript
使用npm发布Node.JS程序包教程
2015/03/02 Javascript
javascript中Function类型详解
2015/04/28 Javascript
js小数运算出现多位小数如何解决
2015/10/08 Javascript
JavaScript中eval函数的问题
2016/01/31 Javascript
JS控件bootstrap datepicker使用方法详解
2017/03/25 Javascript
ES6中新增的Object.assign()方法详解
2017/09/22 Javascript
jQuery实现新闻播报滚动及淡入淡出效果示例
2018/03/23 jQuery
详解使用VUE搭建后台管理系统(vue-cli更新至3.0)
2018/08/22 Javascript
解决vue项目input输入框双向绑定数据不实时生效问题
2020/08/05 Javascript
Webpack5正式发布,有哪些新特性
2020/10/12 Javascript
JavaScript语法约定和程序调试原理解析
2020/11/03 Javascript
vue+element table表格实现动态列筛选的示例代码
2021/01/14 Vue.js
python2.7删除文件夹和删除文件代码实例
2013/12/18 Python
Python实现返回数组中第i小元素的方法示例
2017/12/04 Python
django实现用户登陆功能详解
2017/12/11 Python
Python 中Django安装和使用教程详解
2019/07/03 Python
Python 3.6打包成EXE可执行程序的实现
2019/10/18 Python
关于Python 常用获取元素 Driver 总结
2019/11/24 Python
PyTorch中的拷贝与就地操作详解
2020/12/09 Python
幼儿园消防演练方案
2014/02/13 职场文书
詹天佑教学反思
2014/04/30 职场文书
关于环保的建议书
2014/05/12 职场文书
公安个人四风问题对照检查及整改措施
2014/10/28 职场文书
钱学森电影观后感
2015/06/04 职场文书
2016优秀青年志愿者事迹材料
2016/02/25 职场文书