文章目录

  • 前言
  • 一、案例实现功能描述
  • 二、html代码讲解
  • 三、css代码讲解
  • 四、js实现功能及代码讲解
  • 五、效果图
  • 总结

前言

轮播图案例是一个比较重要的案例,能够在实现功能的过程中掌握大部分js代码的知识点。也是一个比较复杂的案例。涉及到的功能是比较的多,大家要一步步看才能明白哦!我也是学了好几个小时才搞明白的,当然在实际开发中都会直接用模板套。但和你自己一个字母一个字母打出来的感觉和掌握程度是有很大差别的。我感觉自己打一遍源码才是最好的效果。不多说了,直接开整。。。


一、案例实现功能描述

要实现淘宝轮播图,首先要做的是分析它的结构和功能。这里我把淘宝轮播图拿来大家一起分析。

分析结构

                        分析结构主要是为了写html+css 这个比较好分析,相信大家比较轻松。

1.一个大盒子放里面的内容。

2.左中和右中2个箭头。

3.把轮播的图放到ul li里。

4.ol li 实现小圆圈。

                分析功能

大家看图能发现有什么功能吗?我给大家列出来看看和你的想法一样不!

1.鼠标放上去会出现左中和右中的2个箭头。

2.鼠标离开箭头也会随之消失。

3.鼠标点击箭头会出现图片轮播效果,点左箭头图片向左移动一个图片。反之也是一样的。

4.鼠标点击箭头后下方小圆圈的实心圆就会变色,展示的是对应的图片。

5.鼠标放上去后图片将不会再进行自动轮播效果。

6.鼠标离开后图片就会在间隔时间内实现自动的轮播图片。

二、html代码讲解

第一章已经把结构和功能都介绍了,现在开始整代码,先实现html布局。下述代码和分析的一样。

1.我们需要大盒子focus_f1。

2.2个箭头按钮用a标签。那个href写的是javascript:;这样点击域名栏不会跳转。

3.滚动图片区域用ul li。

4.ol 没有设置li ,因为我们要用js动态生成。是不是很高级,下面js再讲它的好处。

                    <!-- 轮播图 --><div class="focus_f1"><!-- 左按钮 --><a href="javascript:;" class="arrow-l"> <</a><!-- 右按钮 --><a href="javascript:;" class="arrow-r">></a><!-- 滚动图片区域 --><ul ><li><a href="#"><img src="./image/p6img/p6img1.png" ></a></li><li><a href="#"><img src="./image/p6img/p6img2.jpg" ></a></li><li><a href="#"><img src="./image/p6img/p6img3.webp" ></a></li><li><a href="#"><img src="./image/p6img/p6img4.jpg" ></a></li><li><a href="#"><img src="./image/p6img/p6img5.webp" ></a></li><li><a href="#"><img src="./image/p6img/p6img6.jpg" ></a></li></ul><ol class="circle" ><!-- 用js添加li --></ol></div>

三、css代码讲解

到了布局样式了,html比较简单,这里就开始慢慢变难了,提醒仔细看代码哦。

下面代码就是css布局和样式的全部代码。要注意的是在没写js之前要把overflow注释掉哦。这样在写js条代码时才会很方便。还有就是大盒子一定要有相对定位。因为后边图片要轮播必须该ul的left属性值才能实现轮播效果。

/* 轮播图盒子修饰 */
.focus_f1 {position: relative;width: 520px;height: 280px;left: 0px;top: 0px;display: inline-block;/* border: 1px solid #ff557f; */overflow: hidden;
}/* 轮播图左按钮 */
.focus_f1 .arrow-l {position: absolute;left: 0px;top: 125px;color: #FF0000;z-index: 2;display: none;
}/* 轮播图右按钮 */
.focus_f1 .arrow-r {position: absolute;top: 125px;left: 506px;color: #FF0000;z-index: 2;display: none;
}/* 轮播图片列表 */.focus_f1 ul {position: absolute;top: 0px;left: 0px;list-style: none;width: 3640px;
}/* 每个图平铺 */.focus_f1 ul li {float: left;
}/* 小圆点 ol样式 */.focus_f1 .circle {position: absolute;left: 206px;top: 250px;width: 200px;list-style-type: circle;
}/* 每个li平铺 */.focus_f1 .circle li {width: 20px;float: left;color: #ffffff;
}/* 选中的li小圆圈变色 */
.focus_f1 .circle .current {color: #ff00ff;
}

