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. 初识 TextKit

    iOS 7 的发布给开发者的案头带来了很多新工具.其中一个就是 TextKit.TextKit 由许多新的 UIKit 类组成,顾名思义,这些类就是用来处理文本的.在这里,我们将介绍 TextKit ...

  2. 多选按钮(CheckBox)

    今天我们介绍的是Checkbox多选框: 1.Activity //复选框,[基础控件]---状态切换控件CompoundButton及其子类CheckBox.RadioButton.ToggleBu ...

  3. iOS网络-02-数据解析(JSON与XML)

    数据交互格式 服务器返回给用户的数据,通常是以下两种方式: JSON XML JSON 一种轻量级的数据数据格式,体积比XML小,是服务器返回给移动端通常采用的格式 用使用JSON文件中的数据,需要对 ...

  4. 多线程基础(五)NSThread线程通信

    5.多线程基础 线程间通信   什么叫线程间通信 在一个进程中,线程往往不是孤立存在的,多个线程之间需要经常进行通信   线程间通信的体现 1个线程传递数据给另一个线程 在1个线程中执行完特定任务后, ...

  5. 学习C语言的数组

    C语言的数组 数组声明的实例:int num[3];只要记下这个模板就好. 不建议使用变量定义数组,如果使用了变量定义数组,作为数组的元素的个数,不初始化的情况下是随机值,如果初始化会直接报错 注意: ...

  6. android中实现view可以滑动的六种方法续篇(二)

    承接上一篇,上一篇中讲解了实现滑动的第五种方法,如果你还没读过,可点击下面链接: http://www.cnblogs.com/fuly550871915/p/4985482.html 这篇文章现在来 ...

  7. High Aavialability with Group Replication-by宋利兵

    今天,2016年12月12日, Group Replication GA啦!GA的版本是MySQL-5.7.17. 下载连接如下: http://dev.mysql.com/downloads/mys ...

  8. MyEclipse中SVN的常见的使用方法

    本次主要内容: 一 .导入项目 (Checkout).从svn资源库检出 二 .更新 (Update) 三.锁(对要修改的文件加锁,防止文件冲突) 四.提交(项目修改后的提交) 五.解锁 六.查看历史 ...

  9. JS高级程序设计2nd部分知识要点7

    例子: <!DOCTYPE html> <html lang="en"> <head>  <meta charset="UTF- ...

  10. 绘制复数图形和双y轴图形

    clearclct=0:0.1:2*pi;x=sin(t);y=cos(t);z=x+i*y;subplot(1,3,1)plot(t,z,'r') %注:这种方式下,不论参数t,z哪个是复数,都将忽 ...