基于JavaScript实现焦点图轮播效果


Posted in Javascript onMarch 27, 2017

     不管是高校的网站还是电商的页面,焦点图的切换和轮播应该是一项不可或缺的应用。今天把焦点图轮播制作的技术要点做下笔记,以供日后查看。 

一、结构层(HTML)

焦点图的HTML结构很简单,就是一个父容器(id=box),包含三个子容器,分别存放图片(id=pics)、底部按钮(id=dots)、作用切换箭头(class=turn)。加上样式后就是下图二的布局。

基于JavaScript实现焦点图轮播效果

基于JavaScript实现焦点图轮播效果

二、表示层(CSS)

页面的表现和风格总是离不开CSS。为叙述方便,后面采用id选择符名或类选择符名代表各div模块。

1.box

box作为父容器,是整个焦点图轮播结构在网页的直观表现,它的宽高就是要显示的图片的宽高。我将图片设置为宽600px、高400px,使父容器box居中显示,并加了阴影。样式大概都可以随自己爱好设置,但溢出一定要隐藏,定位一定要设置为相对定位,以使子容器的绝对定位准确。

#box{
 width: 600px;
 height: 400px;
 margin-top: 100px;
 margin-left: auto;
 margin-right: auto;
 overflow: hidden;
 position: relative;
 box-shadow: 10px 10px 5px #888;
}

 2.pics

 

pics用于放置图片,因为是制作左右切换功能,高仍是一张图片的高,但宽=(展示的图片数量+2)*图片宽,原因在行为层再说明。

另外需要注意的是,由展示图片可知,pics在左右切换箭头和底部切换按钮的下层,所以z-index要设为1。

#pics{
 width: 5400px;
 height: 400px;
 position: absolute;
 z-index: 1;
}

3.dots

z-index设为2,置为上层显示;定位为绝对定位;其他样式随喜好。这里我设置了鼠标滑过的样式,以及配合js对应图片位置改变的样式(on)。

#dots{
 width: 120px;
 height: 10px;
 position: absolute;
 bottom: 25px;
 left: 40%;
 z-index: 2;
}
 
#dots span{
 width: 10px;
 height: 10px;
 float: left;
 margin-right: 5px;
 background: #333;
 border: solid 1px #FFF;
 border-radius: 50%;
 cursor: pointer;
}
 
#dots .on{background: orangered;}
#dots span:hover{background: orangered;}

4.turn

左右箭头的重要样式与dots一致,其他自定义。这里我设置了鼠标滑过box,才显现箭头。

.turn{
 width: 40px;
 height: 40px;
 color: #fff;
 background: orangered;
 line-height: 39px;
 text-align: center;
 font-size: 36px;
 font-weight: bold;
 opacity: 0.5;
 position: absolute;
 top: 180px;
 display: none;
 z-index: 2;
 cursor: pointer;
}
.turn:hover{opacity: 0.8;}
#box:hover .turn{display: block;}

至此页面的样式和布局完成,但行为层方法和功能的实现才是重点。

三、行为层(JavaScript)

定义函数前,先在全局作用域中获得页面的节点。

var box = document.getElementById('box');
var pics = document.getElementById('pics');
var dots = document.getElementById('dots').getElementsByTagName('span');
var pre = document.getElementById('pre');
var next = document.getElementById('next');

1.图片切换动画

轮播图的核心方法,在于图片的切换动画。而此函数的重点,是接收一个位移量offset,然后改变pics相对于box的left值,从而对图片进行显示。

之前CSS设置的,box的宽为600px,但pics的宽却为5400px,由于box溢出隐藏,所以页面只会显示一张图片;通过接收具体位移量offset,改变left值(减去或加上n个图片宽度),就可以改变显示的图片。

此外还有两个问题,如果不设置图片切换的速度,图片就会整张整张的变换,没有进入切换的效果;而且如果不停的点击切换,就会消耗太多的内存造成电脑卡机,出现页面停在前一张图未切换完就出现下一张等情况。所以要对图片做一个速度处理,以及一张图片为切换完就不允许其他切换的设置。

//图片切换函数
 function turn(offset){ 
 turned = true; //切换允许标志,在全局作用域中定义,true表示关闭允许切换
 var new_left = parseInt(pics.style.left) + offset; //最后left值
 var total_time = 300; //位移总时间
 var interval = 10; //每次位移间隔时间
 var speed = offset/(total_time/interval); //位移速度——每次位移量

 function go(){
 if((speed < 0 && parseInt(pics.style.left) > new_left) || (speed > 0 && parseInt(pics.style.left) < new_left)){ //右切||左切
 pics.style.left = parseInt(pics.style.left) + speed +'px';
 setTimeout(go,interval);
 }else{
 turned = false; //已切换完毕,开启允许切换
 pics.style.left = new_left +'px';
 if( new_left < -4200){
  pics.style.left = -600 +'px';
 }
 else if( new_left > -600){
  pics.style.left = -4200 +'px';
 }
 }
 }
 go();
 }

2.箭头切换

在图片切换函数turn()基础上传入参数。因为是左右切换,所以每次直接传入一个图片宽度。向右切换传入-600,左切传入600。

这里要注意的就是,图片与底部按钮的同步,到两边的最后一张后参数的重置,以及是否允许切换的判断。

//箭头切换实现
 next.onclick = function(){
 if(index == 7){
 index = 1;
 }else{
 index += 1;
 }
 show_dots();
 if(!turned){
 turn(-600);
 }
 };
 pre.onclick = function(){
 if(index == 1){
 index = 7;
 }else{
 index -= 1;
 }
 show_dots();
 if(!turned){
 turn(600);
 }
 };

