scroll系列屬性與緩沖動畫封裝

1. scroll系列

  • scrollHeight和scrollWidth 對象內(nèi)部實際內(nèi)容的高度/寬度

  • scrollTop和scrollLeft
    被卷去部分的 頂部/左側(cè) 到可視區(qū)域 頂部/左側(cè) 的距離

2.獲取滾動坐標(biāo)

頁面滾動座標(biāo)非常常用,但是有很大的兼容性問題,可以合寫為:

    var scrollTop = window.pageYOffset || 
                    document.documentElement.scrollTop || 
                    document.body.scrollTop || 0;

兼容性分析:

//<!DOCTYPE html> document type definition 文檔類型聲明   
        //CSS1Compat 標(biāo)準(zhǔn)模式  
//<!DOCTYPE xhtml> document type definition 文檔類型聲明
        //BackCompat怪異模式
 console.log(document.compatMode);
window.onscroll = function () {
    var scrollTop = window.pageYOffset || 
                    document.documentElement.scrollTop || 
                    document.body.scrollTop || 0;
                    
    //var scrollTop = window.pageYOffset;
    //標(biāo)準(zhǔn)模式 chrome可以 FF可以 IE可以 IE678不行
    //怪異模式 chrome可以 FF可以 IE可以 IE678不行
    //var scrollTop = document.documentElement.scrollTop;
    //標(biāo)準(zhǔn)模式 chrome不行 FF可以 IE可以 IE678可以
    //怪異模式 chrome不行 FF不行 IE可以 IE678可以
    //var scrollTop = document.body.scrollTop;
    //標(biāo)準(zhǔn)模式 chrome可以 FF不行 IE不行 IE678不行
    //怪異模式 chrome可以 FF可以 IE可以 IE678不行
    document.title = scrollTop;
};

封裝自己的scroll.js

源碼:

function scroll() {
    return {
        top: window.pageYOffset || 
            document.documentElement.scrollTop ||
            document.body.scrollTop || 0,
        left: window.pageXOffset ||
              document.documentElement.scrollLeft ||
              document.body.scrollLeft || 0
    };
}

3.緩動動畫

(1).原理公式

leader = leader + step

(2)勻速動畫公式

step = 定值
leader = leader + step

(3)緩動動畫公式

step = ( target - leader ) / 10
leader = leader + step

緩動動畫的好處:

1.他的移動是有盡頭的。不像基礎(chǔ)勻速運動那樣無限移動。

2.有非常逼真的緩動效果,實現(xiàn)的動畫效果更細膩。

3.如果不清除定時器,物體永遠跟著目標(biāo)leader在移動。

(4).緩動函數(shù)封裝

// 讓 任意對象 移動到 指定位置
function animate(obj, target) {
    clearInterval(obj.timer);
    obj.timer = setInterval(function () {
        var leader = obj.offsetLeft;
        var step = (target - leader) / 10;
        step = step > 0 ? Math.ceil(step) : Math.floor(step);
        leader = leader + step;
        obj.style.left = leader + "px";
        if (leader === target) {
            clearInterval(obj.timer);
        }
    }, 15);
}

4.獲取計算后樣式的方法

//獲取 任意對象 的 任意屬性
function getStyle(obj, attr) {
    if (window.getComputedStyle) {
        //W3C規(guī)范寫法
        return window.getComputedStyle(obj, null)[attr];
    } else {
        //IE兼容寫法
        return obj.currentStyle[attr];
    }
}

5.可支持透明度和層級的動畫函數(shù)(可以使用回調(diào)函數(shù))

//把 任意對象 的 任意數(shù)值屬性 改變?yōu)?任意的目標(biāo)值
function animate(obj, json, fn) {
    clearInterval(obj.timer);
    obj.timer = setInterval(function () {
        var flag = true;
        for (var k in json) {
            if (k === "opacity") {//opacity要特殊處理
                //opacity沒有單位 參與運算自動轉(zhuǎn)換成數(shù)值 所以不用parsetInt
                //取值范圍 0-1 0.1 0.33 33 為了讓以前的計算公式生效 要擴大100倍
                var leader = getStyle(obj, k) * 100;
                var target = json[k] * 100;
                var step = (target - leader) / 10;
                step = step > 0 ? Math.ceil(step) : Math.floor(step);
                leader = leader + step;
                obj.style[k] = leader / 100;//opacity沒有單位
            } else if (k === "zIndex") {
                obj.style.zIndex = json[k];//層級不需要漸變 直接設(shè)置即可
            } else {
                var leader = parseInt(getStyle(obj, k)) || 0;
                var target = json[k];
                var step = (target - leader) / 10;
                step = step > 0 ? Math.ceil(step) : Math.floor(step);
                leader = leader + step;
                obj.style[k] = leader + "px";
            }
            if (leader != target) {
                flag = false;
            }
        }
        if (flag) {
            clearInterval(obj.timer);
            if (fn) {
                fn();
            }
        }
    }, 15);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,214評論 4 61
  • 今天是雙井店試營業(yè)第一天。本以為已經(jīng)安排很好,還是出現(xiàn)了很多意料之外的問題。 今天每個人都很忙碌,忙碌到不知道自己...
    羅召偉閱讀 318評論 2 4
  • 此文獻給我可愛的同修們,祝賀你們在16年10月和我一起在劉穎老師和白醫(yī)生的帶領(lǐng)下,完成的正念減壓八周課程的...
    守護天使Amy閱讀 1,164評論 1 14
  • 從事游泳教學(xué)將近9年了,對學(xué)員提出的各種問題開始慢慢有了一些感悟。那我們就開始談?wù)勈裁词菚斡?,?biāo)準(zhǔn)是什么? 游泳...
    得到一直在路上閱讀 4,183評論 2 7

友情鏈接更多精彩內(nèi)容