无法滚动到溢出容器的弹性项目的顶部

2024-02-08

在尝试使用 Flexbox 制作有用的模式时,我发现似乎是浏览器问题,并且想知道是否有已知的修复或解决方法 - 或者关于如何解决它的想法。

我试图解决的问题有两个方面。首先,使模态窗口垂直居中,这按预期工作。第二个是让模态窗口在外部滚动,因此整个模态窗口滚动,而不是其中的内容滚动(这样您就可以拥有可以扩展到模态边界之外的下拉菜单和其他 UI 元素 -例如自定义日期选择器等)

但是,当将垂直居中与滚动条结合使用时,模式的顶部可能会变得无法访问,因为它开始溢出。在上面的示例中,您可以调整大小以强制溢出,这样您就可以滚动到模式的底部,但不能滚动到顶部(第一段被截断)。

.modal-container {
  position: fixed;
  top: 0;
  left: 0;
  bottom: 0;
  right: 0;
  background: rgba(0, 0, 0, 0.5);
  overflow-x: auto;
}
.modal-container .modal-window {
  display: -ms-flexbox;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  /* Optional support to confirm scroll behavior makes sense in IE10
  //-ms-flex-direction: column;
  //-ms-flex-align: center;
  //-ms-flex-pack: center; */
  height: 100%;
}
.modal-container .modal-window .modal-content {
  border: 1px solid #ccc;
  border-radius: 4px;
  background: #fff;
  width: 100%;
  max-width: 500px;
  padding: 10px
}
<div class="modal-container">
    <div class="modal-window">
        <div class="modal-content">
            <p class="p3">Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.</p>
            <p class="p3">Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.</p>
            <p class="p3">Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.</p>
        </div>
    </div>
</div>

这会影响(当前)Firefox、Safari、Chrome 和 Opera。有趣的是,如果您在 IE10 供应商前缀 CSS 中进行注释,它在 IE10 中的行为确实正确 - 我还没有在 IE11 中进行测试,但假设该行为与 IE10 的行为匹配。

这是示例代码的链接(高度简化)

https://jsfiddle.net/dh9k18k0/2/ https://jsfiddle.net/dh9k18k0/2/


问题

Flexbox 使居中变得非常容易。

通过简单地申请align-items: center and justify-content: center对于弹性容器,您的弹性项目将垂直和水平居中。

但是,当 Flex 项目大于 Flex 容器时,此方法会出现问题。

正如问题中所指出的,当弹性项目溢出容器时,顶部将变得无法访问。

对于水平溢出,左侧部分将变得不可访问(或者在 RTL 语言中,右侧部分将无法访问)。

这是一个 LTR 容器的示例,其中包含justify-content: center和三个弹性项目:

有关此行为的解释,请参阅此答案的底部。


解决方案#1

要解决此问题,请使用Flexbox 自动边距 https://stackoverflow.com/a/33856609/3597276, 代替justify-content.

With auto边距,溢出的弹性项目可以垂直和水平居中,而不会失去对其任何部分的访问。

因此,不要在 Flex 容器上使用以下代码:

#flex-container {
    align-items: center;
    justify-content: center;
}

在弹性项目上使用此代码:

.flex-item {
    margin: auto;
}

修改后的演示 https://jsfiddle.net/dh9k18k0/9/


解决方案#2(尚未在大多数浏览器中实现)

Add the safe关键字对齐规则的值,如下所示:

justify-content: safe center

or

align-self: safe center

来自CSS 框对齐模块规范 https://www.w3.org/TR/css-align-3/:

4.4.溢出对齐:safe and unsafe关键词和 滚动安全 限制 http://www.w3.org/TR/css-align-3/#overflow-values

当[flex item]大于[flex container]时,它将 溢出。如果在这种情况下遵循某些对齐模式,可能会 导致数据丢失:例如,如果侧边栏的内容是 居中,当它们溢出时,它们可能会将部分盒子发送过去 视口的起始边缘,无法滚动到该边缘。

