基于JavaScript實(shí)現(xiàn)焦點(diǎn)圖輪播效果
不管是高校的網(wǎng)站還是電商的頁(yè)面,焦點(diǎn)圖的切換和輪播應(yīng)該是一項(xiàng)不可或缺的應(yīng)用。今天把焦點(diǎn)圖輪播制作的技術(shù)要點(diǎn)做下筆記,以供日后查看。
一、結(jié)構(gòu)層(HTML)
焦點(diǎn)圖的HTML結(jié)構(gòu)很簡(jiǎn)單,就是一個(gè)父容器(id=box),包含三個(gè)子容器,分別存放圖片(id=pics)、底部按鈕(id=dots)、作用切換箭頭(class=turn)。加上樣式后就是下圖二的布局。


二、表示層(CSS)
頁(yè)面的表現(xiàn)和風(fēng)格總是離不開(kāi)CSS。為敘述方便,后面采用id選擇符名或類選擇符名代表各div模塊。
1.box
box作為父容器,是整個(gè)焦點(diǎn)圖輪播結(jié)構(gòu)在網(wǎng)頁(yè)的直觀表現(xiàn),它的寬高就是要顯示的圖片的寬高。我將圖片設(shè)置為寬600px、高400px,使父容器box居中顯示,并加了陰影。樣式大概都可以隨自己愛(ài)好設(shè)置,但溢出一定要隱藏,定位一定要設(shè)置為相對(duì)定位,以使子容器的絕對(duì)定位準(zhǔn)確。
#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用于放置圖片,因?yàn)槭侵谱髯笥仪袚Q功能,高仍是一張圖片的高,但寬=(展示的圖片數(shù)量+2)*圖片寬,原因在行為層再說(shuō)明。
另外需要注意的是,由展示圖片可知,pics在左右切換箭頭和底部切換按鈕的下層,所以z-index要設(shè)為1。
#pics{
width: 5400px;
height: 400px;
position: absolute;
z-index: 1;
}
3.dots
z-index設(shè)為2,置為上層顯示;定位為絕對(duì)定位;其他樣式隨喜好。這里我設(shè)置了鼠標(biāo)滑過(guò)的樣式,以及配合js對(duì)應(yīng)圖片位置改變的樣式(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一致,其他自定義。這里我設(shè)置了鼠標(biāo)滑過(guò)box,才顯現(xiàn)箭頭。
.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;}
至此頁(yè)面的樣式和布局完成,但行為層方法和功能的實(shí)現(xiàn)才是重點(diǎn)。
三、行為層(JavaScript)
定義函數(shù)前,先在全局作用域中獲得頁(yè)面的節(jié)點(diǎn)。
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.圖片切換動(dòng)畫
輪播圖的核心方法,在于圖片的切換動(dòng)畫。而此函數(shù)的重點(diǎn),是接收一個(gè)位移量offset,然后改變pics相對(duì)于box的left值,從而對(duì)圖片進(jìn)行顯示。
之前CSS設(shè)置的,box的寬為600px,但pics的寬卻為5400px,由于box溢出隱藏,所以頁(yè)面只會(huì)顯示一張圖片;通過(guò)接收具體位移量offset,改變left值(減去或加上n個(gè)圖片寬度),就可以改變顯示的圖片。
此外還有兩個(gè)問(wèn)題,如果不設(shè)置圖片切換的速度,圖片就會(huì)整張整張的變換,沒(méi)有進(jìn)入切換的效果;而且如果不停的點(diǎn)擊切換,就會(huì)消耗太多的內(nèi)存造成電腦卡機(jī),出現(xiàn)頁(yè)面停在前一張圖未切換完就出現(xiàn)下一張等情況。所以要對(duì)圖片做一個(gè)速度處理,以及一張圖片為切換完就不允許其他切換的設(shè)置。
//圖片切換函數(shù)
function turn(offset){
turned = true; //切換允許標(biāo)志,在全局作用域中定義,true表示關(guān)閉允許切換
var new_left = parseInt(pics.style.left) + offset; //最后left值
var total_time = 300; //位移總時(shí)間
var interval = 10; //每次位移間隔時(shí)間
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; //已切換完畢,開(kāi)啟允許切換
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.箭頭切換
在圖片切換函數(shù)turn()基礎(chǔ)上傳入?yún)?shù)。因?yàn)槭亲笥仪袚Q,所以每次直接傳入一個(gè)圖片寬度。向右切換傳入-600,左切傳入600。
這里要注意的就是,圖片與底部按鈕的同步,到兩邊的最后一張后參數(shù)的重置,以及是否允許切換的判斷。
//箭頭切換實(shí)現(xiàn)
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.底部按鈕實(shí)現(xiàn)
按鈕與箭頭的不同,在于點(diǎn)擊它可以切換到任意一張圖片,所以在對(duì)切換函數(shù)turn()傳入?yún)?shù)前要先做一個(gè)計(jì)算。另外按鈕對(duì)應(yīng)樣式的變化也不能忘記。
//按鈕切換樣式
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';
}
//按鈕切換實(shí)現(xiàn)
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); //計(jì)算切換位移量
if(!turned){
turn(offset);
}
index = my_index;
show_dots();
}
}
4. 自動(dòng)播放
自動(dòng)播放自然就是設(shè)置定時(shí)器和清除定時(shí)器的問(wèn)題,這里不再贅述。
//定時(shí)動(dòng)畫
function play(){
time = setInterval(function(){
next.onclick();
},3000);
}
//動(dòng)畫停止
function stop(){clearInterval(time);}
play();
box.onmouseover = stop;
box.onmouseout = play;
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 原生JS輪播圖插件
- 非常優(yōu)秀的JS圖片輪播插件Swiper的用法
- 基于cssSlidy.js插件實(shí)現(xiàn)響應(yīng)式手機(jī)圖片輪播效果
- Bootstrap 最常用的JS插件系列總結(jié)(圖片輪播、標(biāo)簽切換等)
- jQuery插件學(xué)習(xí)教程之SlidesJs輪播+Validation驗(yàn)證
- Bootstrap輪播插件中圖片變形的終極解決方案 使用jqthumb.js
- jQuery實(shí)現(xiàn)圖片輪播效果代碼(基于jquery.pack.js插件)
- BootStrap的JS插件之輪播效果案例詳解
- 原生JS實(shí)現(xiàn)旋轉(zhuǎn)木馬式圖片輪播插件
- 深入解析js輪播插件核心代碼的實(shí)現(xiàn)過(guò)程
相關(guān)文章
JavaScript判斷用戶是否對(duì)表單進(jìn)行了修改的方法
這篇文章主要介紹了JavaScript判斷用戶是否對(duì)表單進(jìn)行了修改的方法,實(shí)例分析了javascript對(duì)表單操作與判定的技巧,需要的朋友可以參考下2015-03-03
拆開(kāi)JavaScript迭代器模式內(nèi)部黑盒子
這篇文章主要為大家介紹了JavaScript迭代器模式內(nèi)部黑盒子解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12
uniapp項(xiàng)目引入?js文件以及全局使用方法
這篇文章主要給大家介紹了關(guān)于uniapp項(xiàng)目引入?js文件以及全局使用方法的相關(guān)資料,在Uniapp中引入JS文件是一項(xiàng)常見(jiàn)的操作,文中通過(guò)代碼示例介紹的非常詳細(xì),需要的朋友可以參考下2023-12-12
JavaScript將數(shù)字轉(zhuǎn)換成大寫中文的方法
這篇文章主要介紹了JavaScript將數(shù)字轉(zhuǎn)換成大寫中文的方法,涉及javascript字符串及匹配的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-03-03
js實(shí)現(xiàn)動(dòng)態(tài)改變r(jià)adio狀態(tài)的方法
下面小編就為大家分享一篇js實(shí)現(xiàn)動(dòng)態(tài)改變r(jià)adio狀態(tài)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-02-02
js省市聯(lián)動(dòng)效果完整實(shí)例代碼
這篇文章主要介紹了js省市聯(lián)動(dòng)效果完整實(shí)例代碼,涉及JavaScript數(shù)組的定義與遍歷技巧,代碼非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-12-12

