JS滚动页面到某一位置时触发指定事件能够增强用户体验或是提高性能,其中使用最多的场景是加载更多,当鼠标滚动至页面下方时,自动加载下一页的内容。另一个常用的场景是当用户滚动至页面某一地方时,页面会给出提示或是将某些重要信息或按钮显示出来。实现这些效果的关键是要区分clientHeight、scrollHeight、offsetHeight等属性的区别。刚好最近项目中有用到过这些概念,今天就抽空整理下关于这几个属性的区别。

1.概念

clientHeight/clientWidth

指元素可见区域的高度,容器的高度,不包括border和滚动条的高度。clientHeight与height值差不多,如果没有边框和滚动条的话,两者值相等,都是指容器的高度。火狐与IE下的值是一样的。

//获得元素的可见区域高度 不传参数表示获取浏览器窗口的可视高度
getClientHeight:function(_elem){
if(!!_elem){
return _elem.clientHeight;
}else{
return window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight;
}
}

offsetHeight/offsetWidth

指元素容器的高度,加上边框和滚动条的高度,如果有设置boder和滚动条的话。

getOffsetHeight:function(_elem){
if(_elem){
return _elem.offsetHeight;
}else{
return document.documentElement.offsetHeight || document.body.offsetHeight;
}
}

scrollHeight/scrollWidth

指元素内容的高度,而不是容器的高度。当元素内容的高度大于容器高度时,指元素内容的高度。

getScrollHeight:function(_elem){
if(_elem){
return _elem.scrollHeight;
}else{
return document.documentElement.scrollHeight || document.body.scrollHeight;
}
}

offsetTop/offsetLeft

offsetTop:元素距离父元素顶端的距离。当前对象到其上级层顶部的间隔。
offsetLeft:元素距离父元素左侧的距离。当前对象到其上级层左侧的间隔。

scrollTop/scrollLeft

scrollTop:元素中垂直滚动条滚动的距离。若元素中没有滚动条,则滚动距离为0。
scrollLeft:元素中水平滚动条滚动的距离。若元素中没有滚动条,则滚动距离为0。

2.案例 

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" Content="text/html; charset=utf-8;">
<title>JS滚动显示指定内容</title>
<meta name="author" content="rainna" />
<meta name="keywords" content="rainna's js lib" />
<meta name="description" content="js" />
<style>
*{padding:0;margin:0;} .m-cnt{width:600px;margin:0 auto;line-height:2;}
.m-cnt img{display:block;width:100%;}
.m-cnt .info{background:rgba(97, 207, 247, 0.5);line-height:80px;} .pos{position:fixed;top:0;width:600px;}
</style>
</head> <body>
<div class="m-cnt">
<p>JS滚动页面到某一位置时触发指定事件能够增强用户体验或是提高性能,其中使用最多的场景是加载更多,当鼠标滚动至页面下方时,自动加载下一页的内容。另一个常用的场景是当用户滚动至页面某一地方时,页面会给出提示或是将某些重要信息或按钮显示出来。实现这些效果的关键是要区分clientHeight、scrollHeight、offsetHeight属性的区别。刚好最近项目中有用到过这些概念,今天就抽空整理下关于这几个属性的区别。</p>
<p><strong>clientHeight/clientWidth</strong>:指元素可见区域的高度,容器的高度,不包括border和滚动条的高度。clientHeight与height值差不多,如果没有边框和滚动条的话,两者值相等,都是指容器的高度。火狐与IE下的值是一样的。</p>
<p><strong>offsetHeight/offsetWidth</strong>:指元素容器的高度,加上边框和滚动条的高度,如果有设置boder和滚动条的话。</p>
<p><strong>scrollHeight/scrollWidth</strong>:指元素内容的高度,而不是容器的高度。当元素内容的高度大于容器高度时,指元素内容的高度。</p>
<p><strong>offsetTop/offsetLeft</strong>:offsetTop:元素距离父元素顶端的距离。当前对象到其上级层顶部的间隔。<br />offsetLeft:元素距离父元素左侧的距离。当前对象到其上级层左侧的间隔。</p>
<p><strong>scrollTop/scrollLeft</strong>:scrollTop:元素中垂直滚动条滚动的距离。若元素中没有滚动条,则滚动距离为0。<br />scrollLeft:元素中水平滚动条滚动的距离。若元素中没有滚动条,则滚动距离为0。</p>
<p class="info" id="info">特殊显示的内容特殊显示的内容特殊显示的内容特殊显示的内容</p>
<p><img src="http://m2.img.srcdd.com/farm5/d/2014/1020/15/BC20A76398278107A49FFC5761F67587_B1280_1280_650_650.jpeg" /></p>
<p><img src="http://m3.img.srcdd.com/farm4/d/2014/1020/15/556E38E2D06F144114550AF1C699E60D_B1280_1280_650_650.jpeg" /></p>
<p><img src="http://m3.img.srcdd.com/farm4/d/2014/1020/15/390F43577E8994667B8CA1C178F90730_B1280_1280_650_650.jpeg" /></p>
</div>
<script>
var scroll = {
info:document.getElementById('info'), //获得元素的可视高度 容器高度,不包括滚动条和边框,不传参数表示浏览器窗口的可视高度
getClientHeight:function(_elem){
if(!!_elem){
return _elem.clientHeight;
}else{
return window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight;
}
},
//获得元素的可视高度 容器高度,包括滚动条和边框,不传参数表示浏览器窗口的可视高度
getOffsetHeight:function(_elem){
if(_elem){
return _elem.offsetHeight;
}else{
return document.documentElement.offsetHeight || document.body.offsetHeight;
}
},
//获得元素的内容高度,包括显示的内容和隐藏的内容,不传参数表示页面整个文档的高度
getScrollHeight:function(_elem){
if(_elem){
return _elem.scrollHeight;
}else{
return document.documentElement.scrollHeight || document.body.scrollHeight;
}
}, //获得元素距离父元素的顶端的距离
getOffsetTop:function(_elem){
return _elem.offsetTop;
},
//获得元素中滚动条纵向滚动的距离,不传参数表示浏览器滚动条的纵向滚动距离
getScrollTop:function(_elem){
if(!!_elem){
return _elem.scrollTop;
}else{
return window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop;
}
},
//初始化
init:function(){
var that = this;
var _offsetTop = that.getOffsetTop(that.info);
document.body.addEventListener("mousewheel", function(event) {
that.info.className = that.getScrollTop() > _offsetTop ? 'info pos' : 'info';
});
}
} scroll.init();
</script>
</body>
</html>

