Google Chrome 使用 Flexbox 视口锚定扩展方向

2024-03-11

Google Chrome 中存在一个问题,当元素放置在带有adjacent弹性项目有space-between or center合理的内容。

这在 Firefox、IE11、Edge 或 Safari 中不是问题,因为元素始终向下扩展。

我很好奇:

  • Chrome 的行为是否遵循某些规范?如果有,是哪一个?
  • 如果不是,那为什么要在 Chrome 中这样做呢? (恕我直言,点击触发器随机消失在屏幕外是可怕的用户体验。)
  • Chrome 的行为可以以某种方式修改或禁用吗?例如。通过 CSS 还是元标记?

更新1:我已经提交了chromium bug tracker 上的问题#739860 https://bugs.chromium.org/p/chromium/issues/detail?id=739860如果可能的话,向 Chromium 开发人员寻求见解/解释。


下面是插入的两个示例。描述问题的完整测试套件可以在这支笔中找到:https://codepen.io/jameswilson/full/xrpRPg/ https://codepen.io/jameswilson/full/xrpRPg/我在本例中选择使用 SlideToggle,以便展开/折叠动作具有动画效果并且肉眼可见。详细信息标签也会发生相同的行为,但尚不支持跨浏览器,并且展开/折叠太卡顿了。

例 1:Chrome 对对齐 Flexbox 之间的空间的展开/折叠行为

$('button').click(function() {
  $(this).next().slideToggle();
})
body {
  margin: 30px;
  font-family: sans-serif;
}
aside,
aside div,
summary,
main,
button,
details p,
button + p {
  background: rgba(0,0,0,.09);
  border: none;
  padding: 20px;
  margin: 0;
}

.flexcontainer {
  display: flex;
}
aside {
  flex: 1;
  position: relative;
  max-width: 25%;
  background: mintcream;

  display: flex;
  flex-direction: column;
  position: relative;
}
aside.space-between {
  justify-content: space-between;
}
aside.center {
  justify-content: center;
}

main {
  flex: 3;
  position: relative;
  max-width: 75%;
  background: aliceblue;
  vertical-align: top;
  height: 100%;
}
main > * + * {
  margin-top: 20px;
}

