由于出现滚动条便意味着元素空间将大于其内容显示区域,根据这个现象即可以获得判断是否出现滚动条的规则。
el.scrollHeight > el.clientHeight
这条规则使用了获取元素不一样高度的两个属性:浏览器
scrollHeight
指的是元素的内容高度,即若是有滚动条,它的值会等于内容实际的高度加padding值(并不包含border和margin值),在没有内容溢出的状况下它的值等于clientHeight;wordpress
clientHeight
指的是元素的内部高度的px值,包括content和padding值之和,并不包括横向滚动条(horizontal scrollbar)、border和margin的值。code
故而若是每一个元素的scrollHeight值大于clientHeight值,则能够说明其出现了竖向滚动条。
el.scrollWidth > el.clientWidth
一样这里使用了获取元素宽度的两个属性:对象
scrollWidth
指的是远的内容高度,即它的值会等于内容实际的宽度加上padding值(不包含border和margin值),在没有内容溢出的状况下它的值等于clientWidth;文档
clientWidth
指的是元素的内部宽度的px值,包括content和padding值之和,并不包括横向滚动条(horizontal scrollbar)、border和margin的值。get
故而若是每一个元素的scrollWidth值大于clientWidth值,则能够说明其出现了横向滚动条。
scrollWidth/scrollHeight:IE8及以上、Chrome 4.0、FireFox 3.0、Safari 4.9 和Opera均支持兼容该属性;io
clientWidth/clientWidth:IE6以上及其余现代浏览器都支持该属性。function
当元素指定了`overflow:hidden`时,是不会出现滚动条的,就算元素的内容尺寸超过了元素尺寸也是不会出现 滚动条的,因此这里须要对元素是否应用了`overflow:hidden`进行判断。
getComputedStyle
使用window
对象下的getComputedStyle
方法,能够得到元素中最终应用的CSS
属性值,而且返回一个 CSSStyleDeclaration
对象。故而咱们能够经过如下写法来获取最终应用于元素上overflow的值:兼容性
window.getComputedStyle(el).getPropertyValue("overflow")
currentStyle
鉴于getComputedStyle
IE9如下不支持,故而这里须要使用IE中特有的currentStyle
来获取最终应用于元素中的overflow
属性值:cli
el.currentStyle.overflow
综上能够得出判断元素出现滚动条方法的代码,以下: function hasScrolled(el, direction = "vertical") { if(direction === "vertical") { return el.scrollHeight > el.clientHeight; }else if(direction === "horizontal") { return el.scrollWidth > el.clientWidth; } }
在线Demo:http://codepen.io/willshawzq/pen/PPVdNX
http://www.zhangxinxu.com/wordpress/2012/05/getcomputedstyle-js-getpropertyvalue-currentstyle/
https://developer.mozilla.org/en-US/docs/Web/API/Element/clientWidth