js实现左右无缝轮播图
今天让我们再来做一个左右无缝的轮播图吧!
一、准备html代码
html代码也叫结构
<!DOCTYPE html>
<html lang="zh-CN"><head><title></title><meta charset="UTF-8"></head><body> <div> <!-- 用来做显示窗口的div --><header> <!--都用div的话就不好的区分的--><img src="img/1.jpg" alt=""><img src="img/2.jpg" alt=""><img src="img/3.jpg" alt=""><img src="img/4.jpg" alt=""><img src="img/1.jpg" alt=""> <!--这里把第一张图在最后也放一张--></header><button> > </button><button> < </button> <!--左右滑动的按钮--> <ul> <!--这里是用于显示当前的点点--><li></li><li></li><li></li><li></li></ul></div> </body>
</html>
这是目前的效果姑且还是给你们看看,img是行内块元素是和div是块级元素
,区别是行内块是可以设置宽高,也不会单个占一整行,而div是会自己占一整行的,当然也可设置宽高
二、css代码
css代码也叫表现
*{margin:0;padding:0;
}
body{width: 100vw; /*设置body的宽度占满屏幕*/height:100vh;display:flex; /*居中*/align-items:center;justify-content: center;
}
div{position: relative;width:730px; /*这个div是用来显示的最好和图片宽高一样*/height: 454px;border:5px solid orange;}
header{width: 3850px;height: 454px;position: relative; /*开启偏移的设置*/
}
button{ /*设置button 左右按钮的设置*/width: 35px;height: 35px;border:none;background: rgba(0,0,0,0.7); position: absolute;color:white;
}
button:last-of-type{ /*向后的按钮位置*/top:50%;transform: translateY(-50%);
}
button:first-of-type{ /*向前的按钮位置*/top:50%;right: 0;transform: translateY(-50%);
}
ul{width: 80%;height: 100px;position: absolute;bottom:0;left: 50%;transform: translateX(-50%);
}
li{ /*小圆点是通过li的默认样式*/width: 25%;height: 100%;list-style: circle inside; /*让li的小圆点居中*/ line-height: 160px;float: left;text-align: center;font-size:22px;color:yellow;
}
li:first-of-type{ /*第一个li默认选中所以为实心圆*/list-style-type: disc;
}
如果你想让li的小圆点居中必须要设置list-style-position:inside和text-align:center
意思是小圆点位置为内部然后文本居中,少一个都不行
你现在看到是这样,有黄色边框的是显示区域,我这么做是为了让你们看明白,你想他要是移动要移动谁,怎么移动,当然是显示区域不懂,后面的图片一直滑动不就成了一个滑动轮播图了。
1、小问题
看到没这个图片之间有一点缝隙了没有,明明我没有写margin和padding
就算写了我也清除了默认样式啊,原因是img是行内块就是inline-black所以每次结束有一个空格
2、解决方案
我们直接把它改为块就解决问题了display:block
img{position: relative; /*配合z-index使用*/display: block; /*解决缝隙问题*/float: left; /*通过浮动让他们显示为一行*/z-index: -1; /*下降层级不能遮住按钮*/
}
这就是解决完了的样子,好了开始js代码
三、js代码
js代码也叫行为
window.onload=() => { //设置最后加载js代码var header=document.querySelector("header"); //获取对应的元素 var div=document.querySelector("div"); //queryselect是es5新出的和jq的用法一样var buttons=document.querySelectorAll("button");var index=0; //翻滚的页码值var timeout;var lis=document.querySelectorAll("li"); //获取所有的li返回的是一个数组形式buttons[0].onclick=() =>{ //向前按钮move(++index)}buttons[1].onclick=() =>{ //向后按钮move(--index)}function move(idx){var offleft,showW;console.log(idx)clearInterval(timeout)timeout = setInterval(function(){ //缓慢移动offleft=header.offsetLeft; //总偏移值showW=(-idx*div.clientWidth-offleft)/10 //每次偏移值if(showW>0){ //把数值向上走showW=Math.ceil(showW)}else{showW=Math.floor(showW)}header.style.left=(offleft+showW)+"px"; }, 30);}
}
就是这样的一个原理
那么如何达到无缝轮播了
if(index>4){ index=1; header.style.left=0+"px";
}else if(index<0){index=3;header.style.left=-lis,length*div.clientWidth+"px";
}
其实这这里有一点视觉上的问题,当页码到达最大值时,我把显示的图片切换为第二张,然后起始值从零开始,切换到最开始是瞬间完成的,我们末尾的一张会有移动的效果,然后瞬间到一开始,我们肉眼无法察觉,所以会有一种移动了的效果。当然页码到最小值时还向前进的话,也是一样的。
四、完整代码
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<title></title>
<meta charset="UTF-8">
<style>*{margin:0;padding:0;}body{width: 100vw; /*设置body的宽度占满屏幕*/height:100vh;display:flex; /*居中*/align-items:center;justify-content: center;}div{position: relative;overflow:hidden; /*!!!隐藏超出的部分*/min-width: 730px;max-height: 454px;width:730px; /*这个div是用来显示的最好和图片宽高一样*/height: 454px;border:2px solid orange;}header{width: 3650px;height: 454px;position: relative; /*开启偏移的设置*/left: 0;}button{ /*设置button 左右按钮的设置*/width: 35px;height: 35px;border:none;background: rgba(0,0,0,0.7); position: absolute;color:white;}button:last-of-type{ /*向后的按钮位置*/top:50%;transform: translateY(-50%); }button:first-of-type{ /*向前的按钮位置*/top:50%;right: 0;transform: translateY(-50%);}ul{width: 80%;height: 100px;position: absolute;bottom:0;left: 50%;transform: translateX(-50%);}li{ /*小圆点是通过li的默认样式*/width: 25%;height: 100%;list-style-type: circle;list-style-position: inside; /*让li的小圆点居中*/ line-height: 160px;float: left;text-align: center;font-size:22px;color:yellow;}li:first-of-type{ /*第一个li默认选中所以为实心圆*/list-style-type: disc;}img{position: relative;display: block;float: left;z-index: -1;width: 730px;height: 454px;}</style>
<script>window.onload=() => { //设置最后加载js代码var header=document.querySelector("header"); //获取对应的元素 var div=document.querySelector("div"); //queryselect是es5新出的和jq的用法一样var buttons=document.querySelectorAll("button");var index=0; //翻滚的页码值var timeout;var lis=document.querySelectorAll("li"); //获取所有的li返回的是一个数组形式buttons[0].onclick=() =>{ //向前按钮move(index++)}buttons[1].onclick=() =>{ //向后按钮move(index--)}var newtime=setInterval(buttons[0].onclick, 2000);div.onmouseout=() =>{newtime=setInterval(buttons[0].onclick, 2000);}div.onmouseover=()=>{clearInterval(newtime)}for(i in lis){ //小圆点点击事件lis[i].index=i //记录下标值lis[i].onclick=function(){ circle(this.index)move(this.index)index=this.index// this.style.listStyleType="square"}}function circle(num){if(num==4){num=0;}for(i of lis){i.style.listStyleType="circle"}lis[num].style.listStyleType="disc"}function move(){var offleft,showW;clearInterval(timeout)timeout = setInterval(function(){ //缓慢移动if(index>4){index=1;header.style.left=0+"px"; }else if(index<0){index=3;header.style.left=-(lis.length)*div.clientWidth+"px"; }offleft=header.offsetLeft; //总偏移值showW=(-index*div.clientWidth-offleft)/10 //每次偏移值if(showW>0){ //把数值向上走showW=Math.ceil(showW)}else{showW=Math.floor(showW)}circle(index);offleft=offleft+showWheader.style.left=offleft+"px"; if(showW==0){clearInterval(timeout)}}, 30);}
}
</script>
</head>
<body>
<div> <!-- 用来做显示窗口的div -->
<header> <!--都用div的话就不好的区分的--><img src="img/1.jpg" alt=""><img src="img/2.jpg" alt=""><img src="img/3.jpg" alt=""><img src="img/4.jpg" alt=""><img src="img/1.jpg" alt=""> <!--这里把第一张图在最后也放一张-->
</header>
<button> > </button><button> < </button> <!--左右滑动的按钮-->
<ul> <!--这里是用于显示当前的点点--><li></li><li></li><li></li><li></li>
</ul>
</div>
</body>
</html>
展开只是为了让你们看的明白,给最大的父容器div 加上一条 overflow:hidden
把超出的部分隐藏了就好了
五、总结
其实没有什么难的,只要思路畅通剩下的就只有把他拼接起来了,最核心的地方就在move()
这个函数里面,还有一种轮播图,是一种深入浅出的,我讲讲思路,首先还是把html和css代码写的和我上面一样,然后给图片加上就是img
加上 position:absolute
让他们爹叠加在一起,最后可以通过z-index
或者opacity
这个两个属性调整,这样一想深入浅出的那种还容易一点,对不对啊!
js实现左右无缝轮播图相关推荐
- 左右无缝轮播html,JS实现左右无缝轮播图代码
废话不多说了,直接给大家贴代码了. 无缝轮播图: 无缝轮播图 *{margin: 0;padding:0; } ul{list-style: none;} .banner{width: 600px;h ...
- vue如何使用原生js写动画效果_原生js写一个无缝轮播图插件(支持vue)
轮播图插件(Broadcast.js) 前言:写这个插件的原因 前段时间准备用vue加上网易云的nodejs接口,模拟网易云音乐移动端.因为想自己写一遍所有的代码以及加固自己的flex布局,所以没有使 ...
- html怎么引轮播图插件,原生js写一个无缝轮播图插件(支持vue)
轮播图插件(Broadcast.js) 前言:写这个插件的原因 前段时间准备用vue加上网易云的nodejs接口,模拟网易云音乐移动端.因为想自己写一遍所有的代码以及加固自己的flex布局,所以没有使 ...
- 原生JS无缝轮播图(左右切换、导航跟随)
原生JS无缝轮播图(左右切换.导航图标) 功能: 1.实现轮播图的左右无缝切换 2.实现导航图标的跟随显示.点击切换 3.使用定时器进行无缝轮播 css部分 <style>/* 轮播图容器 ...
- javaScript小案例------js实现无缝轮播图效果篇
原生js书写无缝轮播图 javaScript无缝轮播图思路及源码 无缝轮播图效果 总体思路 下面附上代码: html css animate.js index.js javaScript无缝轮播图思路 ...
- JS无缝轮播图(支持点击左右切换,小圆点切换,定时器自动播放)
HTML代码 <div class="box"><!-- ul就相当于我装图片的盒子 --><ul class="box_ul"& ...
- 左右无缝轮播图的实现
无缝轮播图: <title>无缝轮播图</title><style>*{margin: 0;padding:0; }ul{list-style: none;}.ba ...
- jq 实现无缝轮播图
工作中经常会用到轮播图,这里记载两种轮播图,供大家参考 一.自动播放的无缝轮播图(一张图片占满屏) 首先是HTML, <div class='bannerCon'><ul class ...
- jquery实现动态左右无缝轮播图
JQ代码实现动态无缝轮播图功能 相比之下 运用jquery比js原生代码 书写更为方便 简介 通俗易懂 以下为代码: <!DOCTYPE html> <html><hea ...
最新文章
- Vml+Dhtml:制作一个应用渐变颜色效果不错的进度条
- Android自定义绘制 绘制基础
- [ubuntu]dlna平台搭建(在家里,寝室搭建自己的影音平台)
- 魔兽世界怀旧服最新服务器开发时间,怀旧服开70最新消息汇总 魔兽怀旧服TBC开放时间几个阶段?...
- eclipse和myeclipse中如何关闭自动补全括号,花括号,双引号等功能
- python绘制不带颜色曲线图_Python数据可视化库-Matplotlib——折线图,子图绘制
- Linux中修改PATH环境变量(只在当前窗口下生效)
- 论文笔记_SLAM_Review_Visual simultaneous localization and mapping: a survey
- 甘特图 知乎_哪一款甘特图软件最好用?
- el-descriptions引入代码中label不生效问题
- 淘宝/天猫、1688、京东按图搜索淘宝商品(拍立淘)API接口
- 遇见“不期而遇的美”---中华古法柴烧大师何建国
- 【转载】SOP SO SOIC TSSOP SSOP 封装直观比较图
- 怎么让win10隐藏任务栏不会在程序有消息时自动弹出
- 【开发随记】【提效】工作习惯那些事系列之三——邮件管理
- PR curve, AP, mAP, AUC, f1-score ??
- sql查询查询半小时内数据的方法
- 云笔记的使用感受和选择
- 【STM32H7教程】第24章 STM32H7的Cache解读(非常重要)
- python判断一个数是否在范围内_检查数字列表是否在某个范围内?
热门文章
- grpc入门到精通_gRPC[go语言]大师教程,构建现代化Api和微服务
- 注册、登录、退出登录
- AI深度学习入门与实战19 语义分割:打造简单高效的人像分割模型
- 开源项目CIIP(企业信息管理系统框架).2018.1.0910版更新介绍-上周工作总结
- TIA Portal面向对象编程入门
- Java项目:医院管理系统(java+SSM+layui+maven+mysql)
- hadoop的两个推荐下载地址
- 【信号与系统】(六)连续系统的时域分析 ——冲激响应与阶跃响应
- 超实用的Excel自动排序小技巧,原来这么简单,早点知道就好了!
- eNSP 1.3.00.100下载