用原生js封装轮播图
原生js封装轮播图
对于初学js的同学来说,轮播图还是一个难点,尤其是原生js封装轮播图代码,下面是我之前做的一个轮播图项目中封装好的一些代码,有需要的同学可以看一下,有什么不懂的可以看注释,注释看不懂的可以直接私信我
slide.js
/*
* 轮播图
*/
function Slide(elem, ms, d, ind){
this.el = elem;
this.w = parseInt(getStyle(elem, "width"));
this.h = parseInt(getStyle(elem, "height"));
var a = this.el.children;
this.ul = a[0];
this.ol = a[1];
this.lBtn = a[2];
this.rBtn = a[3];
this.olspan = this.ol.getElementsByTagName("span");
this.l = this.olspan.length;
this.ul.style.width = this.w*(this.l+1)+"px"; // ul的宽度
this.lBtn.style.top = this.rBtn.style.top = (this.h-this.rBtn.offsetHeight)/2+"px";
this.ms = ms; // 每隔多久执行一次滚动
this.d = d; // 轮播时方向
this.ul.innerHTML += this.ul.children[0].outerHTML; //将第一张图片复制到最后一个位置上
var that = this;
this.now = ind;
that.prev = -that.now*that.w;
this.run = function(){
var i=0, l=that.l, btns=that.olspan, btn;
for( ; i<l; i++){
btn = btns[i];
btn.i = i;
btn.onclick = function(){
that.now = this.i;
that.tab();
}
}
that.timer = setInterval(that.next, that.ms);
that.el.onmouseover = that.over;
that.el.onmouseout = that.out;
that.lBtn.onclick = function(){
that.now--;
that.d = -1;
that.tab();
}
that.rBtn.onclick = function(){
that.now++;
that.d = 1;
that.tab();
}
that.lBtn.onmousedown = that.rBtn.onmousedown = function(){
return false;
}
}
this.tab = function(){
that.ul.style.left = that.prev+"px"; // 每次运动时,先瞬间定位到上一次的目标值,然后再执行本次运动
if( that.now == that.l ){
that.prev = 0;
startMove(that.ul, {"left":-that.now*that.w}, function(){
that.ul.style.left = "0px";
});
that.now = 0;
}else if( that.now == -1 ){
that.now = that.l-1;
that.ul.style.left = -that.l*that.w+"px";
that.prev = -that.now*that.w;
startMove(that.ul, {"left":that.prev});
}else{
that.prev = -that.now*that.w;
startMove(that.ul, {"left":that.prev});
}
// 样式
for( var i=0,l=that.l; i<l; i++ ){
that.olspan[i].className = "";
}
that.olspan[that.now].className = "selected";
}
this.next = function(){
that.now += that.d;
that.tab();
}
this.over = function(){
clearInterval(that.timer);
startMove(that.lBtn, {"opacity":100});
startMove(that.rBtn, {"opacity":100});
}
this.out = function(){
that.timer = setInterval(that.next, that.ms);
startMove(that.lBtn, {"opacity":0});
startMove(that.rBtn, {"opacity":0});
}
this.tab();
this.run();
}
startMove.js(运动函数)
/*
* 运动函数
* 参数:
* elem 指操作的元素
* obj 指操作的元素节点上的css属性及它的目标值
* attr 指操作的元素节点上的css属性
* target 指操作的元素节点上的css属性的目标值
* fn 指运动函数执行完,执行哪一个函数
*/
function startMove(elem, obj, fn){
// 清除定时器
clearInterval(elem.timer);
// 多属性同时运动时,是否每一个属性都到了目标值
// 开启定时器
elem.timer = setInterval(function(){
var flag = true; // 默认时认为到了目标值
// 支持多属性同时运动
for( var attr in obj ){
// 目标值
var target = obj[attr];
// 判断属性是否为透明度
var v; // 获取当前值
if( attr == "opacity" ){
v = getStyle(elem, attr);
v = Math.round(v*100);
}else{
v = parseInt(getStyle(elem, attr));
}
//console.log(v);
// 目标值与当前值的间距
var dist = target - v;
// 求步长
var speed = dist/6;
// 步长取整数
if(speed>0){
speed = Math.ceil(speed);
}else{
speed = Math.floor(speed);
}
// 更新
if( attr == "opacity" ){
elem.style.opacity = (v+speed)/100;
if(/MSIE/.test(navigator.userAgent)){// 如果当前浏览器为IE,则执行兼容代码
elem.style.filter = "alpha(opacity="+(v+speed)+")"; // 兼容低版本IE
}
}else{
elem.style[attr] = v+speed+"px";
}
// 如果没有到达目标值
if(v!=target){
flag = false;
}
//console.log(0);
}
// 如果已经到达目标值,则停止定时器
if( flag ){
clearInterval(elem.timer);
if( fn ){ // 如果给定了第三个参数,则执行该函数
fn();
}
}
}, 50);
}
/*
* 获取行间样式
*/
function getStyle(elem, attr){
if( window.getComputedStyle ){
return getComputedStyle(elem, null)[attr];
}else{
return elem.currentStyle[attr];
}
}
接下来是一些简单的css代码
/*
* 轮播图
*/
.slide{
position: relative;
overflow: hidden;
}
.slide *{
margin: 0;
padding: 0;
}
.slide li{
float: left;
list-style: none;
}
.slide>ul{
position: absolute;
left: 0;
top: 0;
}
.slide>ul>li{
}
.slide>ol{
position: absolute;
right: 0;
bottom: 0;
}
.slide>ol>li{
padding: 10px;
}
.slide>ol>li>span{
display: block;
width: 20px;
height: 20px;
border-radius: 10px;
background: white;
cursor: pointer;
}
.slide .selected{
background: greenyellow;
}
.slide>p{
position: absolute;
display: block;
width: 30px;
height: 30px;
text-align: center;
line-height: 25px;
border-radius: 15px;
background: white;
cursor: pointer;
opacity: 0;
}
.slide>p:hover{
background: greenyellow;
}
.slide>p:nth-child(3){
left: 10px;
}
.slide>p:nth-child(4){
right: 10px;
}
使用方法
<div id="div1" class="slide">
<ul>
<li><img src="img/001.jpg"/></li>
<li><img src="img/002.jpg"/></li>
<li><img src="img/003.jpg"/></li>
<li><img src="img/004.jpg"/></li>
</ul>
<ol>
<li><span></span></li>
<li><span></span></li>
<li><span></span></li>
<li><span></span></li>
</ol>
<p><</p>
<p>></p>
</div>
接下来在script中直接new一个实例,new Slide(div1, 3000, 1, 1);就可以实现轮播效果
代码很简单,细心观察,你也是大神
用原生js封装轮播图的更多相关文章
- 原生js封装轮播图
个人实际开发中用到的效果问题总结出来便于自己以后开发查看调用,如果也适用其他人请随意拿走勿喷就行! 原生js对于思路要求比较高,在js代码我都写有备注,足够理解并使用,即使是小白或者刚入行的程序员也比 ...
- 封装一个简单的原生js焦点轮播图插件
轮播图实现的效果为,鼠标移入左右箭头会出现,可以点击切换图片,下面的小圆点会跟随,可以循环播放(为了方便理解,没有补2张图做无缝轮播).本篇文章的主要目的是分享封装插件的思路. 轮播图我一开始是写成非 ...
- 原生js焦点轮播图
原生js焦点轮播图主要注意这几点: 1.前后按钮实现切换,同时注意辅助图2.中间的button随着前后按钮对应切换,同时按button也能跳转到相应的index3.间隔调用与无限轮播.4.注意在动画时 ...
- 原生js实现轮播图
原生js实现轮播图 很多网站上都有轮播图,但找到一个系统讲解的却很难,因此这里做一个简单的介绍,希望大家都能有所收获,如果有哪些不正确的地方,希望大家可以指出. 原理: 将一些图片在一行中平铺,然后计 ...
- 原生JS实现轮播图的效果
原生JS实现轮播图的效果: 只要缕清了全局变量index的作用,这个轮播图也就比较容易实现了:另外,为了实现轮这个效果,有几处clearInterval()必须写上.废话不多说,直接上代码,修复了几个 ...
- 使用原生js将轮播图组件化
代码地址如下:http://www.demodashi.com/demo/11316.html 这是一个轮播图组件,这里是代码地址,需要传入容器的id和图片地址,支持Internet Explor ...
- 原生js焦点轮播图的实现
继续学习打卡,武汉加油,逆战必胜!今日咱们主要探讨一下原生js写轮播图的问题, 简单解析一下思路: 1,首先写好css样式问题 2,考虑全局变量:自动播放的定时器,以及记录图片位置的角标Index 2 ...
- 原生JS设计轮播图
一.效果预览: 由于只能上传2M以下的图片,这里只截取了自动切换的效果: 二.编写语言 HTML.CSS.原生JS 三.编写思路 (一)HTML部分 1..slide意为滑槽,里面存放所有图片: 2. ...
- 授人以渔式解析原生JS写轮播图
需求与分析 需求:循环无缝自动轮播五张图,按左右箭头可以手动切换图片,鼠标点击轮播图下面按钮 1 2 3 4 5会跳转到对应的第1 2 3 4 5张图片.鼠标放到轮播图的图片上时不再自动轮播并且左右箭 ...
随机推荐
- 2变量与基本类型之const限定符
一.const介绍: const对象一旦被创建其值就不能再改变,所以const对象必须初始化.任何试图对const赋值的行为都会引发错误. 二.初始化和const: 对const对象的主要限制就是只能 ...
- JS分支结构与循环结构
1.分支结构 ①if语句 语法结构 if (/* 条件表达式 */) { // 执行语句 } if (/* 条件表达式 */){ // 成立执行语句 } else { // 否则执行语句 } ...
- 2、go 运行操作
1)有且只有一个函数入口,main liteIDE,直接图形界面编译,一个文件夹里的只能有一个main函数 或者 go build XXX.go 编译go代码,生成一个可执行程序 然后运行可执行程序 ...
- 云cassandra 重磅发布dynamodb特性
云cassandra全新发布dynamodb特性 nosql主力数据库再上新台阶 9月阿里云cassandra产品发布,具体参考阿里云全球首发云Cassandra服务.迄今为止,已有上百大B客户开通了 ...
- 云栖干货回顾 | 云原生数据库POLARDB专场“硬核”解析
POLARDB是阿里巴巴自主研发的云原生关系型数据库,目前兼容三种数据库引擎:MySQL.PostgreSQL.Oracle.POLARDB的计算能力最高可扩展至1000核以上,存储容量可达100TB ...
- NX二次开发-UFUN发射线函数UF_MODL_trace_a_ray的用法
今天是国庆节,放假休息懒得动,没有出去玩,在家研究一下发射线函数UF_MODL_trace_a_ray.小弟以前在软件公司混的时候,当时我做的那个项目就用到了UF_MODL_trace_a_ray,当 ...
- ionic-CSS:ionic icon(图标)
ylbtech-ionic-CSS:ionic icon(图标) 1.返回顶部 1. ionic icon(图标) ionic 也默认提供了许多的图标,大概有 700 多个,针对 Android 和 ...
- python数据结构之图的实现方法
python数据结构之图的实现方法 本文实例讲述了python数据结构之图的实现方法.分享给大家供大家参考.具体如下: 下面简要的介绍下: 比如有这么一张图: A -> B A ...
- [kuangbin带你飞]专题一 简单搜索 - N - Find a way
正确代码: #include<iostream> #include<queue> #define N 210 #define inf 0xffffff using namesp ...
- log4j架构
Log4j API设计为分层结构,其中每一层提供了不同的对象,对象执行不同的任务.这使得设计灵活,根据将来需要来扩展. 有两种类型可用在Log4j的框架对象. 核心对象: 框架的强制对象和框架的使用. ...