Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在将父元素滚动到视图中时,使用jQuery和css3的TranslateX()显示元素

在将父元素滚动到视图中时,使用jQuery和css3的TranslateX()显示元素
EN

Stack Overflow用户
提问于 2019-09-13 01:01:44
回答 3查看 984关注 0票数 0

当一个圆的父节滚动到视图中时,我想要更改它的位置。

当父对象在视图中之后向下滚动时,它应该向右移动,当向上滚动时,它应该回到原来的位置。(-200px向左)它应该只在用户主动滚动时移动。

如果用户一直向下滚动到圆的父部分的最底部,或者如果他们已经向下滚动到底部并重新加载页面,圆应该会出现在它完全显示的位置。

我当前的代码部分正常工作,但我在根据父元素的可见程度显示整个元素以及在滚动到最底部后重新加载页面时将其显示在最终位置时遇到了问题。

JSFiddle:https://jsfiddle.net/thebluehorse/gu2rvnsw/

代码语言:javascript
运行
AI代码解释
复制
var $window = $(window),
    $sectionFour = $('.section-four'),
    $circle = $sectionFour.find('.circle'),
    lastScrollTop = 0,
    position = -200;

function revealCircle() {
  var isVisible,
  	st = $window.scrollTop();

  isVisible = isInView($sectionFour);

  if (isVisible) {
    // console.log('section four is in view, so lets do stuff!');

    if (st > lastScrollTop) {
      if (position === 0) {
        return false
      }
      $circle.css('transform', 'translateX(' + position + 'px')
      position++;
    } else {
      if (position === -200) {
        return false
      }
      $circle.css('transform', 'translateX(' + position + 'px')
      position--;
    }
  }
}

function isInView(node) {
  var rect;

  if (typeof jQuery === 'function' && node instanceof jQuery) {
    node = node[0];
  }

  rect = node.getBoundingClientRect();

  return (
    (rect.height > 0 || rect.width > 0) &&
    rect.bottom >= 0 &&
    rect.right >= 0 &&
    rect.top <= (window.innerHeight || document.documentElement.clientHeight) &&
    rect.left <= (window.innerWidth || document.documentElement.clientWidth)
  );
}

$window.on('scroll', revealCircle);
代码语言:javascript
运行
AI代码解释
复制
.circle {
  width: 400px;
  height: 400px;
  background: #fff;
  -webkit-border-radius: 200px;
  -moz-border-radius: 200px;
  border-radius: 200px;
  transform: translateX(-200px); }

.section {
  min-height: 400px; }
  .section-one {
    background-color: red; }
  .section-two {
    background-color: orange; }
  .section-three {
    background-color: yellow; }
  .section-four {
    background-color: green; }
代码语言:javascript
运行
AI代码解释
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<section class="section section-one"></section>
<section class="section section-two"></section>
<section class="section section-three"></section>
<section class="section section-four">
  <div class="circle"></div>
</section>

EN

回答 3

Stack Overflow用户

发布于 2019-09-13 03:29:46

你的代码可以简化一点。在滚动页面时,唯一需要跟踪的值是scrollTop()。因为$sectionFour的几何体永远不会改变,所以您可以立即缓存它的getBoundingClientRect()

一旦知道$sectionFour在视图中,就需要计算出它的总高度中有多少像素在视图中,将其转换为百分比,然后将该百分比应用于初始位置-200。本质上,当只显示几个像素时,这是一个很小的百分比,例如10%,-200变成-180。当元素完全显示在视图中时,百分比应接近100%,-200变为0。这意味着您没有跟踪上一个位置或滚动的方向,您只是计算应该基于当前视口(scrollTop)的值。

代码语言:javascript
运行
AI代码解释
复制
var $window = $(window),
  $sectionFour = $('.section-four'),
  $circle = $sectionFour.find('.circle');
  rect = $sectionFour[0].getBoundingClientRect();

function revealCircle() {
  var scrollTop = $window.scrollTop();
  var windowHeight = $window[0].innerHeight;

  if (scrollTop + windowHeight > rect.top) {    
    var percentVisible = (scrollTop - (rect.top - windowHeight)) / rect.height;
    var position = 200 - (percentVisible * 200);
    
    $circle.css('transform', 'translateX(-' + position + 'px');
  }
}

