现在各种轮播图插件,玲琅满目,用起来也非常方便,通常只需要选择元素然后传入参数就可以了。但是,和授人以鱼不如授人以渔一样的道理,不管怎样最基本的轮播图原理还是应当掌握的。这样不仅有利于我们自己写出来满足自己要求的轮播图,同时也对我们更好的使用其他插件有帮助。当然,最重要的是扎实我们的JavaScript基本功!

切入正题。

轮播,顾名思义,就是图片的循环“播放”。播放可以自动(定时器)也可以手动(按钮)。轮播的精要其实是切换,切换可以是上下左右不同方向的移动来实现切换,移动可以匀速小步调播放的帧动画可以是一步一幅的“僵尸跳”,也可以是透明度渐变。

一,最基本的图片轮播。

最基本的图片轮播有两种基本形式:

  第一种是要轮播的图片排列在一张画布上,画布之上有一个“窗口”,窗口固定,图片的轮播通过移动窗口之下的画布来实现(一般通过操纵它的margin-top或者left来实现)简称为‘视窗画布型’;

  第二种,不需要画布层,窗口的宽高严格等于元素的宽高,通过精准的控制每一个元素的展示层级来实现轮播(一般使用绝对定位来实现)‘绝对定位型’。下面来逐一进行分析。

(1)视窗画布型

这种类型有一个固定的模式,要点如下:

html和css:

第一,需要有固定大小并有超出隐藏属性的div,作为窗口即视窗。

第二,窗口元素内,需要有固定宽度或者高度(取决于你的轮播是左右还是上下切换)的画布元素,它用来容纳你的所有轮播内容,宽度或者高度通常大于窗口元素。

第三,需要展示的内容,固定排列在画布元素上,即第二所述元素;

JavaScript:

第一,动画效果的实现是通过JavaScript操纵画布元素的margin-top,或者margin-left来实现的。

第二,为了实现连续的变换,通常需要画布元素内,对原始内容重复添加;

示例1:等间隔切换的图片。每隔一定时间段,会切换一张图片,切换是瞬时的,和一个常见的轮播图相比缺少切换时的动画效果,先理解一个一个的组件。主要思路是:通过定时器控制,每隔一定时间间隔操作一次元素属性,使之改变,从而实现等间隔切换。

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>简单轮播图</title>
</head>
<style>
ul,li{list-style: none;padding: 0;margin: 0;}
ul{font-size: 0px;}
.window{width: 300px;height: 200px;overflow: hidden;margin: 60px auto;}
.canvas{width: 6666px;height: 200px;}
.canvas img{height: 200px;width:300px;}
ul li{display: inline-block;width: 300px;text-align: center;}
</style>
<body>
<div class="window">
<div class="canvas">
<ul>
<li><img src="data:images/muwu.jpg"></li>
<li><img src="data:images/shuijiao.jpg"></li>
<li><img src="data:images/yuantiao.jpg"</li>
</ul>
</div>
</div>
</body>
<script>
// 通过操作画布元素的左外边距实现左右轮播
//取得视窗和画布元素,定义静态变量
var window1=document.getElementsByClassName('window')[0],
canvas=document.getElementsByClassName('canvas')[0],
stepDistance=300,//每次移动的小距离,也就是没帧位移,单位为像素
i=0,
sum=document.getElementsByTagName('li').length;//轮播子项目总数
//操纵外边距
sliderMove();
function sliderMove(){
//每隔两秒钟切换一次轮播图,到达末尾时从第一张开始。
setInterval(function(){
if (i<sum) {
// 当子项没有完全展示完时,不断移动
canvas.style.marginLeft=(-stepDistance*i)+'px';
i++;
} else{
// 当子项展示完时,从头开始循环
i=0;
canvas.style.marginLeft=(-stepDistance*i)+'px';
i++;
}
},2000);
}
</script>
</html>

这种简单的轮播图,我觉得给它起名为“僵尸跳”,很合适。是在轮播,不过,不和谐, 一次一跳很突兀。

示例2:一直移动的效果,其实也就是第一种实例的细化,帧间隔变大,帧位移变小。图片之间一直在匀速移动,和一个常见的轮播图相比缺少切换时的停顿,即第一个示例的效果,先理解一个一个的组件。主要思路是:通过定时器,在很短的时间内连续移动元素,从而产生类似动画的效果。下面贴上代码:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>简单轮播图</title>
</head>
<style>
ul,li{list-style: none;padding: 0;margin: 0;}
ul{font-size: 0px;}
.window{width: 300px;height: 200px;overflow: hidden;margin: 60px auto;}
.canvas{width: 6666px;height: 200px;}
.canvas img{height: 200px;width:300px;}
ul li{display: inline-block;width: 300px;text-align: center;}
</style>
<body>
<div class="window">
<div class="canvas">
<ul>
<li><img src="data:images/muwu.jpg"></li>
<li><img src="data:images/shuijiao.jpg"></li>
<li><img src="data:images/yuantiao.jpg"</li>
<li><img src="data:images/muwu.jpg"></li>
</ul>
</div>
</div>
</body>
<script>
var window1=document.getElementsByClassName('window')[0],
canvas=document.getElementsByClassName('canvas')[0],
stepDistance=300/(3000/13),
sumDistance=0,
sum=(document.getElementsByTagName('li').length-1)*300;
sliderMove();
function sliderMove(){
setInterval(function(){
if (sumDistance<sum) {
canvas.style.marginLeft=(-sumDistance)+'px';
sumDistance+=stepDistance;
} else{
sumDistance=0;
canvas.style.marginLeft=(-sumDistance)+'px';
sumDistance+=stepDistance;
}
},13);
}
</script>
</html>

