• 从display:run-in;中学习新技能


    有时我们想在一行内显示一个标题,以及一段内容,虽然看起来比较简单,但是为了语义化用dl比较合适,但是它默认是block元素,改成inline?那么有多段呢?不就都跑上来了?用float?那问题也挺多。

    就是这种效果

    当然如果不需要语义化那是很简单的事,但我现在就想用dl>dt+dd。那么display:run-in就派上用场了。

    display:run-in 会根据后面的元素进行转换display为inline | inlin-block | block

    如果它后一个元素是block那么它会变成inline并且神奇的是它会和后一个元素并排。

    如果它后一个元素是inline那么它会变成block。

    如果它后一个元素是inline-block,它还是正常的显示。

    最有价值的估计就是第一种情况了,但可惜的是Chrome从32版本开始将这个属性移除了,话说要是Chrome没有移除这个属性兼容性还是比较不错的。

    话说为什么要移除这个属性?我们来看看stackoverflow里面的一段话。

    I'm not aware of any change to Chrome's support of display:run-in but the setting has always seemed unloved

    意思好像是说,display:run-in不怎么受欢迎。

    Hixie has been consistently opposed to and I kind of understand why. HTML is a semantic language and the semantics are fully defined by dl/dt/dd. The only practical problems are presentational, and that makes it a CSS problem, not an HTML one.

    Hixie 说HTML是一种语义语言,而display:run-in破坏了,准确的说我们上面的问题不是HTML的问题而是CSS的问题。它是意思应该是display:run-in没有必要,完全可以通过其他方式实现。

    这里有一个解决方法可以解决我们的第一个问题。

    display: run-in dropped in Chrome?

    但是里面没有说特别清楚,我来解释一下吧。

    代码如下:

    <style>
      dt,dd{
        display:inline;
      }
      dt {
        font-weight: bold;
      }
      dt:after {
        content: ": ";
      }
      dd {
        margin:0;
      }
      dd:after {
        content:'A';
        white-space:pre-wrap;
      }
    </style>
    <dl>
      <dt>这是什么?</dt>
      <dd>这是一本神奇的书。</dd>
      <dt>这是什么?</dt>
      <dd>这是一部神奇的电影。</dd>
    </dl>
    

    首先我们把所有的元素变成inline在一行显示,但问题就是所有的都一行显示了,所有这里用了一点小技巧,就是这段代码。

    dd:after {
      content:'A';
      white-space:pre-wrap;
    }
    

    很神奇对吧,其实按理说只有写上content:'A'这句话就好了的,A表示换行,但为什么还要加上white-space:pre-wrap;?因为浏览器默认对文本的换行是忽略的,比如HTML里面的空白字符之类的。除了使用pre-wrap还可以使用其他的,只要不是nowrap就好了。更多关于white-space可以看CSS white-space 属性

    但还是有个小问题,如果有多个dd的话,就换行了。

    会出现这个问题,完全是我们考虑的不周全,换行应该加给“dt”。

    <style>
      dt,dd{
        display:inline;
      }
      dt {
        font-weight: bold;
      }
      dt::after {
        content: ": ";
      }
      dt::before{
        content:"A";
        white-space:pre;
      }
      dd {
        margin:0;
      }
    </style>
    <dl>
      <dt>这是什么?</dt>
      <dd>这是一本神奇的书。</dd>
      <dd>这是一本神奇的书。</dd>
      <dt>这是什么?</dt>
      <dd>这是一部神奇的电影。</dd>
    </dl>
    

    但你有没有发现有个问题啊?就是第一个dt是不用换行的。

    加上这个就OK了

    dt:first-of-type::before{
      content:'';
    }
    

    这里说一下里面的“A”是ASCII码,如果想了解更多ASCII码,可以看ASCII码表

    今天学到的还是很多的,倒不是这个"display:run-in"而是在content中使用ASCII。

  • 相关阅读:
    null和undefined的区别
    "NetworkError: 404 Not Found fontawesome-webfont.woff?v=4.0.3
    php字符串
    php数组
    Oracle 和 MySQL的区别(不完整)
    拦截器和过滤器的区别
    SpringMVC和Struts2的区别
    Redis的介绍
    SpringBoot入门(2)
    SpringBoot入门(1)
  • 原文地址:https://www.cnblogs.com/pssp/p/5905051.html
Copyright © 2020-2023  润新知