【CSS】display的32种写法

转自(担心原作者会删除文章,所以这里自己做个备份):display的32种写法

你知道『』字有四种写法,但你知道display32种写法吗?今天我们一一道来,让你一次性完全掌握display,从此再也不用对它发愁。

从大的分类来讲,display32种写法可以分为6个大类,再加上1个全局类,一共是7大类


1. 外部值

所谓外部值,就是说这些值只会直接影响一个元素的外部表现,而不影响元素里面的儿子级孙子级元素的表现

  • 1.1 display: block;:这个值大家不陌生,我们最熟悉的<div>缺省就是这个值,最基本的块级元素,属于css入门初学者都知道的概念,只要是容器类型的元素基本都是这个值。除<div>之外,还有<h1>到<h6>,<p>,<form>,<header>,<footer>,<section>,<article>天生都是这个值。

  • 1.2 display: inline;:这个值大家也不陌生,行内元素嘛,只要是个行内元素都是这个值,最典型的是<span>,还有<a>,<img>,以及古代html语言当中的<b>,<i>都属于这一类型。

  • 1.3 display: run-in(通常没人用它):除了IEOpera支持它以外,其他所有主流浏览器包括Chrome, Safari, Firefox全都对它置若罔闻。run-in,中文意思就是『闯入』那么这个元素就直接闯入下一行


2. 内部值【CSS3相关:重要】

谈完了外部值,我们来看看内部值。这一组值比较有意思了,在css3如火如荼的今天,你要玩不转这些值,怕是哪儿也找不到工作的。内部值主要是用来管束自己下属的儿子级元素的排布的,规定它们或者排成S形,或者排成B形这样的。

  • 2.1 display: flow;(实验阶段):含义不清,实验室阶段产品,Chrome不支持

  • 2.2 display: flow-root;:不同于flow,现在用flow-root的渐渐多起来了,
    因为它可以撑起被你float掉的块级元素的高度。

    浮动元素使其父元素高度塌陷(该段内容参看了另一文章后总结) :我们经常会遇到一种情况,给一个元素设置浮动之后 float:left/right;,如果该元素的父元素有背景颜色,那么会发现父元素的背景颜色消失了;如果父元素有一个边框,那么浮动元素无法将边框撑开。

<html>
    <head>
        <style>
            .pdiv {
                background-color:cornflowerblue;
                border: 2px solid red;
                /**父元素加overflow:hidden
                可以消除子元素float对父元素的影响*/
                /**overflow: hidden; */
                
                /**
                display新的属性值
                虽然目前仅几个最新浏览器支持,
                但完全可以通过@supports()属性做完美降级处理。
                */
                display: flow-root;
            }
            /**
            为父元素添加伪类可以
            消除子元素float对父元素的影响
            .pdiv::after {
                content:"";
                clear:both;     //清除浮动
                display:block;  //确保该元素是一个块级元素
            }
            */
            .cdiv {
                background-color:burlywood;
                border: 1px solid brown;
                width: 100px;
                height: 100px;
                margin: 20px;
                /** float: left; */
            }
        </style>
    </head>
    <body>
        <div class="pdiv">
            <div class="cdiv">
            </div>
            <div class="cdiv">
            </div>
        </div>
    </body>
</html>

未加float时

image

将上面代码中的float放开
image

在第一个示例中仿佛父元素消失了,但在第二个示例中发现其实父元素并没有消失,只是高度被计算为0。这就要回到浮动元素的特性来说明此问题“当元素设置浮动后,会自动脱离文档流”,翻译成白话就是说,元素浮动后,就不在整个文档流的管辖范围,那么它之前存在在父元素内的高度就随着浮动不复存在了,而此时父元素会默认自己里面没有任何内容(前提是未给父元素设置固定高度,如果父元素本身有固定高度,就不会出现这种情况)

解决方法

a、给父元素也添加float。这样让父元素与子元素一起脱离文档流浮动起来,保证子元素在父元素内,这样父元素就能自适应子元素的高度,但是此方法有一弊端,一定会影响父元素之后的元素排列,甚至影响布局。

b、给父元素一个固定高度,此方法适用于子元素高度已知并且固定的情况。

