JavaScript位置:window&client&offset&scroll&MouseEvent&getBoundingClientRect&计算任意元素滚动条宽度
Window:
window.innerWidth:浏览器viewport视口宽,包括垂直滚动条
window.innerHeight:浏览器视口高,包括水平滚动条
window.outerWidth: 获取浏览器窗口外部的宽度。表示整个浏览器窗口的宽度,包括侧边栏(如果存在)、窗口镶边(window chrome)和调正窗口大小的边框
window.outerHeight:获取整个浏览器窗口的高度(单位:像素),包括侧边栏(如果存在)、窗口镶边(window chrome)和窗口调正边框(window resizing borders/handles)
client:
clientWidth:
对于body元素:滚动条在margin之外。clientWidth = content + padding

对于非body元素:滚动条在padding之内。
如果滚动条不存在,则clientWidth = content+padding
如果有滚动条。
假设元素右边有垂直滚动条。
如果paddingRight>=滚动条宽度,滚动条默认在padding中,则clientWidth包括滚动条(但因为在padding里所以不必额外计算),clentWidth = content+padding
如果paddingRight< 滚动条宽度,滚动条会挤占content空间,此时clientWidth不包括滚动条,clientWidth = content + padding - scrollWidth
综上,clientWidth到底包不包括滚动条,取决于padding和滚动条的大小关系,在默认情况下,如果paddingRight >=滚动条宽度就包括;小于就不包括,就要减去滚动条宽度
场景1:不存在滚动条,padding-right为100时,clientWidth = content + padding


场景2:存在滚动条,但padding为0时,clientWidth = content + padding - scrollWidth


场景3:存在滚动条,但padding小于滚动条宽度时,clientWidth = content + padding - scrollWidth


clientHeight:
类比同上。
clientLeft/clientTop:
元素的左border宽度,当文字方向为右至左且出现滚动条时(direction: rtl),需要加上滚动条宽度
clientLeft = border Width + scrollbar Width(对于行内元素这个值为0)
clientTop = borderTop
计算元素滚动条宽度:
- 对于非body元素,滚动条默认占padding的空间, 当padding没有设置或者已经设置但是宽度小于滚动条, 那么多余的宽度就会挤占content宽度
- 对于body元素,chrome的body缺省margin值是8px,浏览器滚动条处于body元素的margin之外
- elem.offsetWidth - elem.borderLeftWidth - elem.borderRightWidth - elem.clientWidth
export default class myUtils {
// 计算元素滚动条宽度(默认clientWidth包括滚动条的情况)
static getScrollWidth(elemOrSelect) {
if (!elemOrSelect) return;
if (elemOrSelect.constructor === String)
elemOrSelect = document.querySelector(elemOrSelect);
//参数为html或body时
if (/BODY|HTML/.test(elemOrSelect.nodeName)) {
elemOrSelect.style.margin = 0;
return window.innerWidth - elemOrSelect.clientWidth;
}
//兼容IE
var style = elemOrSelect.currentStyle ? elemOrSelect.currentStyle : getComputedStyle(elemOrSelect).style;
//获取某个元素滚动条宽度
var width =
elemOrSelect.offsetWidth
- Math.ceil(parseFloat(style.borderLeftWidth))
- Math.ceil(parseFloat(style.borderRightWidth))
- elemOrSelect.clientWidth;
return width;
}
}
offsetWidth/offsetHeight/offsetLeft/offsetTop:
offsetWidth/Height:
offsetWidth/offsetHeight: content + padding + border,包含滚动条,但滚动条包含在元素padding中,所以不参与计算
offsetParent/offsetTop/offsetWidth:
基于offsetParent确定距离,当祖先元素有定位属性时,offsetParent为最近的定位祖先元素,当offsetParent没有定位时,offsetParent为body。
当offsetParent为body时,offsetTop = margin + border + clientParentTop
当offsetParent存在且不为body时,offsetTop为相对于定位祖先元素(offsetParent)顶端的距离
screen
screenWidth/screenHeight:返回元素的实际宽/高,当元素的实际宽高大于可视宽高时依然如此。而clientWidth/Height则返回元素的时可视窗口内的可见宽高,最大不超过视窗宽高。
screenLeft/screenTop:返回滚动条滚动的距离
一张经典的图片:

MouseEvent
e.clientX/e.clientY:鼠标焦点相对于视口的距离
e.offsetX/e.offsetY:鼠标焦点相对于元素左上角border开始的坐标
e.pageX/e.pageY:鼠标焦点相对于文档左上角的坐标
e.screenX/e.sreenY:鼠标焦点相对于屏幕左上角的坐标
getBoundingClientRect():
返回包一个元素DomRect对象,该对象包含了位置相关属性:left、right、top、bottom、height、width
除了width和height,其他属性都是相对于可视窗口的左上角的距离。

