哪位前端老哥能解释一下,为什么容器设置 overflow-y 也能防止元素*宽度*溢出容器?

17 小时 43 分钟前
 yodhcn

设计的布局很简单:左侧 nav ,右侧 main ; mian 容器中放一个 swiper 轮播组件,宽度默认充满容器。但是

[ codesandbox ] https://codesandbox.io/p/devbox/gzlqqh

初学 CSS 的时候就听说设置 overflow 能治一些疑难杂症,问题是解决了,但想不通是怎么解决的,哪位有经验的前端老哥能解释一下?

946 次点击
所在节点    程序员
7 条回复
yongjing
17 小时 33 分钟前
设置 overflow 能治一些疑难杂症 这个应该是说 BFC
https://developer.mozilla.org/zh-CN/docs/Web/CSS/CSS_display/Block_formatting_context
old9
17 小时 1 分钟前
第一个问题,宽度并不是无限大,是被这个 swiper 组件计算并指定的。看起来很大应该是这个组件的计算 bug 。
第二个问题,因为标准就这么定义的

CSS spec: https://www.w3.org/TR/css-overflow-3/
The visible/clip values of overflow compute to auto/hidden (respectively) if one of overflow-x or overflow-y is neither visible nor clip.

MDN 解读: https://developer.mozilla.org/en-US/docs/Web/CSS/overflow-x
If overflow-y is hidden, scroll, or auto, and the overflow-x property is visible (default), the value will be implicitly computed as auto.
shintendo
16 小时 36 分钟前
简单来说,overflow 的默认值是两个方向都 visible ,但同时又禁止单个方向 visible ,所以如果你改了一个方向,就会让另一个方向变成 auto.

不要试图用理性去挑战不可名状的 CSS Spec ,你会陷入疯狂的。
kongkongye
16 小时 10 分钟前
@shintendo 的确,我一直觉得 css 很复杂,有些样式怎么都调不好
Yaavi
16 小时 0 分钟前
看了代码,俺来解释下:设置了 overflow-y 这时候 overflow-x 被隐式改为了 auto ,而 overflow 值不为 visible 或 clip 的块级元素会触发重新创建新的 BFC ,理解成 重新创建了一个 独立的小盒子 就行,这个时候这个 独立的小盒子 的宽度会由父元素的宽度决定,所以出现了描述中的效果。
yodhcn
15 小时 54 分钟前
@shintendo #3 但是设置 overflow-x-hidden 、overflow-x-auto 、overflow-y-hidden 、overflow-y-auto 任意一个都能解决这个问题。我也怀疑是 swiperjs 组件计算宽度的 bug ,但我看不懂源码,不清除组件宽度计算的具体逻辑
kile
15 小时 49 分钟前
切记,css 是背的不是去理解的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1074068

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX