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

75 天前
 yodhcn

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

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

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

2015 次点击
所在节点    前端开发
9 条回复
yongjing
75 天前
设置 overflow 能治一些疑难杂症 这个应该是说 BFC
https://developer.mozilla.org/zh-CN/docs/Web/CSS/CSS_display/Block_formatting_context
old9
75 天前
第一个问题,宽度并不是无限大,是被这个 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
75 天前
简单来说,overflow 的默认值是两个方向都 visible ,但同时又禁止单个方向 visible ,所以如果你改了一个方向,就会让另一个方向变成 auto.

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

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

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

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

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

© 2021 V2EX