button + p {
  display: none;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<section class="flexcontainer">
  <aside class="space-between">
    <div>Top Sidebar</div>
    <div>Bottom Sidebar</div>
  </aside>
  <main>
    <div>
      <button>slideToggle</button>
      <p>Other browsers: always expands downward.<br>
        Chrome: Should always expand downward because Top Sidebar is always visible.</p>
    </div>

    <div>
      <button>slideToggle (usually expands down)</button>
      <p>Other browsers: always expands downward.<br>
        Chrome: Should expand downward while Bottom Sidebar and Top Sidebar are both visible. But will expand upward if you scroll down far enough so that Top Sidebar is off-screen.</p>
    </div>
    
    <div>
      <button>slideToggle (usually expands down)</button>
      <p>Other browsers: always expands downward.<br>
        Chrome: Should expand downward while Bottom Sidebar and Top Sidebar are both visible. But will expand upward if you scroll down far enough so that Top Sidebar is off-screen.</p>
    </div>
  </main>
</section>

例 2:Chrome 中心对齐 Flexbox 的展开/折叠行为

$('button').click(function() {
  $(this).next().slideToggle();
})
body {
  margin: 30px;
  font-family: sans-serif;
}
aside,
aside div,
summary,
main,
button,
details p,
button + p {
  background: rgba(0,0,0,.09);
  border: none;
  padding: 20px;
  margin: 0;
}

.flexcontainer {
  display: flex;
}
aside {
  flex: 1;
  position: relative;
  max-width: 25%;
  background: mintcream;

  display: flex;
  flex-direction: column;
  position: relative;
}
aside.space-between {
  justify-content: space-between;
}
aside.center {
  justify-content: center;
}

main {
  flex: 3;
  position: relative;
  max-width: 75%;
  background: aliceblue;
  vertical-align: top;
  height: 100%;
}
main > * + * {
  margin-top: 20px;
}

button + p {
  display: none;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<section class="flexcontainer">
  <aside class="center">
    <div>Center Sidebar</div>
  </aside>
  <main>

    <div>
      <button>slideToggle (usually expands downwards)</button>
      <p>Other browsers: always expands downward.<br>
        Chrome: Usually expands downwards. Expands in both directions when the top-edge of the container scrolls out of the viewport.</p>
    </div>

    <div>
      <button>slideToggle</button>
      <p>Other browsers: always expands downward.<br>
        Chrome: Usually expands downwards. Expands in both directions when the top-edge of the container scrolls out of the viewport.</p>
    </div>

    <div>
      <button>slideToggle (usually expands downwards)</button>
      <p>Other browsers: always expands downward.<br>
        Chrome: Usually expands downwards. Expands in both directions when the top-edge of the container scrolls out of the viewport, but then resumes expanding downwards again when Center Sidebar scrolls out of view.</p>
    </div>
  </main>
</section>

将此代码添加到您的 Flex 容器中:

  • overflow-anchor: none

这将禁用 Chrome 中称为“滚动锚定”的功能,该功能会导致框向上扩展(修改后的代码笔 https://codepen.io/anon/pen/NgLBpv).


在 Chrome 中,展开框的向上/向下方向由视口中的滚动位置决定,而不是布局本身。

Chrome 针对这种行为采取了独特的方法,以改善用户体验。

基本上,它们将 DOM 元素绑定到当前滚动位置。屏幕上这个特定(“锚点”)元素的移动将确定对滚动位置的调整(如果有)。

他们将这种方法称为“滚动锚定”。该算法在此页面上进行了解释:https://github.com/WICG/ScrollAnchoring/blob/master/explainer.md https://github.com/WICG/ScrollAnchoring/blob/master/explainer.md

此行为目前是 Chrome 独有的,但是谷歌正在推动标准化。 https://wicg.github.io/ScrollAnchoring/

根据滚动锚定文档,应用overflow-anchor: none到适当的元素将禁用滚动锚定调整。

更多信息:

  • https://github.com/WICG/ScrollAnchoring/blob/master/explainer.md https://github.com/WICG/ScrollAnchoring/blob/master/explainer.md
  • https://bugs.chromium.org/p/chromium/issues/detail?id=739860 https://bugs.chromium.org/p/chromium/issues/detail?id=739860
  • https://hacks.mozilla.org/2019/03/scroll-anchoring-in-firefox-66/ https://hacks.mozilla.org/2019/03/scroll-anchoring-in-firefox-66/
  • 更改 CSS 弹性顺序会导致滚动 https://stackoverflow.com/q/56050959/3597276
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Google Chrome 使用 Flexbox 视口锚定扩展方向 的相关文章

  • iPhone 上的 Chrome 溢出空白页面上的内容(仅在新选项卡上,而不是重新加载)

    在 iOS Chrome 上 正文会在没有内容的新选项卡或页面上溢出 但如果重新加载页面 问题就会得到解决 它会给位于底部的任何元素 绝对或固定 带来问题 这是重现问题的代码
  • 为什么 Flexbox 会拉伸我的图像而不是保留纵横比?

    Flexbox 具有这种行为 它将图像拉伸到其自然高度 换句话说 如果我有一个带有子图像的 Flexbox 容器 并且我调整了该图像的宽度 则高度根本不会调整大小 并且图像会被拉伸 div display flex flex wrap wr
  • 当鼠标悬停在链接上时,如何在链接旁边创建弹出框?

    这是我想要实现的 我的网页上显示了两个超链接 a href http foo com foo a a href http bar com bar a 我还有两个对 div 链接的描述 div foo means foo div div ba
  • 单击按钮重复动画

    我想每次单击按钮时都重复动画 我尝试做某事像这样 https jsfiddle net 91raod7e const dist document querySelector dist document querySelector butto
  • jQuery stopPropagation 不起作用

    我正在使用以下内容选色器 https github com meta100 mColorPicker blob master javascripts mColorPicker js它工作正常 但是当我单击颜色选择器图标时 我不希望它冒泡到主
  • javascript中怪异模式的元素宽度?

    我一直在浏览所有流行的 js 库 但我找不到一个具有 DOM 元素宽度函数的库 该函数实际上可以解释 Internet Explorer 中的怪异模式 问题是 当启用怪异模式时 填充和边框不会计入宽度 据我所知 当省略 doctype 或将
  • :hover 状态在 iOS 上不会结束

    我有一个带有悬停状态的简单菜单
  • 未捕获的类型错误:无法读取未定义的属性“toLowerCase”

    我收到此错误 它源自 jquery 框架 当我尝试加载准备好的文档上的选择列表时 出现此错误 我似乎无法找到为什么会出现此错误 它适用于更改事件 但在尝试手动执行该函数时出现错误 未捕获的类型错误 无法读取未定义的属性 toLowerCas
  • 您能否确定 CSS 文件的范围,使其仅适用于给定元素的后代?

    给定一个 css 文件 有没有办法限制整个文件的范围 使其仅适用于给定元素内的元素 例如给定 div span class some element span div 有没有一种方法可以将整个 css 文件的范围应用于 容器 中的所有元素
  • 在 javascript 中访问 ajax POST 响应

    我正在从 javascript 函数发出 ajax POST 请求 function UpdateMetrics ajax type POST url MyHandler ashx Param1 value1 data contentTyp
  • 使用 bootstrap 将搜索图标放入文本框中

    我默认使用引导程序 文本框占据列的全宽 我想将搜索图标放在文本框的末尾 我的代码是这样的 div class container div class row div class form group col lg 4 div div div
  • 防止jsTree节点选择

    我正在使用 jsTree 插件列出文件系统中的文件夹 我需要防止用户在满足特定条件之前更改到另一个节点 下面的代码不会停止传播 我看到了一些使用其他插件的解决方案 但这是一个简单的任务 没有其他插件它一定是可能的 jstree on sel
  • 使用JQuery检查元素是否有边框?

    所以我正在玩 el css 尝试确定元素是否有边框 我用 css border style solid 设置边框 这是可行的 但实际上它设置了 4 种单独的样式 border right style border left style bo
  • 如何在每个组件完成加载后在 Angular 2 中运行 jquery 函数

    我已经尝试了所有生命周期挂钩 但无法实现所需的结果 我需要的结果是触发一个函数 该函数在加载每个元素 组件 后初始化用于单个页面上不同元素的许多 jquery 插件 假设你有这个结构 主页 滑块 小部件 产品旋转器 ETC 这些元素中的每一
  • 使用 jquery 通配符检查 cookie 名称

    我有一个生成动态 cookie 的表单 例如 webform 62 1234356 62 1234356 可以是任意数字 我需要使用一些通配符检查来检查名称以 webform 开头的 cookie 是否存在 下面不起作用 if cookie
  • 在 ASP.NET MVC 4 中使用 jQuery Mobile 1.3 面板时的双滚动条

    我无法弄清楚这一点 将以下代码放入布局页面并在浏览器中查看后 我将显示 2 个垂直滚动条 div div 遇到了类似的问题 并注意到只有在使用我的自定义主题时才出现这种问题 我以错误的顺序将自定义主题添加到页面 这导致了问题 正确的顺序是
  • jQuery 在 Chrome 下发现错误元素

    我使用 jQuery 迭代 HTML 表 并动态填充每行的行号 通过在文本框中填充行号 function updateRowNums myTable find tr each function index this find input i
  • 如何使用JQuery和Django(ajax + HttpResponse)?

    假设我有一个 AJAX 函数 function callpage ajax method get url abc data x 3 beforeSend function success function html IF HTTPRESPO
  • 限制 jQuery id 字符串吗?

    简而言之 我的问题是字符串在 jQuery 中作为可搜索 id 或可搜索内容有什么限制 更新 我得到了 ID 部分 但不是为什么我什至无法使用该字符串搜索 html 内容 对于任何愿意告诉我一个正则表达式来将模式从 MM dd yy HH
  • 禁用 Chrome 扩展中的“检查弹出”菜单项

    我想禁用我正在开发的扩展中的 检查弹出窗口 菜单选项 我怎样才能做到这一点 我现在可以这样做 因为我安装了一些禁用此选项的扩展 例如 klip me 的 发送到 Kindle The 检查弹出窗口 http developer chrome

随机推荐

  • Javascript document.getSelection

    我正在尝试使用 document getSelection 来选择我在所见即所得编辑器的文本区域中输入的文本 但只有当您选择文本区域之外的文本时 它才有效 不知道有没有办法让它选择文本区域内的文本 下面是所见即所得文本编辑器的文本区域 您需
  • 从按分钟计算的原始数据中按小时聚合 MySQL 数据

    我有一个表 table 1 其中包含每分钟的数据 如下所示 date time value 2015 06 05 18 00 00 222 663 2015 06 05 18 01 00 222 749 2015 06 05 18 02 0
  • Mac系统上检测框架使用情况?

    我想在 OSX 上开发示例框架 并要求在任何时候该框架只能由单个客户端使用 我不知道如何实现这一点 他们有 API 来检测框架正在使用的天气吗 我们可以为此使用一些与文件相关的 API 吗 我看过一个 Windows 示例 其中使用以下命令
  • 在 jQuery 1.8 中的自定义过滤器选择器中获取“匹配”对象

    作为参考 这里有一篇文章使用 jQuery 创建自定义过滤器选择器 http answers oreilly com topic 1055 creating a custom filter selector with jquery 介绍 对
  • 大型文本文件中的词频

    我试图读取一个大文本文件并输出其中的不同单词及其计数 到目前为止 我已经尝试了几次 这是迄今为止我想出的最快的解决方案 private static readonly char separators public IDictionary
  • 为什么分配给空列表有效但分配给空元组无效?

    这出现在最近的 PyCon 演讲 https youtu be MCs5OvhV9S4 t 42m17s 该声明 没有做任何有意义的事情 但它也不会抛出异常 我感觉这一定是由于拆包规则造成的 你可以做元组拆包 http openbookpr
  • Amazon S3 区域转移? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 如何将特定区域的 S3 存储桶的内容传输到另一个特定区域的另一个 S3 存储桶 如果可以的话请提供最简单的方法和详细的步骤 您可以使用AWS 控制台
  • Python 中的yield 和C# 中的yield 之间的区别

    有什么区别yieldPython 中的关键字和yieldC 中的关键字 C s yield return相当于Python的yield and yield break只是return在Python中 除了这些细微的差别之外 它们的目的基本相
  • 智能垂直流线布局

    我正在 JPanel 布局 Swing 中寻找以下行为 基本上它会以垂直方式排列组件 一个组件彼此排列 当组件无法垂直放入容器中时 应将下一个组件添加到新行中 这将动态地继续 根据需要添加新行 添加 3 个标签后 它看起来像这样 label
  • Spring ControllerAdvice和认证/授权异常处理

    在我的 Spring Boot 应用程序中 我有以下 Web 安全配置 Configuration EnableWebSecurity public class WebSecurityConfiguration extends WebSec
  • SQL 对密码进行哈希处理

    我使用 SQL 语句手动从旧数据导入到 MSSQL 当我从原始文本密码散列到数据库中的 MVC 5 密码 HASH 字段时 我得到有趣的字符 如何将哈希插入 mvc5 身份表 MVC 5 表也使用 nvarchar select HASHB
  • 嵌套文档字符串的 Doctest

    假设我有以下代码 def foo s A dummy function foo For example gt gt gt a This is a test string line 1 This is a test string line 2
  • 如何将元素的属性添加到角度指令

    我是角度新手 我想编写一个指令 其中包含我在 html 中使用时添加到其中的所有属性 例如 这是我的指令 use strict app directive province function compile return restrict
  • 重写 Doctrine 2 继承中的 inversedBy 映射

    我有以下实体 class Restaurant OneToMany targetEntity CollectionTime mappedBy restaurant protected collectionTimes OneToMany ta
  • Google应用程序脚本根据一列删除重复项

    下面的代码非常棒 可以删除重复项 但我想更改一件事 例如 如果我有 A 列并且它包含重复值 而 B 列包含唯一值 在这种情况下 该函数不会从 A 列中删除重复项因为它如何将 A 列和 B 列连接在一起然后删除重复项 我需要的是仅根据 A 列
  • LISP:关键字参数,提供-p

    目前我正在学习 Peter Seibel 的 Practical Common Lisp 在 实用 一个简单的数据库 一章中 http www gigamonkeys com book practical a simple database
  • QT:QXmlStreamReader 始终返回“文档提前结束”错误

    我对 Qt QXmlStreamReader 有奇怪的问题 我正在尝试解析简单的文档 注意 它是使用 QXmlStreamWriter 生成的
  • 使用 AAD 将 SAML 交换为 JWT

    我有一个内部应用程序 允许用户使用 Azure AD 登录 身份验证时 将返回 SAML 断言 但是 应用程序进行的某些调用需要 JWT 用户登录时获取 JWT 的最佳方式是什么 或者有没有办法让我将 SAML 换成 JWT 免责声明 我不
  • EventSetter - Visual Studio 设计器中的 XAML 错误

    我已经使用 XAML 完成了 TreeView 但现在我想使用隐藏代码来管理事件 HierarchicalDataTemplate 包含一个图像 我需要捕获图像上的 MouseEnter MouseLeave 事件 我已经尝试过这样的方式
  • Google Chrome 使用 Flexbox 视口锚定扩展方向

    Google Chrome 中存在一个问题 当元素放置在带有adjacent弹性项目有space between or center合理的内容 这在 Firefox IE11 Edge 或 Safari 中不是问题 因为元素始终向下扩展 我