JS clientHeight,scrollHeight,offsetHeight,scrollTop,offsetTop概念的更多相关文章

  1. js的offsetWidth,offsetHeight,offsetLeft,offsetTop

    js的offsetWidth,offsetHeight,offsetLeft,offsetTop

  2. clientHeight , scrollHeight , offsetHeight之间的区别及兼容方案

    clientHeight , scrollHeight , offsetHeight相信每个人都用过,可是每次用都要查一下到底哪个是文档大小哪个是视口大小,还有头疼的兼容问题. 先来官方的了解一下这三 ...

  3. clientHeight scrollHeight offsetHeight

    <div  style="height:200px;padding:10px;border:1px solid green;"></div> 对于上面的di ...

  4. height clientHeight scrollHeight offsetHeight的大致区别

    这主要是针对火狐浏览器来讲的: height:就是div的高度,就是style中设置的高度:在chrome中clientHeight是包含padding的,offsetHeight和clientHei ...

  5. clientHeight—scrollHeight—offsetHeight三者的区别

    clientHeight,scrollHeight,offsetHeight 这三个dom属性有时让人觉得相似但又不相似 以前对它们的理解也有一些模糊,现在总结一下,方便以后复习 clientHeig ...

  6. clientHeight / scrollHeight / offsetHeight 等属性的区别图

    网页(内容)可见区域宽:document.body.clientWidth 网页(内容)可见区域高:document.body.clientHeight 即页面浏览器中可以看到内容的这个区域的高度,一 ...

  7. clientHeight , scrollHeight , offsetHeight之间的区别

    clientHeight:元素客户区的大小,指的是元素内容及其边框所占据的空间大小(经过实践取出来的大多是视口大小) scrollHeight: 滚动大小,指的是包含滚动内容的元素大小(元素内容的总高 ...

  8. jquery 对象的 height、innerHeight、outerHeight 的区别以及DOM 元素的 clientHeight、offsetHeight、scrollHeight、offsetTop、scrollTop

    前言:jquery 对象的 height.innerHeight.outerHeight,还有 DOM 元素的 clientHeight.offsetHeight.scrollHeight.offse ...

  9. offsetTop,offsetHeight,clientHeight,scrollHeight,scrollTop区别

    这些高度相信很多同学都搞不清楚吧.这里我通过本地测试,发现了区别. 以聊天窗口为例. 元素(class='content')高度444px,其中上下padding分别是10px,margin为0.距离 ...

随机推荐

  1. OC语言-04-OC语言-核心语法

    一.点语法 1> 基本使用 点语法本质上是set方法/get方法的调用 2> 使用注意 若出现在赋值操作符的右边,在执行时会转换成get方法 若出现在赋值操作符的左边,在执行时会转换成se ...

  2. iOS之UI--自定义IOS的HYCheckBox源码的使用

    *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...

  3. iOS之学习资源收集--很好的IOS技术学习网站

    点击图片也能打开相关的网站: https://boxueio.com/skill/swift http://ios.b2mp.cn/ http://gold.xitu.io/welcome/?utm_ ...

  4. CentOS6.5+nginx+tomcat负载均衡集群

    思路: 1.安装jdk 2.安装tomcat 3.安装nginx依赖库 4.安装nginx 5.nginx+2个tomcat集群 一:网络拓扑

  5. IdentityHashMap的使用场景

    IdentityHashMap的使用场景 JDK1.4就加入了这个map类型,它是使用 == 判断相等,而不是hashmap的equals方法判断相等. 那么,它有什么应用场合呢? 当然是需要我们必须 ...

  6. python判断字符串,str函数isdigit、isdecimal、isnumeric的区别

    s为字符串s.isalnum() 所有字符都是数字或者字母s.isalpha() 所有字符都是字母s.isdigit() 所有字符都是数字s.islower() 所有字符都是小写s.isupper() ...

  7. hdu 1028 Ignatius and the Princess III(DP)

    Ignatius and the Princess III Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K ...

  8. js删除所有子元素

    没有removeAll的API,但也十分容易实现: var lis = $("#yetai_tbody").find("tr"); $(lis).each(fu ...

  9. Legends-ggplot2图例的一些操作

    移除图例 require(ggplot2) b = qplot(Sepal.Length,Petal.Length,data=iris,geom="point",colour = ...

  10. JS判断浏览器类型及版本

    浏览器 ie firefox opera safari chrome 分类: 一路辛酸---JavaScript 你知道世界上有多少种浏览器吗?除了我们熟知的IE, Firefox, Opera, S ...