offsetWidth padding 真实宽度

2020-05-07 13:24:29

为什么我获取到的aDiv.style.width的值为空

style.xxx这个要求写的是行内样式,比如<div style="xx"/>,你可以用offsetWidth


但是offsetWidth的宽度是加上padding和border的,哎,这样我们在世纪应用中一定要去除。


如果要得到真实的width,我们可以先使用getComputedStyle 

如果能获得width证明没有问题,如果获得不了,我们就用offsetWidth减去padding和border,这个我们可以进行封装一下。

具体如何获取 DOM 元素的绝对位置实例详解

参看下面的地址 JS中获取 DOM 元素的绝对位置实例详解


offsetWidth是什么?

答:它可以获取物体宽度的数值

 

那么就只是这样吗!

html部分

<div id="div1"></div>
 
<style>
#div1 { width:200px; height:200px; border:1px solid red; padding:2px; margin:2px; background:green;}
</style>

 

请看上面的html,你知道div1的offsetWidth是多少吗?

是不是200啊

 

哈哈,错了

div1的offsetWidth是206

 

为什么?

答:offsetWidth实际获取的是盒模型(width+border + padding)

200+2+4=206

 

扩展:那么offsetLeft和offsetTop呢

答: offsetLeft = left + marginLeft

     offsetTop = top +marginTop

 

 

示例:让div变窄

现象:onmouseover时,div变窄

 

原理:

oDiv.style.width = oDiv.offsetWidth - 1 + "px";  

 

js部分

 

复制代码

<script>window.onload = function(){    var oDiv = document.getElementById("div1");
    
    oDiv.onmouseover = function(){
        document.title = oDiv.offsetWidth;
        setInterval(function(){
            oDiv.style.width = oDiv.offsetWidth - 1 + "px";            
        },30);
    }
    
}
</script>

复制代码

 

运行上面示例后,你会发现一个奇怪的现象:

div在变宽

 

我们不是要div变窄的吗!它怎么越来越宽了呢?

 

那么这个问题,怎么解决呢?

 

解决方式:

用oDiv.style.width = parseInt(oDiv.style.width) - 1 + "px";

 

但是发现,onmouseover时,div它不动呢?

原因:oDiv.style.width,它只能获取行间的样式

 

所以需要调整成

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

 

其实,我们还可以写成一个通用的方法,可以获取任意一个样式

方法:function getStyle(obj,name)

注意:此时样式可以不是行间样式,也能获取

 

知识点:

IE写法:currentStyle

非IE写法: getComputedStyle

 

完整代码,如下

1
2
3
4
5
<div id="div1"></div>
 
<style>
#div1 { width:200px; height:200px; border:1px solid red; padding:2px; margin:2px; background:green;}
</style>

  

复制代码

<script>window.onload = function(){    var oDiv = document.getElementById("div1");
    
    oDiv.onmouseover = function(){
        document.title = oDiv.offsetWidth;
        setInterval(function(){            //oDiv.style.width = oDiv.offsetWidth - 1 + "px";            //oDiv.style.width = parseInt(oDiv.style.width) - 1 + "px";    
            oDiv.style.width = parseInt(getStyle(oDiv,"width"))- 1 + "px";    
        },30);
    }
    
}//获取行间任意样式function getStyle(obj,name){    
    if(obj.currentStyle){    //IE
        return obj.currentStyle[name];
    } else {        return getComputedStyle(obj,false)[name];    //非IE    }
    
    
}</script>

复制代码


  • 2018-10-27 16:36:09

    关于 android 中 postDelayed方法的讲解

    当然,你也可以做一个闹钟提醒延时的函数试试,比如,先用MediaPlayer播放闹钟声音, 如果不想起,被停止播放之后,下次就5分钟后再播放,再被停止的话,下次就4分钟后播放,

  • 2018-10-27 17:24:45

    使用localstorage和预加载做到webview秒开

    提到网页加载速度优化,大家都会想到静态资源上CDN,CSS和JS文件合并,图片合并成雪碧图等常用手段;但是在某些特殊情况下这些常用方法也无法达到理想的效果。比如,在国际化场景下,很多国家还停留在2G网络阶段,无论如何优化,都无法避免过慢的网络请求。最近一直在做国际化(主要是印尼和泰国)背景下的webview性能优化,也算有一些经验。由于我们的产品是面向android用户的,而android手机对H5支持很好,因此我们主要是应用H5的新特性。

  • 2018-10-28 10:50:26

    VectorDrawable简单介绍

    在项目中使用矢量图至少可以缩小我们apk包的尺寸,而且可以在屏幕适配时提供很大的方便,因为矢量图是分辨率无关的。

  • 2018-10-28 11:14:29

    矢量资源工具Vector_Asset_Studio

    Android Studio有一个称为“Vector Asset Studio”的工具, 它可以将SVG文件和PSD文件转化为工程可用的矢量可绘制资源(vector drawable resources),

  • 2018-10-28 11:16:09

    Android vector标签 PathData 画图超详解

    SVG是一种矢量图格式,是Scalable Vector Graphics三个单词的首字母缩写。在xml文件中的标签是<vector>,画出的图形可以像一般的图片资源使用,例子如下

  • 2018-10-30 00:16:41

    android ToolBar 设置颜色

    app:popupTheme——有时候我们有需求:ActionBar文字是白的,ActionBar Overflow弹出的是白底黑字让ActionBar文字是白的,那么对应的theme肯定是Dark。可是让ActionBar弹出的是白底黑字,那么需要Light主题。这时候popupTheme就派上用场了。android:theme 与app:theme——在AppCompat v21里,提供了一个快速方便的方法设置Toolbar的主题,使用app:theme。而新版本22.1.x中,AppCompat 允许对 Toolbar 使用 android:theme代替 app:theme。最好的一点是:它会自动继承父视图的theme ,并且兼容所有APIv11以上的设备。