$window.on('scroll', revealCircle);
代码语言:javascript
运行
AI代码解释
复制
body { margin:0;}

.circle {
  width: 400px;
  height: 400px;
  background: #fff;
  -webkit-border-radius: 200px;
  -moz-border-radius: 200px;
  border-radius: 200px;
  transform: translateX(-200px); }

.section {
  min-height: 400px; }
  .section-one {
    background-color: red; }
  .section-two {
    background-color: orange; }
  .section-three {
    background-color: yellow; }
  .section-four {
    background-color: green; }
代码语言:javascript
运行
AI代码解释
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<section class="section section-one"></section>
<section class="section section-two"></section>
<section class="section section-three"></section>
<section class="section section-four">
  <div class="circle"></div>
</section>

票数 0
EN

Stack Overflow用户

发布于 2019-09-13 03:56:17

对于纯JS解决方案,使用css变量可能会更简单:

代码语言:javascript
运行
AI代码解释
复制
const sectFour  = document.querySelector('#section-four')
    , divCircle = sectFour.querySelector('.circle')


function percentVisible(elm)
  {
  let rect       = elm.getBoundingClientRect()
    , viewHeight = Math.max(document.documentElement.clientHeight, window.innerHeight)
    , visu       = viewHeight-rect.top

  return (visu<0) ? -1 : Math.min( 100, (visu/rect.height*100))
  // return !(rect.bottom < 0 || rect.top - viewHeight >= 0)  =>  checkVisible
  }

window.onscroll=_=>
  {
  let circlePos = percentVisible(sectFour) *2

  if (circlePos>=0)
    {
    divCircle.style.setProperty('--circle-pos', `-${200-circlePos}px`)
    // IE 11 : // divCircle.style=('transform:translateX(-'+(200-circlePos)+'px')
    }
  }
代码语言:javascript
运行
AI代码解释
复制
* { margin: 0 }

.circle {
  --circle-pos         :-200px;
  width                : 400px;
  height               : 400px;
  background-color     : #fff;
  -webkit-border-radius: 200px;
     -moz-border-radius: 200px;
          border-radius: 200px;
  transform            : translateX(var(--circle-pos));
  /* IE 11 ........... : translateX(-200px); */
}

section { min-height: 400px;  }
section:nth-of-type(1) { background-color: red;    }
section:nth-of-type(2) { background-color: orange; }
section:nth-of-type(3) { background-color: yellow; }
section:nth-of-type(4) { background-color: green;  }
代码语言:javascript
运行
AI代码解释
复制
<section></section>
<section></section>
<section></section>
<section id="section-four"> <div class="circle"></div> </section>

票数 0
EN

Stack Overflow用户

发布于 2019-09-13 05:54:00

你应该看看Intersection Observer (IO),它是用来解决像你这样的问题的。侦听scroll事件并计算位置可能会导致性能下降。

首先,您必须定义IO的选项:

代码语言:javascript
运行
AI代码解释
复制
let options = {
  root: document.querySelectorAll('.section-four'),
  rootMargin: '0px',
  threshold: 1.0
}

let observer = new IntersectionObserver(callback, options);

在定义了选项之后,您必须告诉观察者要观察哪些元素,我猜在您的例子中应该是.section-four

代码语言:javascript
运行
AI代码解释
复制
let targets = document.querySelectorAll('.section-four');
targets.forEach(target => {
  observer.observe(target) } 
)

最后一步是定义在.section-four进入视图后应该执行的回调函数:

代码语言:javascript
运行
AI代码解释
复制
let callback = (entries, observer) => { 
  entries.forEach(entry => {
    // Each entry describes an intersection change for one observed
    // target element
    // here you can do something like $(entry.target).find('circle') to get your circle
  });
};

看看this demo,这取决于元素背景颜色变化的程度。我认为这接近于你的问题,你只是不改变bg-color,而是在元素中设置圆的动画。

网站上还有另一个演示,可以显示元素在屏幕上的可见程度,也许这个更适合你。

您还可以使用此polyfill from w3c来支持较旧的浏览器。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57916123

