我有4个flexbox列,一切都很好,但当我添加一些文本到一个列,并将其设置为一个大的字体大小,它是使列宽比它应该由于flex属性。
我尝试使用word-break: break-word,它有帮助,但当我将列调整到一个非常小的宽度时,文本中的字母被分成多行(每行一个字母),但列的宽度不会小于一个字母大小。
观看这个视频
(在开始时,第一列是最小的,但当我调整窗口大小时,它是最宽的列。我只是想尊重伸缩设置;伸缩尺寸1:3:4:4)
我知道,将字体大小和列填充设置为较小会有所帮助……但是有没有其他的解决办法呢?
我不能使用overflow-x: hidden。
JSFiddle
.container {
display: flex;
width: 100%
}
.col {
min-height: 200px;
padding: 30px;
word-break: break-word
}
.col1 {
flex: 1;
background: orange;
font-size: 80px
}
.col2 {
flex: 3;
background: yellow
}
.col3 {
flex: 4;
background: skyblue
}
.col4 {
flex: 4;
background: red
}
<div class="container">
<div class="col col1">Lorem ipsum dolor</div>
<div class="col col2">Lorem ipsum dolor</div>
<div class="col col3">Lorem ipsum dolor</div>
<div class="col col4">Lorem ipsum dolor</div>
</div>
我发现这在flex和grid中反复困扰着我,所以我将提出以下建议:
* { min-width: 0; min-height: 0; }
然后使用min-width: auto或者min-height: auto如果你需要那样的行为。
事实上,还可以添加box-sizing来让所有的布局更加合理:
* { box-sizing: border-box; min-width: 0; min-height: 0; }
有人知道会有什么奇怪的结果吗?在使用上述组合的几年里,我还没有遇到任何问题。事实上,我想不出任何我想要从内容向外布局到flex/网格的情况,而不是从flex/网格向内布局到内容的情况——当然,如果存在的话,它们是很少的。这看起来是个糟糕的违约。但也许我遗漏了什么?
伸缩项目的自动最小大小
您遇到了一个flexbox默认设置。
伸缩项不能小于其内容沿主轴的大小。
默认值是…
min-width:汽车
最小高度:汽车
...分别用于行方向和列方向的伸缩项。
你可以通过设置flex项来覆盖这些默认值:
min-width: 0
最小高度:0
溢出:隐藏(或任何其他值,除了可见)
Flexbox规范
4.5. Flex的自动最小大小
项目
为伸缩项目提供更合理的默认最小尺寸,此
的初始值引入一个新的auto值
css2.1中定义的min-width和min-height属性。
关于汽车的价值……
在其溢出在主轴上可见的伸缩项上,当在伸缩项的主轴min-size属性上指定时,将指定自动的最小大小。否则计算为0。
换句话说:
min-width: auto和min-height: auto默认值仅在溢出可见时应用。
如果溢出值不可见,则min-size属性值为0。
因此,overflow: hidden可以替代min-width: 0和min-height: 0。
和…
最小大小算法只适用于主轴。
例如,行方向容器中的伸缩项默认情况下不会获得min-height: auto。
更详细的解释请看这篇文章:
在flex方向:行和flex方向:列中不同的最小宽度渲染
你已经应用了min-width: 0和项目仍然不收缩?
嵌套式伸缩容器
如果在HTML结构的多个层次上处理伸缩项,可能有必要在更高层次的项目上重写默认的min-width: auto / min-height: auto。
基本上,具有min-width: auto的高级伸缩项可以防止在min-width: 0下面嵌套的项上收缩。
例子:
伸缩项目不会收缩到小于其内容
让孩子融入父母
空白CSS属性在flex中产生问题
浏览器渲染说明
Chrome vs. Firefox / Edge
Since at least 2017, it appears that Chrome is either (1) reverting back to the min-width: 0 / min-height: 0 defaults, or (2) automatically applying the 0 defaults in certain situations based on a mystery algorithm. (This could be what they call an intervention.) As a result, many people are seeing their layout (especially desired scrollbars) work as expected in Chrome, but not in Firefox / Edge. This issue is covered in more detail here: flex-shrink discrepancy between Firefox and Chrome
IE11
As noted in the spec, the auto value for the min-width and min-height properties is "new". This means that some browsers may still render a 0 value by default, because they implemented flex layout before the value was updated and because 0 is the initial value for min-width and min-height in CSS 2.1. One such browser is IE11. Other browsers have updated to the newer auto value as defined in the flexbox spec.
修改后的演示
.container {
display: flex;
}
.col {
min-height: 200px;
padding: 30px;
word-break: break-word
}
.col1 {
flex: 1;
background: orange;
font-size: 80px;
min-width: 0; /* NEW */
}
.col2 {
flex: 3;
background: yellow
}
.col3 {
flex: 4;
background: skyblue
}
.col4 {
flex: 4;
background: red
}
<div class="container">
<div class="col col1">Lorem ipsum dolor</div>
<div class="col col2">Lorem ipsum dolor</div>
<div class="col col3">Lorem ipsum dolor</div>
<div class="col col4">Lorem ipsum dolor</div>
</div>
js小提琴
对您的问题的简单回答是,默认情况下,浏览器倾向于向读者显示尽可能多的信息(而不是隐藏任何东西)。
这是默认情况下发生的,甚至包括在白色背景上显示默认的黑色字体(为了最大的页面对比度和可读性),添加一个滚动条,其中内容大于视口的高度(或宽度),或者仍然显示标记的内容(或背景颜色),即使这是错误地放在html文件中的</body>或甚至</html>标记之后。
在CSS上下文中,这也是适用的,但您也可以在此基础上进行许多自定义。
即使在屏幕中使用巨大的字体(如font-size: 50em;),它最初也会作为一个溢出元素(使用display: flex将字体放置在一个灵活的子容器中不会改变这种默认行为,除非您使用overflow: hidden或以某种方式调整元素大小。
例如,一个优雅的解决方案是使用动态调整字母的大小
字体大小:calc(0.5em + 2vw)
即使在响应式场景中也很有效。
正如前面的回答所提到的,flex项不能小于其沿主轴的内容的大小(出于同样的原因,这不仅特定于CSS中实现的flexbox模型,还因为内部浏览器的工作方式)。即使是一个较长的单词,如果它比显示宽度长,也会显示滚动条,就像它是一个固定大小的块类型元素一样。
这在旧的html 4.01规范中提到
按照惯例,可视HTML用户代理将文本行包装起来以适应其中的内容
可用边距。包装算法依赖于脚本
格式化。
例如,在西方脚本中,文本只能用白色进行包装
空间”。
如第9.5.3段所示。这意味着,从那时起,文本必须在默认情况下持续显示(除非我们决定将其分割,但不是单个字符级别:单个非白色字符以120em大小显示将触发浏览器上的滚动条)。
在同一资料来源第9.1段中也明确定义了词语:
我们在这里使用术语“词”来表示“非空白序列”
字符”
显示任何单词的原始格式的目的是不破坏、隐藏或扭曲原始信息、含义或代码作者的意图。因此,我们也有 为了保持两个相连的单词在同一条线上-当打破它们时可能会造成破坏(如纽约,10点,10公里/小时,§10等)