• 封装缓动动画2


    动态设置元素属性

    在前面一篇,我们实现了简单的运动共用,无论向左还是向右运动,改变的都是元素距离左边框的距离,如果我们想要元素向上移动,或者改变元素的宽度、高度,前面的方法变不再适用了。

    前面我们通过传入值,并将值赋给offsetLeft属性,就可以改变元素的位置,实现动画效果。如果我们要元素上下移动,就需要改变元素的offsetTop或者定位的top值;大小改变就要改变元素的宽度或者高度。

    在之前,我们改变元素的属性时,常用的方法是通过style访问并改变某属性,但是,如果我们希望向前面一样对方法函数进行封装,那么这个方法就不适用了。

    例1:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title></title>
        <style>
            *{
                margin: 0;
                padding: 0;
            }
    
            #box{
                width: 150px;
                height: 150px;
                background-color: red;
            }
        </style>
    </head>
    <body>
       <button id="btn1">改变颜色</button>
       <button id="btn2">改变长度</button>
       <div id="box"></div>
    <script>
        var btn1 = document.getElementById("btn1");
        var btn2 = document.getElementById("btn2");
        var box = document.getElementById("box");
        btn1.onclick = function () {
            box.style.backgroundColor = 'green';
            console.log(document.getElementById("box").style.backgroundColor);
        };
    
        btn2.onclick = function () {
            changeCssStyle(box, "width", "500px");
            console.log(document.getElementById("box").style.width);
        };
    
        function changeCssStyle(obj, attr, value) {
            obj.style.attr = value;
           
        }
    </script>
    </body>
    </html>

      

    我们可以发现,当我们点击改变颜色的时候,通过style访问元素属性,并重新为属性赋值,就实现了颜色的改变;但是当点击改变长度的时候,并未发现长度有发生变化,并且打印的结果也为空,这是因为在用js访问css属性的时候,style能够直接访问元素属性并为其赋值,但跟在style后面的属性不能由外面传入,即后面一种方式是无效的。此时我们就需要用到下面的这种方式了。

    例2:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title></title>
        <style>
            *{
                margin: 0;
                padding: 0;
            }
    
            #box{
                width: 150px;
                height: 150px;
                background-color: red;
            }
        </style>
    </head>
    <body>
       <button id="btn1">改变颜色</button>
       <button id="btn2">改变长度</button>
       <div id="box"></div>
    <script>
        var btn1 = document.getElementById("btn1");
        var btn2 = document.getElementById("btn2");
        var box = document.getElementById("box");
        btn1.onclick = function () {
            // box.style.backgroundColor = 'green';
            changeCssStyle(box, "backgroundColor", "green");
        };
    
        btn2.onclick = function () {
            // box.style.width = '500px';
            changeCssStyle(box, "width", "500px");
        };
    
        function changeCssStyle(obj, attr, value) {
            obj.style[attr] = value;
            console.log(obj.style[attr]);
        }
    </script>
    </body>
    </html>

    我们只需要利用[]访问属性,就可以动态的访问和改变我们想要改变的元素属性了。

    动态获取css样式

     在上面的例2中,我们最后之所以能够通过style访问到元素的宽度和背景色,是因为这两个属性是通过动态设置成行内样式的。

    如果我们想要获取的不是行内样式,而是页内样式或者外部样式,这种方法就不适用了。

    例3:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title></title>
        <style>
            *{
                margin: 0;
                padding: 0;
            }
    
            #box{
                width: 150px;
                height: 150px;
                background-color: red;
            }
        </style>
    </head>
    <body>
       <button id="btn1">改变颜色</button>
       <button id="btn2">改变长度</button>
       <div id="box"></div>
    <script>
        var btn1 = document.getElementById("btn1");
        var btn2 = document.getElementById("btn2");
        var box = document.getElementById("box");
        btn1.onclick = function () {
           console.log(document.getElementById("box").style.height);
           console.log(document.getElementById("box").style.width);
           console.log(document.getElementById("box").style.backgroundColor);
        };
    </script>
    </body>
    </html>

    此时,我们可以采用window.getComputedStyle("元素","伪类")的方法来获取非行内样式,该方法接收两个参数,当元素伪类不存在时,可以用null代替,当然,这只是标准写法,还需要兼容其他浏览器,具体如下:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title></title>
        <style>
            #box{
                width: 200px;
                height: 200px;
                background-color: red;
                border: 5px solid #000;
            }
        </style>
    </head>
    <body>
        <div id="box"></div>
        <button id="btn">获取属性值</button>
    <script>
        var box = document.getElementById("box");
        var btn = document.getElementById("btn");
    
        btn.onclick = function () {
            console.log(getStyleAttr(box, "width"));
            console.log(getStyleAttr(box, "height"));
            console.log(getStyleAttr(box, "border"));
        };
    
        function getStyleAttr(obj, attr) {
            if(obj.currentStyle){
                return obj.currentStyle[attr];
            }else {
                return window.getComputedStyle(obj, null)[attr];
            }
        }
    </script>
    </body>
    </html>

    好了,现在我们既可以动态设置元素属性,也可以动态获取非行内样式的属性值了,接下来就可以再次尝试封装缓动动画了。

  • 相关阅读:
    CSS3 页面跳转的动画效果
    JS/React 判断对象是否为空对象
    React 根据官方总结的规范
    ckeditor字数限制
    swfobject.js IE兼容问题
    Jcrop 做图片剪裁 在IE中无法显示问题解决办法
    WebApp 中用 hashchange 做路由解析
    全国省市区Json文件 ,做省市区联动很轻松
    解决用友U8删除用户时提示“用户已启用”不能删除的问题
    CFUpdate高速模式下出现Error #2038提示的解决方案
  • 原文地址:https://www.cnblogs.com/yuyujuan/p/9683437.html
Copyright © 2020-2023  润新知