话说轮播图效果是前端er学习JS的必经之路啊,很多同学写的第一个JS效果应该就是它了,在各大网站我们都会经常见到,但是无缝滚动运动效果的轮播图,对于小白们来说还是有一定难度的。

我们来看看思路吧~
首先我们要实现的效果有以下几点:
小圆点:点击小圆点显示与之对应的图片
向左和向右按钮:点击向左按钮图片向后运动,点击向右按钮图片向前运动
定时器:每隔 2s 自动播放
主要难点在于:
当图片运动到最后一张,点击向右的按钮时,应该显示第一张;
当前显示的是第一张,点击向左的按钮时,应该显示最后一张;
思路:
1、先将第一张图片复制 添加到 ul 最后面,将最后一张图片复制 添加到 ul 最前面(此时 ul 的第一张图片是pic3,最后一张图片是pic0);
2、当图片(ul)运动到pic3,继续向前运动,运动到最后一张pic0时,瞬间把 ul 拉回到第二张图片pic0的位置,然后在继续向前运动;
3、当图片(ul)向后运动到第一张图片pic3时,瞬间把 ul 拉回到倒数第二张图片pic3的位置。
4、还有非常关键的一点:定义iNow变量,用于对应当前显示的图片与ol中的小圆点,并且可以用来关联 ul 的位置。
html代码:
<div id="tab">
<ul>
<li><img src="image/pic0.jpg" alt="" /></li>
<li><img src="image/pic1.jpg" alt="" /></li>
<li><img src="image/pic2.jpg" alt="" /></li>
<li><img src="image/pic3.jpg" alt="" /></li>
</ul>
<ol>
<li class="on"></li>
<li></li>
<li></li>
<li></li>
</ol>
<a href="javascript:;" rel="external nofollow" rel="external nofollow" class="prev" id="prev"><</a>
<a href="javascript:;" rel="external nofollow" rel="external nofollow" class="next" id="next">></a>
</div>
css代码:
*{margin: 0; padding: 0;}
li{ list-style: none;}
#tab{
width: 670px;
height: 240px;
border: 1px solid #ccc;
margin: 50px auto;
position: relative;
}
#tab ul{
width: 2680px;
height: 240px;
position: absolute;
left: 0;
top: 0;
overflow: hidden;
}
#tab ul li{
float: left;
width: 670px;
}
#tab ul li img{
width: 670px;
}
#tab ol{
width: 80px;
position: absolute;
bottom: 10px;
left: 50%;
margin-left: -40px;
overflow: hidden;
}
#tab ol li{
float: left;
width: 10px;
height: 10px;
background: #ccc;
border-radius: 50%;
margin: 5px;
cursor: pointer;
}
#tab ol .on{
background: #f00;
}
#tab .prev,#tab .next{
display: none;
width: 40px;
height: 60px;
background: rgba(0,0,0,.3);
filter:alpha(opacity:30);
text-decoration: none;
text-align: center;
line-height: 60px;
font-size: 30px;
color: #fff;
position: absolute;
top: 50%;
margin-top: -30px;
}
#tab .prev{
left: 0;
}
#tab .next{
right: 0;
}
js 代码:
其中animate()是封装好的运动框架,最后面附有说明
window.onload = function(){
var oTab = document.getElementById('tab');
var oUl = oTab.getElementsByTagName('ul')[0];
var aLi1 = oUl.children;
var oOl = oTab.getElementsByTagName('ol')[0];
var aLi2 = oOl.children;
var prev = document.getElementById('prev');
var next = document.getElementById('next');
//设置ul的初始位置
var iNow = 1;
oUl.style.left=-aLi1[0].offsetWidth*iNow+'px';
//定时器
var timer = null;
//克隆第一张图片 添加在ul的最后面
var oLi1 = aLi1[0].cloneNode(true);
//克隆最后一张图片 添加在ul的最前面
var oLi2 = aLi1[aLi1.length-1].cloneNode(true);
oUl.appendChild(oLi1);
oUl.insertBefore(oLi2,aLi1[0]);
oUl.style.width = aLi1[0].offsetWidth*aLi1.length+"px";
//鼠标移入tab: 关闭定时器,左右按钮显示
oTab.onmouseover = function(){
clearInterval(timer);
prev.style.display = 'block';
next.style.display = 'block';
}
//鼠标移出tab: 开启定时器,左右按钮隐藏
oTab.onmouseout = function(){
timer = setInterval(function(){
toNext();
},2000);
prev.style.display = 'none';
next.style.display = 'none';
}
//点击小圆点
for(var i=0;i<aLi2.length;i++){
(function(index){
aLi2[index].onclick = function(){
iNow = index+1;
for(var i=0;i<aLi2.length;i++){
aLi2[i].className = '';
}
aLi2[index].className = 'on';
animate(oUl,{left: -iNow*aLi1[0].offsetWidth});
}
})(i);
}
//上一个
prev.onclick=function(){
iNow--;
animate(oUl,{left: -iNow*aLi1[0].offsetWidth},{complete:function(){
if(iNow == 0){
iNow = aLi1.length-2;
oUl.style.left=-aLi1[0].offsetWidth*iNow+'px';
}
for(var i=0;i<aLi2.length;i++){
aLi2[i].className = '';
}
aLi2[iNow-1].className = 'on';
}});
}
//下一个
next.onclick=function(){
toNext();
}
function toNext(){
iNow++;
animate(oUl,{left: -iNow*aLi1[0].offsetWidth},{complete:function(){
if(iNow == aLi1.length-1){
iNow = 1;
oUl.style.left=-aLi1[0].offsetWidth*iNow+'px';
}
for(var i=0;i<aLi2.length;i++){
aLi2[i].className = '';
}
aLi2[iNow-1].className = 'on';
}});
}
//设置定时器
timer = setInterval(function(){
toNext();
},2000);
}
封装的animate()运动框架
/*
* 参数说明:
* obj: 运动对象
* json(json形式): 需要修改的属性
* options(json形式):
* duration: 运动时间
* easing: 运动方式(匀速、加速、减速)
* complete: 运动完成后执行的函数
*/
function animate(obj,json,options){
var options=options || {};
var duration=options.duration || 500; //运动时间,默认值为500ms;
var easing=options.easing || 'linear'; //运动方式,默认为linear匀速
var start={};
var dis={};
for(var name in json){
start[name]=parseFloat(getStyle(obj,name)); //起始位置
dis[name]=json[name]-start[name]; //总距离
}
var count=Math.floor(duration/30); //总次数
var n=0; //次数
clearInterval(obj.timer);
obj.timer=setInterval(function(){
if(n>count){
clearInterval(obj.timer);
options.complete && options.complete();
}else{
for(var name in json){
switch(easing){
//匀速
case 'linear':
var a=n/count;
var cur=start[name]+dis[name]*a; //当前位置
break;
//加速
case 'ease-in':
var a=n/count;
var cur=start[name]+dis[name]*a*a*a;
break;
//减速
case 'ease-out':
var a=1-n/count;
var cur=start[name]+dis[name]*(1-a*a*a);
break;
}
if(name=='opacity'){
obj.style.opacity=cur;
obj.style.filter = 'alpha(opacity='+cur*100+')'; //兼容IE8及以下
}else{
obj.style[name]=cur+'px';
}
}
}
n++;
},30);
}
//获取非行间样式
function getStyle(obj,sName){
return (obj.currentStyle || getComputedStyle(obj,false))[sName];
}
以上这篇原生JS实现图片无缝滚动方法(附带封装的运动框架)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
# 原生js无缝滚动
# JS实现运动缓冲效果的封装函数示例
# JS实现匀速与减速缓慢运动的动画效果封装示例
# 原生JS封装animate运动框架的实例
# 原生JS实现风箱式demo
# 并封装了一个运动框架(实例代码)
# 原生js封装运动框架的示例讲解
# JS实现匀速运动的代码实例
# 使用JavaScript 实现对象 匀速/变速运动的方法
# JavaScript中的匀速运动和变速(缓冲)运动详细介绍
# 原生javascript实现匀速运动动画效果
# 浅谈Javascript中匀速运动的停止条件
# js指定步长实现单方向匀速运动
# 原生javascript运动函数的封装示例【匀速、抛物线、多属性的运动等】
# 第一张
# 鼠标
# 小圆点
# 给大家
# 最前面
# 的是
# 瞬间
# 行间
# 第一个
# 有一定
# 各大
# 希望能
# 必经之路
# 来看看
# 几点
# 与之
# 这篇
# 每隔
# 先将
# 到第
相关文章:
网站制作公司,橙子建站是合法的吗?
建站VPS能否同时实现高效与安全翻墙?
建站之星安装后如何自定义网站颜色与字体?
建站主机类型有哪些?如何正确选型
网站制作网站,深圳做网站哪家比较好?
宝塔新建站点为何无法访问?如何排查?
学校建站服务器如何选型才能满足性能需求?
制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?
建站主机空间推荐 高性价比配置与快速部署方案解析
如何快速查询域名建站关键信息?
小自动建站系统:AI智能生成+拖拽模板,多端适配一键搭建
官网自助建站平台指南:在线制作、快速建站与模板选择全解析
详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)
北京制作网站的公司,北京铁路集团官方网站?
深圳网站制作的公司有哪些,dido官方网站?
建站主机数据库如何配置才能提升网站性能?
如何用景安虚拟主机手机版绑定域名建站?
如何用狗爹虚拟主机快速搭建网站?
,有什么在线背英语单词效率比较高的网站?
深圳网站制作案例,网页的相关名词有哪些?
高性价比服务器租赁——企业级配置与24小时运维服务
如何在万网主机上快速搭建网站?
无锡制作网站公司有哪些,无锡优八网络科技有限公司介绍?
南宁网站建设制作定制,南宁网站建设可以定制吗?
简易网站制作视频教程,使用记事本编写一个简单的网页html文件?
手机网站制作与建设方案,手机网站如何建设?
常州企业网站制作公司,全国继续教育网怎么登录?
建站主机核心功能解析:服务器选择与网站搭建流程指南
微课制作网站有哪些,微课网怎么进?
创业网站制作流程,创业网站可靠吗?
如何彻底卸载建站之星软件?
盘锦网站制作公司,盘锦大洼有多少5G网站?
公司网站制作需要多少钱,找人做公司网站需要多少钱?
在线制作视频网站免费,都有哪些好的动漫网站?
Android自定义listview布局实现上拉加载下拉刷新功能
建站之星如何快速生成多端适配网站?
小说建站VPS选用指南:性能对比、配置优化与建站方案解析
php条件判断怎么写_ifelse和switchcase的使用区别【对比】
Swift开发中switch语句值绑定模式
如何在Golang中使用replace替换模块_指定本地或远程路径
如何用好域名打造高点击率的自主建站?
Android自定义控件实现温度旋转按钮效果
建站ABC备案流程中有哪些关键注意事项?
香港服务器网站卡顿?如何解决网络延迟与负载问题?
如何通过商城免费建站系统源码自定义网站主题?
如何快速搭建FTP站点实现文件共享?
宁波免费建站如何选择可靠模板与平台?
如何通过商城自助建站源码实现零基础高效建站?
Swift中swift中的switch 语句
南平网站制作公司,2025年南平市事业单位报名时间?
*请认真填写需求信息,我们会在24小时内与您取得联系。