Flex 项目在 Chrome 和 IE11 中重叠

2023-11-24

我正在尝试创建一个固定高度的 Flexbox 布局,当内部内容太大时,它会滚动内部内容。

另外,如果内容不会导致滚动,我想修复一个带有按钮的 div 到容器底部。

我有一个在 Firefox 中完美运行的布局,但在 Chrome 中,当底部按钮 div 大到足以导致滚动时,它会导致底部按钮 div 夹在内容顶部。

这是 Firefox 中正确呈现的布局:

Firefox proper rendering

这是它在 Chrome 中渲染不正确的方式:

Chrome improper rendering

此外,如果没有足够的内部内容来导致滚动,它应该这样做:

Small content rendering

.container {
  height: 150px;
  width: 300px;
  display: flex;
  flex-direction: column;
  overflow-y: auto;
  border: 1px solid #000;
  padding: 4px;
}

.options {
  display: flex;
  flex-direction: row;
  flex-wrap: wrap;
}

.spacer {
  flex: 1 1 auto;
}

.buttons {
  display: flex;
  flex-direction: row;
  justify-content: space-between;
}
<div class="container">

  <div class="options">
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
  </div>

  <div class="spacer"></div>

  <div class="buttons">
    <input type="button" value="Cancel">
    <input type="button" value="Save">
  </div>

</div>

https://jsfiddle.net/tdghqyuu/1/


Solution

将其添加到您的代码中:

.container > * {
  flex-shrink: 0; 
}

解释

弹性项目的初始设置,根据弹性盒规格, 应该弯曲收缩:1。这意味着柔性物品可以收缩,以避免溢出容器。

Chrome 和 IE11 似乎遵守了这一准则。

其他浏览器,例如 Firefox、Edge 和 Safari,seem具有flex-shrink set to 0默认情况下。

另一方面,这可能与flex-shrink。该问题可能与默认值有关min-height and min-width弹性项目的设置。 (看这里:为什么弹性项目不会缩小到超过内容大小?)

或者也许是两者的结合。这实际上取决于浏览器。

事实上,浏览器的实现各不相同。这就是为什么你必须进行测试。

规格初始设置并不完全可靠,因为

  1. 浏览器代表可以做任何他们想做的事情的独立实体,并且
  2. 使用“干预措施”。

干预措施

干预是指当用户代理决定稍微偏离 标准化的行为,以提供极大增强的用户体验 经验。

换句话说,浏览器会自行提供它认为最适合用户的设置,而不管规范指南如何。

Chrome 似乎经常这样做。这里有些例子:

  • 为什么弹性项目不会缩小到超过内容大小?(参见浏览器渲染说明)
  • 伪元素未在左上角对齐
  • Google Chrome 使用 Flexbox 视口锚定扩展方向
  • 如何使图像保留在 CSS 网格容器的行中?
  • 当父母没有定义身高时,为什么百分比身高对孩子起作用?

有一点是肯定的:如果你禁用flex-shrink,您的布局将适用于所有浏览器。将其添加到您的代码中:

.container > * {
  flex-shrink: 0; 
}

.container>* {
  flex-shrink: 0;
}

.container {
  height: 150px;
  width: 300px;
  display: flex;
  flex-direction: column;
  overflow-y: auto;
  border: 1px solid #000;
  padding: 4px;
}

.options {
  display: flex;
  flex-direction: row;
  flex-wrap: wrap;
}

.buttons {
  display: flex;
  flex-direction: row;
  justify-content: space-between;
  margin-top: 10px;
  /* new; for demo only */
}
<div class="container">

  <div class="options">
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
  </div>

  <div class="buttons">
    <input type="button" value="Cancel">
    <input type="button" value="Save">
  </div>

</div>

您可能还想考虑仅将滚动条移动到选项框,然后您就真正将按钮固定到了屏幕底部。对您的代码进行此调整:

.container {
  height: 150px;
  width: 300px;
  display: flex;
  flex-direction: column;
  /* overflow-y: auto; */
  border: 1px solid #000;
  padding: 4px;
}

.options {
  display: flex;
  flex-direction: row;
  flex-wrap: wrap;
  overflow-y: auto; /* NEW */
  flex: 1;          /* NEW; may be necessary for overflow to work in some browsers */

}

.container > * {
  flex-shrink: 0;
}

.container {
  height: 150px;
  width: 300px;
  display: flex;
  flex-direction: column;
  /* overflow-y: auto; */
  border: 1px solid #000;
  padding: 4px;
}

.options {
  display: flex;
  flex-direction: row;
  flex-wrap: wrap;
  overflow-y: auto; /* NEW */
  flex: 1;          /* NEW; may be necessary for overflow to work in some browsers */
}

.buttons {
  display: flex;
  flex-direction: row;
  justify-content: space-between;
  margin-top: 10px; /* new; for demo only */
}
<div class="container">

  <div class="options">
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
    <div class="option">
      <input type="checkbox"> Option
    </div>
  </div>

  <div class="buttons">
    <input type="button" value="Cancel">
    <input type="button" value="Save">
  </div>

</div>

另外,我删除了您拥有的间隔元件。当有多种干净的方法可以在弹性容器中的项目之间创建空间时,这似乎没有必要。

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

Flex 项目在 Chrome 和 IE11 中重叠 的相关文章