JavaScript位置:window&client&offset&scroll&MouseEvent&getBoundingClientRect&计算任意元素滚动条宽度的更多相关文章
- DOM盒模型和位置 client offset scroll 和滚动的关系
DOM盒模型和位置 client offset scroll 和滚动的关系 概览 在dom里面有几个描述盒子位置信息的值, pading border margin width height clie ...
- JavaScript概念之screen/client/offset/scroll/inner/avail的width/left 分类: JavaScript HTML+CSS 2015-05-27 16:42 635人阅读 评论(0) 收藏
原文地址:http://caibaojian.com/js-name.html JS中获取各种宽度和距离,常常让我们混淆,各种浏览器的不兼容让我们很头疼,现在就在说说js中有哪些宽度和距离. 1.名词 ...
- client offset scroll 之间的区别
一.client 属性 值 clientWidth 元素被设置的宽度 + padding左右内间距 clientHeight 元素被设置的高度 + padding上下内间距 clientLeft 左 ...
- JS中client/offset/scroll等的宽高解析
原文地址:→传送门 window相关宽高属性 1. window.outerHeight (窗口的外层的高度) / window.outerWidth (窗口的外层的宽度) window.outerH ...
- client , offset , scroll 系列 及百度导航栏案例
1. client 系列 示例 : <!DOCTYPE html> <html> <head> <meta charset="UTF-8" ...
- client,offset,scroll系列
client(客户端),offset(偏移),scroll(滚动)1.client系列 clientTop 内容区域到边框顶部的距离 ,说白了,就是边框的高度 clientLeft 内容区域到边框左部 ...
- JS-特效 ~ 04. client对象、网页可视区域的宽高、client / offset / scroll 三大家族的区别、冒泡事件、事件委托、获取内嵌式和外链式属性getStyle(ele,attr) ;、缓动动画封装
知识点: 模拟滚动条的解除事件问题 : event内置对象,包含 了大量事件: page兼容性: pageX || clientX + scool().top : if (true === a)tr ...
- offset、client、scroll开头的属性归纳总结
HTML元素有几个offset.client.scroll开头的属性,总是让人摸不着头脑.在书中看到记下来,分享给需要的小伙伴.主要是以下几个属性: 第一组:offsetWidth,offsetHei ...
- offset系列,client系列,scroll系列回顾
一 scroll系列属性 ——滚动
随机推荐
- 钉钉内网穿透工具在windows的使用。
钉钉内网穿透工具在windows环境下使用 1.WIN+R,然后cmd,调出dos控制台 2.进入内网穿透程序ding.exe所在目录 3.执行 ./ding.exe -config=ding.cfg ...
- 总结下抽象类Abstract和虚方法Virtual(易混点)
1.普通类中可以有普通方法和虚方法,在被继承时,虚方法可以选择重写(override)或者不重写 2.抽象类中可以有普通方法和虚方法和抽象方法,当被继承时 如下 1.普通方法不能被子类重写 2.虚方法 ...
- Linux - Shell - find - 基础
概述 find 基础 背景 查找文件 人的记忆能力, 是有限的 计算机里的文件数量, 虽然不是无限, 但是也不少 要去找那些 记不清楚的文件, 必然要用查找 准备 OS centos7 用户 root ...
- schroeder reverb matlab实现
原理参考:Natural sounding artificial reverberation combFilter.m: function output = combFilter(delay, gai ...
- php 利用debug_backtrace方法跟踪代码调用
在开发过程中,例如要修改别人开发的代码或调试出问题的代码,需要对代码流程一步步去跟踪,找到出问题的地方进行修改.如果有一个方法可以获取到某段代码是被哪个方法调用,并能一直回溯到最开始调用的地方(包括调 ...
- Oracle的表空间、用户和表的区别和联系
Oracle的表空间.用户和表的区别和联系 Oracle数据库是通过表空间来存储实际存在的那些表.索引.视图的, 表空间分类: 临时表空间: 用于存储数据库中单持久性模型对象,如表.索引.视图等, ...
- ErgExp-lookbehind assert(后行断言)
//先行断言:先遇到一个条件,判断后面的条件是否满足 let test = 'hello world' console.log(test.match(/hello(?=\sworld)/)) //后行 ...
- C#中对虚拟属性和抽象属性的重写有什么异同
public abstract class A { //抽象属性不能有实现代码 public abstract strin ...
- 设置myeclipse控制台输出到文件中
1.// System.setOut(new PrintStream(new FileOutputStream("文件路径"))); 2.选择项目右击找到Run As 选项,选项下 ...
- 数据库程序接口——JDBC——功能第四篇——事务之Spring事务
综述 事务的实现方式有三种,JTA,Spring事务,Web Container方式.本篇讲述Spring事务. Spring事务分为两个部分核心对象,Spring事务的实现方式. Spring事务实 ...