1. 程式人生 > 其它 >js動畫函式實現側邊欄動態顯示內容

js動畫函式實現側邊欄動態顯示內容

技術標籤:前端jsjavascriptcss

功能概要
  1. 滑鼠懸浮側邊欄 彈出資料框 同時指示圖示進行變化
  2. 效果圖
    效果圖
實現原理
  1. 實現過程有兩部分組成:顯示箭頭,以及顯示內容盒子
  2. 通過滑鼠懸浮以及離開註冊監聽事件,監聽事件中呼叫動畫函式
  3. 動畫函式事件步驟:
    1. 通過設定定時器setInterval不斷改變顯示內容盒子的e.style.left位置
    2. 並通過移動目標位置與當前內容盒子左偏移offsetLeft來控制移動步數,實現緩動動畫
    3. 結束條件:內容盒子左偏移等於目標位置
    4. 設定回撥函式在結束定時器時設定顯示箭頭方向
注意點
  1. 移動步數需要考慮在前進/後退時,選取的取整函式不一樣
  2. 在chrome中進行測試的時候,內容盒子的offsetLeft一直處於不變狀態,也即出現了obj.offsetLeft - 1一直等於 obj.offsetLeft,進行bug除錯還沒有找出問題,但是在火狐等其他瀏覽器都是Ok的。還是挺懵的,如果有人明白為什麼出現這種情況,還望指教!
程式碼實現

html

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>practice1</title>
    <link href="../css/practive1.css" rel="stylesheet"/>
    <script src="../js/animate.js"></script>
    <script type="text/javascript" src="../js/practice1.js"></script>
</head>

<body>
<div class="sidderbar">
    <span>⬅</span>
    <div class="con">展示出來</div>
</div>
</body>

</html>

css


.sidderbar {
    position: fixed;
    top: 100px;
    right: 0;
    width: 40px;
    height: 40px;
    text-align: center;
    line-height: 40px;
    background-color: #fff;
}

.con {
    position: absolute;
    left: 0;
    top: 0;
    width: 200px;
    height: 40px;
    line-height: 40px;
    background-color: #84c170;
    z-index: -9;
}

animate.js

/**
 * 動畫封裝
 * @param obj 移動物件
 * @param target 移動目標位置
 * @param timeout 每次移動間隔
 */
function animate(obj, target, timeout,callback) {
    // 清空已有的定時器
    clearInterval(obj.timer);
    // 為每個物件開闢一個定時器
    obj.timer = setInterval(function () {
        // 移動步長
        var step = (target - obj.offsetLeft) / 10;
        // 判斷是否為前進還是後退
        step = step > 0? Math.ceil(step): Math.floor(step);
        console.log('step = ' + step);
        if (obj.offsetLeft == target) {
            clearInterval(obj.timer);
            // 改變狀態
           if (callback) {
               callback();
           }
        }
        obj.style.left = obj.offsetLeft + step + 'px';
    },timeout)
}

practice.js

window.addEventListener('pageshow',function () {
    var sidderbar = document.querySelector('.sidderbar');
    var con = document.querySelector('.con');

    sidderbar.addEventListener('mouseenter',function () {
        // 向左移動 con 盒子寬度減去 父盒子sibberbar寬度 其中left絕對於父盒子的距離
        animate(con,sidderbar.offsetWidth - con.offsetWidth  ,15,function () {
                sidderbar.children[0].innerHTML = '➡';
        });
    })

    sidderbar.addEventListener('mouseleave',function () {
        animate(con,0,15,function () {
            sidderbar.children[0].innerHTML = '⬅';
        });
    })

})