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 相关文章推荐
模拟select的代码
Oct 19 Javascript
javascript获取form里的表单元素的示例代码
Feb 14 Javascript
动态加载iframe时get请求传递中文参数乱码解决方法
May 07 Javascript
javascript在网页中实现读取剪贴板粘贴截图功能
Jun 07 Javascript
jQuery前端分页示例分享
Feb 10 Javascript
Vuejs第六篇之Vuejs与form元素实例解析
Sep 05 Javascript
js遮罩效果制作弹出注册界面效果
Jan 25 Javascript
vue axios数据请求及vue中使用axios的方法
Sep 10 Javascript
vue组件通信传值操作示例
Jan 08 Javascript
JavaScript中十种一步拷贝数组的方法实例详解
Apr 22 Javascript
微信小程序实现的一键拨号功能示例
Apr 24 Javascript
vue实现简易计算器功能
Jan 20 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
PHP运行模式汇总
2016/11/06 PHP
再谈Yii Framework框架中的事件event原理与应用
2020/04/07 PHP
基于jQuery捕获超链接事件进行局部刷新代码
2012/05/10 Javascript
Table冻结表头示例代码
2013/08/20 Javascript
jQuery中hasClass()方法用法实例
2015/01/06 Javascript
jQuery 选择器详解
2015/01/19 Javascript
基于JavaScript怎么实现让歌词滚动播放
2015/11/03 Javascript
基于javascript实现页面加载loading效果
2020/09/15 Javascript
Bootstrap3学习笔记(二)之排版
2016/05/20 Javascript
解决Node.js使用MySQL出现connect ECONNREFUSED 127.0.0.1:3306的问题
2017/03/09 Javascript
详解nodejs微信公众号开发——3.封装消息响应模块
2017/04/10 NodeJs
Vue和Bootstrap的整合思路详解
2017/06/30 Javascript
JS 组件系列之Bootstrap Table 冻结列功能IE浏览器兼容性问题解决方案
2017/06/30 Javascript
基于js 各种排序方法和sort方法的区别(详解)
2018/01/03 Javascript
Vue 报错TypeError: this.$set is not a function 的解决方法
2018/12/17 Javascript
Node.js + express基本用法教程
2019/03/14 Javascript
.netcore+vue 实现压缩文件下载功能
2020/09/24 Javascript
[59:35]DOTA2上海特级锦标赛主赛事日 - 3 败者组第三轮#1COL VS Alliance第二局
2016/03/04 DOTA
[00:57]英雄,你的补给到了!
2020/11/13 DOTA
基于ID3决策树算法的实现(Python版)
2017/05/31 Python
matplotlib中legend位置调整解析
2017/12/19 Python
Python用61行代码实现图片像素化的示例代码
2018/12/10 Python
Python3删除排序数组中重复项的方法分析
2019/01/31 Python
Python环境Pillow( PIL )图像处理工具使用解析
2019/09/12 Python
opencv3/C++图像像素操作详解
2019/12/10 Python
Python字符串格式化f-string多种功能实现
2020/05/07 Python
python退出循环的方法
2020/06/18 Python
精选鞋类、服装和配饰的全球领先目的地:Bodega
2021/02/27 全球购物
初中生学习的自我评价
2013/11/14 职场文书
医院检讨书范文
2014/02/01 职场文书
2014年三八妇女节活动方案
2014/02/28 职场文书
南京青奥会口号
2014/06/12 职场文书
离婚财产分配协议书
2014/10/21 职场文书
饭店服务员岗位职责
2015/02/09 职场文书
自主招生学校推荐信范文
2015/03/26 职场文书
干货干货!2019最新优秀创业计划书
2019/03/21 职场文书