原生js实现无缝轮播
原生js实现无缝轮播
因为要做到无缝,所以就要把第一张图片和最后一张连接起来,在此处采用js克隆了第一张图片的节点,添加到最后,显示图片序号的小圆按钮也是使用js动态添加的。
- html部分
<div class="banner" id="banner">
<ul class="pic" id="pic">
<li><a href="javascript:void(0)"><img src="data:images/1.jpg"></a></li>
<li><a href="javascript:void(0)"><img src="data:images/2.png"></a></li>
<li><a href="javascript:void(0)"><img src="data:images/3.png"></a></li>
<li><a href="javascript:void(0)"><img src="data:images/4.png"></a></li>
<li><a href="javascript:void(0)"><img src="data:images/5.jpg"></a></li>
<li><a href="javascript:void(0)"><img src="data:images/6.png"></a></li>
<li><a href="javascript:void(0)"><img src="data:images/7.png"></a></li>
</ul>
<ul class="dot" id="dot"></ul>
<button class="left" id="leftBtn"><</button>
<button class="right" id="rightBtn">></button>
</div> - css部分
* {
padding:;
margin:;
}
.banner {
width: 1000px;
height: 600px;
margin: 0 auto;
position: relative;
overflow: hidden;
}
ul, li {
list-style: none;
}
.pic {
height: 600px;
position: absolute;
left:;
top:;
}
.pic li {
float: left;
}
.pic li img {
width: 1000px;
height: 600px;
}
.dot {
width: 100%;
text-align: center;
font-size:;
position: absolute;
bottom: 40px;
left:;
}
.dot li {
display: inline-block;
width: 10px;
height: 10px;
border-radius: 50%;
background-color: #fff;
margin: 0 5px;
cursor: pointer;
}
.banner button {
width: 30px;
height: 50px;
background-color: rgba(0, 0, 0, .5);
border: 0 none;
color: #fff;
opacity: .5;
position: absolute;
top: 45%;
cursor: pointer;
font-size: 24px;
}
.left {
left:;
}
.right {
right:;
} - js部分
js中有封装的一些方法,包括查看对象属性的兼容写法,动画函数(该方法实现了height,width,left,top,opacity等属性的动画效果),和通过事件冒泡找寻节点的函数;var leftBtn = document.getElementById("leftBtn");
var rightBtn = document.getElementById("rightBtn");
var banner = document.getElementById("banner");
var pic = document.getElementById("pic");
var dot = document.getElementById("dot");
for (var i = 0; i < pic.children.length; i++) {
var node = document.createElement("LI");
node.index = i;
dot.appendChild(node);
}
var copy = pic.children[0].cloneNode(true);
pic.appendChild(copy);
var width = parseInt(getStyle(pic.children[0], "width"));
var len = pic.children.length;
pic.style.width = width * len + "px";
var index = 0;
var t;
function move() {
if(index == len) {
pic.style.left = 0;
index = 1;
}
if (index == -1) {
pic.style.left = -(len - 1) * width + "px";
index = len - 2;
}
left = -width * index;
changeDots(index);
animate(pic, {left, left}, function() {
t = setTimeout(function () {
index++;
if (index == len) {
pic.style.left = 0;
index = 1;
}
move();
}, 2000);
});
}
move();
// 为按钮添加点击事件
dot.onclick = function(e) {
e = e || window.event;
var target = e.target || e.srcElement;
target = getTarget(target, "tagName", "LI", this);
if (target) {
clearTimeout(t);
index = target.index;
changeDots(index);
move();
}
}
// 左右按钮
leftBtn.onclick = function() {
clearTimeout(t);
index--;
move();
}
rightBtn.onclick = function() {
clearTimeout(t);
index++;
move();
}
// 改变按钮颜色
function changeDots(index) {
if (index < 0) {
index = len;
}
if (index == len - 1) {
index = 0;
}
for (var i = 0; i < len - 1; i++) {
dot.children[i].style.backgroundColor = "#fff";
}
dot.children[index].style.backgroundColor = "red";
}
/**
* 查看ele对象的type属性
* @param {元素对象} ele
* @param {属性} type
*/
function getStyle(ele, type) {
if (ele.currentStyle) {
return ele.currentStyle[type];
} else {
return getComputedStyle(ele, null)[type];
}
}
/**
* 动画效果
* @param {元素对象} el
* @param {结束条件} endObj
* @param {回调函数} cb
* @param {时间} time
*/
function animate(el, endObj, cb, time) {
time = time || 200;
var startObj = {};
var _startObj = {};
var speedObj = {};
for (var i in endObj) {
startObj[i] = parseInt(getStyle(el, i));
_startObj[i] = startObj[i];
speedObj[i] = 16.7 * (endObj[i] - startObj[i]) / time;
}
var flag = false;
clearInterval(el.t);
el.t = setInterval(function() {
for (var j in endObj) {
startObj[j] += speedObj[j];
if (_startObj[j] < endObj[j] ? startObj[j] >= endObj[j] : startObj[j] <= endObj[j]) {
startObj[j] = endObj[j];
clearInterval(el.t);
flag = true;
}
if (j == "opacity") {
el.style[j] = startObj[j];
} else {
el.style[j] = startObj[j] + "px";
}
}
if (flag && cb) {
cb();
}
}, 16.7);
}
/**
* 找到attr属性为value的节点
* @param {目标对象,鼠标点击对象} target
* @param {属性名} attr
* @param {属性值} value
* @param {结束条件} end
*/
function getTarget(target, attr, value, end) {
while (target != end) { //如果鼠标点击的是end,则直接结束
if (target[attr] == value) { //如果点击的对象的attr属性值为value,则返回该对象
return target;
}
target = target.parentNode; //否则查找其父节点
}
}
原生js实现无缝轮播的更多相关文章
- 原生js实现图片轮播思路分析
一.复习原生js实现图片轮播 1.要点 自动轮播 点击小圆圈按钮,显示相应图片 点击左右箭头,实现向前向后轮播图片 2.实现思路 <div id="container"> ...
- 用jQuery基于原生js封装的轮播
我发现轮播在很多网站里面都用到过,一个绚丽的轮播可以为网页增色不少,最近闲来无事,也用原生js封装了一个轮播,可能不像网上的插件那么炫,但是也有用心去做.主要用了闭包的思想.需要传递的参数有:图片地址 ...
- jQuery与原生js实现banner轮播图
jQuery与原生js实现banner轮播图: (jq需自己加载)(图片需自己加载) <!DOCTYPE html> <html> <head> <meta ...
- 原生JS实现简易轮播图
原生JS实现简易轮播图(渐变?) 最近做网页总是会用到轮播图,我就把之前写的轮播图单独拿出来吧,如果有...如果真的有人也需要也可以复制去用用啊..哈~.. window.onload = funct ...
- js动画 无缝轮播 进度条 文字页面展示 div弹窗遮罩效果
1.无缝轮播 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.a ...
- 自己用原生JS写的轮播图,支持移动端触屏滑动,面向对象思路。分页器圆点支持click和mouseover。
自己用原生javascript写的轮播图,面向对象思路,支持移动端手指触屏滑动.分页器圆点可以选择click点击或mouseover鼠标移入时触发.图片滚动用的setInterval,感觉setInt ...
- 自己用原生JS写的轮播图,支持移动端触摸滑动,分页器圆点可以支持mouseover鼠标移入和click点击,高手看了勿喷哈
自己用原生JavaScript写的轮播图,分页器圆点按钮可支持click点击,也可支持mouseover鼠标悬浮触发,同时支持移动端触摸滑动,有兴趣的友友可以试试哈,菜鸟一枚,高手看了勿喷,请多多指正 ...
- 原生 js 左右切换轮播图
使用方法: 可能很多人对轮播图感兴趣,下面奉上本人的 原生 js 轮播代码复制 js 到页面的最底部,样式在 css 里改,js 基本不用动,有什么不懂的可以 加本人 QQ172360937 咨询 或 ...
- 原生JS实现幻灯片轮播效果
在以往的认知中,一直以为用原生JS写轮播是件很难得事情,今天上班仿照网上的写了一个小demo.小试牛刀. 大致效果: html结构很简单,两个列表,一个代表图片列表,一个是右下角序号列表. <d ...
随机推荐
- 转:Flutter动画二
1. 介绍 本文会从代码层面去介绍Flutter动画,因此不会涉及到Flutter动画的具体使用. 1.1 Animation库 Flutter的animation库只依赖两个库,Dart库以及phy ...
- Shell命令-文件及内容处理之sort、uniq
文件及内容处理 - sort.unip 1. sort:对文件的文本内容排序 sort命令的功能说明 sort 命令用于将文本文件内容加以排序.sort 可针对文本文件的内容,以行为单位来排序. so ...
- [模板] 二分图博弈 && BZOJ2463:[中山市选2009]谁能赢呢?
二分图博弈 from BZOJ 1443 游戏(二分图博弈) - free-loop - 博客园 定义 1.博弈者人数为两人,双方轮流进行决策. 2.博弈状态(对应点)可分为两类(状态空间可分为两个集 ...
- 使用Sublime Text 3进行Markdown编辑+实时预览
使用Sublime Text 3进行Markdown编辑+实时预览 安装软件包管理器 打开Sublime Text 3 同时按下 ctrl+` ,窗口底部出现一个小控制台 复制以下代码,粘贴到控制台的 ...
- <数据结构基础学习>(四)链表 Part 1
一.链表基础 动态数组.栈.队列底层都是依托静态数组实现的,靠resize来解决固定容量问题. 链表是真正的动态数据结构,是一种最简单的一种动态数据结构. 更深入的理解引用(或者指针). 更深入的理解 ...
- Java【第一篇】基本语法之--关键字、标识符、变量
关键字 定义:被Java语言赋予了特殊含义,用做专门用途的字符串(单词)特点:关键字中所有字母都为小写 标识符 Java 对各种变量.方法和类等要素命名时使用的字符序列称为标识符凡是自己可以起名字的地 ...
- 洛谷 P3327 【[SDOI2015]约数个数和】
前置芝士 关于这个题,你必须知道一个这样奇奇怪怪的式子啊QAQ \[d(i*j)= \sum_{x|i} \sum_{y|j}[gcd(x,y)=1] \] 留坑,先感性理解:后面那个gcd是为了去重 ...
- Elasticsearch6.5.2 X-pack破解及安装教程
先正常安装 elasticSearch, kibana. 1. 如果是6.5.2版本,可以直接下载jar文件:https://download.csdn.net/download/bigben0123 ...
- Linux基本命令总结(六)
接上篇: 27,diff在命令行中打印每一个行的改动.最新版本的diff还支持二进制文件.diff程序的输出被称为补丁 (patch),因为Linux系统中还有一个patch程序,可以根据diff的输 ...
- deepin安装mysql记录
本文转载自http://www.linuxidc.com/Linux/2016-07/133128.htm sudo apt-get install mysql-server apt-get isnt ...