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 相关文章推荐
JS查看对象功能代码
Apr 25 Javascript
jquery使用ColorBox弹出图片组浏览层实例演示
Mar 14 Javascript
js中对象的声明方式以及数组的一些用法示例
Dec 11 Javascript
Bootstrap三种表单布局的使用方法
Jun 21 Javascript
jquery插件autocomplete用法示例
Jul 01 Javascript
js判断出两个字符串最大子串的函数实现方法
Nov 01 Javascript
ES6新特性之Object的变化分析
Mar 31 Javascript
Node.js自定义实现文件路由功能
Sep 22 Javascript
QQ跳转支付宝并自动领红包脚本(最新)
Jun 22 Javascript
Vue和React组件之间的传值方式详解
Jan 31 Javascript
从零搭一个自用的前端脚手架的方法步骤
Sep 23 Javascript
JS运算符简单用法示例
Jan 19 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如何透过ODBC来存取数据库
2006/10/09 PHP
php access 数据连接与读取保存编辑数据的实现代码
2010/05/12 PHP
详解thinkphp实现excel数据的导入导出(附完整案例)
2016/12/29 PHP
Laravel构建即时应用的一种实现方法详解
2017/08/31 PHP
php实现支付宝当面付(扫码支付)功能
2018/05/30 PHP
一些不错的js函数ajax
2008/08/20 Javascript
jQuery 事件队列调整方法
2009/09/18 Javascript
javascript parseInt 大改造
2009/09/27 Javascript
js中判断文本框是否为空的两种方法
2011/07/31 Javascript
javascript 闭包
2011/09/15 Javascript
(跨浏览器基础事件/浏览器检测/判断浏览器)经验代码分享
2013/01/24 Javascript
JS实现下拉框的动态添加(附效果)
2013/04/03 Javascript
js实现的简洁网页滑动tab菜单效果代码
2015/08/24 Javascript
jquery仿京东商品放大浏览页面
2017/06/06 jQuery
JavaScript之filter_动力节点Java学院整理
2017/06/28 Javascript
vue 下列表侧滑操作实例代码详解
2018/07/24 Javascript
ES6的异步操作之promise用法和async函数的具体使用
2019/12/06 Javascript
vue实现鼠标移过出现下拉二级菜单功能
2019/12/12 Javascript
python获取beautifulphoto随机某图片代码实例
2013/12/18 Python
Python基本数据类型详细介绍
2014/03/11 Python
python:pandas合并csv文件的方法(图书数据集成)
2018/04/12 Python
tensorflow 中对数组元素的操作方法
2018/07/27 Python
python读取tif图片时保留其16bit的编码格式实例
2020/01/13 Python
通过python连接Linux命令行代码实例
2020/02/18 Python
python 实现表情识别
2020/11/21 Python
基于html5实现的图片墙效果
2014/10/16 HTML / CSS
英国领先的电视购物零售商:Ideal World
2019/03/18 全球购物
linux面试题参考答案(8)
2015/08/11 面试题
介绍一下linux文件系统分配策略
2013/02/25 面试题
浅谈react路由传参的几种方式
2021/03/23 Javascript
房产销售经理职责
2013/12/20 职场文书
初中军训感想300字
2014/03/05 职场文书
干部考核评语
2014/04/29 职场文书
国贸专业求职信
2014/06/28 职场文书
用基于python的appium爬取b站直播消费记录
2021/04/17 Python
MySQL 逻辑备份 into outfile
2022/05/15 MySQL