提示:document.documentElement 和 document.getElementsByTagName('html')[0] 是一样的;

1、视口大小(不包括滚动条,视口字面理解当然是不包括滚动条),

document.documentElement.clientWidth

document.documentElement.clientHeight

即使给 html 元素显示设置了宽高,返回的值也仍然是视口的尺寸,这是非常特殊的,跟普通 ele.clientWidth 含义不同。

通常情况下,ele.clientWidth 指的是 ele,作为包含块,给于内部元素的一个视口,ele 的尺寸和 clienWidth 是相关的,详情戳clientWidth

按照这个逻辑,我们应该计算 html 的包含块,也就是初始包含块的 clientWidth,但是似乎没有接触初始包含块的接口,仅仅知道,在桌面端,他的尺寸和视口一致;

所以当我们设置

   html {
height: 100%;
width: 100%;
}

其实,是将 html 的宽高设置为初始包含块的宽高,等于视口的宽高。

关于 body 的这个属性,如果消除了默认的 margin ,则和上方是相等的:

document.body.clientWidth

document.body.clientHeight

但是如果给 body 显示设置了宽高,返回的就不一定是视口的宽高了,这是普通元素的特性。

另外,浏览器窗口大小(浏览器窗口,自然是包括滚动条的):

window.innerWidth

window.innerHeight

屏幕大小(设备像素,不常用,其实就是分辨率),即使浏览器缩小了,这个值也不会变,是屏幕。

screen.width

screen.height

2、文档大小(包含了超出文档的溢出部分)

document.documentElement.scrollHeight

document.documentElement.scrollWidth

文档大小(不包含超出文档的溢出部分,如果 overflow:hidden,那么和上面的是一致的,但这个属性耗性能)

document.documentElement.offsetHeight

document.documentElement.offsetWidth

3、文档滚动的大小

兼容移动端需要用:

window.pageXOffset

window.pageYOffset

别名 scrollX / scrollY ,IE 不兼容别名,兼容 pageXOffset / pageYOffset,但是 IE9 之前的两个都不兼容;

另一种常用的写法:

document.documentElement.scrollTop;

document.documentElement.scrollLeft;

可写可读,缺点是不兼容移动端;

4、元素相对于视口的位置

ele.getBoundingClientRect(); //包含4 个属性:left、top、right 和bottom

5、元素的大小(border-box,不包含溢出部分,包括溢出的用 )

ele.offsetWidth;

ele.offsetHeight;

元素的大小(border-box 包括溢出的部分,如果溢出隐藏,和上面值一致 )

ele.scrollWidth;

ele.scrollHeight;

6、元素滚动的大小,(应该是相对于包含块) 可写(当然包含块要处于溢出状态才行)

ele.scrollTop;

ele.scrollLeft;

  html.scrollTop 相对于初始包含块,所以上文 html.scrollTop 计算文档相对于视口的偏移就是这个道理

7、元素相对于文档的位置(貌似没有原生的 API,推算就是,相对于视口的偏移 + 文档相当于视口的滚动)

ele.getBoundingClientRect().top+document.documentElement.scrollTop;

ele.getBoundingClientRect().left+document.documentElement.scrollLeft;

8、计算滚动条的宽度

function getScrollbarWidth() {
var para = document.createElement('p'),
styles = {
width: '100px',
height: '100px',
overflowY: 'scroll'
},
i, scrollbarWidth;
for (i in styles) { para.style[i] = styles[i]; };
document.body.appendChild(para);
scrollbarWidth = para.offsetWidth - para.clientWidth;
document.body.removeChild(para);
return scrollbarWidth;
}

参考资料:

JavaScript高级程序设计-第3版-中

https://yq.aliyun.com/ziliao/52315

