Flex 项目不考虑边距和框大小:border-box

2023-11-24

我正在尝试实现标准 CSS 中的一件简单的事情。

假设我有一个包含 3 列的网格系统,box-sizing: border-box.

这意味着我将容纳 3 个盒子,并留出一定的边距,以缩小尺寸以容纳最多 3 个盒子。

但当我尝试用 FLEXBOX 做到这一点时,很痛苦!

所以如果我有 divflex: 1 1 33.33%; margin: 10px;我原以为每行有 3 个盒子......但如果我使用flex-wrap: wrap,不会缩小以容纳 3 个盒子。

这是一个例子.. 这个想法是第二行将有 3 个盒子在一行中,第四个盒子将在最后一行。

Thanks

https://jsfiddle.net/mariohmol/pbkzj984/14/

.horizontal-layout {
  display: flex;
  flex-direction: row;
  width: 400px;
}

header>span {
  /* flex: 1 1 100%; */
  /* flex: 1 0 100%; */
  flex: 1 1 33.33%;
  margin: 10px;
}

header>.button {
  background-color: grey;
}

header>.app-name {
  background-color: orange;
}

header#with-border-padding {
  flex-wrap: wrap;
}

header#with-border-padding>span {
  flex: 1 1 33.33%;
  box-sizing: border-box;
  /* this is not useful at all */
}

header#with-border-padding>.button {
  border: 1px solid black;
  padding-left: 5px;
}
NO flex-wrap: wrap, so it not respects the flex 33% <br/>
<header class="horizontal-layout">
  <span class="button">A</span>
  <span class="app-name">B</span>
  <span class="button">C</span>
  <span class="button">D</span>
</header>
<br/><br/> WITH flex-wrap: wrap : I expect to have 3 boxes in first row and D box in a down<br/>
<header id="with-border-padding" class="horizontal-layout">
  <span class="button">A</span>
  <span class="app-name">B</span>
  <span class="button">C</span>
  <span class="button">D</span>
</header>

请记住box-sizing: border-box将填充和边框带入宽度/高度计算中,但不是边距。保证金始终单独计算。

The box-sizing属性有两个值:

  • content-box
  • border-box

它不提供padding-box or margin-box.

提及时请考虑这些术语CSS 盒子模型.

enter image description here

source: W3C

3.1.更改盒子模型:box-sizing财产

content-box

指定的宽度和高度分别适用于宽度和高度 元素的内容框。的内边距和边框 元素在指定的宽度和高度之外进行布局和绘制。

border-box

该元素的长度以及宽度和高度的百分比值 确定元素的边框。也就是说,任何填充或 元素上指定的边框在该元素内布局和绘制 指定的宽度和高度。内容的宽度和高度是 通过减去边框和填充宽度来计算 指定宽度和高度属性的各个边。


另外,弹性容器的初始设置是flex-shrink: 1。这意味着弹性物品可以收缩以适合容器。

因此,指定一个width, height or flex-basis不会成立,除非flex-shrink被禁用。

您可以使用以下命令覆盖默认值flex-shrink: 0.

这是更完整的解释:flex-basis 和 width 有什么区别?


这是一个简单的解决方案:

你有四个盒子。您希望第 1 行有 3 个,第 2 行有最后一个。

这就是你所拥有的:

flex: 1 1 33.33%;
margin: 10px;

这可以分解为:

  • flex-grow: 1
  • flex-shrink: 1
  • flex-basis: 33.33%

我们知道box-sizing: border-box因素填充和边框flex-basis。那不是问题。但利润率又如何呢?

好吧,既然你已经flex-grow: 1对于每个项目,不需要flex-basis为33.33%。

Since flex-grow将消耗该行上的任何可用空间,flex-basis只需要足够大即可强制换行。

由于边距也会消耗可用空间,flex-grow不会侵入边缘空间。

所以试试这个:

flex: 1 1 26%;
margin: 10px;

* {
  box-sizing: border-box;
}

.horizontal-layout {
  display: flex;
  width: 400px;
}

header > span { 
  flex: 1 0 26%;                    /* ADJUSTED */
  margin: 10px;
}

header#with-border-padding {
  flex-wrap: wrap;
}

header#with-border-padding>span {
  flex: 1 0 26%;                   /* ADJUSTED */
}

header#with-border-padding>.button {
  border: 1px solid black;
  padding-left: 5px;
}

header>.button {
  background-color: grey;
}

header>.app-name {
  background-color: orange;
}
NO flex-wrap: wrap, so it not respects the flex 33% <br/>
<header class="horizontal-layout">
  <span class="button">A</span>
  <span class="app-name">B</span>
  <span class="button">C</span>
  <span class="button">D</span>
</header>
<br/><br/> WITH flex-wrap: wrap : I expect to have 3 boxes in first row and D box in a down<br/>
<header id="with-border-padding" class="horizontal-layout">
  <span class="button">A</span>
  <span class="app-name">B</span>
  <span class="button">C</span>
  <span class="button">D</span>
