display属性
- display 是CSS中最重要的用于控制布局的属性。
- 每个元素都有一个默认的 display 值,这与元素的类型有关。
- 列举一些已经学过的属性值:
属性值 | 描述 |
---|---|
block |
一个 block 元素通常被叫做块级元素。div 是一个标准的块级元素。一个块级元素会新开始一行并且尽可能撑满容器。其他常用的块级元素包括 p 、 form 和HTML5中的新元素: header 、 footer 、 section 等等。 |
inline |
一个 inline 元素通常被叫做行内元素。span 是一个标准的行内元素, a 元素是最常用的行内元素。 |
inline-block |
它可以让内联的盒子像一个块元素,使元素在一行显示,仍然保持样式可设置 |
flex |
用于设置元素为弹性盒子的父容器 |
none |
一些特殊元素的默认 display 值是它,例如 script 。 display:none 通常被 JavaScript 用来在不删除元素的情况下隐藏或显示元素。它和 visibility 属性不一样。把 display 设置成 none 元素不会占据它本来应该显示的空间,但是设置成 visibility: hidden; 还会占据空间。 |
- 每个元素都有一个默认的
display
类型。不过你可以随时随地的重写它!常见的例子是:把 li 元素修改成inline
,制作成水平菜单。
max-width
属性更好地处理小窗口情况
使用 max-width
替代 width
可以使浏览器更好地处理小窗口的情况。
1 | <head> |
可以看到缩小窗口以后下方的水平滚动条:
使用 max-width
替代 width
使用 max-width
后可以注意到缩小窗口后也不会出现水平滚动条:
替代盒模型注意事项
box-sizing
是个很新的属性,目前应该像下面例子中那样使用 -webkit-
和 -moz-
前缀。这可以启用特定浏览器实验中的特性。同时记住它是支持IE8+的。
1 | * { |
position
属性与CSS<footer>
标签(页脚)
- 如果你使用了一个固定定位的页眉或页脚,确保有足够的空间来显示它们!比如:在 body 上面加上足够的 margin-bottom 。
- 例子
float
属性
Float 可用于实现文字环绕图片,如下:
1 | img { |
nav
元素与float
属性
这个例子在容器比nav元素高的时候可以正常工作。如果容器比nav元素低,那么nav会溢出到容器的外面。
nav改用浮动以后可以解决易出问题。
响应式设计——媒体查询
- MDN 媒体查询
- 一个例子:当屏幕宽度大于600px时执行的CSS样式表与小于599px时执行的CSS样式表有所不同,当窗口缩小到宽度小于599px时,nav中的li元素就会转变为行内元素并出现在section元素上方。
vertical-align
属性设置行内元素垂直方向对齐方式
- vertical-align 用来指定行内元素(inline)或表格单元格(table-cell)元素的垂直对齐方式。
- 注意: vertical-align 只对行内元素、表格单元格元素生效,不能用它垂直对齐块级元素。
- 作用于行内元素的属性值(分为“相对父元素的值”和”相对行的值”):
相对父元素的属性值 描述(这些值使元素相对其父元素垂直对齐) baseline(默认值) 使元素的基线与父元素的基线对齐。HTML规范没有详细说明部分可替换元素的基线,如 <textarea>
,这意味着这些元素使用此值的表现因浏览器而异。sub 使元素的基线与父元素的下标基线对齐。 super 使元素的基线与父元素的上标基线对齐。 text-top 使元素的顶部与父元素的字体顶部对齐。 text-bottom 使元素的底部与父元素的字体底部对齐。 middle 使元素的中部与父元素的基线加上父元素x-height(译注:x高度)的一半对齐。 <length>
使元素的基线对齐到父元素的基线之上的给定长度。可以是负数。 <percentage>
使元素的基线对齐到父元素的基线之上的给定百分比,该百分比是line-height属性的百分比。可以是负数。
相对行的属性值 | 描述(下列值使元素相对整行垂直对齐) |
---|---|
top | 使元素及其后代元素的顶部与整行的顶部对齐。 |
bottom | 使元素及其后代元素的底部与整行的底部对齐。 |
没有基线的元素,使用外边距的下边缘替代。 |
vertical-align属性可被用于两种环境:
- 使行内元素盒模型与其行内元素容器垂直对齐。例如,**用于垂直对齐一行文本的内的图片
<img>
**: - 垂直对齐表格单元内容:
inline-block
属性值可方便创建网格
- 想要创建很多网格来铺满浏览器。在过去很长的一段时间内使用 float ,但是使用
display:inline-block;
会更简单。 - 让我们看下使用这两种方法的例子对比
注意:
vertical-align
属性(默认值为baseline
)会影响到inline-block
元素,你可以把它的值设置为top
(使元素及其后代元素的顶部与整行的顶部对齐) 。(例子)- 你需要设置每一列的宽度
- 如果HTML源代码中元素之间有空格,那么列与列之间会产生空隙
- 你得做些额外工作来让IE6和IE7支持
inline-block
。有些时候人们谈到inline-block
会触发叫做hasLayout
的东西,你只需要知道那是用来支持旧浏览器的就可以了。如果你对此很感兴趣,可以在这个链接中找到更详细的信息。
columns
属性轻松实现文字的多列布局
- CSS columns是很新的标准,所以你需要使用前缀(如下方例子中),并且它不被IE9及以下和Opera Mini支持。还有许多和 column 相关的属性,点击这里了解更多。
- 一个例子
- MDN 关于
columns
属性
使用flexbox
居中布局
- 同时在父容器设置
align-items: center;
(沿交叉轴居中)与justify-content: center;
(沿主轴居中)可以使子项元素在父容器中居中。 - 例子
布局模型
1. 流动模型(Flow) [默认的]
流动(Flow)模型是默认的网页布局模式。也就是说网页在默认状态下的 HTML 网页元素都是根据流动模型来分布网页内容的。
流动布局模型具有2个比较典型的特征:
- 块状元素都会在所处的包含元素内自上而下按顺序垂直延伸分布,因为在默认状态下,块状元素的宽度都为100%。实际上,块状元素都会以行的形式占据位置。
- 在流动模型下,行内元素都会在所处的包含元素内从左到右水平分布显示。
2. 浮动模型 (Float)
使用CSS的float
属性。
3. 层模型(Layer)
层模型有三种形式:
- 相对定位(position: relative)
- 绝对定位(position: absolute)
- 固定定位(position: fixed)
注意:固定定位是相对视图定位,不会随着滚动条的操作而移动位置。而绝对定位相对于其最接近的一个非默认position属性值的父元素进行定位,在父元素全部是默认position属性值时则是相对body元素(即相对于浏览器窗口)进行定位,会随着滚动条的操作而移动位置。【注意区分“视图”与“浏览器窗口”】
注意:
更改堆叠顺序的z-index
属性只适用于定位元素(position
属性值为 static
的对象不是定位元素)
父子元素都设置z-index
属性时只要父元素z-index
属性生效则子元素z-index
属性不生效,默认与父元素属性值相等并按照文档流排列,子元素出现在父元素上方。(父元素未设置position属性值或设为默认值 static
时z-index
属性失效,则子元素z-index
属性生效)
什么时候用定位,什么时候用浮动
float被设计出来的初衷是用于——文字环绕图片
float是部分脱离文档流,而absolute是完全脱离文档流。
也就是说,使用float属性时,其他元素会无视这个float元素,但是其他元素内的文本依然会为这个元素让出位置,环绕在周围,所以称为部分无视。
而使用absolute脱离文档流的元素,其它盒子无论是本身还是盒子内的文本都会无视这个元素,也就是完全脱离文档流。
float多个特性
- 破坏性:被设置了float的元素会脱离文档流
- 包裹性:块级元素设置了float之后,其宽度会自动调整为包裹住内容宽度,而不是撑满整个父容器。
- 清空格:根本原因是由于float会导致节点脱离文档流结构,float元素都不属于文档流结构了,那么它身边的什么换行、空格就都和它没关系,它就尽量的往一边去靠拢,能靠多近就靠多近,这就是清空格的本质。
float具有“破坏性”,它会导致父元素“坍塌”(即父元素无法包裹float子元素),此时可以为父元素添加overflow:hidden
,这样父元素就有高度了 ,父元素的高度便不会被破坏。
网页布局方式
网页实质是块与块之间的位置,块挨着块,块嵌套块,块叠着块。
三种关系:相邻,嵌套,重叠。
参考
一列布局(固定宽高,水平居中)
一般都是固定的宽高,设置margin : 0 auto
来水平居中,用于界面显著标题的展示等:
1 | .main{ |
两列布局(常用float
)
- 最常见的就是使用
float
来实现。float
浮动布局的缺点是浮动后会造成文本环绕等效果,需要及时清除浮动。 - 设置左左浮动,或设置左右浮动(需要设置父元素的宽度)
- 如果父级元素没有设置高度,则需要设置
overflow:hidden
/display:flow-root
创建BFC/display:flow-root
创建BFC避免父元素“高度坍塌”。- 当一个父元素的子元素设置了浮动或者绝对定位时,父元素的高度可能会丢失,从而导致所谓的“高度坍塌”问题。这是因为浮动或者绝对定位的元素脱离了文档流,不再占据父元素的空间,导致父元素无法自动计算出正确的高度。
- 通过设置
overflow:hidden
,可以触发 BFC(块级格式化上下文)的生成,从而使得父元素包含其浮动或绝对定位的子元素。BFC是一种渲染区域,其中的元素布局是相互独立的,不会影响到外部元素。当父元素生成了BFC后,其高度将被计算为包含其子元素的高度,从而避免了高度坍塌问题。 - 因此,使用
overflow:hidden
可以有效避免父元素高度坍塌问题。但需要注意的是,这也可能导致溢出内容被隐藏,需要根据实际情况进行权衡和选择。**display:flow-root
可以创建无副作用的BFC**
1 | <div class="main"> |
1 | .main{ |
三列布局(浮动或子绝父相)
浮动:
首先设置父级元素的宽度(width: 100%;overflow: hidden;
)
- 可以左左右设置浮动。然后中间设置margin调整间距。
- 也可以都设置成左浮动,设置margin,调整间距。同样注意清除浮动!
子绝父相:
为父元素设置relative属性,再为子元素设置absolute属性,再分别定位,调间距。
混合布局
在一列布局的基础上,保留top和foot部分,将中间的main部分改造成两列或三列布局,小的模块可以再逐级同理划分。
对齐方式
水平居中
补充:img是行内元素,为什么可以设置框高?(面试题)
(题目来自魅族一面)
问题:既然img是行内元素,那为什么可以通过CSS设置框高呢?
答案:尽管img是行内元素,但同时它也是置换元素,置换元素一般内置框高属性,因此可以设置其框高。
引申问题:那么什么又是“置换元素”呢?
答案:置换元素就是会根据标签属性来显示的元素。反之就是非置换元素了。比如img根据src属性来显示,input根据value属性来显示,因此可知道img和input是置换元素,当然同理select也是置换元素。
行内元素的水平居中
- 注意:
text-align
属性虽然规定元素中的文本的水平对齐方式,但他是作用于块级元素的(p/h1等等)。 - 如果被设置元素为文本、图片等行内元素时,则需要**在父元素中设置
text-align:center
**实现行内元素水平居中(必要时可以将子元素的display设置为inline-block,使子元素变成行内元素的同时可设置样式)。
补充:图片等比缩小可借助max-width和max-height
1 | .dad { |
1 | <div class="dad"> |