js offsetWidth的坑

offsetWidth 在官方文档解释就是:实际的width+borderWidth+padding+scrollbar
最近在做项目,发现了一个offsetWidth的坑;
用一个简单功能展示一下这个坑:一个div不匀速的变宽
正常情况:没有边距的div,只有width

<head>
        <meta charset="utf-8" />
        <title></title>
        <style>
            div{
                height: 100px;
                width: 100px;
                background-color: red;
            }
        </style>
    </head>
    <body>
        <div id="div1"></div>
    </body>
    <script>
        window.onload=function(){
            var div1 = document.getElementById("div1");
            setInterval(function(){
                div1.style.width = div1.offsetWidth -1 + "px";
            },30);
        }
    </script>

以上代码是正常情况,能1px的减小到div消失
但是如果我给div加上border,并且在该div下打印出宽度
页面运行效果竟然是变宽了,原本宽度只有100px;
看下图就能看出运行结果


image.png

这个貌似就是offsetWidth的一个bug,没有什么实际的解决办法,只能换一种方式
注意:width值不能使用style.width的方式,style.width只能用来赋值,这样方式只能获取到行间样式,以上div的样式是内部样式,是拿不到的
后面改成使用currentStyle ,用getComputedStyle适配火狐,封住成一个公共方法:
obj:元素对象,如 document.getElementById("div1")
attr:获得的属性,如width

function getStyle(obj, attr)
{
    if(obj.currentStyle)
    {
        return obj.currentStyle[attr];
    }
    else
    {
        return getComputedStyle(obj, false)[attr];
    }
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 14,697评论 1 92
  • DOM总结 1:DOM - document object model 文档对象模型 作用:给我们提供了一些方法...
    盒小饭stone阅读 3,848评论 0 0
  • 1.行级元素有哪些?块级元素有哪些?行级元素如何转换成块级元素? block元素的特点: 1.总在新行开始,2.高...
    我的天气很好啦阅读 5,396评论 2 9
  • w一:rem布局公式 document.documentElement.style.fontSize=20*doc...
    stars甜阅读 4,172评论 0 1
  • 前言 CSSOM全称CSS对象模型,涉及两部分内容,第一部分和操作样式表相关,第二部分和元素尺寸相关,本文介绍第二...
    江枫阅读 8,130评论 1 10

友情链接更多精彩内容