JS判断指定dom元素是否在屏幕内的方法实例


Posted in Javascript onJanuary 23, 2017

前言

刷网页的时候,有时会遇到这样一个情景,当某个dom元素滚到可见区域时,它就会展现显示动画,十分有趣。那么这是如何实现的呢?

实现原理

想要实现这个功能,就要知道具体的实现原理。下面直入主题。

我们通过浏览器在浏览一个网页时候是这个样子的,如图所示

JS判断指定dom元素是否在屏幕内的方法实例

页面的长宽,以及各dom的坐标都是静止的,动的是显示窗口坐标而已。所以明白了这个,那么判断一个dom元素是否可见时,就十分简单了。

我们需要知道三个坐标就可知道当前dom是否在可见区域内,分别是

  1. 显示窗口的顶部坐标
  2. 显示窗口的底部坐标
  3. dom元素的中心坐标

其判断规则就是,当dom元素的中心坐标的X及Y坐标均小于显示窗口的顶部,且大于显示窗口的底部坐标时,那么就可以判断该坐标在可见区域。

OK,那么接下来就是要知道这三个坐标怎么计算了。

首先是窗口的顶部坐标,顶部坐标就是页面的滚动条滚动的距离。

其次是底部坐标,底部坐标就是滚动条的距离加上当前可视窗口的高度。

最后dom元素的中心距离,就是这个dom元素到最顶端的高度加上自身高度的一般。

原理就是那么的简单有木有。

具体实现

明白了原理,具体实现起来就很简单啦。下面直接贴上一个简单的dom代码做下示例,在实际的生产中还是要优化的,比如初次的首屏显示等等,这里就不赘述了。

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Document</title>
</head>
<style type="text/css">
 .box {
 width: 100%;
 height: 200px;
 background: #ff0000;
 margin-bottom: 10px;
 text-align: center;
 color: #fff;
 line-height: 200px;
 font-family: microsoft yahei;
 font-size: 40px;
 
 }
 .animate{
 animation: showText 1s;
 }
 @keyframes showText
 {
 from {
 font-size: 20px;
 }
 to {
 font-size: 40px;
 }
 }
</style>
<body>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
</body>
<script type="text/javascript">
 
 var box = document.getElementsByClassName('box');
 document.addEventListener('scroll',function(){
  
  //滚动条高度+视窗高度 = 可见区域底部高度
  var visibleBottom = window.scrollY + document.documentElement.clientHeight;
  //可见区域顶部高度
  var visibleTop = window.scrollY;
  for (var i = 0; i < box.length; i++) {
  var centerY = box[i].offsetTop+(box[i].offsetHeight/2);
  if(centerY>visibleTop&¢erY<visibleBottom){
   box[i].innerHTML = '区域可见'
   box[i].setAttribute("class",'box animate')
   console.log('第'+i+'个区域可见');
  }else{
   box[i].innerHTML = '';
   box[i].setAttribute("class",'box')
   console.log('第'+i+'个区域不可见');
  }
  }
 })
</script>
</html>

效果图

JS判断指定dom元素是否在屏幕内的方法实例

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

Javascript 相关文章推荐
如何用javascript去掉字符串里的所有空格
Feb 08 Javascript
我也种棵OO树JXTree[js+css+xml]
Apr 02 Javascript
加速IE的Javascript document输出的方法
Dec 02 Javascript
Jquery技巧(必须掌握)
Mar 16 Javascript
JavaScript提高网站性能优化的建议(二)
Jul 24 Javascript
分享javascript、jquery实用代码段
Oct 20 Javascript
angularjs过滤器--filter与ng-repeat配合有奇效
Apr 20 Javascript
vue.js源代码core scedule.js学习笔记
Jul 03 Javascript
一文看懂如何简单实现节流函数和防抖函数
Sep 05 Javascript
JavaScript实现字符串与HTML格式相互转换
Mar 17 Javascript
Vue为什么要谨慎使用$attrs与$listeners
Aug 27 Javascript
vue实现轮播图帧率播放
Jan 26 Vue.js
jQuery弹出层插件popShow用法示例
Jan 23 #Javascript
Javascript中for循环语句的几种写法总结对比
Jan 23 #Javascript
基于jQuery插件jqzoom实现的图片放大镜效果示例
Jan 23 #Javascript
JavaScript在form表单中使用button按钮实现submit提交方法
Jan 23 #Javascript
canvas绘制表盘时钟
Jan 23 #Javascript
canvas绘制的直线动画
Jan 23 #Javascript
node.js实现复制文本到剪切板的功能
Jan 23 #Javascript
You might like
关于我转生变成史莱姆这档事:第二季PV上线,萌王2021年回归
2020/05/06 日漫
destoon在各个服务器下设置URL Rewrite(伪静态)的方法
2014/06/21 Servers
Yii框架关联查询with用法分析
2014/12/02 PHP
PHP动态柱状图实现方法
2015/03/30 PHP
PHP中substr_count()函数获取子字符串出现次数的方法
2016/01/07 PHP
(currentStyle)javascript为何有时用style得不到已设定的CSS的属性
2007/08/15 Javascript
支持ie与FireFox的剪切板操作代码
2009/09/28 Javascript
JavaScript在浏览器标题栏上显示当前日期和时间的方法
2015/03/19 Javascript
JavaScript事件处理的方式(三种)
2016/04/26 Javascript
js实现的万能flv网页播放器代码
2016/04/30 Javascript
如何让一个json文件显示在表格里【实现代码】
2016/05/09 Javascript
必备的JS调试技巧汇总
2016/07/20 Javascript
jQuery实现拖动剪裁图片作为头像
2016/12/28 Javascript
react-native中ListView组件点击跳转的方法示例
2017/09/30 Javascript
JavaScript的Object.defineProperty详解
2018/07/09 Javascript
小程序云开发获取不到数据库记录的解决方法
2019/05/18 Javascript
element-ui 中使用upload多文件上传只请求一次接口
2019/07/19 Javascript
微信小程序后端无法保持session的原因及解决办法问题
2020/03/20 Javascript
js实现mp3录音通过websocket实时传送+简易波形图效果
2020/06/12 Javascript
JavaScript indexOf()原理及使用方法详解
2020/07/09 Javascript
[03:02]生活中的Dendi之野外度假篇
2016/08/09 DOTA
python批量提交沙箱问题实例
2014/10/08 Python
Python中的异常处理学习笔记
2015/01/28 Python
Tensorflow中的降维函数tf.reduce_*使用总结
2020/04/20 Python
python模拟斗地主发牌
2020/04/22 Python
pandas数据选取:df[] df.loc[] df.iloc[] df.ix[] df.at[] df.iat[]
2020/04/24 Python
python matplotlib模块基本图形绘制方法小结【直线,曲线,直方图,饼图等】
2020/04/26 Python
python中的错误如何查看
2020/07/08 Python
HTML5的download属性详细介绍和使用实例
2014/04/23 HTML / CSS
美国棒球装备和用品商店:Baseball Savings
2018/06/09 全球购物
银行实习生的自我评价
2014/01/13 职场文书
活动策划邀请函
2014/02/06 职场文书
党组织公开承诺书
2014/03/29 职场文书
小学教师读书笔记
2015/07/01 职场文书
Python实现Hash算法
2022/03/18 Python
MySQL使用IF语句及用case语句对条件并结果进行判断 
2022/09/23 MySQL