赞
踩
目录
无论是前端还是客户端开发都离不开页面的展示,而页面是由布局和各种组件构成的。布局好比是建筑里的框架,而组件则相当于建筑里的砖瓦。组件按照布局的要求依次排列,就组成了用户所看见的界面。
比如Android开发者常用的布局方式有:线性布局(LinearLayout)、相对布局(RelativeLayout)、绝对布局(AbsoluteLayout)、网格布局(GridLayout)等。
IOS开发者常用的布局方式:手写Frame、自动布局(AutoLayout)、xib、storyboard等方式,我们这里主要介绍前端的布局方式。虽然目前大多数网站的构建都是通过成熟的框架搭建的,但是作为前端开发的基础,学习了解一下布局还是很有必要的。
页面布局(Layout):就是对页面的文字、图形或表格进行排布、设计。
研究布局的目的是让我们的页面尽可能的还原UI设计给我们的设计图,适配各种尺寸的屏幕,使其在各种尺寸屏幕上能很好地显示出我们的视图。
我们来看下我们Web开发中常用的几种布局类型:
这是页面默认布局的方式 ,每个元素都有默认空间,每个元素都是在父元素的左上角出现的,页面中的块元素都是按照从上到下的方式出现,每个块元素独占一行,页面中行内元素都是从左到右的方式排列。
每个元素都有一个默认的 display
值,这与元素的类型有关。对于大多数元素它们的默认值通常是 block
或 inline
。一个 block
元素通常被叫做块级元素。一个 inline
元素通常被叫做行内元素。比如 div
是一个标准的块级元素,页面在进行渲染时候,遇到块级元素会另起一行,而行内元素会在当前行进行展示。举个简单的例子:
- html
- <head>
- <title>标题</title>
- <style>
- * {
- padding: 0;
- margin: 0;
- box-sizing: border-box;
- }
- body {
- background-color: white;
- }
- div {
- border: 1px solid red;
- }
- span {
- border: 1px solid green;
- }
- body :nth-child(4) {
- display: inline-block;
- background-color:salmon;
- }
- </style>
- </head>
- <body>
- <div>这是一个div块元素</div>
- <span>这是一个行内元素</span>
- <span>这是另一个行内元素</span>
- <div>
- 这是行内块元素
- </div>
- <div>这是还是一个div块元素</div>
- </body>
div
元素是单独占一行的,而行内元素span
不会换行。其他常用的块级元素包括 p
、 h1——h6
、form
以及Html5中的新元素: header
、 footer
、 section
等等。常用的行内元素a
、input
、img
、label
等。display
的取值除了为block
跟inline
外还可以取值inline-block
,它表示行内块元素,如果一个块元素的display属性取值为inline-block,那么他就不在换行,比如我们这里的第二个div元素。如果一个行内元素display取值为inline-block那么它就具有了块元素的一些特性,例如我们可以改变它的尺寸。display
值是 none
。一些特殊元素的默认display
值是它,例如 script
。 display:none
通常被 JavaScript 用来在不删除元素的情况下隐藏或显示元素。它和 visibility
属性不一样。把 display
设置成 none
元素不会占据它本来应该显示的空间,但是设置成 visibility: hidden;
还会占据空间。display
还有一些其他取值,可以看这里属性:float
取值:none
: 默认,无浮动left
: 左浮动,让元素在父元素的左边,或者挨着已有的浮动元素right
: 右浮动,让元素在父元素的右边,或者挨着已有的浮动元素
我们看下它如何使用,正常情况下的布局:
- <!DOCTYPE html>
- <html>
- <head>
- <title>正常布局</title>
- <meta charset="UTF-8">
- <style>
- * {
- margin: 0;
- padding: 0;
- box-sizing: border-box;
- }
- .container {
- background-color: wheat;
- }
- .left {
- width: 100px;
- height: 200px;
- background-color: rosybrown;
- }
- .right {
- width: 100px;
- height: 200px;
- background-color: saddlebrown;
- }
- .last {
- width: 100px;
- height: 200px;
- background-color: red;
- }
- </style>
- </head>
-
- <body>
- <div class="container">
- <div class="left">左侧</div>
- <div class="right">右侧</div>
- </div>
- <div class="last">后面</div>
- </body>
- </html>
现在我们分别给.left
跟.right
添加浮动属性,添加下面代码
- .left {
- float: left;
- width: 100px;
- height: 200px;
- background-color: rosybrown;
- }
- .right {
- float: right;
- width: 100px;
- height: 200px;
- background-color: saddlebrown;
- }
结果:
看下页面效果,左右两个模块倒是符合我们的预期,但是container
元素的背景没有了,我们检查下元素,可以看到container
的高度变成了0,last
只展示了文字,背景没有了。这就说到float属性的特点了:
特点:
解决浮动带来的影响
(1)可以直接设置父元素的高度,比如直接添加height:300px;
(2)为父元素设置overflow
取值 hidden
或者auto
(3)使用clear
属性,取值both
可以解决左右浮动带来的影响。这里注意:这里要给contariner
容器添加子元素
(4)在容器内添加一个CSS伪元素,并将其clear属性设置为both。
- <div class="container">
- <div class="left">左侧</div>
- <div class="right">右侧</div>
- <div style="clear:both"></div>
- </div>
或者是
- .container::after {
- content: "";
- display: table;
- clear: both;
- }
看下效果,符合我们的预期了
实际上浮动最主要的作用:是可以使块级元素在一行内显示。并且可以使文字可以环绕浮动元素进行排列。
position
,默认值:static
,根据其取值的的不同分为:position:relative
;position:absolute
;position:fixed
;position
属性取值不为static
,那么这个元素就被称为已定位元素。这里需要注意,后面在介绍这几种定位时,已定位元素会对他本身的位置有所影响。top
、left
、right
、bottom
,取值是以px为单位的数值,取值可以是正数也可以是负数,分别对应不同方向的偏移top
:取值为正,向下移动,取值为负数,向上移动bottom
:取值为正,向上移动,负值 向下移动。left
:取值为正,右移动,负值 左移动right
:取值为正 左移动,负值 右移动如何记忆:可以参考下面的图例,取值为正数时,都是向元素的内部进行靠拢,取值为负数时候都是向远离元素的位置移动。
relative
元素相对于他原来的位置进行距离偏移
用法:position:relative;
配合 top、left、right、bottom进行位置的微调
我们还是以上面的正常文档流布局为例,现在我们想让右侧块跟左侧块在一行显示,并且在左侧块的右边显示,实现下图的效果:
那么我们可以设置.right
的布局如下
- .right {
- position: relative;
- top: -100px;
- left: 50px;
- width: 50px;
- height: 100px;
- background-color: saddlebrown;
- }
absolute
元素会相对于离他最近的已定位的(三种定位方式的一中)祖先元素去实现位置的初始化跟偏移,祖先元素就是本元素的父级元素。如果没有已定位的祖先元素,那就相对于body去实现位置的初始化跟偏移。绝对定位元素会变成块级元素。
用法:position:absolute;
配合 top、left、right、bottom进行位置的微调
现在我们想让右侧块块叠加在左侧块之上显示,实现下图的效果:
那么我们可以设置.right
的布局如下
- .right {
- position: absolute;
- top: 50px;
- left: 0;
- width: 50px;
- height: 100px;
- background-color: saddlebrown;
- }
absolute
后 原先父元素的高度变化了,说明.right
脱离了文档流,不再占据页面空间。注意这里top: 50px;
的改变是相对于body改变的,其初始化位置为文档流的左上角,因为其父元素container
并不是已定位的元素。fixed
固定定位(position:fixed)元素会相对于视窗来定位,这意味着即便页面滚动,它还是会停留在相同的位置。和 relative 一样, top 、 right 、 bottom 和 left 属性都可用。
我们还是拿上面的例子,我们将last
固定在页面的右下角,设置last
的CSS如下
- .last {
- position: fixed;
- right: 0;
- bottom: 0;
- width: 70px;
- height: 75px;
- background-color: red;
- }
position:fixed
的元素也会脱离文档流。一旦将元素设置 已定位元素(position的取值不为static),元素可能会出现堆叠效果,堆叠效果的属性:
z-index
,取值:无单位的数子,数子越大越靠上
我们以上面绝对定位的例子来说明,设置了right
为绝对定位后,right
在left
的上面,此时如果想让left
在上,right
在下,实现下面效果:
设置left
的CSS代码
- .left {
- position: relative;
- z-index: 10;
- width: 50px;
- height: 100px;
- background-color: rosybrown;
- }
position: relative;
是没有效果的,父子元素之间无法调整堆叠效果,子元素压在父上。flex布局又叫弹性布局,是一种为一维布局而设计的布局方法。一维的意思是你希望内容是按行或者列来布局。你可以使用display:flex
来将元素变为弹性布局。
我们直接看例子:实现7个item横向排列
- <!DOCTYPE html>
- <html>
- <head>
- <title>flex布局2</title>
- <meta charset="UTF-8">
- <style>
- * {
- margin: 0;
- padding: 0;
- box-sizing: border-box;
- }
- .container {
- display: flex;
- flex-direction: row;
- justify-content: flex-start;
- align-items: flex-end;
- background-color: wheat;
- flex-wrap: wrap;
- }
- .item {
- width: 100px;
- height: 100px;
- border: 1px solid royalblue;
- text-align: center;
- line-height: 100px;
- margin: 10px 10px;
- }
- .item6 {
- flex: 1;
- }
- .item7 {
- flex: 2;
- }
- </style>
- </head>
-
- <body>
- <div class="container">
- <div class="item0 item">item0</div>
- <div class="item1 item">item1</div>
- <div class="item2 item">item2</div>
- <div class="item3 item">item3</div>
- <div class="item4 item">item4</div>
- <div class="item5 item">item5</div>
- <div class="item6 item">item6</div>
- <div class="item7 item">item7</div>
- </div>
- </body>
- </html>
上面的代码基本基本涵盖了我们常用的flex的属性
display:flex
: 设置container
容器为弹性布局
flex-direction
:决定主轴的方向,项目横向或是纵向排列
取值:row | row-reverse | column | column-reverse;row
(默认值):主轴为水平方向,起点在左端。row-reverse
:主轴为水平方向,起点在右端。column
:主轴为垂直方向,起点在上沿。column-reverse
:主轴为垂直方向,起点在下沿。
justify-content
: 定义Item在主轴上如何对齐。
取值:flex-start | flex-end | center | space-between | space-around;flex-start
(默认值):左对齐flex-end
:右对齐center
: 居中space-between
:两端对齐,项目之间的间隔都相等。space-around
:每个项目两侧的间隔相等。所以,项目之间的间隔比项目与边框的间隔大一倍。
align-items
:定义Item在交叉轴上如何对齐。
取值:align-items: flex-start | flex-end | center;flex-start
:交叉轴的起点对齐。flex-end
:交叉轴的终点对齐。center
:交叉轴的中间点对齐。
flex-wrap
:一条轴线上放不下,决定其是否换行
取值: nowrap(不换行) | wrap(换行)
flex 属性:flex属性是flex-grow
, flex-shrink
和 flex-basis
的简写,默认值为0 1 auto。flex-grow
: 属性定义项目的放大比例,默认为0,即如果存在剩余空间,也不放大。 取值越大,占用剩余空间越大。flex-shrink
: 属性定义了项目的缩小比例,默认为1,即如果空间不足,该项目将缩小。flex-basis
:属性指定了flex元素在主轴方向上的初始大小
这里设置item6
与 item7
的flex为1和2,表示当前轴剩余的空间item6占1/3,item7占2/3.
我们访问caniuse查看浏览器对它支持情况,可以看到目前绝大多数浏览器是支持这个属性的。
更多的关于flex的属性可以查看这里:flex布局
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。