为了控制这种情况,溢出对齐模式可以是 明确指定。Unsafe对齐方式遵循指定的 溢出情况下的对齐模式,即使会导致数据丢失, 尽管safealignment 改变溢出时的对齐方式 情况,以避免数据丢失。

默认行为是将对齐主题包含在 可滚动区域,尽管在撰写本文时此安全功能是 尚未实现。

safe

如果 [flex item] 的大小溢出 [flex container],则 [flex item] 改为对齐,就像对齐模式一样 [flex-start].

unsafe

无论 [flex item] 和 [flex 容器],遵循给定的对齐值。

注意:盒子对齐模块可用于多个盒子布局模型,而不仅仅是 Flex。因此,在上面的规范摘录中,括号中的术语实际上表示“对齐主题”、“对齐容器”和“start”。我使用了 Flex 特定的术语来将注意力集中在这个特定问题上。


MDN 对滚动限制的解释:

弹性项目 考虑因素 https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Flexible_Box_Layout/Using_CSS_flexible_boxes#Flex_item_considerations

Flexbox 的对齐属性可以“真正”居中,与其他对齐属性不同 CSS 中的居中方法。这意味着弹性项目将保留 居中,即使它们溢出了弹性容器。

然而,如果它们溢出超过了,这有时可能会出现问题 页面的上边缘,或左边缘 [...],如 即使那里有内容,您也无法滚动到该区域!

在未来的版本中,对齐属性将扩展为具有 也是一个“安全”选项。

目前,如果这是一个问题,您可以使用边距来实现 居中,因为他们会以“安全”的方式做出反应,并在以下情况下停止居中: 他们溢出了。

而不是使用align-属性,只需输入auto边距 您想要居中的弹性项目。

而不是justify-属性,将自动边距放在外面 Flex 容器中第一个和最后一个 Flex 项目的边缘。

The auto边距将“弯曲”并占据剩余空间, 当有剩余空间时将弹性项目居中,并切换 不时恢复正常对齐。