c、添加一个块级元素,并给此元素设置clear:both;清除浮动。在很早之前用的就是这种解决办法,新建一个空的div,为这个div设置clear:both;这样无疑是增加了无意义的标签,一个大型页面中,这种标签太多是不好的。

d、给父元素添加 overflow:hidden;

e、给父元素添加伪类::after清除浮动

新的解决方法display: flow-root;


  • 2.3 display: table;:这一个属性,以及下面的另外8个与table相关的属性,都是用来控制如何把div显示成table样式的,因为我们不喜欢<table>这个标签嘛,所以我们想把所有的<table>标签都换成<div>标签。<div>有什么好?无非就是能自动换行而已,但其实你完全可以做一个<table><tr><td>标签,把它全都替换成display: block;也可以自动折行,只不过略微麻烦而已。

  • 2.4 display: flex;【敲黑板,划重点!】:作为新一代的前端工程师,这个属性你必须烂熟于胸。display: flex;以及与它相关联的一系列属性:flex-direction, flex-wrap, flex-flow, justify-content, align-items, align-content,并且包括所有这些属性的取值,都是你需要反复研磨的。2009年诞生的这个属性可以说是不亚于css界一场蒸汽机诞生一样的工业革命,它的诞生标志着马车一样的float被彻底抛进历史的垃圾堆。

    image

阮老师的Flex布局教程

A Complete Guide to Flexbox

  • 2.5 display: grid;【会flex很吊吗?会grid更吊哦!】:也许这就是下次前端面试的重点哦!

    image

    grid布局,中文翻译为网格布局。学习grid布局有两个重点

    一个重点是grid布局引入了一个全新的单位:fr,它是fraction(分数)的缩写,所以从此以后,你的兵器库里除了px, em, rem, 百分比这些常见兵器以及vw,vh这些新式武器之外,又多了一样旁门暗器fr,要想用好grid,必须充分掌握fr。

    另一个重点是斜杠操作符,这可不是分数哦。它表示的是起始位置和结束位置。比如说3 /4,这可不是四分之三的意思,这是指一个元素从第3行开始,到第4行结束,但又不包括第4行。

    同样,与grid相关联的也有一大堆旁门属性,是在学习display: grid;的同时必须掌握的。包括grid, grid-column-start, grid-column-end, grid-row-start, grid-row-end, grid-template, grid-template-columns, grid-template-rows, grid-template-areas, grid-gap, grid-column-gap, grid-row-gap, grid-auto-columns, grid-auto-rows, grid-auto-flow, grid-column, grid-row。不能详述,关于这个写起来又是一大篇文章。详情还是参考csstrick上这篇文章,讲得非常细致非常清楚。

  • 2.6 display: ruby;【类似加拼音】:ruby这个取值对于我们亚洲人来说其实是非常有用的一个东西,但是目前除了Firefox以外其它浏览器对它的支持都不太好。简而言之,display: ruby;的作用就是可以做出下面这样的东西:

    image

  • 2.7 display: subgrid;【了解即可】

    2015年8月6日W3C的级联样式单(CSS)工作组(Cascading Style Sheets Working Group)发布了CSS网格布局模块第一级(CSS Grid Layout Module Level 1)的工作草案。在这个草案里规定了上一节我们讲到的display: grid;的方案。

    display: subgrid;是属于2017年11月9日发布的非正式的CSS网格布局模块第二级的内容。所以这是一个非常新的草案,并且围绕它的争议从来也没有断过。

    subgrid总的思想是说大网格里还可以套小网格,互相不影响。

    但如果grid里可以再套subgrid的话,那我subgrid里还想再套subgrid怎么办?subsubgrid吗?况且,到底是grid: subgrid;还是display: subgrid;这个也没有达成共识,关于此一系列的争议,感兴趣的同学可以看看这篇文章


3. 列表值【极少用】

  • 3.1 display: list-item;
    image

    display: list-item;display:table;一样,也是一帮痛恨各种html标签,而希望只使用<div>来写遍一切html的家伙搞出来的鬼东西,实际使用极少,效果就是这样:
    image

    看,你用<ul><li>能实现的效果,他可以用<div>实现出来,就是这个作用。
  • 3.2 哈哈哈~~~~ PS:自己今天看了下li的默认样式
    image

4. 属性值【附属于主值】

