使用JS實(shí)現(xiàn)側(cè)邊欄展開和關(guān)閉動(dòng)畫效果
摘要
在很多電商的pc端網(wǎng)頁,我們往往能看到那個(gè)再熟悉不過的側(cè)邊欄。當(dāng)我們鼠標(biāo)放上去時(shí),它就會(huì)絲滑的彈出一個(gè)內(nèi)容的盒子,當(dāng)你離開,這個(gè)盒子又像彈簧一樣收縮回去。接下來我們就要用JS做出這個(gè)簡(jiǎn)單的動(dòng)畫效果...
一、緩動(dòng)動(dòng)畫原理
注:以左右移動(dòng)效果為例
1.首先獲得盒子原始的位置 (盒子要有定位,因?yàn)槭抢煤凶拥膌eft屬性移動(dòng))
2.讓盒子在當(dāng)前位置上移動(dòng)一個(gè)距離
3.添加定時(shí)器setInterval()重復(fù)2中的操作
4.到達(dá)指定位置后清除定時(shí)器 clearInterval
二、代碼實(shí)現(xiàn)
1.首先準(zhǔn)備一個(gè)大盒子,包含一個(gè)span和一個(gè)用來滑動(dòng)的盒子
<div class = "slider_bar">
<span>展開</span>
<div class = "con">內(nèi)容</div>
</div>
2.為盒子設(shè)置樣式
.slider_bar{
position:absolute;
right:0;
top:500px;
width:100px;
height:100px;
}
.span{
display:block;
width:100px;
height:100px;
background-color:pink;
}
.con{
position:absolute;
left:0;
top:0;
width:300px;
height:100px;
z-index:-1;
}
因?yàn)閏ss的層疊性,要給.con設(shè)置z-index:-1,把滑動(dòng)盒子放在span下面隱藏起來
3.寫一個(gè)能夠?qū)崿F(xiàn)左右移動(dòng)動(dòng)畫函數(shù)
function animate(obj,target,callback){
clearInterval(obj.timer);
obj.timer = setInterval(function(){
var step = (target - obj.offsetLeft)/10;
step = step > 0 ? Math.ceil(step) : Math.floor(step);
if(obj.offsetLeft == target){
clearInterval(obj.timer);
if(callback){
callback();
}
}
else{
obj.style.left = obj.offsetLeft + step + 'px';
}
},30)
}
4.綁定顯示和隱藏事件
<script>
var sliderbar = document.querySelector(".slider_bar");
var con = document.querySelector(".con");
sliderbar.addEventListener("mouseenter",function(){
animate(con,-200,function(){
sliderbar.children[0].innerHTML = '關(guān)閉';
) })
}
sliderbar.addEventListener("mouseleave",function(){
animate(con,0,function(){
sliderbar.children[0].innerHTML = '展開';
) })
}
</script>
三、特別標(biāo)注
1.當(dāng)步長(step)為正數(shù)時(shí),要向上取整(Math.ceil());為負(fù)數(shù)時(shí),要向下取整(Math.floor())。 2.運(yùn)動(dòng)速度先快后慢,緩動(dòng)效果,用公式:(目標(biāo)位置-現(xiàn)在位置)/10. 3.回調(diào)函數(shù)做參數(shù),callback就相當(dāng)于聲明的函數(shù)體,所以函數(shù)調(diào)用直接寫callback();
四、完整代碼示例
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>緩動(dòng)動(dòng)畫原理</title>
<style>
.slider_bar {
right: 0;
top: 500px;
position: absolute;
width: 100px;
height: 100px;
}
span {
display: block;
width: 100px;
height: 100px;
background-color: pink;
}
.con {
position: absolute;
left: 0px;
top: 0px;
width: 300px;
height: 100px;
background-color: blueviolet;
z-index: -1;
}
</style>
<script src="/practice1/animate.js"></script>
</head>
<body>
<div class="slider_bar">
<span>展開</span>
<div class="con">問題反饋</div>
</div>
<script>
var sliderBar = document.querySelector(".slider_bar");
var con = document.querySelector(".con");
sliderBar.addEventListener("mouseenter", function () {
animate(con, -200, function () {
sliderBar.children[0].innerHTML = '關(guān)閉';
});
})
sliderBar.addEventListener("mouseleave", function () {
animate(con, 0, function () {
sliderBar.children[0].innerHTML = '展開';
});
})
</script>
</body>
</html>
JS文件
function animate(obj, target, callback) {
clearInterval(obj.timer);
obj.timer = setInterval(function () {
var step = (target - obj.offsetLeft) / 10;
step = step > 0 ? Math.ceil(step) : Math.floor(step);
if (obj.offsetLeft == target) {
clearInterval(obj.timer);
if (callback) {
callback();
}
}
else {
obj.style.left = obj.offsetLeft + step + 'px';
}
}, 30)
}
完整代碼示例的前面純手搓,沒在編輯器里面寫,如果有錯(cuò)誤希望掘友們幫我指出我再改正!
以上就是使用JS實(shí)現(xiàn)側(cè)邊欄展開和關(guān)閉動(dòng)畫效果的詳細(xì)內(nèi)容,更多關(guān)于JS側(cè)邊欄展開和關(guān)閉動(dòng)畫的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
JavaScript計(jì)劃任務(wù)后臺(tái)運(yùn)行的方法
這篇文章主要介紹了JavaScript計(jì)劃任務(wù)后臺(tái)運(yùn)行的方法,需要的朋友可以參考下2015-12-12
JavaScript實(shí)現(xiàn)excel文件導(dǎo)入導(dǎo)出
這篇文章主要介紹了JavaScript實(shí)現(xiàn)excel文件導(dǎo)入導(dǎo)出,文件的導(dǎo)入導(dǎo)出是非常常見的需求功能,excel文件的導(dǎo)入導(dǎo)出更為常見,實(shí)踐中許多時(shí)候,是調(diào)用接口實(shí)現(xiàn)導(dǎo)入導(dǎo)出的,具體實(shí)現(xiàn)內(nèi)容需要的小伙伴可以參考一下2022-06-06
使用javascript過濾html的字符串(注釋標(biāo)記法)
本篇文章是對(duì)使用javascript過濾html的字符串進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-07-07
JavaScript設(shè)計(jì)模式之調(diào)停者模式實(shí)例詳解
這篇文章主要介紹了JavaScript設(shè)計(jì)模式之調(diào)停者模式,詳細(xì)分析了調(diào)停者模式的概念、原理、優(yōu)缺點(diǎn)并結(jié)合javascript實(shí)例形式給出了相關(guān)使用技巧,需要的朋友可以參考下2018-02-02
JavaScript實(shí)現(xiàn)動(dòng)態(tài)網(wǎng)頁時(shí)鐘
這篇文章主要介紹了JavaScript實(shí)現(xiàn)動(dòng)態(tài)網(wǎng)頁時(shí)鐘,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06
JS 實(shí)現(xiàn)導(dǎo)航菜單中的二級(jí)下拉菜單的幾種方式
這篇文章主要介紹了JS 實(shí)現(xiàn)導(dǎo)航菜單中的二級(jí)下拉菜單的幾種方式的相關(guān)資料,這里提供了三種方式,和實(shí)例代碼,需要的朋友可以參考下2016-10-10
Javascript isArray 數(shù)組類型檢測(cè)函數(shù)
在日常開發(fā)中,我們經(jīng)常需要判斷某個(gè)對(duì)象是否是數(shù)組類型的,在js中檢測(cè)對(duì)象類型的常見的方法有幾種.2009-10-10
基于JavaScript實(shí)現(xiàn)一定時(shí)間后去執(zhí)行一個(gè)函數(shù)
在實(shí)際需要中可能需要規(guī)定在指定的時(shí)間之后再去執(zhí)行一個(gè)函數(shù)以達(dá)成期望的目的,這也就是一個(gè)定時(shí)器效果,本文給大家介紹基于JavaScript實(shí)現(xiàn)一定時(shí)間后去執(zhí)行一個(gè)函數(shù)的相關(guān)知識(shí),感興趣的朋友一起學(xué)習(xí)吧2015-12-12

