盒子模型
盒子模型.jpg盒子模型是CSS布局的基础,CSS假定每个元素都会生成一个或多个矩形框,每个元素框中心都有一个内容区(content),这个内容区周围有内边距(padding)、边框(border)和外边距(margin),这些项默认宽度为0,这个矩形框就是常说的盒子模型。
简单来说,HTML中每一个元素就是一个盒子,同理,在小程序中每一个组件就是个盒子,元素的宽度、高度就是内容区域宽度、高度,不包含内边距、边框和外边距,我们可以通过元素width、height、padding、border、margin属性控制盒子样式。
盒子模型根据浏览器具体实现可分为W3C的标准盒子模型和IE盒子模型,这两种盒子模型在宽度和高度的计算上不一致,IE盒子模型的宽度和高度是包含内边距和边框的,我们这里讲述的主要是W3C的盒子模型,WXSS完全遵守W3C盒子模型规范。
1.块级元素
元素按显示方式主要可以分为块级元素和行内元素,元素的显示方式是由display属性控制的,块级元素会默认占一行高度,一般一行内只有一个块级元素(浮动后除外),当再添加新的块级元素时,新元素会自动换行显示。
块级元素一般作为容器出现,用于组织结构。一些元素默认就是块级元素,如小程序中的<view/>组件,而一些则默认是行内元素,我们可以通过修改元素display属性为block,将一个元素强制设置为块级元素。一个块级元素的元素框与其父元素的width相同,块级元素的width+marginLeft+marginRight+paddingLeft+paddingRight刚好等于父级元素内容区宽度,显示时默认撑满父元素内容区。块级元素高度由其子元素决定,父级元素高度会随内容元素变化而变化。
块级元素特点总结如下:
□总是在新行上开始。
□宽度默认为width+marginLeft+marginRight+paddingLeft+paddingRight刚好等于父级元素内容区宽度,除非设定一个新宽度,这里需要注意,当设置块级元素宽度为100%时,如果当前块级元素存在padding、margin会导致块级元素溢出父元素。
□盒子模型高度默认由内容决定。
□盒子模型中高度、宽度及外边距和内边距都可控制。
□可以容纳行内元素和其他块级元素。
示例:
<view/>组件默认是块级元素,下面我们使用<view/>为大家演示块级元素的特性
块级元素.png
<!--父级元素高度随内容决定 内容为块级元素--->
<view style='margin-top:10px;border:solid 1px'>
<view style='height:100px'>块级元素</view>
</view>
<!--每个块级元素占领一行-->
<view style='border:solid 1px'>第一个块级元素</view>
<!--默认情况下块级元素的元素框和父级元素的width相同,刚好撑满内容区-->
<view style='border:solid 10px;margin:10px;padding:10px'>第二个块级元素</view>
<!--即使宽度不足,仍会占领一行让其余元素换行-->
<view style='border:solid 1px;width:200px'>第三个块级元素</view>
<!--父级元素高度随内容决定 内容为文本流情况-->
<view style='margin-top:10px;border:solid 1px'>文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本</view>
2.行内元素
除了块级元素,最常见的就是行内元素了,通过设置display属性为inline可以将一个元素设置为行内元素,小程序中<text/>就是一个行内组件。行内元素没有块级元素那么简单直接,块级元素只是生成框,通常不允许其他内容与这些框并存;
行内元素特点总结如下:
□和其他非块级元素都在一行上。
□盒子模型中高度、宽度、上下margin、上下padding设置均无效,只能设置左右margin和左右padding。
□宽度就是文字或图片的宽度,不可改变。
□行内元素宽度、高度都不能直接设置。
□行内元素只能容纳文本或其他行内元素,在行内元素中放置块级元素会引起不必要的混乱。
本例中行内元素换行是因为上面的块级元素强制占位一行。
行内元素.png
<!--块级元素 -->
<view style='border:solid 1px #999;color:#999'>我是块级元素我是块级元素我是块级元素我是块级元素我是块级元素</view>
<!--通过修改display属性的行内元素-->
前面的文字<view style="border:solid 1px; margin:10px; padding : 0 10px; display:inline; ">我是块级元素我是块级元素我是块级元素</view>后面的文字
3.行内块元素
行内块元素.png行内块元素是块级元素和行内元素的混合物,当display属性为inline-block时,元素就被设置为一个行内块元素,行内块元素可以设置宽、高、内边距和外边距,可以简单认为行内块元素是把块级元素以行的形式展现,保留了块级元素对宽、高、内边距、外边距的设置,它就像一张图一样放在一个文本行中.
<!--行内块元素宽度撑满父级宽度情况-->
前面的文字<view style='border:solid 1px;margin:10px;padding:10px;display:inline-block'>我是块级元素我是块级元素我是块级元素我是块级元素我是块级元素</view>后面的文字
<!--行内块元素宽度不足父级宽度情况 -->
前面的文字<view style="border:solid 1px;margin: 10px;padding : 10px; display:inline-block; ">我是行内块元素</view>后面的文字后面的文字
浮动和定位
1.浮动
浮动不完全是定位,同时它也不是正常流布局,通过设置float属性,浮动的框可以向左或者向右移动,直到其外边缘碰到包含框或另一个浮动框的边框为止。由于浮动框不在文档的普通流中,文档的普通流中的会表现的浮动框不存在一样,其他内容会环绕过去。
浮动.png<view>文本文本文本文本文本文本文本文本文本文本文本
<view style='display:block;float:left;border:solid 1px;margin:20px'>浮动框</view>本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本
</view>
在上例中有个特别有意思的现象,父元素虽然会忽略浮动元素(如浮动高度示例中产生的坍塌),但是不会忽略其他元素(包括清除浮动的元素),而清除浮动的元素总在浮动元素下方,所以在显示时视觉上父元素就把所有元素都包含进去了,如上例中无论非浮动元素在哪里,父元素边框都包含了非浮动元素。利用这个特性,如果把上例中清除浮动的高度置为0使其看不见,这时父元素仍然会包裹它,这样就能防止浮动元素父元素高度坍塌,网上利用after伪属性清除浮动就是这个原理。这里我们对比使用元素和after伪属性2种实现方案
清除浮动.png//wxml
<!--添加高度为0的元素清除浮动-->
<view style='border:solid 1px'>
<view>其他元素</view>
<view style='float:left'>浮动框</view>
<view style='clear:both;height:0'></view>
</view>
<!--利用伪属性在后面插入一个元素清除浮动 -->
<view style='border:solid 1px;margin-top:10px' class='clearfix'>
<view>其他元素</view>
<view style='float:left'>浮动框</view>
</view>
<!--不清除浮动对比-->
<view style='border:solid 1px;margin-top:10px'>
<view>其他元素</view>
<view style='float:left'>浮动框</view>
</view>
//wxss
/* 一定要设置content,否则元素不会显示 */
.clearfix::after{
display: block;
height: 0;
clear: both;
content: ''
}
在实际项目中,为了复用性和便捷性,我们通常使用.clearfix类清除浮动。
2.定位
元素的定位由position属性控制,position有4种不同类型的定位,会影响元素框生成的方法:
□static:元素框正常生成。块级元素生成一个矩形框,作为文档流的一部分,行内元素则会创建一个或多个行框,置于其父元素中,static是position的默认值。
□relative:元素框偏移某个距离。元素仍保持其未定位前的形状,它原本所占的空间仍保留。
□absolute:元素框从文档流中完全删除,并相对于其包含块定位,包含块可能是文档中的另一个元素或者是初始包含块。对于absolute来说,包含块是离当前元素最近的position为absolute或relative的父元素,如果父元素中没有任何absolute或relative布局的元素,那么包含块就是根元素。使用position布局后,元素原先在正常文档流中所占用的空间会关闭,就好像该元素原来不存在一样。元素定位后生成一个块级框,不论原来它在正常流中生成何种类型的框。
□fixed:元素框的表现类似于将position设置为absolute,不过其包含块是视窗本身。
定位.png
<!--relative相对之前位置进行移动,原占有空间不会被关闭-->
<view style='border:solid 1px'>
文案文案<text style='position:relative;top:10px;left:10px;background-color:green'>relative</text>文案文案文案文案文案文案文案
</view>
<!--absolute依赖于包含块,原占有空间会被关闭-->
<view style='border:solid 1px;position:relative;height:80px'>
文案文案<text style='position:absolute;top:10px;left:10px;background-color:green'>absolute</text>文案文案文案文案文案文案文案
</view>
<!--没有找到最近的absolute或relative元素会直接认为根元素是包含块,原占有空间会关闭 -->
<view style='border:solid 1px'>
文案文案<text style='position:absolute;bottom:10px;left:10px;background-color:green'>absolute不设置包含块</text>文案文案文案文案文案文案文案
</view>
<!-- fixed直接认为视窗本身为包含块,原占有空间会关闭 -->
<view style='border:solid 1px'>
文案文案<text style='position:fixed;bottom:10px;right:10px;background-color:green;border:solid'>fixed</text>文案文案文案文案文案文案文案
</view>
Flex布局
浮动和定位是基于盒子模型的传统布局解决方案,它在处理一些特殊布局时非常不方便,比如垂直居中,2009年W3C提出了一种新的方案Flex布局,该布局可以简单快速地完成各种伸缩性的设计。Flex是Flexible Box的缩写,即为弹性盒子布局,可以为传统盒子模型带来更大的灵活性
容器支持的属性有:
□display:通过设置display属性,指定元素是否为Flex布局。
□flex-direction:指定主轴方向,决定了项目的排列方式。
□flex-wrap:排列换行设置。
□flex-flow:flex-direction和flex-wrap的简写形式。
□justify-content:定义项目在主轴上的对齐方式。
□align-items:定义项目在交叉轴上的对齐方式。
□align-content:定义多根轴线的对齐方式,如果只有一根轴线,该属性不起作用。
1.display
display用来指定该元素是否为Flex布局,语法为:
.mybox{ display: flex | inline-flex; }
其属性值如下:
□flex:用于产生块级Flex布局。
□inline-flex:用于产生行内Flex布局,行内容器符合行内元素的特性,同时在容器内又符合Flex布局规范。
设置Flex布局以后,子元素的float、clear和vertical-align属性将会失效。
2.flex-direction
flex-direction用于指定主轴的方向,即项目排列的方向,语法为:
.mybox{ flex-direction : row | row-reverse | colum | colum-reverse; }
它有4个值
flex-direction.jpg
□row:主轴为水平方向,起点在左端,默认值。
□row-reverse:主轴为水平方向,起点在右端。
□colum:主轴为垂直方向,起点在上沿。
□colum-reverse:主轴为垂直方向,起点在下沿
3.flex-wrap
默认情况下,项目都排在一条线上,flex-wrap用来指定如果一条轴线排不下,该如何换行。
.mybox{ flex-wrap : nowrap | wrap | wrap-reverse; }
它有3个值
flex-wrap.jpg
□nowrap:不换行,默认值。
□wrap:换行,第一行在上方。
□wrap-reverse:换行,第一行在下方。
当设置换行时,还需要设置align-item属性配合实现自动换行,并且align-item的值不能为“stretch”。
4.flex-flow
flex-flow是flex-direction和flex-wrap的简写形式,默认值为row nowrap。语法如下:
.mybox{ flex-flow : <flex-direction> || <flex-wrap>; }
示例代码如下:
.mybox{ flex-flow : row-reverse wrap; } .mybox{ flex-flow : wrap row-reverse; }
/* 和上一句效果一样 */
.mybox{ flex-flow : row-reverse; } .mybox{ flex-flow : wrap; }
5.justify-content
justify-content属性定义了项目在主轴上的对齐方式,语法如下:
.mybox{ justify-content : flex-start | flex-end | center | space-between | space- around; }
justify-content与主轴方向有关,包括以下属性(默认主轴从左到右)
justify-content.jpg
□flex-start:左对齐,默认值。
□flex-end:右对齐。
□center:居中。
□space-between:两端对齐,项目之间的间隔都相等。
□space-around:每个项目两侧的间隔相等。所以,项目之间的间隔比项目与边框的间隔大一倍。
6.align-items
align-items指定项目在交叉轴上如何对齐,语法如下:
.mybox{ align-items : flex-start | flex-end | center | baseline | stretch; }
algin-items与交叉轴方向有关,包括以下属性(假设交叉轴从上到下
align-items.jpg
□flex-start:交叉轴的起点对齐。
□flex-end:交叉轴的终点对齐。
□center:交叉轴的中线对齐。
□baseline:项目根据它们第一行文字的基线对齐。
□stretch:如果项目未设置高度或设置为auto
7.align-content
align-content用来定义项目多根轴线(出现换行后)在交叉轴上的对齐方式,如果项目只有一根轴线,该属性不起作用,语法如下:
.mybox{ align-content : flex-start | flex-end | center | space-between | space- around | stretch; }
其属性值如下
align-content.jpg
□flex-start:与交叉轴的起点对齐。
□flex-end:与交叉轴的终点对齐。
□center:与交叉轴的中点对齐。
□space-between:与交叉轴两端对齐,轴线之间的间隔平均分布。
□space-around:每根轴线两侧的间隔都相等,轴线之间的间隔比轴线与边框间隔大一倍。
□stretch:轴线占满整个交叉轴,每个项目会被拉伸直至填满交叉轴,默认值。
项目属性
项目支持的属性有6个:
□order:定义项目的排序顺序。
□flex-grow:定义项目的放大比例。
□flex-shrink:定义项目的缩小比例。
□flex-basis:定义在分配多余空间之前,项目占据的主轴空间(main size)。
□flex:flex-grow、flex-shrink和flex-basis的简写。
□align-self:用来设置单独的伸缩项目在交叉轴上的对齐方式,可覆盖默认的algin-items属性。
1.order
order属性定义项目的排列顺序。数值越小,排列越靠前(如图3-16),默认为0,语法如下:
.myitem{ order : <integer>; }
order.jpg
2.flex-grow
flex-grow定义项目的放大比例,默认为0,即如果存在剩余空间,也不放大,语法如下:
.myitem{ flex-grow : <number>; }
如果所有项目的flex-grow值都为1,则它们将等分剩余空间(如果有的话)。如果一个项目的flex-grow属性为2,其他项目都为1,则前者占据的剩余空间将比其他项多一倍,整体按比例填充剩余空间
flex-grow.jpg
3.flex-shrink
flex-shrink定义了项目的缩小比例,默认为1,如果空间不足,该项目将缩小,语法如下:
.myitem{ flex-shrink : <number>; }
如果所有项目的flex-shrink属性都为1,当空间不足时,都将等比缩小。如果一个项目的flex-shrink属性为0,其他项目都为1,则空间不足时,前者不缩小,负值对该属性无效。
这里我们举个例子,如一个容器宽200px,里面有4个项目,它们的宽度都为60px,那么整体宽度就是4×60=240px,比容器多了40px,如果这4个项目的flex-shrink值分别为1、2、1、3,那么它们的宽度分别按比例减少40px × 1 / (1+2+1+4) = 5px、40px × 2 / (1+2+1+4) = 10px、40px × 1 /(1+2+1+4) = 5px、40px × 4 / (1+2+1+4) = 20px,缩小后它们的宽度分别为:55px、50px、55px、40px。
flex-shrink.jpg4.flex-basis
flex-basis属性用来定义伸缩项目的基准值,剩余的空间将按比例进行缩放。它的默认值为auto,即项目的本来大小,语法如下:
.myitem{ flex-basis : <length> | auto; }
它可以设为跟width或height属性一样的固定值,如320px,这样项目将占据固定空间。
5.flex
flex属性是flex-grow、flex-shrink和flex-basis的简写,默认值为0 1 auto。后两个属性可选,语法如下:
.myitem{ none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ] }
该属性有两个快捷值:auto(1 1 auto)和none(0 0 auto)。
建议优先使用这个属性,而不是单独写三个分离的属性,因为浏览器会推算相关值。
示例代码如下:
.myitem{ flex: 1 1 auto } .myitem{ flex : auto; } /* 同上句 */ .myitem{ flex: 0 0 auto } .myitem{ flex : none; } /* 同上句 */ .myitem{ flex : 1 auto; } .myitem{ flex : 1 1; }
6.align-self
align-self用来设置单独的伸缩项目在交叉轴上的对齐方式,该属性会复写默认的对齐方式,语法如下:
.myitem{ align-self : auto | flex-start | flex-end | center | baseline | stretch; }
该属性6个值除了auto,其余和容器align-items属性完全一致:
□auto:表示继承容器align-items属性,如果没有父元素,则等同于stretch,默认值。
□flex-start:交叉轴的起点对齐
□flex-end:交叉轴的终点对齐。
□center:交叉轴的中线对齐。
□baseline:项目根据它们第一行文字的基线对齐。
□stretch:如果项目未设置高度或设置为auto,项目将在交叉轴方向拉伸填充整个容器,默认值。
align-self.jpg
网友评论