display可是个神奇的东西,通过修改display可以帮助组件实现“逆天改命”,变成其他组件的“模样”,当然,修炼之路不乏贫困,让我们一起来看看都有些什么神奇的display可供更改。
display:none
display:none,如同其名字,也就是将整个组件给弄没了,注意,这里的display:none与将该组件从dom树上彻底删除有着很大区别,display:none仅仅是将该组件隐藏,通常用于制作二级菜单:想将其display设置为none,然后当鼠标滑过一级菜单时再将其display改为block。
display:none可以让比较复杂的界面简洁化,使这个网页(界面)视觉重量减轻。除此之外,在排他算法中display:none也经常用到。
display:block、inline
根据css的规定,一些组件有着其默认的display值,常用的div的默认display值为block,为“块级元素”(block-level ),而作为块级元素,其高度、宽度、内距以及外距都可以进行调整。
块级元素特点:
- 每个块级元素都从新的一行开始(一块霸占一行)
- 在其本身的宽度不进行设置时,其宽度默认为其父级组件的宽度(body也算父级组件)。
- 可以设置padding和margin
常用的 块级元素有:
div、p、h1…h6、ol、ul、dl、table、address、blockquote (块引用)、form
<div style='display:inline’></div>
而如链接元素a,其默认display值为inline,为“行内元素”,它是依附于其他块级元素存在的,故行内元素是无法设置高度、宽度等属性,在设置margin时只有left、right的时候,与此同时可以设置padding(若想设置,应该将其display强制转化为block)
<span style='display:block’></span>
常用的行内元素有:
a、span、br、i、em、strong、label、q、var、cite、code(表示计算机源代码或者其他机器可以阅读的文本内容)什么是Flex布局
什么是inline-block
上文提到了display:block和display:inline,其中inline可以排列在一行但无法设置整个组件的高度与宽度,block可以设置组件大小但又只能单独一个组件占一行,为了解决这一尴尬的问题,inline-block孕育而生。
inline-block(融合行内于块级)结合了inline和block的特点,能够与其他行内元素共享一行的同时可以改变元素的高度以及宽度,同时还可以设置padding和margin。
设置为inline-block后,几个元素可以在同一行显示,这个效果跟浮动基本上一样,但也有不同。
inline-block Vs float
相同之处:效果能够基本上达到一样的效果
不同之处:设置浮动后容易导致父元素高度坍塌,而且float会导致元素脱离文本流;display:inline-block不会使元素脱离文本流。
我们来对对比一下display:inline-block和float的效果
设置overfloat:hidden防止父元素高度坍塌
如果每一个子元素高度相同,那么display:inline-block和float没有什么区别,但是每个子元素高度不同的时候float和inline-block的差距就比较明显了。
若要元素排满一行,换行后还要整齐排列,就要子元素的高度一致才行,不然就会出现图三的效果,而inline-block就不会。
inline-block存在的问题
大家可以看使用了display:inline-block后,每个组件之间会存在间隙问题(4px),这个问题其实不是inline-block的问题,而是我们写标签时随手打的回车符(原来是你)。
去除空隙的方法也很简单,对父元素添加font-size:0,将空白符的大小变成0px,从而消除空隙。
总结
如果要使用横向排列,那就大胆的使用inline-block;如果使用文字环绕就要使用浮动了。
什么是flex
我们首先来解读一下flex是什么意思。flex就是flexible box的缩写,译为弹性布局,如同其名,弹性布局就是为了给盒型模型提供最大的灵活性。其中,每一个容器都可以指定为flex(行内元素也可:inline-flex)。Webkit为内核的浏览器,则必须加上-webkit前缀(如display: -webkit -flex)
使用Flex布局的元素称为称为 Flex 容器(flex container),简称”容器”。它的所有子元素自动成为容器成员,称为 Flex 项目(flex item),简称”项目”。在设置属性display=flex时,需要将其赋值于容器上,项目则不需要。
默认存在两条主轴:水平的主轴(main axis)和垂直的交叉轴(cross axis)
Flex VS Float
我们经常需要完成将多个照片并排放置的工作,此时比较简单的做法就是设置float,但是float会出现父组件高度坍塌等问题,此时,我们就需要使用flex布局进行图片的放置。
容器属性
- flex-direction
- justify-content
- align-items
- flex-wrap
- align-content
- flex-flow
1.flex-direction
项目(flex item)默认情况下是沿着主轴从main start 开始往main end 方向进行排序。而属性flex-direction决定了主轴的方向。其中flex-direction有四个取值(row(默认值)、row-reverse、column(自上而下)、column-reverse)
2.justify-content
这个属性主要用来排列主轴上各个项目(item)的位置,决定了项目在主轴上的对齐方式
属性值:
- flex-start(默认值):与main start对齐
- flex-end:与main end对齐
- center:居中
- space-between:flex items 之间的距离相等,与main start、main end两端对齐
- space-evenly: flex items 之间的距离相等,flex items与main start 、main end 之间的距离等于flex items之间的距离
- space-around :flex items 之间的距离相等,flex items与main start 、main end 之间的距离等于flex items之间的距离的一半
值得注意的是这些都是容器的属性
3.align-items
这个属性是用于决定项目(items)在纵轴上的对齐方式
属性值:
- normal:在弹性布局中,效果和stretch一样
- stretch:前提是items不设置高度,当flex items 在cross axis 方向的size为auto时,会自动拉伸至填充flex container(或者换句话说:如果项目未设置高度或设为auto,将占满整个容器的高度。)
- flex-satrt:与cross start 对齐
- flex-end:与cross end 对齐
- center:居中对齐
- baseline:与基准线对齐
4.flex-wrap
决定了flex container 是单行还是多行,默认情况下,项目都排在一条线(又称”轴线”)上。flex-wrap属性定义,如果一条轴线排不下,如何换行。
属性值:
- nowrap(默认):单行
- warp:多行 //这个比较少用
- wrap-reverse:多行(对比wrap,cross start 与cross end相反)
5.align-content
决定了多行flex items 在cross axis的对齐方式 用法与justify-content相似 一个是横轴。一个控制竖轴
属性值:
- stretch(默认值):与align-items的stretch类似,当items有高度的时候,无效果
- flex-start:与cross start 对齐
- flex-end :与cross end 对齐
- center:居中对齐
- space-between:flex items 之间的距离相等,与cross start、cross end两端对齐
- space-evently: flex items 之间的距离相等,flex items与cross start 、cross end 之间的距离等于flex items之间的距离
- space-around :flex items 之间的距离相等,flex items与cross start 、cross end 之间的距离等于flex items之间的距离的一半
flex项目属性(item属性)
1.order
order决定了该项目在容器中的顺序,可以设置为任意整数,默认为0,值越小,排的越靠前。
2. align-self
设置该属性可以覆盖容器的设置的align-items,属性值及其对应的效果与align-items一致。
3.flex-grow
决定了flex items如何扩展 可以设置为任意非父数字(小数,整数 0),默认为0 当flex container 在main axis方向上有剩余得size时,flex-grow属性才会有效
如果所有flex items 的flex-grow 综合sum不超过1,这直接乘以剩余size就是扩展大小、 如果超过1 扩展size=剩余size*flex-grow/sum
当设置flex:1时,每个子组件将会均匀的分布(水平)在flex容器中
4.flex-shrink
flex-shrink (shrink 缩小,收缩)与flex-grow相似,一个扩展,一个伸缩 可以设置为任意非父数字(小数,整数 0),默认为1 当flex items在main axis 方向上超过了flex container 的size flex-shrink属性才会生效、 如果所有flex items 的flex-shrink 总和sum超过1,每个flex item 收缩的size为: flex item 超出flex container 的size*收缩比例/每个flex items 的收缩比例之和 如果sum不超过1,每个flex item 收缩的size为: size = 超出的size * flex-shrink值 flex items收缩后的最终size不能小于min-width\min-height
5.flex-basis
用来设置flex items 在 main axis方向上的base size 默认为auto,可以设置具体的宽度数值 决定flex items最终base size 的因素,优先级从高到低
- max-width\max-height\min-width\min-height
- flex-basis width\height
- 内容本身的size