Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >查找第一个可滚动的父级

查找第一个可滚动的父级
EN

Stack Overflow用户
提问于 2016-03-11 12:06:55
回答 8查看 42.9K关注 0票数 74

在这种情况下,我需要将一个元素滚动到视口中。问题是我不知道哪个元素是可滚动的。例如,在Portrait中,body是可滚动的,而在Landscape中,它是另一个元素(并且有更多的情况会改变可滚动元素)

现在的问题是,给定一个需要滚动到视区中的元素,找到它的第一个可滚动父元素的最佳方法是什么?

我已经设置了一个演示here。使用该按钮,您可以在两种不同的情况之间切换

代码语言:javascript
运行
AI代码解释
复制
<div class="outer">
    <div class="inner">
        <div class="content"> 
            ...
            <span>Scroll me into view</span>
        </div>
    </div>
</div>

正文是可滚动的或.outer

有什么建议吗?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2016-03-11 12:26:26

只需检查滚动条是否可见,如果看不到,请查看父级。

代码语言:javascript
运行
AI代码解释
复制
function getScrollParent(node) {
  if (node == null) {
    return null;
  }

  if (node.scrollHeight > node.clientHeight) {
    return node;
  } else {
    return getScrollParent(node.parentNode);
  }
}
票数 77
EN

Stack Overflow用户

发布于 2017-03-01 23:11:59

这是一个纯JS端口的jQuery UI scrollParent方法,即cweston spoke of。我选择了这个,而不是接受答案的解决方案,如果还没有内容溢出,它就不会找到滚动父对象。

我的端口的一个不同之处在于,如果找不到具有正确的CSS overflow属性值的父元素,我将返回<body>元素。JQuery UI,则返回document对象。这很奇怪,因为像.scrollTop这样的值可以从<body>中检索,但不能从document中检索。

代码语言:javascript
运行
AI代码解释
复制
function getScrollParent(element, includeHidden) {
    var style = getComputedStyle(element);
    var excludeStaticParent = style.position === "absolute";
    var overflowRegex = includeHidden ? /(auto|scroll|hidden)/ : /(auto|scroll)/;

    if (style.position === "fixed") return document.body;
    for (var parent = element; (parent = parent.parentElement);) {
        style = getComputedStyle(parent);
        if (excludeStaticParent && style.position === "static") {
            continue;
        }
        if (overflowRegex.test(style.overflow + style.overflowY + style.overflowX)) return parent;
    }

    return document.body;
}
票数 52
EN

Stack Overflow用户

发布于 2018-03-09 04:38:11

大多数投票的答案并不是在所有情况下都有效,即使没有滚动条,scrollHeight > clientHeight也可以是true

我找到了这个主要的解决方案https://github.com/olahol/scrollparent.js/blob/master/scrollparent.js#L13

^全部归功于编写代码的https://github.com/olahol

将其重构为es6

代码语言:javascript
运行
AI代码解释
复制
export const getScrollParent = (node) => {
  const regex = /(auto|scroll)/;
  const parents = (_node, ps) => {
    if (_node.parentNode === null) { return ps; }
    return parents(_node.parentNode, ps.concat([_node]));
  };

  const style = (_node, prop) => getComputedStyle(_node, null).getPropertyValue(prop);
  const overflow = _node => style(_node, 'overflow') + style(_node, 'overflow-y') + style(_node, 'overflow-x');
  const scroll = _node => regex.test(overflow(_node));

  /* eslint-disable consistent-return */
  const scrollParent = (_node) => {
    if (!(_node instanceof HTMLElement || _node instanceof SVGElement)) {
      return;
    }

    const ps = parents(_node.parentNode, []);

    for (let i = 0; i < ps.length; i += 1) {
      if (scroll(ps[i])) {
        return ps[i];
      }
    }

    return document.scrollingElement || document.documentElement;
  };

  return scrollParent(node);
  /* eslint-enable consistent-return */
};

您可以像这样使用它:

代码语言:javascript
运行
AI代码解释
复制
const $yourElement = document.querySelector('.your-class-or-selector');
getScrollParent($yourElement);
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35939886

复制
相关文章
cmake/gcc:strip缩减程序体积
版权声明:本文为博主原创文章,转载请注明源地址。 https://blog.csdn.net/10km/article/details/83212925
10km
2019/05/25
3.9K0
python数据类型-列表创建和操作
从字符串取数据的时候要分片,也就是切割。通过索引的形式,而这里用字符串取值的时候 每个角色取值的名字 长短不一,所以几个字符代表名字 ,是不可以的,血的值 也是经常变换的 所以显然字符串该被淘汰了。
py3study
2020/01/09
9500
linux LVM逻辑卷的创建,扩容,缩减和删除
LVM是逻辑盘卷管理(Logical Volume Manager)的简称,它是Linux环境下对磁盘分区进行管理的一种机制,LVM是建立在硬盘和分区之上的一个逻辑层,来提高磁盘分区管理的灵活性。
用户4877748
2020/07/22
6.9K0
linux  LVM逻辑卷的创建,扩容,缩减和删除
Linux使用lvresize扩展或缩减lv大小
2.创建lv,名称是lv_u01,大小10g,从vg_jydb中划分空间,这里的vg_jydb是vg的名称。
Alfred Zhao
2022/05/06
2.2K0
使用Swift操作NSDate类型基础
  时间类型是我们在处理业务的时候使用非常频繁的一个数据类型。下面我们看一下时间NSDate的基本使用方法。
