继续学习打卡,武汉加油,逆战必胜!今日咱们主要探讨一下原生js写轮播图的问题,

  简单解析一下思路:

    1,首先写好css样式问题

    2,考虑全局变量:自动播放的定时器,以及记录图片位置的角标Index

    2,根据轮播图的张数,动态设置焦点小圆点的个数,并设置好相应的自定义属性(以备焦点图点击的时候与index对应方便去改变图片的播放问题)

    3,为了解决第一张和最后一张衔接的问题,给最后一张图后面追加第一张图,在播放追加的这张图的时候,改变位置播放2这张图;左侧播放仪式一样,复制最后一张图放在最前面做衔接;完成后注意及时改变盒子的宽度和定位置

    4,自动播放:开启定时器,记录图片角标的index自加执行图片播放

    5,图片从起始位置到结束位置的播放实现

      5.1,获取元素原来的位置

      5.2,设置定时器移动

    1.把需要移动的位置分五次轮播--多少次都行   计算需要移动的长度----步长不一定是固定的

     2.计算出来的长度取整--可能不是整数

     3.原来的位置加上要移动的位置

    4.判断原来的位置移动后是否和需要去的位置相等

    5. 如果相等则清除定时器

         6.调用回调函数,判断index的极值问题及时做出改变

     6,改变圆点当前位置样式问题:主要通过index角标找到当前位置,然后与圆点自定义属性值对应来找到圆点当前位置

     7,焦点圆点控制的问题

        7.1,首先添加事件监听,判断点击对象

        7.2,清除定时器--防止点击过快

        7.3,执行图片播放

        7.4,继续自动播放

      8,上下翻页问题:

        8.1,首先添加事件监听,判断点击对象

        8.2,上翻页则index自减,上翻页则自增,相应的执行圆点改变及图片播放,最后自动播放

      9,鼠标移入移出问题:绑定事件监听,移入则清除定时器,移出则自动播放

        10,附代码如下:

        

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

<title>Document</title>

<style>

* {

margin: 0;

padding: 0;

}

ul,

ol,

li {

list-style: none;

}

a,

a:hover,

a:active {

text-decoration: none;

color: #333;

}

.clear::after {

content: "";

display: block;

clear: both;

}

.banner {

width: 600px;

height: 400px;

margin: 40px auto;

position: relative;

/* overflow: hidden; */

}

.banner ul {

width: 500%;

height: 100%;

position: absolute;

top: 0;

left: 0;

}

.banner ul li {

width: 600px;

height: 100%;

float: left;

display: flex;

justify-content: center;

align-items: center;

color: #fff;

font-size: 100px;

}

.banner ol {

height: 50px;

background: rgba(0, 0, 0, .4);

position: absolute;

bottom: 50px;

left: 50%;

transform: translateX(-50%);

display: flex;

justify-content: space-evenly;

align-items: center;

border-radius: 100px;

}

.banner ol li {

width: 25px;

height: 25px;

border-radius: 50%;

background: #fff;

margin: 0 25px;

cursor: pointer;

}

.banner ol li.active {

background: red;

}

.banner div {

width: 100%;

height: 50px;

position: absolute;

top: 50%;

transform: translateY(-50%);

display: flex;

justify-content: space-between;

align-items: center;

}

.banner div a {

width: 40px;

line-height: 40px;

font-size: 40px;

font-weight: 900;

color: #fff;

background: rgba(0, 0, 0, .4);

text-align: center;

}

</style>

</head>

<body>

<div class="banner">

<!-- 需要轮序播放的图片,没有多的5和1

多出来的5和1是动态生成的

-->

<ul class="clear">

<li style="background:pink ;">img1</li>

<li style="background:gray ;">img2</li>

<li style="background:blue ;">img3</li>

<li style="background:skyblue;">img4</li>

<li style="background:orange ;">img5</li>

<li style="background:orange ;">img6</li>

</ul>

<!-- 与轮播图,对应的焦点按钮

是根据轮播图的图片数量,动态生成的

-->

<ol></ol>

<div>

<a href="JavaScript:;" class="left"> < </a>

<a href="JavaScript:;" class="right"> > </a>

</div>

</div>

<script>

