樓梯導航

樓梯導航

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>樓梯導航</title>
    <style type="text/css">
        *{margin: 0;padding: 0;}
        body, html{height: 100%;}
        ul{list-style: none;height: 100%;}
        ul li{height: 100%;}
        ol{list-style: none;position: fixed;top:0;left: 500px;}
        ol li{float:left;width: 50px;height: 50px;border: 1px solid #000;text-align: center;
            line-height: 50px;margin-top: -1px;cursor: pointer;}
    </style>
</head>
<body>
<ul>
    <li>第一區域</li>
    <li>第二區域</li>
    <li>第三區域</li>
    <li>第四區域</li>
</ul>
<ol>
    <li>1</li>
    <li>2</li>
    <li>3</li>
    <li>4</li>
</ol>
<script>
// 點擊ol的li,屏幕滑動到對應的ul的li
// 利用window.scrollTo();緩動動畫實現
var ul = document.getElementsByTagName("ul")[0];
var ol = document.getElementsByTagName("ol")[0];
var ulLiArr = ul.children;
var olLiArr = ol.children;
var target = 0;//目標索引
var leader = 0;//目標元素top到瀏覽器頂部距離
var timer = null;
// 1. 指定ul和ol中li的背景色,對應li的背景色相同
var arrColor = ["green","orange","yellow","red","gold"];
// 利用for循環給兩個數組中的元素上色
for(var i=0; i<arrColor.length; i++){
    ulLiArr[i].style.backgroundColor = arrColor[i];
    olLiArr[i].style.backgroundColor = arrColor[i];
    // 屬性綁定索引值
    olLiArr[i].index = i;
    // 循環綁定,爲每一個li綁定點擊事件
    olLiArr[i].onclick =function(){
    // 獲取目標位置
        target = ulLiArr[this.index].offsetTop;
        console.log("目標位置偏移target:"+target);
        clearInterval(timer);
        // 利用緩動動畫原理實現屏幕滑動
        timer = setInterval(function(){
            // (1).獲取步長
            var step = (target-leader)/10;
            console.log("步長step:"+step);
            // (2).二次處理步長
            step = step > 0 ? Math.ceil(step) : Math.floor(step);
            console.log("二次步長step:"+step);
            // (3).屏幕滑動
            leader = leader + step;
            console.log("到頂部距離leader="+leader);
            window.scrollTo(0, leader);
            // (4).清除定時器
            if(Math.abs(target-leader) <= Math.abs(step)){
                window.scrollTo(0, target);
                clearInterval(timer);
            }
        }, 25);
    };
    // 用scroll事件模擬盒子距離最頂端的距離
    window.onscroll = function(){
    // 每次屏幕滑動,把屏幕捲去的值賦給leader,模擬獲取顯示區域距離頂部的距離
        leader = scroll().top;
        console.log("區域到頂部距離leader:"+leader);
    }
}
function scroll() {
    // 開始封裝自己的scrollTop
    if(window.pageYOffset !== undefined) {
        // ie9+ 高版本瀏覽器
        // 因爲 window.pageYOffset 默認的是0,所以需要判斷
        return {
            left: window.pageXOffset,
            top: window.pageYOffset
        }
    }
    else if(document.compatMode === "CSS1Compat") {
        // 標準瀏覽器,來判斷有沒有聲明DTD
        return {
            left: document.documentElement.scrollLeft,
            top: document.documentElement.scrollTop
        }
    }
    return {
        // 未聲明 DTD
        left: document.body.scrollLeft,
        top: document.body.scrollTop
    }
}
</script>
</body>
</html>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章