</header>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Flex 项目不考虑边距和框大小:border-box 的相关文章

  • 有什么方法可以声明盒子的大小/部分边框吗?

    有什么方法可以在 CSS 中声明框的大小 部分边框吗 例如一个盒子350px只显示第一个边框底部60px 我认为这可能非常有用 例子 并不真地 但以优雅降级且不需要多余标记的方式实现这种效果非常容易 div width 350px heig
  • 在 Javascript 中访问表格单元格的内容

    我有一个嵌套在 HTML 表格单元格元素内的复选框 如何从 Javascript 访问内部复选框 我见过的所有示例都改变了内部 HTML 本身或视觉属性 这不是我感兴趣的 我尝试过 childNodes 数组 但显然它是空的 如果你不使用
  • 如何使用 XPath 通过 CSS 类查找元素?

    我的网页里有一个div with a class named Test 我怎样才能找到它XPath 该选择器应该可以工作 但如果将其替换为适合的标记 则会更有效 contains class Test 或者 因为我们知道所寻找的元素是div
  • 如何向 div 添加“闪耀”叠加层?

    如何添加如下图所示的漂亮叠加层 考虑以下 HTML 我将如何添加这样的覆盖层 我知道我可以在它上面使用渐变 并对角应用它 但我也可以弯曲它吗 div class photostrip div class overlay div img sr
  • $_POST 返回空

    尝试练习一下 ajax 和 PHP 我不明白为什么每当我发送一些东西时 它都会返回空或未定义的索引 PHP 返回空 JS form submit function var meth this attr action var msg msg
  • 如何在单页应用程序中使用 #-URL?

    本文 http danwebb net 2011 5 28 it is about the hashbangs提出了一个非常令人信服的论点 因为 URL 是长期存在的 它们被添加书签并传递 所以它们应该是有意义的 并且使用哈希进行真正的路由
  • 为什么该消息没有出现在 Chrome 中的手风琴上方?

    我正在尝试新的 HTML5 验证 当我尝试使用required里面的属性
  • Javascript 制作音频 blob

    我正在测试 html 音频标签 我想制作音频 blob url 就像 youtube 或 vimeo 那样 并将其添加到 src 开始播放音频 我一直在测试new Blob and URL createObjectURL 但我不知道如何使用
  • 光标:IE 8 和 9 中的自动行为

    我想要的是为整个正文标记指定cursor pointer 这样页面的背景是可点击的 但我也希望页面的其余部分像以前一样工作 所以我尝试为div设置cursor auto 其中包含这一页 在 FF Chrome 和 safari 中 它工作得
  • 获取输入图像类型选择的图片并加载到图像标签中

    所以 我有一个用于上传 img 文件的输入框 我想要做的是从该数据 或选定的源 中获取数据并将其路由到图像标签的 src 属性中 像这样的东西 http jsfiddle net QC2c4 http jsfiddle net QC2c4
  • 为什么 Firefox 关闭空 html 标签?

    我注意到在 Firefox 中 当我查看源代码时 它会向空标签项添加结束标签 例如 hr and img src image jpg 在 Firefox 中查看源代码我明白了 hr and img src image jpg 该文档是 HT
  • CreateJs Canvas 形状在 Windows Phone 上丢失坐标

    我正在制作一个 Createjs 和 html5 项目 在其中绘制一个形状 红色圆圈 当我单击圆圈时它会发出警报 它在所有台式机和 Android 手机上都能正常工作 除非我在 Windows Phone 中打开它 否则它在普通屏幕上工作正
  • 将可点击的锚标记转换为 html 文档中的纯文本

    我正在尝试匹配 a 我的内容中的标签 并将其替换为链接文本 后跟打印版本的方括号中的 url 如果只有 href 则以下示例有效 如果 a 包含另一个属性 它匹配太多并且不会返回所需的结果 我怎样才能匹配 URL 和链接文本 就是这样 这是
  • 电子邮件模板中的剪贴板功能

    我想在电子邮件模板中发送优惠券代码 一个小按钮 用于复制剪贴板上输入元素的内容 通过电子邮件模板 我的意思是我想发送一封电子邮件 其中包含优惠券代码 并且电子邮件模板中会有一个按钮 允许我将其复制到剪贴板 这可以做到吗 任何帮助将不胜感激
  • 将 div 附加到另一个 div 的右侧

    我有一个 div 它就像一个容器 里面有 2 个图像 一张图像位于 div 的左侧 另一张图像位于右侧 我的容器是Bootstrap的容器 它们都用 div 包裹 并且div s position is fixed 我的问题是我无法找到要附
  • 在画布上剪出圆形图像

    我正在使用 html5 canvas 并且我正在创建一个游戏 可以将您的脸部上传到游戏中 并将其用作主要角色 不幸的是 游戏中的角色是圆形的 就像笑脸一样 那么这将如何完成呢 是否可以拍一张照片 然后将其剪成一个圆 这样圆之外的任何东西都是
  • 检测 html 选择框上的编程更改

    有没有办法让 HTML 选择元素在每次以编程方式更改其选择时调用函数 当使用 JavaScript 修改选择框中的当前选择时 IE 和 FF 都不会触发 onchange 此外 更改选择的 js 函数是框架的一部分 因此我无法更改它以在结束
  • HTML 标签在 Ionic 5 警报文本中不起作用

    我已将以下代码从 Ionic 3 迁移到 Ionic 5 const alert await this alertCtrl create subHeader About b this user name b message Test Mes
  • Flexbox 列的垂直间距相等

    我在CSS中努力让我的Flexbox在垂直等距的列中显示项目 从而使列的每行之间的空间均匀 html body flex container margin 0 height 100 width 100 body font family Dr
  • 文件和目录条目 API 在 Chrome 中损坏?

    我正在尝试使用文件和目录条目 API 创建一个文件上传器工具 该工具允许我将文件和目录的任意组合放入浏览器窗口中 以供读取和上传 我完全意识到 可以通过使用文件输入元素来实现类似的功能webkitdirectory已启用 但我正在测试一个用

随机推荐