但是,如果您想替换justify-content和 在多行 Flexbox 中基于边距的居中,您可能无法使用 运气好,因为您需要将边距放在第一个和最后一个弹性项目上 在每行上。除非你能提前预测哪些项目会 最终在哪一行,您无法可靠地使用基于边距的居中 主轴更换justify-content财产。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法滚动到溢出容器的弹性项目的顶部 的相关文章

  • 更改javascript nodejs中所有页面的href url

    我已经实现了具有多种语言下拉菜单的引导导航栏 当我选择语言时 它将翻译页面 如何更改其他页面的 url 和按钮文本 当我选择french 将所有网址更改为 fr about and fr contact 如何使用 JavaScript 进行
  • 从顶部开始在同一水平线上显示同一行中的两个 div

    这是我的代码 floating box display inline block width 150px margin 10px border 3px solid 73AD21 after box border 3px solid red
  • 古老的“字幕”标签的替代品?

    marquee 标签的标准等效项是什么 我正在寻找 HTML C asp NET 或 ASPX jquery java 脚本的解决方案 marquee 标签未包含在标准中 因为它是 视觉 标签 而不是 语义 标签 因此 您想要的任何语言都没
  • 在 Android 上禁用标注(上下文菜单)

    在网络应用程序中 我需要禁用移动浏览器在触摸并按住 长按 触摸目标 例如 img 或链接 我已经在使用了 webkit touch callout none 它在 iPhone 和 iPad 上运行良好 但似乎不适用于 Android 在
  • html 电子邮件内的背景图像 css - Gmail 不支持

    我想向我的用户发送如下所示的带有背景图像 css 的 html 正文电子邮件 div style width 500px height 1000px background color black background image none
  • 将鼠标悬停在原点时会触发translateY()

    当您将光标移动到按钮底部时 是否可以无限期地不触发动画 它看起来是这样的 gif https i stack imgur com QwdHW gif and codepen https codepen io jaeyson pen GwwJ
  • VueJS 中数据无法正确显示

    我的 VueJS 代码有一个小问题 在 输出 压缩的 GS1 数字链接 URI 部分中 When there is no result it should have nothing display like this I have remo
  • 固定 div 位于居中 div 旁边

    我有一个网页 其中有可滚动的内容 此内容包含在 content 内 位于页面的中心 现在我希望导航栏出现在内容左侧 50 像素处 该栏应具有固定位置 不应滚动 这是我到目前为止所尝试过的 nav position fixed top 50
  • 如何在Yii框架中向Form添加类?

    我在 Yii 中有一个表单 我想向该表单添加一个类
  • 按下回车键时不刷新页面

    我遇到了一些问题 只要表单中有输入 回车键就会触发页面刷新 下面的代码 如果按下回车并且文本区域 input 中没有输入任何文本 则不会刷新页面 但是如果按下回车并且 input中有输入或者光标位于文本区域 我不确定是什么触发了它 因为 s
  • 如何使使用 css 调整大小的图像在 IE 中看起来不错?

    当使用 css 宽度 高度或属性宽度 高度缩放图像时 IE6 和 IE7 无法很好地缩放网页中的图像 我不确定它默认使用哪种算法 但这不好 在这些浏览器中缩放时 缩放图像会显示锯齿伪影 幸运的是 有一种方法可以通过简单的 css 规则强制
  • 合并 2 个大型 CSS 文件的有效方法

    我正在寻找一个可以合并 2 个大型 CSS 文件的工具 到目前为止我尝试过的所有方法 例如CSSMerge 都没有成功 其中一些只是随机删除属性 其他人则因 webkit 和 moz 等非标准属性而窒息 并给我错误 我还需要保留每条规则大小
  • 使用 JavaScript 移动页面上的按钮

    我的按钮可以移动 但奇怪的是 我无法弄清楚偏移是否有问题 我希望我的按钮随着鼠标光标移动 但现在它的移动方式不是我想要的 有时它会消失 另外 创建的新按钮是重叠的 我不知道如何解决这个问题并拥有更好的外观 var coorA var coo
  • 如何停止TinyMCE删除span标签?

    在我的工作中 前一位程序员决定使用公司网站上精彩的TinyMCE 我遇到的数千个问题之一是 如果原文有的话span标签 当我按下退格键删除一行 p仅标签 全部span标签已从文本中删除 这个错误比另一个错误更具体 我可以删除anything
  • 具有 100% 高度行和 Internet Explorer 9 的表格

    我有以下示例 div style height 150px background color AAAAFF div
  • 表单发布请求并存储收到的数据

    我有一个非常简单的表单 在提交时发出发布请求
  • 使用 Javascript 设置 cookie [重复]

    这个问题在这里已经有答案了 我正在尝试构建我的第一个移动应用程序 它需要连接到我的 mysql 数据库并使用 json 返回数据 这很好 目前我有一个登录系统 一旦确定用户名和密码存在 它就会返回一条成功消息 对于下一步 我想在我的页面上使
  • 使用 CSS 的响应式图像

    我发现调整图像大小以使其具有响应能力很棘手 我正在开发一个 php 应用程序来自动将网站转换为响应式版本 我有点被图像困住了 我已经成功地为网站上的每个图像添加了一个包装类 并且可以很好地调整图像的大小 我的问题在于自然小于窗口的图像 例如
  • 如何从浏览器向服务器发送“页面将关闭”消息?

    我想向每个 html 文档添加一个脚本 JavaScript 该脚本向服务器发送两条消息 页面确实打开了 页面将关闭 此消息包含页面打开的时间 打开消息应在文档加载时 或加载完成时 发送 这是简单的部分 The close message
  • Webpack 4:如何使用 LESS 获取 CSS 源映射?

    多年来我一直在尝试让 CSS 源映射在 webpack 中工作 但没有成功 我不确定链条中哪里出了问题 我希望有人能指出我正确的方向 这是发生的事情 行号是错误的 实际上文件名也是错误的 main less只是包含一堆 import也就是说

随机推荐