MJ.Zhou
2022/05/07
6710
使用Swift操作NSDate类型基础
PCS7 过程标签类型批量创建程序演示
PCS7的项目重在前期的布局,编辑好模板程序,设置好相应引脚的显隐、参数等,后续会减少大量工作量。熟练运用IEA过程标签类型导入导出,在组态大型的PCS7项目时会有很大优势。
剑指工控
2021/11/09
1.6K0
【应用安全】 使用Java创建和验证JWT
Java对JWT(JSON Web Tokens)的支持过去需要大量的工作:广泛的自定义,几小时的解析依赖关系,以及仅用于组装简单JWT的代码页。不再!
架构师研究会
2019/05/13
2.3K0
【应用安全】 使用Java创建和验证JWT
使用cargo创建rust程序并运行
我们按照文档在路径中打开命令行终端 cargo new world_hello 我们现在就可以运行了 cd .\world_hello\ cargo run 可以看到输出了Hello, world 我们用vscode打开 可以对我们的代码进行少许更改,然后再次运行 fn main() { println!("world, Hello!"); } 再次运行 cargo run 可以看到我们的修改生效
阿超
2022/08/21
4100
使用cargo创建rust程序并运行
006:Redis-Set集合类型操作使用
所谓的集合好比一个乾坤袋,什么东西都可以放进去,但是每个集合中的各个元素不能重复。
李玺
2021/11/22
3570
006:Redis-Set集合类型操作使用
Ubuntu根分区使用Lvm扩容
ubuntu 根分区剩余空间不足,影响工作,因此通过lvm工具对根文件系统进行扩容
全栈程序员站长
2022/08/31
3.8K0
Ubuntu根分区使用Lvm扩容
使用TortoiseGit操作分支的创建与合并
点击右键选择TortoiseGit,选择Create Branch…,在Branch框中填写新分支的名称(若选中”switch to new branch”则直接转到新分支上,省去第二步),点击OK按钮:
用户1518699
2018/09/12
2.2K0
使用TortoiseGit操作分支的创建与合并
【安全】XSS 类型
后面会把前端进阶的课程内容都总结一遍。有些都是很常见的知识,但是为了梳理自己的知识树,所以尽量模糊的地方都会记录
神仙朱
2019/11/18
1K0
【C 语言】指针数据类型 ( 指针类型变量 | 使用 * 操作内存 )
测试 指针 变量占用的内存空间大小 : 定义一个 int * 指针类型变量 , 使用 sizeof 函数 获取该变量的大小 ;
韩曙亮
2023/03/29
6860
【C 语言】指针数据类型 ( 指针类型变量 | 使用 * 操作内存 )
Nova创建实例类型
创建一个实例类型名为:至尊型,ID为zzx,内存为8192M,系统盘为50G,CPU为8核,临时磁盘为:1G
院长技术
2021/02/19
1.1K0
Nova创建实例类型
004.LVM缩减
1 减少文件的大小一定需要按照上面提高的4个规定动作顺序来做,在缩减LV大小前,首先要缩减filesystem的大小,否则将导致文件系统破坏等恶劣影响。
木二
2019/07/26
4520
Android如何缩减APK包大小
代码 保持良好的编程习惯,不要重复或者不用的代码,谨慎添加libs,移除使用不到的libs。 使用proguard混淆代码,它会对不用的代码做优化,并且混淆后也能够减少安装包的大小。 native code的部分,大多数情况下只需要支持armabi与x86的架构即可。如果非必须,可以考虑拿掉x86的部分。 资源 使用Lint工具查找没有使用到的资源。去除不使用的图片,String,XML等等。 assets目录下的资源请确保没有用不上的文件。 生成APK的时候,aapt工具本身会对png做优化,但是在此之前
六月的雨
2018/05/14
1K0
Pandas类型操作
官网地址:https://pandas.pydata.org/docs/reference/api/pandas.to_numeric.html
皮大大
2023/08/25
2870
如何使用 Flutter 创建桌面应用程序[Flutter专题7]
开发人员可以选择编写多种类型的应用程序:控制台应用程序、移动应用程序、Web 应用程序和桌面应用程序。
徐建国
2021/11/30
4.7K0
如何使用 Flutter 创建桌面应用程序[Flutter专题7]
【Rust日报】2021-11-17 Neon - 使用 Rust 创建内存和类型安全的 Node.js 模块
Neon除了内存和类型安全之外,应该在 Node.js 中使用 Rust Embedding 的原因还有很多。
MikeLoveRust
2021/11/22
5940
点击加载更多

相似问题

如何使用根缩减程序配置存储

10

为相似类型的操作创建一个缩减程序

120

Python:使用`copyreg`为已有缩减程序的类型定义缩减程序

11

使用生成类型提供程序创建多个根类型

10

Redux操作不触发缩减程序

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

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