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 网页跳转的方法
Dec 24 Javascript
javascript 另一种图片滚动切换效果思路
Apr 20 Javascript
JS声明变量背后的编译原理剖析
Dec 28 Javascript
js获取上传文件大小示例代码
Apr 10 Javascript
js实现iframe自动自适应高度的方法
Feb 17 Javascript
深入浅出 jQuery中的事件机制
Aug 23 Javascript
jQuery实现可兼容IE6的滚动监听功能
Sep 20 jQuery
Javascript中从学习bind到实现bind的过程
Jan 05 Javascript
JS弹窗 JS弹出DIV并使整个页面背景变暗功能的实现代码
Apr 21 Javascript
深入理解Angularjs 脏值检测
Oct 12 Javascript
深入浅析js原型链和vue构造函数
Oct 25 Javascript
何时/使用 Vue3 render 函数的教程详解
Jul 25 Javascript
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
几个学习PHP的网址
2006/11/25 PHP
解决phpmyadmin中文乱码问题。。。
2007/01/18 PHP
并发下常见的加锁及锁的PHP具体实现代码
2010/10/12 PHP
php中explode与split的区别介绍
2012/10/03 PHP
解析CodeIgniter自定义配置文件
2013/06/18 PHP
php实现从上传文件创建缩略图的方法
2015/04/02 PHP
PHP定时执行任务的3种方法详解
2015/12/21 PHP
PHP实现redis限制单ip、单用户的访问次数功能示例
2018/06/16 PHP
浅谈Laravel POST,PUT,PATCH 路由的区别
2019/10/15 PHP
JS+CSS实现的竖向简洁折叠菜单效果代码
2015/10/22 Javascript
EasyUI闪屏EasyUI页面加载提示(原理+代码+效果图)
2016/02/21 Javascript
Bootstrap编写一个兼容主流浏览器的受众门户式风格页面
2016/07/01 Javascript
jquery点击切换背景色的简单实例
2016/08/25 Javascript
JavaScript设计模式之职责链模式应用示例
2018/08/07 Javascript
Vue开发中遇到的跨域问题及解决方法
2020/02/11 Javascript
使用JavaScript实现贪吃蛇游戏
2020/09/29 Javascript
python原始套接字编程示例分享
2014/02/21 Python
Python爬取qq music中的音乐url及批量下载
2017/03/23 Python
Python 用Redis简单实现分布式爬虫的方法
2017/11/23 Python
python中itertools模块zip_longest函数详解
2018/06/12 Python
Python3.5模块的定义、导入、优化操作图文详解
2019/04/27 Python
基于腾讯云服务器部署微信小程序后台服务(Python+Django)
2019/05/08 Python
flask 实现上传图片并缩放作为头像的例子
2020/01/09 Python
Python Scrapy图片爬取原理及代码实例
2020/06/12 Python
Python使用sys.exc_info()方法获取异常信息
2020/07/23 Python
法国珠宝店:CLEOR
2017/01/29 全球购物
沙龙级头发造型工具:FOXYBAE
2018/07/01 全球购物
图库照片、免版税图片、矢量艺术、视频片段:Depositphotos
2019/08/02 全球购物
超市后勤自我鉴定
2014/01/17 职场文书
校园公益广告语
2014/03/13 职场文书
工业自动化专业自荐信范文
2014/04/10 职场文书
大班上学期幼儿评语
2014/04/30 职场文书
领导干部作风建设工作总结
2014/10/23 职场文书
员工辞退通知书
2015/04/17 职场文书
Python Numpy库的超详细教程
2022/04/06 Python
Vue ECharts实现机舱座位选择展示功能
2022/05/15 Vue.js