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>

复制代码


  • 2020-04-08 22:46:28

    Element的操作方法

    Element 是一个通用性非常强的基类,所有 Document 对象下的对象都继承自它。这个接口描述了所有相同种类的元素所普遍具有的方法和属性。一些接口继承自 Element 并且增加了一些额外功能的接口描述了具体的行为。例如, HTMLElement 接口是所有 HTML 元素的基本接口,而 SVGElement 接口是所有 SVG 元素的基础。大多数功能是在这个类的更深层级(hierarchy)的接口中被进一步制定的。

  • 2020-04-12 17:42:43

    Node.js设置CORS跨域请求中多域名白名单的方法

    在Node.js中,res的响应头Header中的 Access-Control-Allow-Origin 属性不能匹配除 (*) 以外的正则表达式的,域名之间不能也用逗号分隔。也就是说, Access-Control-Allow-Origin 的属性值只允许设置为单个确定域名字符串或者 (*)。

  • 2020-04-14 09:40:59

    CSS3实现文字描边的2种方法

    首先想到去看CSS3有没有什么属性可以实现,后来被我找到了text-stroke     该属性是一个复合属性,可以设置文字宽度和文字描边颜色      该属性使用很简单:text-stroke:1px #f00;(1px是文字宽度,#ff是文字描边颜色)

  • 2020-04-14 09:42:47

    用 TypeScript 编写 npm 模块

    自从开始使用 Node.js 已经一年多,写的代码越多,越是觉得自己提高的越慢。想来应该有没有将单一功能的代码封装在一个独立模块,而导致代码稍微多一点就维护困难的原因。

  • 2020-04-14 09:46:25

    TypeScript 入门教程

    TypeScript 是 JavaScript 的超集,扩展了 JavaScript 的语法,因此现有的 JavaScript 代码可与 TypeScript 一起工作无需任何修改,TypeScript 通过类型注解提供编译时的静态类型检查。 TypeScript 可处理已有的 JavaScript 代码,并只对其中的 TypeScript 代码进行编译。

  • 2020-04-14 09:51:03

    package.json 字段说明

    package.json 有很多字段,也有很多官方字段,我们需要知道他们的具体是做什么的才能很好的运用