轮播图会用到java的哪些功能,原生JS实现的轮播图功能详解

news/2024/7/5 6:50:05

本文实例讲述了原生JS实现的轮播图功能。分享给大家供大家参考,具体如下:

一、效果预览:

1f3122fe74341af01e29f8c16b1ef0d2.gif

由于只能上传2M以下的图片,这里只截取了自动切换的效果:

二、编写语言

HTML、CSS、原生JS

三、编写思路

(一)HTML部分

1、.slide意为滑槽,里面存放所有图片;

2、.prev存放向左的箭头,.next存放向右的箭头;

3、pointer意为指示器,存放下方的五个切换按钮,每个切换按钮用span来表示;

4、.m-view,意为视窗,即每次看到图片的窗口,它存放以上所有的部件;

(二)CSS部分

1、.m-view设为相对定位,他的后代元素可以以它作为绝对定位的参照;

2、.slide、.prev、.next、pointer全都用绝对定位放到合适位置;

3、.slide的所有图片水平排列,且视窗.m-view的宽度设为只有一张图片那么宽,这样默认情况.slide还是会全部显示;当给.m-view设置overflow:hidden后子元素超出它的部分就会隐藏,就实现了只显示一张图片的效果;

(三)JS部分

1、切换功能:

设置一个切换函数toggle实现左切或者右切一张图,toggle有两个子函数leftToggle和rightToggle分别实现向左、向右切换一张图,将他们分别绑定到.prev和.next按钮的clik事件;

2、切换功能的淡入动画效果

只有1的话切换是立即产生的,没有过渡效果;这里利用定时器和步长将切换功能细化到更小的滑动操作leftStep和rightStep,leftToggle和rightToggle通过多次调用滑动操作来实现一次切换,这样就会产生动画效果;

3、跳转功能

对指示器的每个圆形按钮绑定跳转功能,跳转实际上是将.slide进行移动;

4、自动播放

只需要设置定时器,每隔一定时间执行切换即可;

四、我的代码

轮播图

.m-view,.m-view .slide img{

position: relative;/*作为绝对定位的父元素*/

width: 800px;

height: 600px;

}

.m-view{

overflow: hidden;/*将超出该div的子元素隐藏*/

}

.m-view .slide{

position: absolute;

width: 8000px;

height: 600px;

}

.m-view .slide img{

margin-right: -5px;

}

.m-view .prev,.m-view .next{

position: absolute;

top: 40%;

font: 60px/60px Microsoft YaHei;

color: #00BFFF;

}

.m-view .prev{

left: 10px;

}

.m-view .next{

right: 10px;

}

.m-view .pointer{

position: absolute;

bottom: 40px;

left: 33%;

}

.m-view .pointer span{

display: inline-block;/*水平排列*/

width: 40px;

height: 40px;

border-radius: 20px;

margin-right: 10px;

background-color: #00FF00;

}

.m-view .pointer .on{/*点亮当前图片对应的圆圈*/

background-color: #1E90FF;

}

4

0

1

2

3

4

0

var view=document.getElementsByClassName('m-view')[0];

var slide=document.getElementsByClassName('slide')[0];

var prev=document.getElementsByClassName('prev')[0];

var next=document.getElementsByClassName('next')[0];

var button=document.getElementsByClassName('button');

var curIndex=0;//当前图片的索引位置

var toggled=true;//是否正在切换,true表明切换已完成,此时才能切换

/* Toggle函数实现切换一张图片的功能 */

function Toggle () {

var TIMER=50;//滑动一次所用的时间,它是setInterval的第二个参数

var time=800;//每切换一张图片总共用的时长

var times=time/TIMER;//每切换一张图片需滑动的次数

var stepLenth=800/times;//每次滑动的步长

var leftToggle=function () {

var t1=times;

function leftStep(){

slide.style.left=parseInt(slide.style.left)+stepLenth+"px";

t1--;

if (!t1) {

clearInterval(interval);

curIndex--;

if (curIndex<0) {

slide.style.left=parseInt(slide.style.left)-4000+"px";

curIndex=4;

};

toggled=true;

};

};

if (toggled==true) {

toggled=false;

button[curIndex].className="button";

if (curIndex!=0) {

button[curIndex-1].className="button on";

}else{

button[curIndex+4].className="button on";

}

var interval=setInterval(leftStep,TIMER);

};

};

var rightToggle=function () {

var t2=times;

function leftStep(){

slide.style.left=parseInt(slide.style.left)-stepLenth+"px";

t2--;

if (!t2) {

clearInterval(interval);

curIndex++;

if (curIndex>4) {

slide.style.left=parseInt(slide.style.left)+4000+"px";

curIndex=0;

};

toggled=true;

};

};

if (toggled==true) {

toggled=false;

button[curIndex].className="button";

if (curIndex!=4) {

button[curIndex+1].className="button on";

}else{

button[curIndex-4].className="button on";

};

var interval=setInterval(leftStep,TIMER);

};

}

this.leftToggle=leftToggle;//输出对外的接口

this.rightToggle=rightToggle;

};

var toggle=new Toggle();

prev.οnclick=function () {

toggle.leftToggle();

};

next.οnclick=function () {

toggle.rightToggle();

};

/* 点击圆圈跳转功能 */

for (var i = 0; i < button.length; i++) {

button[i].οnclick=function () {

var newIndex=parseInt(this.getAttribute("index"));

if (newIndex!=curIndex) {

var distance=-800*(newIndex-curIndex);

slide.style.left=parseInt(slide.style.left)+distance+"px";

button[curIndex].className="button";

button[newIndex].className="button on";

curIndex=newIndex;

};

};

}