比如主值里设置了display: table;,就可以在子元素里使用display: table-row-group;等等属性,不过并不绝对。关于它们的作用,主要参考主值就够了。

display: table-row-group;
display: table-header-group;
display: table-footer-group;
display: table-row;
display: table-cell;
display: table-column-group;
display: table-column;
display: table-caption;

我所知道的几种display:table-cell的应用

display: ruby-base;
display: ruby-text;
display: ruby-base-container;
display: ruby-text-container;

5. 显示值

MDN里把它叫做<display-box> values(盒子值),我把它叫做显示值,主要是为了便于理解。

  • 5.1 display: contents(下面内容来自w3cplus)

  • display:contents啥意思呢?看下图展示:

    image

    上图对应代码:

    <div style="display: contents; 
        background: magenta; 
        border: solid thick black; 
        ng: 20px; color: cyan; 
        font: 30px/1 Monospace;"> 
        <span style="background: black;">foobar</span> 
    </div>
    

    即:display: contents样式规则使div元素不产生任何边界框,因此元素的背景、边框和填充部分都不会渲染。然而,继承的属性如颜色(color)和字体(font)却能照常影响到span这个子元素。

  • 5.2 CSS网格布局与display: contents

    这个display: contents样式能取代子网格(subgrids:上面2.7提到的内容)功能,目前还没有任何浏览器支持次网格。不过,子网格(subgrids)有些情况还是需要用到的。

    典型的例子是网格布局(Grid Layout)的自动就位(auto-placement)效果,下面是一个简单的表格元素,看起来是这样的:

    <html>
        <head>
            <style> 
                form { display:grid; } 
                label { grid-column: 1; } 
                input { grid-column: 2; } 
                button { grid-column: span 2; } 
            </style> 
        </head>
        <body>
            <form> 
                <label>Name</label><input /> 
                <label>Mail</label><input /> 
                <button>Send</button> 
            </form>
        </body>
    </html>
    
image

然而这不是一个典型的HTML网页表格,因为通常我们会在表格内部使用列表,这样使用读屏软件的用户就能预先知道有多少空要填。所以HTML网页看起来更可能会是这样的:

<form>
    <ul>
        <li><label>Name</label><input /></li>
        <li><label>Mail</label><input /></li>
        <li><button>Send</button></li>
    </ul>
</form>

有了display: contents样式,就可以做出和第一个例子相同的布局,用的CSS也差不多:

ul{ 
    display: grid;
}
li{ 
    display: contents;
}
label{ 
    grid-column: 1;
}
input{ 
    grid-column: 2;
}
button { 
    grid-column: span 2; 
}

现在这样,网站转用CSS网格布局(Grid Layout)时,HTML代码不用大改,也不需要舍去一些确实有用的HTML元素,如上面例子里的列表元素,真的很不错。


6. 混合值

  • 6.1 display: inline-block;:关于display: inline-block;的作用恐怕只要做过3天以上前端的工程师都应该知道。什么也不说了,上一张著名的图片作总结吧:

    image

  • 6.2 display: inline-table;:你要能理解inline-block,你就能理解inline-table。在行内显示一个表格,就像这样:

    image

  • 6.3 display: inline-flex;:这个就不用多说了吧?跟上面一样,在行内进行弹性布局,参考display: flex;。

  • 6.4 display: inline-grid;:同上,在行内进行网格布局,参考display: grid;


7. 全局值

这些值不是display属性的专利,几乎其它任意属性都可以用,列在这里凑个数。

  • 7.1 display: inherit;:继承父元素的display属性。
  • 7.2 display: initial;:不管父元素怎么设定,恢复到浏览器最初始时的display属性
  • 7.3 display: unset;unset混合了inheritinitial。如果父元素设值了,就用父元素的设定,如果父元素没设值,就用浏览器的缺省设定。直接看图最明白:

总结

以上就是在cssdisplay32种写法。谈了这么多,不知道你记住了多少呢?其实,单纯理解每一个display属性的取值都不难,难的是融会贯通,在恰当的地方运用恰当的值,毕竟我们的目的是为了把代码写短,而不是把代码写长。如果你怕记不太清的话,就请你收藏这篇小文,也许将来的某一天,你会用得着。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容