这个其实是我们后面要说的轮播的同时移动的移动部分的简单原理。其实,无论移动还是停顿都是通过定时器来实现的。

(2)绝对定位型

这是通过操纵元素的z-index来实现切换的动画类型。

二,轮播的同时移动。

三,带按钮的轮播图。

四,有其他特效的轮播图。

五,一些我用过的轮播图插件简介。

未完待续。。。

浅谈轮播图(原生JavaScript实现)的更多相关文章

  1. Web前端原生JavaScript浅谈轮播图

    1.一直来说轮播图都是困扰刚进业内小白的一大难点,因为我们不仅需要自己作出一个比较完美的运动框架(虽然网上一抓一大把,但是哪有比自己做出来实现的有成就感,不是吗?^_^),还必须需要非常关键性的把握住 ...

  2. 轮播图原生js实现和jquery实现和js面向对象方式实现

    原生JS实现 html: <!DOCTYPE html> <html lang="en"> <head> <meta charset=&q ...

  3. js 轮播图 (原生)

    注 : 此处内容较多, 只显示代码, 具体讲解看注释.  具体参考 "黑马 pink老师"   https://www.bilibili.com/video/BV1Sy4y1C7h ...

  4. React视角下的轮播图

    天猫购物网站最显眼的就是轮播图了.我在学习一样新js库,一个新框架或新的编程思想的时候,总是感叹"入门必做选项卡,进阶须撸轮播图."作为一个React组件,它是状态操控行为的典型, ...

  5. Js-带进度条的轮播图

    带进度条的轮播图--原生JS实现 实现了图片自动轮播,左右按钮实现图片左右转换,下方原点或者缩小图点击选择其中的某一张图片,然后有红条实现图片的进度. <div class="cont ...

  6. 【云开发】10分钟零基础学会做一个快递查询微信小程序,快速掌握微信小程序开发技能(轮播图、API请求)

    大家好,我叫小秃僧 这次分享的是10分钟零基础学会做一个快递查询微信小程序,快速掌握开发微信小程序技能. 这篇文章偏基础,特别适合还没有开发过微信小程序的童鞋,一些概念和逻辑我会讲细一点,尽可能用图说 ...

  7. javascript原生js轮播图

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. 原生javascript焦点轮播图

    刚刚学会,写了一个轮播图效果,不过bug蛮多,请高手指点一下,谢谢 <!DOCTYPE html> <html> <head> <meta charset=& ...

  9. 用原生的javascript 实现一个无限滚动的轮播图

    说一下思路:和我上一篇博客中用JQ去写的轮播图有相同点和不同点 相同点: 首先页面布局是一样的 同样是改变.inner盒子的位置去显示不同的图片 不同点: 为了实现无限滚动需要多添加两张重复的图片 左 ...

随机推荐

  1. java基础笔记(3)----函数

    前言引入函数前,所有的代码都写在main主函数中,代码过多,代码冗余,可读性差. 引入函数后,函数是实现某一特定功能的代码块.一个类中可以定义多个函数,每个函数和main主函数都是并列关系. 函数: ...

  2. 使用Java客户端操作elasticsearch

    Java REST客户端有两种风格: Java低级别REST客户端(Java Low Level REST Client,以后都简称低级客户端算了,难得码字):Elasticsearch的官方low- ...

  3. 云计算之路-阿里云上-容器难容:优化自建 docker swarm 集群的部署

    在上周六遭遇阿里云容器服务 swarm 版的故障之后,我们决定还是走自建 docker swarm 之路,只要不是阿里云底层的问题,我们相信会找到办法解决或避开自建 docker swarm 不稳定的 ...

  4. 201621123040《Java程序设计》第八周学习总结

    1.本周学习总结 2.书面作业 2.1ArrayList代码分析 2.1.1解释ArrayList的contains源代码 ArrayList.contain()方法通过调用indexOf()来判断元 ...

  5. 冲刺NO.9

    Alpha冲刺第九天 站立式会议 项目进展 项目已完成模块的模块测试工作开始进行.如学生基本信息模块和学生信用信息模块. 问题困难 框架的掌握存在一定的问题,导致项目的执行速度变慢.其他课程的作业占据 ...

  6. 冲刺NO.1

    Alpha冲刺第一天 站立式会议 项目进展 项目的第一天,主要工作是对项目的开发进行规划,以及将规划的成果转化为燃尽图与博客文章.依据项目需求分析报告与开题报告中已经完成的设计任务和项目规划,我们将系 ...

  7. 201621123031 《Java程序设计》第5周学习总结

    作业05-继承.多态.抽象类与接口 1. 本周学习总结 1.1 写出你认为本周学习中比较重要的知识点关键词 关键字:接口.继承.多态 1.2 尝试使用思维导图将这些关键词组织起来.注:思维导图一般不需 ...

  8. Python科学计算(一)

    作者 J.R. Johansson (robert@riken.jp) http://dml.riken.jp/~rob/ 最新版本的 IPython notebook 课程文件 http://git ...

  9. initializer element is not a compile-time constant

    初始化一个全局变量或static变量时,只能用常量赋值,不能用变量赋值! 如下就会报这个错误(KUIScreenWidth)是变量 static CGFloat const topButtonWidt ...

  10. python 3.x 爬虫基础---常用第三方库(requests,BeautifulSoup4,selenium,lxml )

    python 3.x 爬虫基础 python 3.x 爬虫基础---http headers详解 python 3.x 爬虫基础---Urllib详解 python 3.x 爬虫基础---常用第三方库 ...