Js動畫(四) ---獲取樣式


先上效果圖:

animation.gif

實際上,就是改變一個div寬度的效果

初步實現過程:

a. 簡單地定義一個div

<body>
<div id="div1"></div>
</body>

b. 定義div的樣式:

 <style>
        #div1 {
            width: 200px;
            height: 200px;
            background: #ff0;
            border: 2px solid #000;
        }
</style>

c. 實現js動畫:

 <script>
        window.onload = function () {
            startMove();
        };
        
        function startMove() {
            /**
             * 定義一個時間函數每30ms減少一次div的寬度
             */
            setInterval(function () {
                //獲取到div對象
                var oDiv = document.getElementById("div1");
                //減少div的寬度
                //注意這里要先用parseInt方法獲取到數值,然后才可以進行減法運算,最后記得加上單位
                oDiv.style.width = parseInt(oDiv.style.width) - 2 + 'px';
            }, 30);
        }
    </script>

這樣我們的初步設計就完成,點擊運行,結果發現,div的寬度并不會改變!!!

因為我們使用obj.style.width方法只能獲取到行內樣式,不能獲取到非行內樣式!

因此,我們修改如下:實際上就是增加了樣內樣式

<body>
<div id="div1" style="width: 200px"></div>
</body>

但這樣的話,我們就無法將html與css分離,這明顯不是一個很好的辦法。
實際上,獲取非行內樣式,我們可以采用另一個方法--- currentStyle(針對IE)和getComputedStyle(針對火狐和谷歌)

修改如下:

 setInterval(function () {
                //獲取到div對象
                var oDiv = document.getElementById("div1");
                //減少div的寬度
                //注意這里要先用parseInt方法獲取到數值,然后才可以進行減法運算,最后記得加上單位
                oDiv.style.width = parseInt(window.getComputedStyle(oDiv, null)['width']) - 2 + 'px';
            }, 30);

但以上只是針對谷歌或狐火,但并不支持IE,因此,我們需要進一步修改。

        /**
         * 封裝一個函數用來獲取樣式
         * @param obj 傳入的元素對象
         * @param attr 傳入要獲取的樣式
         * @returns {*}
         */
        function getStyle(obj, attr) {
            //判斷是否支持currentStyle屬性,若為IE則支持
            if (obj.currentStyle){
                //返回該樣式
                return obj.currentStyle[attr];
            } 
            //若不支持,則使用getComputedStyle方法,使得火狐和谷歌支持
            else {
                return getComputedStyle(obj, null)[attr];
            }
        }

調用方法如下:

//這里調用getStyle函數去獲取到樣式
oDiv.style.width = parseInt(getStyle(oDiv, 'width')) - 2 + 'px';
完整代碼如下:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Get Style</title>
    <style>
        #div1 {
            width: 200px;
            height: 200px;
            background: #ff0;
            border: 2px solid #000;
        }
    </style>
    <script>
        window.onload = function () {
            startMove();
        };

        function startMove() {
            /**
             * 定義一個時間函數每30ms減少一次div的寬度
             */
            setInterval(function () {
                //獲取到div對象
                var oDiv = document.getElementById("div1");
                //減少div的寬度
                //這里調用getStyle函數去獲取到樣式
                oDiv.style.width = parseInt(getStyle(oDiv, 'width')) - 2 + 'px';
            }, 30);
        }
        /**
         * 封裝一個函數用來獲取樣式
         * @param obj 傳入的元素對象
         * @param attr 傳入要獲取的樣式
         * @returns {*}
         */
        function getStyle(obj, attr) {
            //判斷是否支持currentStyle屬性,若為IE則支持
            if (obj.currentStyle){
                //返回該樣式
                return obj.currentStyle[attr];
            }
            //若不支持,則使用getComputedStyle方法,使得火狐和谷歌支持
            else {
                return getComputedStyle(obj, null)[attr];
            }
        }
    </script>

</head>
<body>
<div id="div1"></div>
</body>
</html>
總結:

JS中 obj.style.attr 只能獲取行內樣式
要獲取非行內樣式要通過obj.currentStyle[attr]或者getComputedStyle(obj,false)[attr]方法獲取
其中obj.currentStyle[attr]只支持IE瀏覽器,getComputedStyle(obj,false)[attr]支持火狐和谷歌瀏覽器。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 在前端開發過程中往往需要動態的編輯、修改一個UI的樣式,這必然涉及到style的獲取與設置。一般都說有圖有真相,而...
    天問_專注于大前端技術閱讀 6,523評論 0 6
  • HTML+CSS 1.對WEB標準以及W3C的理解與認識 標簽閉合、標簽小寫、不亂嵌套、提高搜索機器人搜索幾率、使...
    aymincoder閱讀 5,121評論 2 188
  • 本章轉載自新浪博客網友:blog.sina.com.cn/s/blog_7f5571aa0102w2tv.html...
    czboy閱讀 1,476評論 0 11
  • w一:rem布局公式 document.documentElement.style.fontSize=20*doc...
    stars甜閱讀 800評論 0 1
  • JavaScript 將字符串轉換為數字 parseInt() ◆只保留數字的整數部分,不會進行四舍五入運算。 ...
    AkaTBS閱讀 1,001評論 0 9