window.onload = function(){

// 标签对象

var oDiv = document.querySelector('div');

var oUl = oDiv.querySelector('ul');

var oOl = oDiv.querySelector('ol');

var oUllis = document.querySelectorAll('ul li');

var wid = parseInt(window.getComputedStyle(oDiv)['width']);

var oBtnBox = oDiv.querySelector('div');

// 轮播图的角标

var index = 1;

// 自动轮播定时器

var timer = 0;

// 动态设置圆点的个数

setDot();

// 给第一张图前面复制最后欧一个节点,给最后一个元素复制第一个节点

copyLi();

// 自动播放

autoPlay();

// 点击圆点

dotFocus();

// 上翻页和下翻页

page();

// 鼠标移入移除

mouse();

// 设置圆点的个数

function setDot(){

var str = '';

oUllis.forEach(function(val,i){

if (i == 0) {

// 给第一个点添加当前样式

str += `<li class="active" index="1"></li>`

} else {

str += `<li index=${i + 1}></li>`

}

})

oOl.innerHTML = str;

}

// 给第一张图前面复制最后一个节点,给最后一个元素复制第一个节点

function copyLi(){

var firstLi = oUllis[0];

var lastLi = oUllis[oUllis.length - 1];

var first = firstLi.cloneNode(true);

var last = lastLi.cloneNode(true);

oUl.appendChild(first);

oUl.insertBefore(last,firstLi);

        // 重新赋值oUl的定位距离

oUl.style.left = (-index * wid) + 'px';

        // 重新赋值oUl的宽度

oUl.style.width = (oUllis.length + 2) * wid + 'px';

}

// 自动播放

function autoPlay(){

timer = setInterval(function(){

index++;

move(oUl,{left:-index * wid},moveEnd);

dotChange();

},2000)

}

// 1.获取元素原来的位置

// 2.设置定时器移动

//   1.把需要移动的位置分五次轮播--多少次都行   计算需要移动的长度

//    2.计算出来的长度取整--可能不是整数

//    3.原来的位置加上要移动的位置

//    4.判断原来的位置移动后是否和需要去的位置相等

//      如果相等则清除定时器

function move(ele,obj,callback){

for(var key in obj){

var oldPos = parseInt(window.getComputedStyle(ele)[key]);

var t = setInterval(function(){

var step = (obj[key] - oldPos) / 5;

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

oldPos += step;

ele.style[key] = oldPos + 'px';

if (oldPos == obj[key]) {

clearInterval(t);

callback()

};

},50)

}

}

      // 回调函数主要是判断index的极点值,然后赋值oUl的定位位置

function moveEnd(){

if (index == oUllis.length + 1) {

index = 1;

oUl.style.left = (-index * wid) + 'px';

} else if (index == 0){

index = oUllis.length;

oUl.style.left = (-index * wid) + 'px';

}

}

// 点的当前样式

function dotChange(){

var oOllis = oOl.querySelectorAll("li");

oOllis.forEach(function(val,i){

val.className = '';

var m = index;

if (index == oOllis.length + 1) {

m = 1;

};

if (val.getAttribute('index') * 1 == m) {

val.className = 'active'

};

})

}

// 点击圆点

function dotFocus(){

oOl.addEventListener('click',function (e) {

e = e || window.event;

if (e.target.tagName == 'LI') {

clearInterval(timer)

index = e.target.getAttribute('index') * 1;

dotChange();

move(oUl,{left:-index * wid},moveEnd);

autoPlay()

};

})

}

// 上下翻页

function page(){

oBtnBox.addEventListener('click',function(e){

e = e || window.event;

if (e.target.className == 'left') {

clearInterval(timer);

index--;

dotChange();

move(oUl,{left:-index * wid},moveEnd);

autoPlay()

};

if (e.target.className == 'right') {

clearInterval(timer);

index++;

dotChange();

move(oUl,{left:-index * wid},moveEnd);

autoPlay()

};

})

}

// 鼠标移入移出

function mouse(){

oDiv.addEventListener('mouseover',function(){

clearInterval(timer);

})

oDiv.addEventListener('mouseout',function(){

autoPlay()

})

}

}

</script>

</body>

</html>

