写这篇文章源于工作项目前端UI要重构,而我选择参考bs框架来促进这个任务。同时,在创建媒体对象UI组件时,我发现bs框架的_media.scss类有几个属性令我不解。
bs完整的_media.scss类是这样的:
最先令我疑惑的是
为什么要设置这么大的宽度呢?意义在哪?百度无果,我寻问了前辈豪大(豪情),得到线索stackoverflow。
又挑战我4级未过的英文水平了。。借助有道,我整理了一下提问和回答
提问
Why does media-body class in bootstrap have width 10,000px and media class have overflow hidden and zoom 1?
翻译:
在bootstrap框架里为什么media-body
样式含有width:10000px
和media
样式含有overflow:hidden
,zoom:1
?
I have some question regarding the media classes in bootstrap.
- Why does .media-body class in bootstrap have width 10,000px? Why did they use display: table-cell not display: block?
- Why is overflow: hidden and zoom: 1used on .media class?
- Why doesn’t the div with .media-body actually take 10,000px width?
- What would happen if overflow: hidden and zoom: 1 are not used in .media class?
As for my effort, I removed overflow, zoom and 10,000px width and observed no difference.
翻译:
我有一些关于bs框架里media类的问题。
1. 为什么.media-body的宽为10000px,为什么是display:tall-cell而不是block?
2. 为什么.media用了zoom:1和overflow:hideen?
3. 为什么实际上div的宽度不是.media-body设置的10000px?
4. 如果不设置over-flow:hidden和zoom:1将会发生什么?
经过实践后,我删除over-flow:hidden和zoom:1和width:10000px观察到并没有什么改变。
大致是这个意思QAQ有没有英语好点的指导指导……
回答
I have found some comments in the collection “Responsive Bootstrap”:
- Create new block formatting context in modern browsers
- Avoid shrink-wrap behaviour of table-cell
- Override for IE6/7
- Create new block formatting context in IE6/7
Alternatively, use ‘overflow:hidden’ if clipping is OK
1234567 display: table-cell; /* 1 */width: 10000px; /* 2 */@include old-ie() {*width: auto; /* 3 */*zoom: 1; /* 4 */}>zoom is a hack for IE6 and IE7. All browsers ignore attributes that begin with an asterisk. Only IE7 and below takes them into account.
翻译:
我收集到一些关于“bs响应”的回复:
1. display: table-cell;
在新版本浏览器可触发BFC(块级格式化上下文),如果不知道什么是BFC,可以百度或者看我的前一篇文章overflow:hidden
2. width:10000px
能避免设置table-cell
的盒子变型 (因为在IE6/7不支持table-cell
属性,且浏览器对table-cell
属性展现不一)
3. width:auto
在IE6/7中形同于重写/覆盖。(*width是IE8下的hack技术)
4. zoom:1
能在IE6/7中触发BFC
使用overflow:hidden
能恰到好处的隐藏溢出样式。
zoom:1
是IE6/7的hack技巧,所有浏览器都会忽略这个属性除了IE6/7.
总结
看来为了善用table-cell
,Twitter大牛们又给我上了一课。
这里为了求证以上答案的真实性,我去拜访了张鑫旭前辈的博客,了解table-cell。
在之前,我对table-cell属性仅仅停留在表单元形式展现的印象里,通俗理解,设置display:table-cell
的盒子形式上会变成<table>
,所以其子元素都会变成表单元,形同于<td>
或<tr>
。但由于IE6/7的不支持,所以设置其父元素需要配合overflow:hidden
,zoom:1
用于避免盒子塌陷,和触发BFC。而*width:10000px
多余的宽度也恰到好处的被父元素隐藏。
所以table-cell
有很高的使用价值,如:
- 大小不固定元素的垂直居中,在对图片垂直居中时,
img
标签应被<a>
标签包裹。(父table-cell + 父子vertical-align + 子inline-block) - 两栏自适应布局(兄弟flout + 兄弟table-cell)
- 等高布局(父table-row + 子table-cell)
- 列表布局(同上 + 子width)
(父:指父元素,子:指子元素,兄弟:相邻元素)
超实用有木有,日常写demo都遇的上。
系统提示:恭喜玩家uhey技能提升10个点!