原生js實(shí)現(xiàn)百葉窗效果及原理介紹
百葉窗大家都見(jiàn)過(guò)吧!如圖:




原理:
如圖所示,空心格子就好比是每個(gè)li,給它設(shè)定相對(duì)定位屬性,設(shè)置overflow:hidden;黑塊為li子元素,高度為li的2倍,設(shè)置absolute屬性,我們正是要改變它的top值從而獲得變化!(右上角多余塊與本圖無(wú)關(guān))


布局分析:
注意top值得變化!默認(rèn)top=0時(shí)候,顯示的“一樓上鋪”,當(dāng)top=-40px時(shí)候,li的子元素 上移40px,這時(shí)候顯示的內(nèi)容就為“一樓下鋪”注意p元素的包裹層div



JS分析:
1、要開(kāi)多個(gè)定時(shí)器來(lái)達(dá)到效果
2、執(zhí)行相反方向
3、執(zhí)行多組運(yùn)動(dòng)
4、累加產(chǎn)生錯(cuò)落感
5、產(chǎn)生時(shí)間間隔的動(dòng)畫(huà)
JS代碼如下:
<script>
window.onload = function(){
var oUl = document.getElementById('ul1');
var oUl2 = document.getElementById('ul2');
toShow(oUl);
//每四秒執(zhí)行一次
setTimeout(function(){
toShow(oUl2);
},4000);
function toShow(obj){
var aDiv = obj.getElementsByTagName('div');
var iNow = 0;
var timer = null;
var bBtn = true;
setInterval(function(){
toChange();
},2000);
function toChange(){
timer = setInterval(function(){
if(iNow==aDiv.length){
clearInterval(timer);
iNow = 0;
bBtn = !bBtn;
}
else if(bBtn){
startMove(aDiv[iNow],{top:0},function(){
var p = document.getElementsByClassName('p-2');
for(var i=0; i<p.length;i++){
p[i].style.background = 'red';
}
});
iNow++;
}
else{
startMove(aDiv[iNow],{top:-30});
iNow++;
}
},100);
}
}
};
//運(yùn)動(dòng)框架
function startMove(obj,json,endFn){
clearInterval(obj.timer);
obj.timer = setInterval(function(){
var bBtn = true;
for(var attr in json){
var iCur = 0;
iCur = parseInt(getStyle(obj,attr)) || 0;
var iSpeed = (json[attr] - iCur)/8;
iSpeed = iSpeed >0 ? Math.ceil(iSpeed) : Math.floor(iSpeed);
if(iCur!=json[attr]){
bBtn = false;
}
obj.style[attr] = iCur + iSpeed + 'px';
}
if(bBtn){
clearInterval(obj.timer);
if(endFn){
endFn.call(obj);
}
}
},30);
}
//獲取非行間樣式
function getStyle(obj,attr){
if(obj.currentStyle){
return obj.currentStyle[attr];
}
else{
return getComputedStyle(obj,false)[attr];
}
}
</script>
下載地址:js實(shí)現(xiàn)百葉窗效果
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家學(xué)習(xí)實(shí)現(xiàn)js百葉窗效果有所幫助。
相關(guān)文章
用CSS+JS實(shí)現(xiàn)的進(jìn)度條效果效果
用CSS+JS實(shí)現(xiàn)的進(jìn)度條效果效果...2007-06-06
JavaScript setTimeout()基本用法有哪些
這篇文章主要介紹了JavaScript setTimeout()基本用法有哪些,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11
javascript獲取重復(fù)次數(shù)最多的字符
本文給大家講述的是使用javascript實(shí)現(xiàn)獲取重復(fù)次數(shù)最多的字符,代碼很簡(jiǎn)單,有需要的小伙伴可以參考下。2015-07-07
js實(shí)現(xiàn)網(wǎng)頁(yè)音樂(lè)播放器
這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)網(wǎng)頁(yè)音樂(lè)播放器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-06-06