随机推荐

  • 如何将答案转换为小数点后两位

    这是我的代码 我想要的输出是txtA Text and txtB Text保留两位小数 Public Class Form1 Private Sub btncalc Click ByVal sender As System Object B
  • 为什么 EF 5.x 对表使用复数名称?

    我对 ORM 框架 例如 Hibernate 甚至 Entity Framework 3 0 有一些经验 默认情况下 这些框架使用表的单数名称 例如 类 User 将映射到表 User 但是 当我使用 Visual Studio 2012
  • 使具有不可选取字段的对象可选取的正确方法是什么?

    对我来说 我所做的就是检测不可选取的内容并将其放入字符串中 我想我也可以将其删除 但随后它会错误地告诉我该字段不存在 但我宁愿让它存在但成为字符串 但我想知道是否有一种不那么老套 更正式的方式来做到这一点 我当前使用的代码 def make
  • Windows 上的 /usr/lib/ 相当于什么?

    我正在创建一个依赖于 libxml2 的跨平台程序 我不想在应用程序的 Windows 端口上使用 POSIX 环境 例如 Cygwin 或 MSYS 我计划使用 Javascript Host for Windows 和 nmake 创建
  • Java 中的函数式数据结构

    Java标准库是否有功能更新的功能数据结构 例如不可变集 列表等 函数式java has 集合 列表以及更多有趣的抽象
  • 如何使用 Java 中的 ResultSet 获取行数?

    我正在尝试创建一个简单的方法 该方法接收 ResultSet 作为参数并返回一个包含 ResultSet 行数的 int 这是一种有效的方法吗 int size 0 try while rs next size catch Exceptio
  • 在 matplotlib 中向辅助 y 轴添加 y 轴标签

    我可以使用以下命令向左侧 y 轴添加标签plt ylabel 但如何将其添加到辅助 y 轴 table sql read frame query connection table 0 plot color colors 0 ylim 0 1
  • Android Studio 错误:无法翻译 setText 中的字符串文字

    这是我的第一个应用程序 我遇到了一些麻烦 当我运行该应用程序时 它崩溃了 我不知道如何修复此错误 public class MainActivity extends AppCompatActivity TextView outputBott
  • 创建“灵活”的 XML 模式

    我需要为 XML 文件创建一个非常灵活的架构 它必须满足以下要求 验证我们需要存在的一些元素 并了解其确切结构 验证一些可选元素 我们知道其确切结构 允许任何其他元素 以任意顺序允许它们 快速示例 XML
  • 蒙戈服务崩溃了。需要查找崩溃原因

    今天早上我在我的服务器上发现 mongo 出现以下错误 System restart required You have mail ubuntu ip xxx xx xx xx mongo MongoDB shell version 2 4
  • Manifest.json 意外令牌

    你好 我将一个反应 表达项目推到了heroku https polar oasis 57801 herokuapp com 并在控制台中收到以下错误 Chrome 控制台错误消息 我尝试查找此错误 似乎我需要更改 manifest json
  • 将数组或列表传递给 @Pathvariable - Spring/Java

    我正在 JBoss Spring 中做一个简单的 获取 我希望客户端在 url 中向我传递一个整数数组 我如何在服务器上进行设置 并显示客户端应该发送消息吗 这就是我现在所拥有的 RequestMapping value test firs
  • multiprocessing.Manager 嵌套共享对象不适用于队列[重复]

    这个问题在这里已经有答案了 Python 文档multiprocessing模块状态 3 6版本更改 共享对象可以嵌套 例如 共享容器对象 例如共享列表 可以包含其他共享对象 这些对象都将由共享容器对象管理和同步 SyncManager 这
  • 在 JavaScript 中定义“嵌套”对象构造函数?

    是否可以在另一个对象中定义一个对象 我在想这样的事情 function MyObj name this name name function EmbeddedObj id this id id 然后我可以创建一个 EmbeddedObj 如
  • Rails 4 中的 form_for 参数数量错误

    我正在使用 form for 标签 它在 Rails 3 0 4 环境中工作 但是当我尝试将项目更新到 Rails 4 时 出现以下错误 参数数量错误 3 对 2 这是我的代码 尝试删除可能试图改变视图中的内容的内容 就我而言 问题在于cl
  • 如何将计算列添加到我的 EF4 模型?

    给定 MS SQL 2008 中的 用户 表和 登录 表 CREATE TABLE dbo User User UserID int IDENTITY 1000 1 NOT NULL UserName varchar 63 NOT NULL
  • 如何解决读取问候语数据包时出现错误?

    我正在尝试连接到 NetBeans 中的服务器 我写的代码如下 运行此代码会返回此错误 wlecome Warning mysqli connect MySQL server has gone away in C xampp htdocs
  • C 和 C++ 中的 static 和 extern 全局变量

    我制作了 2 个项目 第一个项目使用 C 语言 第二个项目使用 C 语言 两者都具有相同的行为 C项目 header h int varGlobal 7 main c include
  • 在 C++ 中,如何在运行时获取给定元素的模板类型?

    我正在设计一个简单的Array类能够保存任何类型的对象 就像一个向量可以在一个对象中保存多种类型的数据 这是为了学习目的 我有一个名为的空基类Container class Container 还有一个名为的模板化子类Object temp
  • Flex 项目在 Chrome 和 IE11 中重叠

    我正在尝试创建一个固定高度的 Flexbox 布局 当内部内容太大时 它会滚动内部内容 另外 如果内容不会导致滚动 我想修复一个带有按钮的 div 到容器底部 我有一个在 Firefox 中完美运行的布局 但在 Chrome 中 当底部按钮