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. linux下使用正确的用户名密码,本地无法连接mysql

    问题现象: Linux系统为CentOS 7.0 64位,通过IP远程mysql时,可以正常访问,确定账号密码没有问题.但是本地连接mysql时,提示ERROR 1045 (28000): Acces ...

  2. SQL 统计表行数和空间大小

    CREATE TABLE #tablespaceinfo ( nameinfo VARCHAR() , rowsinfo BIGINT , reserved VARCHAR() , datainfo ...

  3. Google Guava之--cache

    一.简介 Google Guava包含了Google的Java项目许多依赖的库,如:集合 [collections] .缓存 [caching] .原生类型支持 [primitives support ...

  4. PL/SQL之--变量

    一.PL/SQL 简介 PL/SQL也是一种程序语言,叫做过程化SQL语言(Procedural Language/SQL).PL/SQL是oracle对sql语句的一种扩展,在普通SQL语句的使用上 ...

  5. C语言的函数

    "函数"在英文的翻译是"function",无论在自然科学还是计算机科学都是这个词,而"function"的本意是"功能" ...

  6. 编译流程,C开发常见文件类型名

    编译流程 我们常说的编译是一个整体的概念,是指从源程序到可执行程序的整个过程,实际上,C语言编译的过程可以进一步细分为预编译->编译->汇编->链接 预编译是把include关键字所 ...

  7. Swift学习笔记--变量与常量

    1.Swift是一门强类型语言,不能为变量赋予其自身数据类型之外的值: 2.声明变量使用var关键字,声明常量使用let关键字: 3.声明变量或常量时没有对其指定类型且赋予了初值,则编译器会自动推断常 ...

  8. Palindrome subsequence

    Palindrome subsequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65535 K (Java/ ...

  9. 动手学习TCP:数据传输

    前面的文章介绍了TCP状态变迁,以及TCP状态变迁图中的一些特殊状态. 本文主要看看TCP数据传输过程中需要了解的一些重要点: MSS(Maximum Segment Size) Seq号和Ack号的 ...

  10. NFS(Network File System)服务配置和使用

    Sun公司开发NFS (Network File System)之初就是为了在不同linux/Unix系统之间共享文件或者文件夹.可以在本地通过网络挂载远程主机的共享文件,和远程主机交互.NFS共享存 ...