js實(shí)現(xiàn)無(wú)縫輪播圖特效
用原生js實(shí)現(xiàn)無(wú)縫輪播圖,供大家參考,具體內(nèi)容如下
index.js:
var config = {
imgWidth:380,//圖片尺寸
dotWidth:8,//小圓點(diǎn)尺寸
doms:{
divImgs:document.querySelector('.imgs'),
divDots:document.querySelector('.circle'),
divDirection:document.querySelector('.direction'),
divContainer:document.querySelector('.container')
},
curIndex:0,//實(shí)際圖片索引,0 ~ imgNumber-1
timer:{
duration:16,//運(yùn)動(dòng)間隔時(shí)間
total:1000,//總時(shí)間
id:null//計(jì)時(shí)器編號(hào)
}
}
//圖片的數(shù)量
config.imgNumber = config.doms.divImgs.children.length;
//初始化元素尺寸
config.imgsWidth = (config.imgNumber + 2)*config.imgWidth;
config.dotsWidth = (config.imgNumber + 2)*config.dotWidth;
//初始化
function inti(){
intiWidth();
intiCount();
intiElement();
intiPosition();
function intiWidth(){
config.doms.divImgs.style.width = config.imgsWidth + 'px';
config.doms.divDots.style.width = config.dotsWidth + 'px';
}
function intiCount(){
for(var i = 0; i < config.imgNumber; i ++){
var p = document.createElement('p');
config.doms.divDots.appendChild(p);
}
}
function intiElement(){
var first = config.doms.divImgs.children[0],last = config.doms.divImgs.children[config.imgNumber-1];
var newImg = first.cloneNode(true);//深度克隆
config.doms.divImgs.appendChild(newImg);
newImg = last.cloneNode(true);
config.doms.divImgs.insertBefore(newImg,first);
}
function intiPosition(){
var left = (-config.curIndex-1)*config.imgWidth;
config.doms.divImgs.style.marginLeft = left + 'px';
setDots();//小圓點(diǎn)的激活狀態(tài)位置設(shè)置
}
}
inti();
//小圓點(diǎn)的激活狀態(tài)位置設(shè)置
function setDots(){
for(var i = 0; i < config.doms.divDots.children.length; i++){
var dot = config.doms.divDots.children[i];
if(i === config.curIndex){
dot.className = 'select';
}else{
dot.className = '';
}
}
}
/*
圖片切換
index: 圖片索引
directions: 圖片切換方向(left,right)
*/
function switchTo(index,directions){
if(index === config.curIndex){
return;
}
if(!directions){
directions = 'right';//默認(rèn)狀態(tài)下向右切換圖片
}
//最終的顯示圖片; 圖片容器的marginLeft
var newLeft = (-index-1)*config.imgWidth;
animateSwitch();
//config.doms.divImgs.style.marginLeft = newLeft + 'px';
//小圓點(diǎn)的激活狀態(tài)位置設(shè)置
config.curIndex = index;
setDots();
//一張圖片的總運(yùn)動(dòng)次數(shù)
var number = Math.ceil(config.timer.total/config.timer.duration);
//當(dāng)前運(yùn)動(dòng)次數(shù)
var curNumber = 0;
var distance,//總運(yùn)動(dòng)距離
totalWidth = config.imgNumber*config.imgWidth,
marginLeft = parseFloat(getComputedStyle(config.doms.divImgs).marginLeft);
if(directions === 'left'){
if(newLeft < marginLeft){
distance = newLeft - marginLeft;
}else{
distance = -(totalWidth-Math.abs(newLeft - marginLeft));
}
}
if(directions === 'right'){
if(newLeft > marginLeft){
distance = newLeft - marginLeft;
}else{
distance = totalWidth-Math.abs(newLeft - marginLeft);
}
}
//每次改變的距離
var everDistence = distance/number;
//逐步改變marginLeft
function animateSwitch(){
clearAnimate();
config.timer.id = setInterval(function(){
marginLeft += everDistence;
if(directions === 'left' && Math.abs(marginLeft) > totalWidth){
marginLeft += totalWidth;
}
else if(directions === 'right' && Math.abs(marginLeft) < config.imgWidth){
marginLeft -= totalWidth;
}
config.doms.divImgs.style.marginLeft = marginLeft + 'px';
curNumber ++;
if(curNumber === number){
clearAnimate();
}
},config.timer.duration);
}
//清空計(jì)時(shí)器
function clearAnimate(){
clearInterval(config.timer.id);
config.timer.id = null;
}
}
//默認(rèn)情況下自動(dòng)向右輪播圖片
var timer = setInterval(function(){
toRight();
},2000);
config.doms.divContainer.onmouseleave = function() {
timer = setInterval(function(){
toRight();
},2000);
}
//鼠標(biāo)移出則清空定時(shí)器
config.doms.divContainer.onmouseover = function() {
clearInterval(timer);
}
//左右點(diǎn)擊事件
config.doms.divDirection.onclick = function(e){
clearInterval(timer);
if(e.target.classList.contains('left')){
toLeft();
}
if(e.target.classList.contains('right')){
toRight();
}
}
function toLeft(){
var index = config.curIndex - 1;
if(index < 0){
index = config.imgNumber - 1;
}
switchTo(index,'right');
}
function toRight(){
var index = config.curIndex + 1;
if(index > config.imgNumber - 1){
index = 0;
}
switchTo(index,'left');
}
//小圓點(diǎn)點(diǎn)擊事件
config.doms.divDots.onclick = function(e){
if(e.target.tagName === 'P'){
var index = Array.from(this.children).indexOf(e.target);
switchTo(index,index > config.curIndex? 'left' : 'right')
}
}
index.html:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>無(wú)縫輪播圖</title> <link rel="stylesheet" href="index.css" rel="external nofollow" > </head> <body> <div class="container"> <div class="imgs"> <img class="item" src="../imagejpg/1.jpg" alt=""> <img class="item" src="../imagejpg/2.jpg" alt=""> <img class="item" src="../imagejpg/3.jpg" alt=""> </div> <div class="circle"> <!-- <p></p> <p class="select"></p> <p></p> <p></p> <p></p> --> </div> <div class="direction"> <div class="item left"><</div> <div class="item right">></div> </div> </div> <script src="./index.js"> </script> </body> </html>
index.css:
.container{
width:380px;
height:250px;
border:1px solid;
margin:0 auto;
position:relative;
overflow: hidden;
}
.container .imgs{
}
.container .imgs .item{
width:380px;
height:250px;
display:block;
float:left;
top:0;
}
.container .circle{
position:absolute;
left:0;
right:0;
margin:0 auto;
background:rgba(0,0,0,.3);
bottom:8px;
border-radius:5px;
}
.container .circle p{
width:8px;
height:8px;
background:#fff;
border-radius:50%;
float:left;
margin:2px;
cursor:pointer;
}
.container .circle p.select{
background:#f40;
}
.container .direction .item{
background:rgba(0,0,0,.4);
position:absolute;
top:120px;
width:20px;
height:26px;
padding:2px;
box-sizing:border-box;
display:none;
cursor:pointer;
}
.container .direction .item:hover{
background:rgba(0,0,0,.5);
}
.container:hover .direction .item{
display:block;
}
.container .direction .left{
left:0;
border-radius:0 15px 15px 0;
}
.container .direction .right{
right:0;
padding-left:6px;
border-radius:15px 0 0 15px;
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
BootStrap實(shí)現(xiàn)帶有增刪改查功能的表格(DEMO詳解)
這篇文章主要介紹了BootStrap實(shí)現(xiàn)帶有增刪改查功能的表格,表格封裝了3個(gè)版本,接下來(lái)通過(guò)本文給大家展示下樣式及代碼,對(duì)bootstrap增刪改查相關(guān)知識(shí)感興趣的朋友一起通過(guò)本文學(xué)習(xí)吧2016-10-10
js動(dòng)態(tài)獲取子復(fù)選項(xiàng)并設(shè)計(jì)全選及提交的實(shí)現(xiàn)方法
下面小編就為大家?guī)?lái)一篇js動(dòng)態(tài)獲取子復(fù)選項(xiàng)并設(shè)計(jì)全選及提交的實(shí)現(xiàn)方法。小編覺得挺不錯(cuò)的, 現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-06-06
優(yōu)雅而高效的JavaScript?try...catch語(yǔ)句詳解(js異常處理)
這篇文章主要給大家介紹了關(guān)于JavaScript中try...catch語(yǔ)句的相關(guān)資料,也就是js異常處理方法,try...catch是JavaScript中的錯(cuò)誤處理機(jī)制,它的作用是捕獲和處理可能發(fā)生的錯(cuò)誤,以避免程序崩潰,需要的朋友可以參考下2024-01-01
通過(guò)js動(dòng)態(tài)創(chuàng)建標(biāo)簽,并設(shè)置屬性方法
下面小編就為大家分享一篇通過(guò)js動(dòng)態(tài)創(chuàng)建標(biāo)簽,并設(shè)置屬性方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-02-02
js純前端實(shí)現(xiàn)騰訊cos文件上傳功能的示例代碼
這篇文章主要介紹了vue純前端實(shí)現(xiàn)騰訊cos文件上傳功能的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-05-05
微信小程序--onShareAppMessage分享參數(shù)用處(頁(yè)面分享)
本篇文章主要介紹了微信小程序的頁(yè)面分享onShareAppMessage分享參數(shù)用處的相關(guān)資料。具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧2017-04-04
Cropper.js進(jìn)階之固定寬高圖片裁切實(shí)現(xiàn)示例
這篇文章主要為大家介紹了Cropper.js進(jìn)階之固定寬高圖片裁切實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05

