zoukankan      html  css  js  c++  java
  • 从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。

  • 相关阅读:
    开源一个常用的小软件的源码——系统数据库服务管理软件
    MySql Windws 下自动备份脚本
    ubuntu-14.04-server配置Jexus --安装步骤记录
    Jumony快速抓取网页 --- Jumony使用笔记--icode
    视频教程--ASP.NET MVC 使用 Petapoco 微型ORM框架+NpgSql驱动连接 PostgreSQL数据库
    收录.NET跨平台及跨数据库的博文...
    ASP.NET MVC 使用 Petapoco 微型ORM框架+NpgSql驱动连接 PostgreSQL数据库
    Windbg程序调试系列
    QCY蓝牙耳机 左右两只耳机配对 方法
    wpf 的 Window或UserControl绑定自己后台属性
  • 原文地址:https://www.cnblogs.com/pssp/p/5905051.html
Copyright © 2011-2022 走看看