js 常用 DOM 元素宽高的更多相关文章

  1. js获取隐藏元素宽高的方法

    网上有一些js获取隐藏元素宽高的方法,但是可能会存在某些情况获取不了. 例如: <!DOCTYPE html> <html lang="en"> <h ...

  2. Vue动态设置Dom元素宽高

    需求: slider侧边栏是宽度是动态的,使用jquery可以操作dom元素,设置宽高,但vue是避免操作dom的 <template> <div class="slide ...

  3. 原生JS获取元素宽高实践详解

    开篇的话 任何不是亲身实践中求得的知识,都不是属于你的.任何求得的知识不去时常温习运用,也不是属于你的. 记录由来 在做个上拉广告功能中遇到了一个"理所当然"觉得对的用法,慢慢才排 ...

  4. js获取精确的元素宽高(普通获取高度会有误差)

    当js获取元素宽高时, 并不是一个精确的数字,如果想获取真正的宽高大致方法如下 var oStyle = obj.currentStyle ? obj.currentStyle : window.ge ...

  5. CSS子元素居中(父元素宽高已知,子元素未知)

    <style> .container{width:400px; height:400px; position:relative;} .center{position:absolute; l ...

  6. JS获取图片实际宽高及根据图片大小进行自适应

    JS获取图片实际宽高,以及根据图片大小进行自适应  <img src="http://xxx.jpg" id="imgs" onload="ad ...

  7. JS1 js获取dom元素方法

     js获取dom元素方法  1.通过ID选取元素(getElementById) 1)使用方法:document.getElementById("domId")         其 ...

  8. JS获取图片实际宽高

    JS获取图片实际宽高,以及根据图片大小进行自适应 <img src="http://xxx.jpg" id="imgs" onload="ada ...

  9. 关于Echarts的原生js获取DOM元素与动态加载DOM元素的冲突问题

    1.前言: 最近在做的看板项目,因为需要循环加载后台数据,并且用Echarts做数据呈现,所以jQuery和angular等库统统靠边站,Echarts用的是原生js获取DOM元素,至于诸多不兼容等深 ...

随机推荐

  1. JavaScript身份证正则表达式,querySelector通过name获取元素,php正则表达式

    var preg_sfz1 = /^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3 ...

  2. 详解php的安装模式---CGI,FASTCGI,php-fpm,mod_php,mod_cgi,mod_fcgid

    1. CGI CGI是通用网关接口,HTTP服务器使用这样的接口程序来和“其他程序”(比如PHP的解释器程序)通讯,这个“其他程序”可以使用任何计算机语言来编写,它通过CGI这个接口从HTTP服务器取 ...

  3. 多国语言解决方案gnu.gettext + poedit

    1.工具简介 1.1.关于i18n i18n其来源是英文单词 internationalization的首末字符i和n,18为中间的字符数是“国际化”的简称. i10n为资源本地化,全称为Locali ...

  4. 响应式布局框架 Pure-CSS 5.0 示例中文版-下

    10. 表格 Tables 在 table 标签增加 .pure-table 类 <table class="pure-table"> <thead> &l ...

  5. wget镜像网站并且下载到指定目录 2012-06-20 19:40:56

    wget镜像网站并且下载到指定目录 2012-06-20 19:40:56 分类: Python/Ruby wget -r -p -np -k -P /tmp/ap http://www.exampl ...

  6. iOS应用代码段瘦身办法

    iOS应用代码段瘦身办法 大型app应对苹果官方代码段大小限制的小伎俩… 背景 苹果官方文档 对二进制 __TEXT 段大小有限制: 代码实在瘦不下去怎么办? 解决方案 利用 rename_secti ...

  7. 介绍CppShell

    写在前面 bajdcc/CppShell 最近心血来潮又造了个轮子,其实启发我的是bajdcc/jMiniLang中的管道思想,java运行着太慢,因而用C艹实现一把. 如题图所示,使用非常非常简单. ...

  8. eclipse中tomcat配置JNDI链接Oracle数据源例子

    最近换到新公司,第一次接触JNDI方式连接数据库. 一开始怎么找也没找到数据库地址在哪里配置的,后面跟代码发现spring中初始化dataSource是通过这个类JndiObjectFactoryBe ...

  9. 学习PHP垃圾回收机制了解引用计数器的概念

    php变量存在一个叫"zval"的变量容器中,"zval"变量容器包括含变量的类型和值,还包括额外的两个字节信息,分别是“is_ref”表示变量是否属于引用,“ ...

  10. Java反射机制的基本概念与使用

    本篇文章分为以下几个部分: 1.认识反射 2.反射的源头(Class类) 3.利用反射操作构造方法 4.利用反射调用类中的方法 5.反射中的invoke方法 6.利用反射调用类中的属性 反射在我们普通 ...