一.盒子模型
微信小程序的视图层由WXML和WXSS组成。其中,WXSS(WeiXin Style Sheets)是基于CSS拓展的样式语言,用于描述WXML的组成样式,决定WXML的组件如何显示。
盒子模型是我们在学习页面设计中经常用到的一种思维模型。在CSS中一个独立的盒子模型由内容(content)、内边距(padding)、边框(border)和外边距(margin)4个部分组成,如图所示:
此外,对padding、border、和margin可以进一步细化为上、下、左、右4个部分,在CSS中可以扽别设置,如图所示:
图中各元素如下:
- width和height 内容的宽度和高度。
- padding-top、padding-right、padding-bottom和padding-left 上内边距、右内边距、底内边距和左内边距 。
- border-top、border-right、border-bottom和border-left 上边框、右边框、底边框和左边框。
- margin-top、margin-right、margin-bottom和margin-left 上外边距、右外边距、底外边距和左外边距。
因此一个盒子实际所占有的宽度(高度)应该由“内容”+“内边距”+“边框”+“外边距”组成。
二.块级元素与行内元素
元素按显示方式分为块级元素、行内元素和行内块元素,他们的显示方式由display属性控制。
1.块级元素
块级元素默认占一行高度,一行内通常只有一个块级元素,添加新的块级元素时,会自动换行,块级元素一般作为盒子出现。特点如下:
- 一个块级元素占一行。
- 块级元素的默认高度由内容决定,除非自定义高度。
- 块级元素的默认宽度是父级元素的内容区宽度,除非自定义宽度。
- 块级元素的宽度、高度、外边距及内边距都可以自定义设置。
- 块级元素可以容纳块级元素和行内元素。
<view/>组件默认为块级元素,使用<view/>组件演示盒子模型及块级元素的示例代码如下:
<view style="border: 1px solid #f00;">块级元素1</view>
<view style="border: 1px solid #0f0;margin: 15px; padding: 20px;">块级元素2</view>
<view style="border: 1px solid #00f;width: 200px; height:80px ;">块级元素3</view>
<view style="border: 1px solid #ccc;">
<view style="height: 60px;">块级元素4</view>
</view>
<view style="border: 1px solid #f00;width: 100px;background-color: #ccc;">父级元素高度随内容决定,内容为文本</view>
2.行内元素
- 将一个元素的display属性设置为inline后,该元素被设置为行内元素。特点如下:
- 行内元素不背设置高度和宽度,其高度和宽度被内容决定。
- 行内元素内不能放置块级元素,只容纳文本或者其他行内元素。
- 同一块内,行内元素和其他行内元素显示在同一行。
<text/>组件默认为行内元素,使用<view/>及<text/>组件演示盒子模型及行内元素的代码如下:
3.行内块元素
当元素的display元素被设置为inline-block时,元素被设置为行内块元素。行内块元素可以被设置高度、宽度、内边距和外边距。示例代码如下:
三.浮动与定位
1.元素浮动与清除
基本格式为:
{float:none|left|right;}
在下面的代码中,分别对bix1、box2、box3元素左浮动:
通过案例我们发现,当box3左浮动后,父元素的边框未能包裹住其元素,此时可以通过清除浮动去解决,其基本格式为
{clear:left|right|both|none}
示例代码:
<view>box1,box2,box3 没浮动 </view>
<view style="border: 1px solid #f00;padding: 5px;"></view>
<view style="border: 1px solid #0f0;">box1</view>
<view style="border: 1px solid #0f0;">box2</view>
<view style="border: 1px solid #0f0;">box3</view>
</view>
<view>box1 左浮动 </view>
<view style="border: 1px solid #f00;padding: 5px;"></view>
<view style="float: left;border: 1px solid #0f0;">box1</view>
<view style="border: 1px solid #0f0;">box2</view>
<view style="border: 1px solid #0f0;">box3</view>
</view>
<view>box1 box2 左浮动 </view>
<view style="border: 1px solid #f00;padding: 5px;"></view>
<view style="float: left;border: 1px solid #0f0;">box1</view>
<view style="float: left;border: 1px solid #0f0;">box2</view>
<view style="border: 1px solid #0f0;">box3</view>
</view>
<view>box1 box2 box3 左浮动 </view>
<view style="border: 1px solid #f00;padding: 5px;">
<view style="float: left;border: 1px solid #0f0;">box1</view>
<view style="float: left;border: 1px solid #0f0;">box2</view>
<view style="float: left;border: 1px solid #0f0;">box3</view>
</view>
另外,还可以在父元素外添加一个空元素,实现父元素包裹浮动元素。示例代码如下:
<view>box1 box2 左浮动 box3 清除左浮动 </view>
<view style="border: 1px solid #f00;padding: 5px;">
<view style="float: left;border: 1px solid #0f0;">box1</view>
<view style="float: left;border: 1px solid #0f0;">box2</view>
<view style="clear: left;border: 1px solid #0f0;">box3</view>
</view>
2.元素定位
浮动布局虽然灵活,但无法对元素的位置进行精确的控制。在css中,通过position属性可以实现对页面元素的精确定位。基本格式如下:
{position:static|relative|absolute|fixed}
示例代码:
<view style="border: 1px solid #0f0;width: 100px;height: 100px;">box1</view>
<view style="border: 1px solid #0f0;width: 100px;height: 100px;">box2</view>
<view style="border: 1px solid #0f0;width: 100px;height: 100px;">box3</view>
运行效果:
四.flex布局
flex布局主要有容器和项目组成。容器默认存在两根轴:水平的主轴(main axis)和垂直的交叉轴(cross axis)。设置display属性可以将一个元素指定为flex布局,设置flex-direction属性可以指定主轴方向。主轴既可以是水平方向,也可以是垂直方向。
1.容器属性
flex容器支持的属性有7种,如下表所示:
(1).display
用来指定元素是否为flex布局,语法格式如下:
.box{display:flex|inline-flex;}
flex 块级flex布局,该元素变为弹性盒子;
inline-flex 行内flex布局,行内容器符合行内元素的特征,同时在容器内有符合flex布局规范。
(2). flex-direction
用于设置主轴的方向,即项目排列的方向,语法格式为:
.box{flex-direction:row|row-reverse|column|column-reverse;}
a.row 主轴为水平方向,起点在左端,当元素设置为flex布局时,主轴默认为row;
b.row-reverse 主轴为水平方向,起点在右端;
c.column 主轴为垂直方向,起点在顶端;
d.column-reverse 主轴为垂直方向,起点在底端。
(3).flex-wrap
用来指定当项目在一根轴线的排列位置不够时,项目是否换行,其语法格式如下:
.box{flex-wrap:nowrap|wrap|wrap-reverse;}
a.nowrap 不换行,默认值;
b.wrap 换行,第一行在上方;
c.wrap-reverse 换行,第一行在下方。
(4).flex-flow
是flex-direction和flex-wrap的简写形式,默认值为row nowrap。语法格式为:
.box{flex-flow:<floex-direction>||<flex-wrap>;}
(5).justify-content
用于定义项目在主轴上的对齐方式。语法格式如下:
.box{justify-content:flex-start|flex-end|center|space-between|space-around;}
a.justify-content 与主轴方向有关,默认主轴水平对齐,方向从左到右;
b.flex-start 左对齐,默认值;
c.flex-end 右对齐;
d.center 居中;
e.space-betwwen 两端对齐,项目之间的间隔都相等;
f.space-around 每个项目两侧的间隔相等。
(6).align-items
用于指定项目在交叉轴上的对齐方式,语法格式如下:
.box{align-items:flex-start|flex-end|center|baseline|stretch;}
a.align-items 与交叉轴方向有关,默认交叉由上到下;
b.flex-start 交叉轴起点对齐
c.flex-end 交叉轴终点对齐;
d.center 交叉轴中线对齐;
e.baseline 项目根据它们第一行文字的基线对齐;
f.stretch 如果项目未设置高度或设置未auto,项目将在交叉轴方向拉伸填充容器,此为默认值。
示例代码如下:
//.wxml
<view class="cont1">
<view class="item">1</view>
<view class="item item2">2</view>
<view class="item item3">3</view>
<view class="item item4">4</view>
</view>
//wxss
.cont1{
display: flex;
flex-direction: row;
align-items: baseline;
}
.item{
background-color: #ccc;
border: 1px solid #f00;
height: 100px;
width: 50px;
margin: 2px;
}bg
.item2{
height: 80px;
}
.item3{
display: flex;
height: 50px;
align-items: flex-end;
}
.item4{
height: 120px;
}
(7).align-content
用来定义项目有很多轴线在交叉轴上的对齐方式,如果只有一根轴线,该属性不起作用。其语法格式如下:
.box{align-content:flex-start|flex-end|center|space-between|space-around|stretch}
a.space-between 与交叉轴两端对齐,轴线之间的间隔平均分布;
b.space-around 每根轴线两侧的间隔都相等,轴线之间的间隔比轴线与边框间隔大一倍。
其余各属性值的含义与l=align-itens属性的含义相同。
2.项目属性
容器内的项目支持6个属性,其名称和功能如下表:
(1).order
定义项目的排列顺序,数值越小,排列越靠前,默认值为0.语法格式如下:
.item{order:<number>;}
示例代码如下:
(2).flex-grow
定义项目的放大比例。语法格式如下:
.item{flex-grow:<number>;}
(3).flex-shrink
定义项目的缩小比例。语法格式如下:
.item{flex-shrink:<number>;}
(4).flex-basis
定义伸缩项目的基准值,剩余空间将按比例进行缩放。语法格式如下:
.item{flex-basis:<number>|auto;}
(5).flex
.item{flex:<flex-grow>|<flex-shrink>|<flex-basis>;}
(6).align-self
指定单独的伸缩项目在交叉轴上的对齐方式。语法格式如下:
.item{align-self:auto|flex-start|flex-end|center|baseline|stretch;}