原生js焦点轮播图的实现的更多相关文章

  1. 原生js焦点轮播图

    原生js焦点轮播图主要注意这几点: 1.前后按钮实现切换,同时注意辅助图2.中间的button随着前后按钮对应切换,同时按button也能跳转到相应的index3.间隔调用与无限轮播.4.注意在动画时 ...

  2. 封装一个简单的原生js焦点轮播图插件

    轮播图实现的效果为,鼠标移入左右箭头会出现,可以点击切换图片,下面的小圆点会跟随,可以循环播放(为了方便理解,没有补2张图做无缝轮播).本篇文章的主要目的是分享封装插件的思路. 轮播图我一开始是写成非 ...

  3. 原生js实现轮播图

    原生js实现轮播图 很多网站上都有轮播图,但找到一个系统讲解的却很难,因此这里做一个简单的介绍,希望大家都能有所收获,如果有哪些不正确的地方,希望大家可以指出. 原理: 将一些图片在一行中平铺,然后计 ...

  4. 原生JS实现轮播图的效果

    原生JS实现轮播图的效果: 只要缕清了全局变量index的作用,这个轮播图也就比较容易实现了:另外,为了实现轮这个效果,有几处clearInterval()必须写上.废话不多说,直接上代码,修复了几个 ...

  5. 使用原生js将轮播图组件化

    代码地址如下:http://www.demodashi.com/demo/11316.html   这是一个轮播图组件,这里是代码地址,需要传入容器的id和图片地址,支持Internet Explor ...

  6. 用原生js封装轮播图

    原生js封装轮播图 对于初学js的同学来说,轮播图还是一个难点,尤其是原生js封装轮播图代码,下面是我之前做的一个轮播图项目中封装好的一些代码,有需要的同学可以看一下,有什么不懂的可以看注释,注释看不 ...

  7. js焦点轮播图

    汇集网上焦点轮播图的实现方式,自己试了下,不过鼠标悬浮停止动画和鼠标离开动画播放好像没生效,不太明白,最后两行代码中,为什么可以直接写stop和play.不用加括号调用函数么?求懂的大神指点! 所用知 ...

  8. 原生js封装轮播图

    个人实际开发中用到的效果问题总结出来便于自己以后开发查看调用,如果也适用其他人请随意拿走勿喷就行! 原生js对于思路要求比较高,在js代码我都写有备注,足够理解并使用,即使是小白或者刚入行的程序员也比 ...

  9. 原生JS设计轮播图

    一.效果预览: 由于只能上传2M以下的图片,这里只截取了自动切换的效果: 二.编写语言 HTML.CSS.原生JS 三.编写思路 (一)HTML部分 1..slide意为滑槽,里面存放所有图片: 2. ...

随机推荐

  1. JZOJ 1154. 【GDOI2003】购物

    1154. [GDOI2003]购物 (Standard IO) Time Limits: 1000 ms Memory Limits: 65536 KB Description GDOI商场推出优惠 ...

  2. web页面上展示图片时,图片不显示,报错:ERR_CONTENT_LENGTH_MISMATCH

      问题描述 前端页面加载css,和js文件的时候,经常出现ERR_CONTENT_LENGTH_MISMATCH的报错情况.   查找问题 在单独打开hearder中css,js的网络地址是能打开的 ...

  3. position:absolute和width的关系

    碰到如下问题: 如图,我设置了宽高和绝对定位 ,但实际上我图片显示宽度为0: 然后我就查了一下,发现是因为我设了公共img宽度有个max-width:100%:屏蔽掉就有正常宽了,这点暂时没明白为啥 ...

  4. hibernate中cascade属性以及inverse属性

    级联操作 cascadecascade的常用属性值 none 默认值 不做任何变动 save-update 保存或修改 delete 删除 all 包含save-update 和delete等行为 c ...

  5. unzip详解,Linux系统如何解压缩zip文件?

    通常在使用linux时会自带了unzip,但是在最小化安装之后,可能系统里就无法使用此命令了. yum list unzip 查看是否安装 如果没安装过就继续 yum install unzip 安装 ...

  6. 逐浪CMS全面升级为.NET Core 3.0性能大提升

    微软发布了.Net Core 3.0正式版,逐浪CMS也在第一时间做了全面升级,并做了一系列的优化和调整,性能大幅提升,并解决了一些历史遗留问题,添加了一些新的功能.如后台固有小程序功能做了升级,功能 ...

  7. 如何搭建自己的SpringBoot源码调试环境?--SpringBoot源码(一)

    1 前言 这是SpringBoot2.1源码分析专题的第一篇文章,主要讲如何来搭建我们的源码阅读调试环境.如果有经验的小伙伴们可以略过此篇文章. 2 环境安装要求 IntelliJ IDEA JDK1 ...

  8. 7,MapReduce基础

    目录 MapReduce基础 一.关于MapReduce 二.MapReduce的优缺点 三.MapReduce的执行流程 四.编写MapReduce程序 五.MapReduce的主要执行流程 Map ...

  9. MySQL记录操作(单表查询)

    单表查询的语法及关键字执行的优先级 单表查询语法 SELECT DISTINCT 字段1,字段2... FROM 表名 WHERE 条件 GROUP BY field HAVING 筛选 ORDER ...

  10. 如何让antd的Modal组件的确认和取消不显示(或自定义按钮)(转载)

    使用Modal中的footer属性,如下: <Modal title="更改成员" visible={visible} confirmLoading={confirmLoad ...