inline-block 未来

不过在「娓娓」之前,我们回顾一下「前世今生」中主要讲了几个问题:

  1. IE6 是不是真的不支持 inline-block;
  2. 到底什么是 inline-block;
  3. display:inline-block 后的元素为什么会产生水平空隙,这是不是 Bug?
  4. 如何更好的去掉 inline-block 产生的空隙。

虽然前文中连 inline-block 他爸都写出来了,但无论是 YUI 的解决方案,还是我给出的解决方案都是一坨一坨的,捞出来给大家瞅瞅:

YUI的解决方案:

.yui3-g {
letter-spacing: -0.31em; /* webkit: collapse white-space between units */
*letter-spacing: normal; /* reset IE < 8 */
word-spacing: -0.43em; /* IE < 8 && gecko: collapse white-space between units */
}

 

.yui3-u {
display: inline-block;
zoom: 1; *display: inline; /* IE < 8: fake inline-block */
letter-spacing: normal;
word-spacing: normal;
vertical-align: top;
}

我写的方案:

.dib-wrap {
font-size:0;/* 所有浏览器 */
*word-spacing:-1px;/* IE6、7 */
}

.dib-wrap .dib{
font-size: 12px;
letter-spacing: normal;
word-spacing: normal;
vertical-align:top;
}

@media screen and (-webkit-min-device-pixel-ratio:0){
/* firefox 中 letter-spacing 会导致脱离普通流的元素水平位移 */
.dib-wrap{
letter-spacing:-5px;/* Safari 等不支持字体大小为 0 的浏览器, N 根据父级字体调节*/
}
}

.dib {
display: inline-block;
*display:inline;
*zoom:1;
}

我们知道造成空隙的根本性原因是:空白符(whitespace)。

在 CSS 中空白符的表现主要是由 white-space 属性来控制的,取值与特性如下:

取值 换行 空白和制表符 文字换行
normal 折叠 折叠 换行
pre 保留 保留 不换行
nowrap 折叠 折叠 不换行
pre-wrap 保留 保留 换行
pre-line 保留 折叠 换行

但是我们发现没有一个关键字来忽略空白符,于是有人在「www-style」发邮件提出:增加一个「white-space: ignore」来忽略空白符。并且通过 JS 来模拟了一个「white-space:none」去除 inline-block 空隙的 Demo,更多例子可以看 Github 上的介绍。

实际上,在「CSS Text Level 4」中已经把 white-space 分为两部分:

  1. white-space-collapsing
  2. text-wrap

这样一来「white-space」与「white-space-collapsing」、「text-wrap」的关系便可以通过下表来描述:

white-space 取值 white-space-collapsing 取值 text-wrap 取值 换行 空白和制表符 文字换行
normal collapse normal 折叠 折叠 换行
pre preserve none 保留 保留 不换行
nowrap collapse none 折叠 折叠 不换行
pre-wrap preserve normal 保留 保留 换行
pre-line preserve-breaks normal 保留 折叠 换行

其中,white-space-collapsing 专门用来控制元素中的空白如何折叠,取值如下:

  • 「collapse」该值要求用户代理将一系列空白折叠为一个单独的字符(或者在某些情况下,没有字符)。
  • 「preserve」该值阻止用户代理折叠空白,换行符保留为强制换行符。
  • 「preserve-breaks」该值将与「collapse」一样折叠空白字符,但保留换行符为强制换行符。
  • 「discard」该值要求用户代理”丢弃(discard)”元素中的所有空白符。
  • 「trim-inner」对于块容器,该值要求用户代理丢弃所有在元素开始处的空白符,直到并包含在第一个非空白字符之前的最后一个换行符;同时丢弃在元素结尾处的所有空白符,其从最后一个非空白字符之后的第一个换行符开始。
  • 「consume-before」该值要求用户代理折叠紧邻元素开始(位置)之前的所有可折叠空白符。
  • 「consume-after」该值要求用户代理折叠紧邻元素开始(位置)之后的所有可折叠空白符。

「discard」便是我们需要的救星,它会删除一切空白符,再也不用担心了。Like this:

ul{ white-space-collapsing:discard; }

li{ display: inline-block;}

但是「trim-inner」、「consume-before」、「consume-after」似乎不能很好的工作,因为「white-space-collapsing」具有继承的特性,假如插入一个<span>或<div>便会造成额外的空白被删除。这一块目前还没能很好的解决,如同「Tab Atkins」所说:我们没有给予 Text4 更多的关爱(We haven’t  given Text 4 much love yet),可怜的 CSS Text 4 是个没人要的孩子?你说嗯哼不嗯哼?

最后,抛开 inline-block 本身的局限性,放眼未来,Tab Atkins 也更赞同布局问题应该用布局属性在内部解决空白符的问题,所以充分运用 flex 才是主流的方向。CSS Text 4 毕竟还只是编辑草案,「white-space-collapsing」 随时可能会被修改或者删除。或者你发现在现代浏览器上,inline-block 可以实现 flex 却不能实现的效果,欢迎写出 Demo和我交流。

未来,你或许不用再担心 inline-block 空隙的问题了,未来是 flex,grid 的天下,你说嗯哼不嗯哼?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一段科技感十足的书本介绍的 HTML 代码: ```html <!DOCTYPE html> <html> <head> <title>书本介绍</title> <meta charset="utf-8"> <style> body { background-color: #1d1f27; color: #fff; font-family: Arial, sans-serif; font-size: 16px; line-height: 1.5; padding: 20px; } h1 { color: #fff; font-size: 36px; font-weight: bold; margin-bottom: 30px; text-align: center; text-shadow: 2px 2px #000; } p { margin-bottom: 20px; text-align: justify; } .container { max-width: 800px; margin: 0 auto; } .book-cover { display: inline-block; margin-right: 30px; vertical-align: top; } .book-cover img { max-width: 300px; height: auto; box-shadow: 5px 5px 10px #000; border-radius: 5px; } .book-info { display: inline-block; max-width: 400px; vertical-align: top; } .book-title { font-size: 24px; font-weight: bold; margin-bottom: 20px; text-shadow: 2px 2px #000; } .book-author { font-size: 18px; font-weight: bold; margin-bottom: 10px; } .book-description { font-size: 16px; line-height: 1.5; text-align: justify; } </style> </head> <body> <div class="container"> <h1>书本介绍</h1> <div class="book-cover"> <img src="book-cover.jpg" alt="Book Cover"> </div> <div class="book-info"> <div class="book-title">标题</div> <div class="book-author">作者</div> <div class="book-description"> <p>这本书是一本关于科技的书,涵盖了各种前沿的技术和应用。从人工智能到区块链,从机器学习到物联网,从虚拟现实到增强现实,这本书全面地介绍了这些领域的最新进展和未来发展趋势。同时,书中还提供了大量实用的案例和应用,帮助读者更好地理解这些技术的应用场景和商业价值。</p> <p>该书作者是一位资深的科技从业者,有着丰富的实战经验和深入的理论研究。他在书中分享了自己多年的经验和见解,帮助读者更好地掌握这些复杂的技术和概念。无论是想了解科技前沿的人士,还是从事相关行业的专业人士,都可以从这本书中获得很多有价值的信息和启示。</p> </div> </div> </div> </body> </html> ``` 你可以将 `book-cover.jpg` 替换成你喜欢的书籍封面图片,将 `标题`、`作者` 和书籍介绍部分的文字替换成你喜欢的内容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值