基于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 相关文章推荐
Jquery Ajax学习实例3 向WebService发出请求,调用方法返回数据
Mar 16 Javascript
js下将阿拉伯数字每三位一逗号分隔(如:15000000转化为15,000,000)
Jun 02 Javascript
node.js中的fs.linkSync方法使用说明
Dec 15 Javascript
js将字符串中的每一个单词的首字母变为大写其余均为小写
Jan 05 Javascript
详解vue 中使用 AJAX获取数据的方法
Jan 18 Javascript
JavaScript利用fetch实现异步请求的方法实例
Jul 26 Javascript
Node之简单的前后端交互(实例讲解)
Nov 14 Javascript
React Native 真机断点调试+跨域资源加载出错问题的解决方法
Jan 18 Javascript
微信小程序通过js实现瀑布流布局详解
Aug 28 Javascript
vue中的 $slot 获取插槽的节点实例
Nov 12 Javascript
JS浏览器BOM常见操作实例详解
Apr 27 Javascript
在antd中setFieldsValue和defaultVal的用法
Oct 29 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
php字符编码转换之gb2312转为utf8
2013/10/28 PHP
简单的php缓存类分享     php缓存机制
2014/01/22 PHP
php使用google地图应用实例
2014/12/31 PHP
利用php-cli和任务计划实现订单同步功能的方法
2017/05/03 PHP
使用一个for循环将N*N的二维数组的所有值置1实现方法
2017/05/29 PHP
Linux下 php7安装redis的方法
2018/11/01 PHP
javascript淡入淡出效果的实现思路
2012/03/31 Javascript
在js中判断checkboxlist(.net控件客户端id)是否有选中
2013/04/11 Javascript
js正则匹配出所有图片及图片地址src的方法
2015/06/08 Javascript
js基础知识(公有方法、私有方法、特权方法)
2015/11/06 Javascript
第九章之路径分页标签与徽章组件
2016/04/25 Javascript
Windows 系统下设置Nodejs NPM全局路径
2016/04/26 NodeJs
150行代码带你实现微信小程序中的数据侦听
2019/05/17 Javascript
深入学习js函数的隐式参数 arguments 和 this
2019/06/24 Javascript
js实现小时钟效果
2020/03/25 Javascript
Antd中单个DatePicker限定时间输入范围操作
2020/10/29 Javascript
JavaScript实现跟随鼠标移动的盒子
2021/01/28 Javascript
初步理解Python进程的信号通讯
2015/04/09 Python
详解python之简单主机批量管理工具
2017/01/27 Python
Python实现合并同一个文件夹下所有PDF文件的方法示例
2018/04/28 Python
python3解析库BeautifulSoup4的安装配置与基本用法
2018/06/26 Python
对python 操作solr索引数据的实例详解
2018/12/07 Python
python+selenium 定位到元素,无法点击的解决方法
2019/01/30 Python
python替换字符串中的子串图文步骤
2019/06/19 Python
Django将默认的SQLite更换为MySQL的实现
2019/11/18 Python
pandas中的ExcelWriter和ExcelFile的实现方法
2020/04/24 Python
python向xls写入数据(包括合并,边框,对齐,列宽)
2021/02/02 Python
详解HTML5 window.postMessage与跨域
2017/05/11 HTML / CSS
HTML5自定义视频播放器源码
2020/01/06 HTML / CSS
雷朋巴西官方商店:Ray-Ban Brasil
2020/07/21 全球购物
数控专业毕业生求职信范文
2013/09/21 职场文书
租车协议书范本2014
2014/11/17 职场文书
2016年第32个教师节红领巾广播稿
2015/12/18 职场文书
2016年第二十五次全国助残日活动总结
2016/04/01 职场文书
浅谈Python中对象是如何被调用的
2022/04/06 Python
Python如何让字典保持有序排列
2022/04/29 Python