3.底部按钮实现

按钮与箭头的不同,在于点击它可以切换到任意一张图片,所以在对切换函数turn()传入参数前要先做一个计算。另外按钮对应样式的变化也不能忘记。

//按钮切换样式
 function show_dots(){
 for(var i = 0; i < dots.length; i++){
 if(dots[i].className == 'on'){
 dots[i].className = '';
 break;
 }
 }
 dots[index - 1].className = 'on';
 }
 //按钮切换实现
 for(var i = 0; i < dots.length; i++){
 dots[i].onclick= function(){
 if(this.className == 'on'){
 return;
 }
 var my_index = parseInt(this.getAttribute('index')); //注意! index是自定义属性
 var offset = -600 * (my_index - index);


 //计算切换位移量

 if(!turned){
 turn(offset);
 }
 index = my_index;
 show_dots();
 }
 }

4. 自动播放

自动播放自然就是设置定时器和清除定时器的问题,这里不再赘述。

//定时动画
 function play(){
 time = setInterval(function(){
 next.onclick();
 },3000); 
 }
 //动画停止
 function stop(){clearInterval(time);}

 play();
 box.onmouseover = stop;
 box.onmouseout = play;

最后附上demo和源码链接:demo、源码。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JS比较两个时间大小的简单示例代码
Dec 20 Javascript
jQuery实现鼠标滚轮动态改变样式或效果
Jan 05 Javascript
jQuery Real Person验证码插件防止表单自动提交
Nov 06 Javascript
JS实现的仿QQ空间图片弹出效果代码
Feb 23 Javascript
快速解决Canvas.toDataURL 图片跨域的问题
May 10 Javascript
JS实现兼容各种浏览器的获取选择文本的方法【测试可用】
Jun 21 Javascript
connection reset by peer问题总结及解决方案
Oct 21 Javascript
利用原生JS与jQuery实现数字线性变化的动画
Feb 24 Javascript
jQuery.cookie.js使用方法及相关参数解释
Mar 06 Javascript
用原生 JS 实现 innerHTML 功能实例详解
Apr 03 Javascript
vue安装遇到的5个报错及解决方法
Jun 12 Javascript
ElementUI实现el-form表单重置功能按钮
Jul 21 Javascript
Angularjs+bootstrap+table多选(全选)支持单击行选中实现编辑、删除功能
Mar 27 #Javascript
JS闭包用法实例分析
Mar 27 #Javascript
vue 2.0组件与v-model详解
Mar 27 #Javascript
JavaScript无缝滚动效果的实例代码
Mar 27 #Javascript
JS数组搜索之折半搜索实现方法分析
Mar 27 #Javascript
javascript实现下雨效果
Mar 27 #Javascript
HTML的select控件美化
Mar 27 #Javascript
You might like
神族 PROTOSS 概述
2020/03/14 星际争霸
分享一个php 的异常处理程序
2014/06/22 PHP
PHP生成随机密码4种方法及性能对比
2020/12/11 PHP
求解开jscript.encode代码的asp函数
2007/02/28 Javascript
javascript 拖动表格行实现代码
2011/05/05 Javascript
今天是星期几的4种JS代码写法
2013/09/17 Javascript
JavaScript在for循环中绑定事件解决事件参数不同的情况
2014/01/20 Javascript
使用jquery实现的一个图片延迟加载插件(含图片延迟加载原理)
2014/06/05 Javascript
js实现window.open不被拦截的解决方法汇总
2014/10/30 Javascript
javascript控制层显示或隐藏的方法
2015/07/22 Javascript
NodeJS自定义模块写法(详解)
2017/06/27 NodeJs
javascript实现电脑和手机版样式切换
2017/11/10 Javascript
vue watch自动检测数据变化实时渲染的方法
2018/01/16 Javascript
使用react实现手机号的数据同步显示功能的示例代码
2018/04/03 Javascript
layerUI下的绑定事件实例代码
2018/08/17 Javascript
Vue开发Html5微信公众号的步骤
2019/04/11 Javascript
vue项目前端知识点整理【收藏】
2019/05/13 Javascript
解决vue-cli项目开发运行时内存暴涨卡死电脑问题
2019/10/29 Javascript
JS立即执行的匿名函数用法分析
2019/11/04 Javascript
Vue+elementUI实现多图片上传与回显功能(含回显后继续上传或删除)
2020/03/23 Javascript
js实现移动端轮播图滑动切换
2020/12/21 Javascript
python的Template使用指南
2014/09/11 Python
python的dataframe和matrix的互换方法
2018/04/11 Python
pandas数据分组和聚合操作方法
2018/04/11 Python
Tensorflow卷积神经网络实例
2018/05/24 Python
如何将tensorflow训练好的模型移植到Android (MNIST手写数字识别)
2020/04/22 Python
python 绘制场景热力图的示例
2020/09/23 Python
联想加拿大官方网站:Lenovo Canada
2018/04/05 全球购物
军训感想500字
2014/02/20 职场文书
销售求职信范文
2014/05/26 职场文书
青年干部培训班学习心得体会
2016/01/06 职场文书
2016中秋节广告语
2016/01/28 职场文书
责任书格式
2019/04/18 职场文书
MySQL数据库实验实现简单数据库应用系统设计
2022/06/21 MySQL
MySQL表字段数量限制及行大小限制详情
2022/07/23 MySQL
Vue Element plus使用方法梳理
2022/12/24 Vue.js