四、js实现功能及代码讲解

        html+css已经全部打出来了,但是他还不会实现轮播等鼠标监听事件的功能。所以说该我们的大哥js出马了。

首先我们要实现一个图片缓动动画的实现。把这个功能封装起来。封装成animate文件。方便我们调用。animate(移动对象,移动距离,执行的函数)三个参数。

进函数先让上一次的停止再开始执行函数代码:

clearInterval(obj.timer);

缓动的实现代码,每隔15毫秒执行移动的距离就会减少:

var step = (target - obj.offsetLeft) / 10;

缓动可能出现小数,这里我们把他取整,如果为2.1就变为3.如果为-1.1就变为-2代码。

step = step > 0 ? Math.ceil(step) : Math.floor(step);

直到等于了传过来的target就会让它停止代码,最后一个参数可以写也可以不写,写的话就执行:

if (obj.offsetLeft == target) {clearInterval(obj.timer);// 回调函数if (callback) {callback();}}

最后把ul li 的left值变化代码:

obj.style.left = obj.offsetLeft + step + 'px';

分开每一步都讲完了,完整的封装代码展示:

function animate(obj, target, callback) {clearInterval(obj.timer);obj.timer = setInterval(function() {// var step=Math.ceil((target-obj.offsetLeft)/10);var step = (target - obj.offsetLeft) / 10;step = step > 0 ? Math.ceil(step) : Math.floor(step);if (obj.offsetLeft == target) {clearInterval(obj.timer);// 回调函数if (callback) {callback();}}obj.style.left = obj.offsetLeft + step + 'px';}, 15);
}

下面我们就开始写js核心代码

                创建一个lb.js文件然后获取元素代码,把要操作的元素都获取过来:

window.addEventListener('load',function(){var arrow_l=document.querySelector('.arrow-l');var arrow_r=document.querySelector('.arrow-r');var focus=document.querySelector('.focus_f1');var ul=focus.querySelector('ul');var ol=focus.querySelector('.circle');
})

实现第一个功能鼠标放上去和离开实现箭头的显示和消失代码,加注释的下面会讲。先别着急,看不懂也没关系:

    // 鼠标经过focus.addEventListener('mouseenter',function(){arrow_l.style.display='block';arrow_r.style.display='block';// 鼠标经过停止定时器clearInterval(timer);// 清除定时器变量timer=null;})// 鼠标离开focus.addEventListener('mouseleave',function(){arrow_l.style.display='none';arrow_r.style.display='none';// 开启定时器timer=setInterval(function(){// 每2秒自动调用点击事件arrow_r.click();},2000);})

每次图片移动都移动一个盒子的宽度,所以我们获取盒子宽度代码:

var focusWidth=focus.offsetWidth;

下面我们要动态创建ol li并且点击小圆圈就会变色并且实现图片移动过去代码,注释也都写在代码里了,这里就简单描述了,直接看代码:

for(var i=0;i<ul.children.length;i++){// 创建livar li=document.createElement('li');// 记录小圆圈的索引号 自定义属性li.setAttribute('index',i);// 把创建li添加到ol里ol.appendChild(li);// 绑定点击事件li.addEventListener('click',function(){// 把所有li清除for(var i=0;i<ol.children.length;i++){ol.children[i].className='';}this.className='current';// 当前li的索引号var index=this.getAttribute('index');// 当前小圆点的位置给num控制图片下一张播放num=index;// 当前小圆点的位置给小圆点,下一个移动小圆点才会正常circle=index;// 点击小圆圈移动图片animate(ul,-focusWidth*index);})}

下面我们克隆一张图片放到ul最后面,实现走到最后一张后跳到第一张。并且把第一个ol li的小圆圈设置为默认点击样式代码:

    // 把第一个小li设置类名currentol.children[0].className='current';// 克隆第一张图片 放到ul最后面var first=ul.children[0].cloneNode(true);ul.appendChild(first);

这里需要用排他思想来让点击的小圆圈变样式,其余的小圆圈都要变为默认样式代码:

    function circleChange(){// 重置小圆圈样式 排它思想for(var i=0;i<ol.children.length;i++){ol.children[i].className='';}ol.children[circle].className='current';}

下面实现点击左右箭头后移动图片实现轮播效果代码:

    // 右侧按钮var num=0;// 控制小圆圈的变化var circle=0;// 控制函数执行 防止点击过快var flag=true;arrow_r.addEventListener('click',function(){if(flag){// 有函数执行关闭 函数执行完后打开flag=false;// 走到了最后复制的图片 left改为0if(num==ul.children.length-1){ul.style.left=0+'px';num=0;}num++;animate(ul,-num*focusWidth,function(){flag=true;});circle++;if(circle==ol.children.length){circle=0;}// 调用函数circleChange();}})arrow_l.addEventListener('click',function(){if(flag){flag=false;// 走到了最后复制的图片 left改为0if(num==0){num=ul.children.length-1;ul.style.left=-num*focusWidth+'px';}num--;animate(ul,-num*focusWidth,function(){flag=true;});circle--;// if(circle<0){//    circle=ol.children.length-1;// }circle=circle<0 ? ol.children.length-1 :circle;// 调用函数circleChange();}})

最后就是自动2秒实现一次轮播效果的代码了:

    // 自动播放定时器var timer=setInterval(function(){// 每2秒自动调用点击事件arrow_r.click();},2000);

 lb.js全部代码展示

分块讲述完了代码,现在组合起来看看吧:

window.addEventListener('load',function(){var arrow_l=document.querySelector('.arrow-l');var arrow_r=document.querySelector('.arrow-r');var focus=document.querySelector('.focus_f1');// 鼠标经过focus.addEventListener('mouseenter',function(){arrow_l.style.display='block';arrow_r.style.display='block';// 鼠标经过停止定时器clearInterval(timer);// 清除定时器变量timer=null;})// 鼠标离开focus.addEventListener('mouseleave',function(){arrow_l.style.display='none';arrow_r.style.display='none';// 开启定时器timer=setInterval(function(){// 每2秒自动调用点击事件arrow_r.click();},2000);})var ul=focus.querySelector('ul');var ol=focus.querySelector('.circle');var focusWidth=focus.offsetWidth;for(var i=0;i<ul.children.length;i++){// 创建livar li=document.createElement('li');// 记录小圆圈的索引号 自定义属性li.setAttribute('index',i);// 把创建li添加到ol里ol.appendChild(li);// 绑定点击事件li.addEventListener('click',function(){// 把所有li清除for(var i=0;i<ol.children.length;i++){ol.children[i].className='';}this.className='current';// 当前li的索引号var index=this.getAttribute('index');// 当前小圆点的位置给num控制图片下一张播放num=index;// 当前小圆点的位置给小圆点,下一个移动小圆点才会正常circle=index;// 点击小圆圈移动图片animate(ul,-focusWidth*index);})}// 把第一个小li设置类名currentol.children[0].className='current';// 克隆第一张图片 放到ul最后面var first=ul.children[0].cloneNode(true);ul.appendChild(first);// 右侧按钮var num=0;// 控制小圆圈的变化var circle=0;// 控制函数执行 防止点击过快var flag=true;arrow_r.addEventListener('click',function(){if(flag){// 有函数执行关闭 函数执行完后打开flag=false;// 走到了最后复制的图片 left改为0if(num==ul.children.length-1){ul.style.left=0+'px';num=0;}num++;animate(ul,-num*focusWidth,function(){flag=true;});circle++;if(circle==ol.children.length){circle=0;}// 调用函数circleChange();}})arrow_l.addEventListener('click',function(){if(flag){flag=false;// 走到了最后复制的图片 left改为0if(num==0){num=ul.children.length-1;ul.style.left=-num*focusWidth+'px';}num--;animate(ul,-num*focusWidth,function(){flag=true;});circle--;// if(circle<0){//    circle=ol.children.length-1;// }circle=circle<0 ? ol.children.length-1 :circle;// 调用函数circleChange();}})function circleChange(){// 重置小圆圈样式 排它思想for(var i=0;i<ol.children.length;i++){ol.children[i].className='';}ol.children[circle].className='current';}// 自动播放定时器var timer=setInterval(function(){// 每2秒自动调用点击事件arrow_r.click();},2000);
})

五、效果图


总结

这里也是讲完了,不知道你们能不能看的懂。我的语言描述能力比较差,看不懂的下去自己思考思考,何尝不是一种学习呢!轮播图是BOM中做的案例里计较麻烦的一个,我也就写这一遍啊,下次我直接打开我的博客看我的笔记了。希望大家也能自己动手实现一遍。对知识的掌握更牢固。这篇内容写了好久,看到这里的动动你们可爱的小手指点个赞呗。这也是我创作最大的动力哦!

仿淘宝中心轮播图 JS[代码+详细讲解+效果图]相关推荐

  1. 仿淘宝详情页 直接上代码

    仿淘宝详情页 直接上代码 package com.example.liketitledemo;import android.content.Context; import android.graphi ...

  2. jquery仿淘宝SKU选择商品属性代码

    jquery仿淘宝SKU选择商品属性代码 下载地址:https://www.yujianni.top/news/comp_artinfo.html?id=103

  3. 淘宝网返回顶部JS代码效果

    淘宝网返回顶部JS代码效果 http://hi.baidu.com/huangyongliang/blog/item/99f069cb0e731b12be09e619.html posted on 2 ...

  4. 仿淘宝双色球走势图自定义控件

    博主爱玩彩票,今早刚好看到淘宝手机端彩票走势图表效果非常nice,于是乎code一上午,大致效果还是出来了,碍于数据就没有细调UI,效果图如下 实现思路也比较简单:几个recyclerView+手势分 ...

  5. jQuery实现折叠卡片[代码+详细讲解+效果图]

    文章目录 前言 一.html代码及说明 二.css代码及说明 三.js代码及说明 四.完整代码 五.效果图 总结 前言 主要我们来练习jQuery语法,这是我在学习jQuery时写的案例,感觉比较有意 ...

  6. 【每日一练】原生js仿淘宝主图放大镜功能,附学习源码

    在我们的项目中,经常会遇到各种功能效果的实现,对于每一项功能的实现方式,都有很多种,这些实现方式没有好坏之分,只有适合与否,但是我个人建议,如果项目急就选择自己擅长的方式实现,比较完成工作更加重要嘛. ...

  7. 仿淘宝详情页轮播图效果实现

    仿淘宝详情页轮播图效果实现 图片路径记得修改.js源文件记得导入! <!doctype html>  <head>   <meta charset="UTF-8 ...

  8. js仿淘宝主图放大镜功能

    js仿淘宝主图放大镜功能 演示地址 下载地址

  9. JS仿淘宝网顶部的导航菜单

    代码简介: JS仿淘宝网顶部的导航菜单.整合了购物车,收藏夹,搜索,搜索,网站导航等功能的导航. 代码内容: <!DOCTYPE html PUBLIC "-//W3C//DTD XH ...

  10. ViewFlipper实现文字轮播(仿淘宝头条垂直滚动广告)

    ViewFlipper实现文字轮播(仿淘宝头条垂直滚动广告) 广告条目可以单独写成布局文件,然后在布局文件或者代码中添加到总布局中 从源码可以看出,其实ViewFlipper间接的继承了FrameLa ...

最新文章

  1. 如何通过 C# 自动捕获一个文件的变更?
  2. django QuerySet对象转换成字典对象
  3. 泰安高考2021成绩查询,泰安高考成绩查询入口2021
  4. WinCE内核裁减(中文字体)及字库和内核的分离
  5. linux里工作目录的字体变蓝,netterm访问Linux时字体和背景颜色随目录发生改变的问题解决...
  6. linux整个文件夹下全部文件的属性,C/C++遍历目录下的所有文件(Windows/Linux篇,超详细)...
  7. Flutter 升级 2.0 填坑指导,带你原地起飞
  8. linux脚本解密,给shell脚本加密和解密的shell脚本
  9. php 钉钉 免登,免登的正确使用方式
  10. 排队问题解题思路_教育随笔|数学之排队问题
  11. 深度 | 无法找到“黑点”的代码,连顶级黑客也束手无策
  12. 屏幕录像专家7.5注册机
  13. matlab截掉空间曲面一部分,用Matlab作空间曲面的切平面及法线图像.ppt
  14. TalkingData游戏统计对接
  15. python人工智能面试题爱奇艺面试题_【爱奇艺Python面试】爱奇艺大数据面试 python-看准网...
  16. SIP开源服务器kamalio安装教程
  17. 对 算术基本定理 的研究
  18. 人脸核身--第二篇--启用 H5人脸认证
  19. 快排优化代码__2018.07.26
  20. java实现头像上传 前后端

热门文章

  1. xenu死链检测工具使用教程
  2. java自画快递单,使用画图功能绘制快递单,并调用打印机打印
  3. [转]3D Ripper DX模型截取器
  4. 聊天室私人聊天原理_如何设置极其安全的私人群组聊天
  5. 2D制图实战之仿QQ截图工具
  6. AMAZINGIC晶焱CAN 总线收发器一致性测试
  7. 矩阵理论——Smith标准型的学习
  8. 关于Win7企业版激活
  9. orange软件使用
  10. Vuejs vm对象详解