复制
相关文章
CDO学习1 CDO简介[通俗易懂]
http://www.ceda.ac.uk/static/media/uploads/ncas-reading-2015/cdo.pdf
全栈程序员站长
2022/09/16
2.1K0
Python如何将GrADs常用文件转换为NetCDF格式?
测试数据分享 链接:https://pan.baidu.com/s/1mj1-YpvQN414crNz32f8GA 提取码:wmfr
气象学家
2022/01/18
1.9K0
Python如何将GrADs常用文件转换为NetCDF格式?
Python如何将GrADs常用文件转换为NetCDF格式?
首先需要确保xgrads库的安装: pip install xgrads Install from github 或者 git clone https://github.com/miniufo/xgrads.git cd xgrads python setup.py install 链接https://github.com/miniufo/xgrads , 有提供示例ctl和dat文件,下面我们是使用的ctl和grd文件转换的,方法类似: #import sys #sys.path.append('/home/gavin/miniconda3/envs/atmpy/lib/python3.8/site-packages') #sys.path from xgrads import CtlDescriptor, open_CtlDataset ds = open_CtlDataset('lst.ctl') ctl = CtlDescriptor(file='lst.ctl') ds.attrs['pdef' ] = 'None' ds.to_netcdf('lst.nc') data = ds.ro1 data.where(data!=ctl.undef).plot(figsize=(9,5), cmap='jet') 以上需要注意两点: 1.如果在jupyter-lab中无法加载xgrads需要手动添加其路径,使用到的是:import sys 2. xgrads存在bug,如果不添加语句ds.attrs['pdef' ] = 'None'会一直报错,无法生成nc文件!
郭好奇同学
2021/08/26
2.8K0
Python如何将GrADs常用文件转换为NetCDF格式?
Word 技术篇-段落的前后间距单位磅改为行,行改为磅
很多时候,比如我们写论文,word的格式是有严格要求的,我们要一丝不苟的按照要求来。因为,这是一种规范,也是是一种礼仪。
小蓝枣
2020/09/23
1.8K0
Word文档段落的前后间距单位磅改为行,行改为磅方法演示
很多时候,比如我们写论文,word 的格式是有严格要求的,我们要一丝不苟的按照要求来。因为,这是一种规范,也是是一种礼仪。
小蓝枣
2023/05/27
1.8K0
Word文档段落的前后间距单位磅改为行,行改为磅方法演示
在Python中绘图,更丰富,更专业
Excel使绘制图形变得非常容易。Python也是如此!这里,我们将快速熟悉如何在Python中绘制图形。
fanjy
2022/03/07
1.8K0
在Python中绘图,更丰富,更专业
PowerShell中theFuck插件PoShFuck将wtf搜索引擎从Google改为Baidu或者Bing
有一个很好玩的插件 PoShFuck ,安装后,输入 wtf ,就可以自动帮我们打开网页,用谷歌搜索刚刚报错的语句。但是谷歌引擎‘不好用’,于是我将其改为了 BAIDU ,如下图。我将阐述修改方法。BING 也是可以的。
Piper蛋窝
2020/11/19
8810
PowerShell中theFuck插件PoShFuck将wtf搜索引擎从Google改为Baidu或者Bing
如何将生产环境的字段类型从INT修改为BIGINT
改变数据类型是一个看起来很简单的事情,但是如果表非常大或者有最小停机时间的要求,又该如何处理那?这里我提供一个思路来解决这个问题。
全栈程序员站长
2021/11/29
3.1K0
如何将生产环境的字段类型从INT修改为BIGINT
如何使用Python创建NetCDF文件
之前介绍过如何使用Python处理NetCDF格式文件,这次介绍一下如何创建NetCDF文件。
MeteoAI
2019/07/24
14.8K1
如何将生产环境的字段类型从INT修改为BIGINT
介绍 改变数据类型是一个看起来很简单的事情,但是如果表非常大或者有最小停机时间的要求,又该如何处理那?这里我提供一个思路来解决这个问题。 背景 在一个常规SQL Server heath检查中,使用sp_blitz,我们最大的生产表之一引发了令人担忧的警报。保存客户订单信息的表的ID列是一个INT datatype,很快就将达到最大值。 这个表大约有500GB,有超过9亿行。根据在该表上每天的平均插入数,我估计未来八个月后,在这张表上的插入将会溢出。这是一个订单输入表,由于客户的活动,需要24小时的插入。一
用户1217611
2018/03/29
5.1K0
如何将生产环境的字段类型从INT修改为BIGINT
使用Python处理NetCDF格式文件
NetCDF(Network Common Data Form)是一种科学二进制数据格式,由UCAR负责开发和维护netCDF软件,主要用于存储多维科学数据。在地球科学领域使用较为广泛,大多数数值模式,卫星,雷达等数据格式通常为NetCDF格式。
MeteoAI
2019/07/22
7.7K1
将 UWP 中 CommandBar 的展开方向改为向下展开
发布于 2018-10-05 19:37 更新于 2018-10-16 08:57
walterlv
2020/02/10
1.7K0
基于netcdf库的nc文件读写
因为近期涉及到预报系统部署和后处理开发的任务,为了和预报模式更好的兼容,一些数据处理工作就交给Fortran来做了。把Fortran和C的NetCDF库API部分内容做了一个整理。
bugsuse
2020/04/21
4.6K0
Python将文件大写字母的格式后缀改为小写
  本文介绍基于Python语言,基于一个大文件夹,遍历其中的多个子文件夹,对于每一个子文件夹中的大量文件,批量将其文件的名称或后缀名中的字母由大写修改为小写的方法。