/* 自动播放功能,鼠标移上去停止播放,移开再次播放 */

var intervalo=setInterval(toggle.rightToggle,3000);

view.οnmοuseοver=function () {

clearInterval(intervalo);

}

view.οnmοuseοut=function () {

intervalo=setInterval(toggle.rightToggle,3000);

}

五、一些总结

1、本次采用了面向对象和封装的思路,这是因为个人体会到确实面向对象的设计能使代码编写思路更加清晰,还能够免去很多冗余重复的代码,也尝试过其他书写思路,但都会使代码变得不太直观;要注意的一点就是封装后要向外提供接口,且如果是封装在一个函数中,需要实例化一个对象才能调用;

2、在.slide中设置了一个内联样式,这是因为在后面要获取并改变它的left属性,如果不采用内联样式的方法,将无法设置;因为初始时.style.left只能获取内联样式,即使采用内部样式和外部样式也会使得获取的值为undefined。当然,肯定也可以采用其他方法,但是似乎其他方案都更为复杂一些,没找到更简便的方法。

3、在前后各多放置一张图片的作用:

比如,当前是图片1,现在向左切换,可以和其他位置一样先执行统一的左移操作,这时视窗显示额外放置的图片5,再将.slide整体左移使真正的图片5显示在视窗中,这样是先出现了动画效果再“暗中移动”了.slide,就好像没移动一样,真正做到了无缝切换,逻辑也很简单;如果不放置额外的图片,就需要先将视窗左移,使图片5显示在视窗中,这样动画效果难以设置。

4、在获取每个span在它父元素的索引位置时,采用了getAttribute获取自定义的index属性的方法,其他方法肯定也有不少,但是肯定不能在循环中把i的值直接当成span的索引位置。

5、在跳转功能中,如果要跳转的正是当前的页面,应该什么也不做,这样可以优化性能 。

6、在点击左右箭头切换时,先判断上一次动画是否完成,没完成就不切换,这样可以优化性能,否则连续点击可能导致卡顿、切换效果不佳。

7、代码似乎还有可以优化的地方;

8、这个只是制作了一个轮播图,接下来考虑做一个轮播组件,似乎难度要大些,还有3D的轮播效果也想要尝试下了。

PS:感兴趣的朋友还可以将上述代码中的图片替换成网络图片,再使用如下在线工具在线测试运行效果:

希望本文所述对大家JavaScript程序设计有所帮助。


http://www.niftyadmin.cn/n/3297552.html

相关文章

常用 ajax 框架比较--摘自网络

No1—Prototype http://www.prototypejs.org/特点&#xff1a;一个非常优雅的JS库&#xff0c;定义了JS的面向对象扩展&#xff0c;DOM操作API&#xff0c;事件等等&#xff0c;之上还有rico/script.aculo.us实现一些JS组件功能和效果(尚不够完善)&#xff0c;以prototype为核心…

kafka mysql 迁移,kafka迁移数据目录

问题先前存储kafka日志的磁盘空间太小&#xff0c;zabbix警报不断&#xff0c;于是加了磁盘&#xff0c;将日志存到新磁盘上。解决方案依次在每台机器上操作&#xff0c;保证有机器能响应producer和consumer的操作。加磁盘需要重启服务器。1. 拷贝日志服务器启动后&#xff0c;…

js时间格式化通用方法

/*** 时间工具类*//*** 获取现在的时间戳&#xff08;精确到s&#xff09;* 使用&#xff1a;new Date().nowTimestamp* type {number}*/ Date.prototype.nowTimestamp Date.parse(new Date()) / 1000;/*** 时间戳转换成Date* 使用&#xff1a;new Date().timestampToDate(149…

redis 3.0的集群部署

文章转载自&#xff1a;http://hot66hot.iteye.com/blog/2050676 转载请注明出处:http://hot66hot.iteye.com/admin/blogs/2050676 最近研究redis-cluster,正好搭建了一个环境,遇到了很多坑,系统的总结下,等到redis3 release出来后&#xff0c;换掉memCache 集群. 一:关于redis…

部分去重复php,找到重复小数的重复部分 – PHP

要说这并不像我想象的那么容易.但我得到了它的工作.我确信有一种更有效的方法可以做到这一点,希望其他人会改进这一点.特别是它被打印的部分.$number1 $number / $divisor;if(findRepeat( $number1 ) ! false){$result findRepeat($number1);$leadingNum strstr($number1, .…

深入理解ASP.NET MVC(4)

系列目录 DataTokens和Areas机制 到目前为止Route对象只剩下DataTokens属性没有涉及&#xff0c;事实上这个Areas机制的核心。 DataTokens实际上也是一个RouteValueDictionary&#xff0c;在用MapRoute方法构造在Route构造的时候&#xff0c;可以传一个namespaces字符串数组&am…

mysql 数据 信息,Mysql 获取最近数据信息

今天select * from 表名 where to_days(时间字段名) to_days(now());昨天SELECT * FROM 表名 WHERE TO_DAYS( NOW( ) ) - TO_DAYS( 时间字段名) < 1近7天SELECT * FROM 表名 where DATE_SUB(CURDATE(), INTERVAL 7 DAY) < date(时间字段名)近30天SELECT * FROM 表名 whe…

多线程编程(9)Barrier

魔兽世界组队下副本 下副本一般都要找5个人,一般玩家都在副本门口等,然后等待其他玩家跑过来 即玩家在做两个动作 1.跑到副本门口 2.等5个人到齐了&#xff0c;然后进副本. 如果玩家先到就得等其他玩家到了才可以下副本&#xff0c;即大家跑到副本门口的时间是不同的&#xff0…