块级元素与行内元素
p、ul、form、div 等元素被称为块级元素,这些元素会自动换行,span、input 等元素称为行内元素,这些元素在一行中水平排列,行内元素的高度由其内容撑开,不可显示的设置其高度,这就是为什么在span上设置height属性不起作用的原因。
简单了解了这些知识,看看display常用的几个属性。
| 值 | 描述 |
|---|---|
| none | 此元素不会被显示。 |
| block | 此元素将显示为块级元素,此元素前后会带有换行符。 |
| inline | 此元素会被显示为内联元素,元素前后没有换行符。 |
| inline-block | 行内块元素。(CSS2.1 新增的值) |
在显示隐藏元素的时候经常会用到把display设为none或者’ ’,设为none可以让元素脱离文档流,不显示并且不占文档空间,而设为’ ’其实就是把属性设置为block或inline。
inline-block属性是CSS2.1新加值,IE8以上及其他主流浏览器都已经支持,它可以使元素像行内元素那样水平一次排列,但是框的内容符合块级元素行为,能够显示设置宽,高,内外边距。
另外,可以通过不同的赋值改变元素生成框的类型,也就是说,通过将display属性设置为block,可以使行内元素表现的想块级元素一样,反之亦然。
定位
要想了解CSS元素定位就需要了解position属性了,position属性有几个常用值如下。
| 值 | 属性 |
|---|---|
| inhert | 规定应该从父元素继承 position 属性的值。 |
| static | 默认值。没有定位,元素出现在正常的流中(忽略 top, bottom, left, right 或者 z-index 声明)。 |
| relative | 生成相对定位的元素,相对于元素本身正常位置进行定位。因此,"left:20" 会向元素的 LEFT 位置添加 20 像素。 |
| absolute | 生成绝对定位的元素,相对于 static 定位以外的第一个祖先元素进行定位。元素的位置通过 "left", "top", "right" 以及 "bottom" 属性进行规定。 |
| fixed | 生成绝对定位的元素,相对于浏览器窗口进行定位。元素的位置通过 "left", "top", "right" 以及 "bottom" 属性进行规定。 |
CSS有三种基本的定位机制:普通流,浮动和绝对定位。
普通流是默认定位方式,在普通流中元素框的位置由元素在html中的位置决定,元素position属性为static或继承来的static时就会按照普通流定位,这也是最常见的方式。
在使用相对定位时,无论元素是否移动,元素在文档流中占据原来空间,只是表现会改变。 另外,固定定位fixed是绝对定位,但不包含在普通文档流中。
浮动
浮动元素不在文档的普通流中。浮动的框可以左右移动(根据float属性值而定),直到它的外边缘碰到包含框或者另一个浮动元素的框的边缘。
如果包含块太窄,无法容纳水平排列的浮动元素,那么其它浮动块向下移动,如果这些浮动元素的高度不同,那么向下移动的时候可能被卡住。
行框和清理
浮动元素旁边的行框被缩短,从而给浮动元素流出空间,因而行框围绕浮动框。要想阻止行框围绕在浮动元素外边,可以使用clear属性,属性的left,right,both,none表示框的哪些边不挨着浮动框。
另外,应用值为hidden或auto的overflow属性会有一个副作用:自动清理包含的任何浮动元素,所以在页面出现相关问题时,可以看看是不是这个属性的问题。
高度塌陷
当父元素没有添加高度(高度自适应),而子元素又脱离文档流的时候(当子元素设置了浮动或者子元素的position属性值为absolute或是fixed,都会脱离文档流),就会发生高度塌陷。
如何解决高度塌陷?
一、给父元素添加高度
这种方法虽然简单,但是只适合固定页面的布局,无法进行自适应,不推荐使用。
二、触发BFC
BFC即 Block Formatting Contexts (块级格式化上下文), BFC有一个特性是计算BFC的高度时,浮动元素也参与计算,所以将box出发为BFC后可以解决高度塌陷。可以通过给box添加overflow: hidden;等声明触发BFC。
三、给所有的浮动元素后面加一个空的标签,给添加的这个空标签添加声明 clear: both; 。
另外,可以再加上height: 0; overflow: hieedn;这是为了避免这个空标签是li,因为li在IE6和IE7.上有默认高度撑着。
四、万能清除法:给高度塌陷的元素添加如下after伪类
.box::after{
content: '';
clear: both;/*清除两侧浮动*/
display: block;/*转成成一个块元素*/
overflow: hidden;
visibility: hidden;
}
子元素margin-top对父元素的影响
注意:::after对IE8以下有兼容问题,可以通过增加zoom: 1;声明来解决。
css2.1盒模型中规定:所有毗邻的两个或更多盒元素的margin将会合并为一个margin共享之。毗邻的定义为:同级或者嵌套的盒元素,并且它们之间没有非空内容、Padding或Border分隔。
根据定义,因为父div模块和子div模块之间没有非空内容、padding或者是border分割,所以此时这两个盒元素的margin合并共享之,子div的margin-top直接作用于合并的margin,将整个父div模块和子div模块下拉。因为两者同时下移,所以子div相对于父div的位置并未发生改变。
解决办法:
-
父级或子元素使用浮动或者绝对定位absolute(浮动或绝对定位不参与margin的折叠)
-
父级overflow:hidden;
-
父级设置padding(破坏非空白的折叠条件)
-
父级设置borde
Flex 布局
Flex 意为"弹性布局",用来为盒状模型提供最大的灵活性。任何一个容器都可以指定为 Flex 布局,行内元素也可以使用 Flex 布局。
注意:设为 Flex 布局以后,子元素的float、clear和vertical-align属性将失效。
基本概念
采用 Flex 布局的元素,称为 Flex 容器,简称"容器"。所有子元素自动成为容器成员,称为 Flex 项目,简称"项目"。
容器默认存在两根轴:水平的主轴和垂直的交叉轴。项目默认沿主轴排列。
容器的属性
以下6个属性设置在容器上。
flex-direction属性
flex-direction属性决定主轴的方向。
.box {
flex-direction: row | row-reverse | column | column-reverse;
}
它可能有4个值。
row(默认值):主轴为水平方向,起点在左端。
row-reverse:主轴为水平方向,起点在右端。
column:主轴为垂直方向,起点在上沿。
column-reverse:主轴为垂直方向,起点在下沿。
flex-wrap属性
默认情况下,项目都排在一条线上。flex-wrap属性定义,如果一条轴线排不下,如何换行。
.box{
flex-wrap: nowrap | wrap | wrap-reverse;
}
它可能取3个值。
nowrap(默认):不换行。
wrap:换行,第一行在上方。
wrap-reverse:换行,第一行在下方。
flex-flow属性
flex-flow属性是flex-direction属性和flex-wrap属性的简写形式,默认值为row nowrap。
.box {
flex-flow: <flex-direction> || <flex-wrap>;
}
justify-content属性
justify-content属性定义了项目在主轴上的对齐方式。
.box {
justify-content: flex-start | flex-end | center | space-between | space-around;
}
它可能取5个值,具体对齐方式与轴的方向有关。下面假设主轴为从左到右。
flex-start(默认值):左对齐
flex-end:右对齐
center: 居中
space-between:两端对齐,项目之间的间隔都相等。
space-around:每个项目两侧的间隔相等。所以,项目之间的间隔比项目与边框的间隔大一倍。
align-items属性
align-items属性定义项目在交叉轴上如何对齐。
.box {
align-items: flex-start | flex-end | center | baseline | stretch;
}
它可能取5个值。具体的对齐方式与交叉轴的方向有关,下面假设交叉轴从上到下。
flex-start:交叉轴的起点对齐。
flex-end:交叉轴的终点对齐。
center:交叉轴的中点对齐。
baseline: 项目的第一行文字的基线对齐。
stretch(默认值):如果项目未设置高度或设为auto,将占满整个容器的高度。
align-content属性
align-content属性定义了多根轴线的对齐方式。如果项目只有一根轴线,该属性不起作用。
.box {
align-content: flex-start | flex-end | center | space-between | space-around | stretch;
}
该属性可能取6个值。
flex-start:与交叉轴的起点对齐。
flex-end:与交叉轴的终点对齐。
center:与交叉轴的中点对齐。
space-between:与交叉轴两端对齐,轴线之间的间隔平均分布。
space-around:每根轴线两侧的间隔都相等。所以,轴线之间的间隔比轴线与边框的间隔大一倍。
stretch(默认值):轴线占满整个交叉轴。
项目的属性
以下6个属性设置在项目上。
order属性
order属性定义项目的排列顺序。数值越小,排列越靠前,默认为0。
.item {
order: <integer>;
}
flex-grow属性
flex-grow属性定义项目的放大比例,默认为0,即如果存在剩余空间,也不放大。
.item {
flex-grow: <number>; /* default 0 */
}
注意:如果所有项目的flex-grow属性都为1,则它们将等分剩余空间(如果有的话)。如果一个项目的flex-grow属性为2,其他项目都为1,则前者占据的剩余空间将比其他项多一倍。
flex-shrink属性
flex-shrink属性定义了项目的缩小比例,默认为1,即如果空间不足,该项目将缩小。
.item {
flex-shrink: <number>; /* default 1 */
}
注意:如果所有项目的flex-shrink属性都为1,当空间不足时,都将等比例缩小。如果一个项目的flex-shrink属性为0,其他项目都为1,则空间不足时,前者不缩小。
负值对该属性无效。
flex-basis属性
flex-basis属性定义了在分配多余空间之前,项目占据的主轴空间。浏览器根据这个属性,计算主轴是否有多余空间。它的默认值为auto,即项目的本来大小。
.item {
flex-basis: <length> | auto; /* default auto */
}
注意:如果设为跟width或height属性一样的值,则项目将占据固定空间。
flex属性
flex属性是flex-grow, flex-shrink 和 flex-basis的简写,默认值为0 1 auto。后两个属性可选。
.item {
flex: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ]
}
该属性有两个快捷值:auto (1 1 auto) 和 none (0 0 auto)。
注意:优先使用这个属性,而不是单独写三个分离的属性,因为浏览器会推算相关值。
align-self属性
align-self属性允许单个项目有与其他项目不一样的对齐方式,可覆盖align-items属性。默认值为auto,表示继承父元素的align-items属性,如果没有父元素,则等同于stretch。
.item {
align-self: auto | flex-start | flex-end | center | baseline | stretch;
}
该属性可能取6个值,除了auto,其他都与align-items属性完全一致。
透明度设置
在搭建前端页面时,我们也会遇到需要设置透明度的情况。实现透明的css方法通常有3种方式,以下是不透明度为80%的3种写法:
1、css3的opacity:x,例 opacity: 0.8
2、css3的rgba(red, green, blue, alpha),例 rgba(255,255,255,0.8)
3、IE专属滤镜 filter:Alpha(opacity=x),例 filter:Alpha(opacity=80)
css3的opacity
兼容性:IE6、7、8不支持,IE9及以上版本和标准浏览器都支持
使用说明:设置opacity元素的所有后代元素会随着一起具有透明性,一般用于调整图片或者模块的整体不透明度
css3的rgba
兼容性:IE6、7、8不支持,IE9及以上版本和标准浏览器都支持
解决IE8浏览器不支持rgba的方法:
background:rgba(0,0,0,0.5);
filter:progid:DXImageTransform.Microsoft.gradient(startcolorstr=#7F000000,endcolorstr=#7F000000);
使用说明:设置颜色的不透明度,一般用于调整background-color、color、box-shadow等的不透明度
另外,background:rgba(200, 54, 54, 0.5);中,表示半透明度的0.5可以直接写为.5。