疯狂学习GIS
2023/10/24
4100
Python将文件大写字母的格式后缀改为小写
从xarray走向netCDF处理(四):合并与计算
前面有关xarray已经讲了3期了,介绍了数据索引,数据结构还有插值和掩膜。今天这是最后一期介绍用xarray处理nc数据了,打算聊一下如何做数据合并与计算。
MeteoAI
2019/07/22
12.1K3
python 将网卡改为嗅探功能
def pktPrint(pkt): if pkt.haslayer(Dot11Beacon): print '[+] Detected 802.11 Beacon Frame' elif pkt.haslayer(Dot11ProbeReq): print '[+] Detected 802.11 Probe Request Frame' elif pkt.haslayer(TCP): print '[+] Detected a TCP Packet' elif pkt.haslayer(DNS): print '[+] Detected a DNS Packet'
用户5760343
2019/07/31
1.2K0
python 将网卡改为嗅探功能
openwrt将LAN口改为WAN方法
牢骚 折腾了好几个好几个小时,终于搞好了。原因就是因为固件里面的端口序号和实际路由器后面的序号不一致,导致我的设置和物理连接对不上,这是个巨坑。 折腾需求 PS:我家里面有两条宽带,一条中国联通50M,一条中国移动50M。 折腾多WAN口(就是把LAN口改为WAN口)的主要目的是我想是默认上网走联通,部分IP(什么IP你懂的)通过静态路由走移动出去,因为移动的国际出口在中国香港,出国速度相对来说好一些。 折腾方法 1.依次点开-网络-交换机 2.首先要启用VLan,可
行 者
2018/03/26
16.7K0
openwrt将LAN口改为WAN方法
nestjs将底层由express改为fastify
nestjs默认使用的http框架为express,代码如下:// 输入代码内容import { NestFactory } from '@nestjs/core';import { AppModule } from './app.module';async function bootstrap() { const app = await NestFactory.create(AppModule); await app.listen(3000);}bootstrap();在这里将express替换为fa
挥刀北上
2023/05/24
8040
nestjs将底层由express改为fastify
从xarray走向netCDF处理(二):数据索引
xarray专题再次开讲,错过第一部分的可以先去补个课从xarray走向netCDF处理(一):数据结构及数据读取。 今天要介绍的就是xarray的索引功能,通过索引你可以对数据进行切片,从整体中提取你所关注的区域、高度或者时间。
自学气象人
2022/11/02
1.8K0
从xarray走向netCDF处理(二):数据索引
pip和pip3的区别_linux将文件改为只读
前言 装完python3后发现库里面既有pip也有pip3,不知道它们的区别,因此特意去了解了一下。
全栈程序员站长
2022/09/20
2.1K0
pip和pip3的区别_linux将文件改为只读

相似问题

容器中的左、右边距-10 in

25

不使用position:absolute删除上/左/右边距

10

边距在Chrome和Firefox上的左/右边距不同

10

CSS左对齐浮动,但限制在右边距。

32

如何理解同样有左/右边距的固定div?

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档