使用CSS的注意事项

因为快应用以flexbox布局为主,因此建议使用flexbox布局;不要用浮动定位;可以用绝对定位和相对定位(1040以上版本才支持的),但不支持z-index

注意点

样式的继承

快应用的样式的继承和 H5 类似,不过需要注意的是在快应用中其基本容器(div)所支持的样式及其有限(见上表)。

例如字体相关的样式只有 <text><span><a> 等组件支持并且它们都不支持 <div> 这样的块级子组件,所以对于字体的样式来说没法像 H5 那样自由的继承。

为了支持快应用下, pages目录下的样式表,不能@import pages目录下的其他样式表,也不能@import components目录下的样式表, 只能引用assets目录下的样式表。

components目录下的样式也是如此,想共享一些已有的样式,也能引用assets目录下的样式表,不要引用其他组件的样式表。

组件出现在伸缩盒项目位置时的处理

错误的写法

  1. <div style="display:flex; flex-direction:column;">
  2. <div>xxx</div>
  3. <anu-com><anu-com>
  4. </div>

正确的写法

  1. <div style="display:flex; flex-direction:column;">
  2. <div>xxx</div>
  3. <div>
  4. <anu-com><anu-com>
  5. </div>
  6. </div>

标签选择器要谨慎避开小程序专有的标签

为了兼容所有平台,尽量避免在CSS样式表中使用 只有小程序 才有的标签,如image, switch, scroller, scroll-div…

这些在小程序特有的标签可能会编译成div或view标签,导致样式失效。

垂直和水平居中

由于在快应用中元素组件默认使用横向 flex 布局,因此居中可以很方便的使用 justify-content: centeralign-items: center 来实现主轴和交叉轴方向上的居中。

单位的转换问题

有的平台支持px与rpx,有的只支持px。但如果你不想转换px,你需要将px改成PX;

text标签的line-height 不能写line-height: 1; 快应用会自动加px 只能写 line-height: 52px; 这样 最近小米快应用本体可能有更新 导致之前样式ok的会挂 大家注意改下

flex 元素的宽度问题

当 flex 元素为垂直方向时( flex-direction: column),其宽度并不会默认占满父元素的宽度,有些情况下你需要设置 width: 100% 来然他满父元素的宽度:

  1. <template>
  2. <div class="row">
  3. <div class="col">
  4. <div class="item"></div>
  5. <div class="item"></div>
  6. </div>
  7. </div>
  8. </template>
  9. <style>
  10. .row, .col {
  11. display: flex;
  12. }
  13. .row {
  14. border: 1px solid black;
  15. flex-direction: row;
  16. }
  17. .col {
  18. width: 100%;
  19. border: 1px solid red;
  20. flex-direction: column;
  21. }
  22. .item {
  23. border: 1px solid blue;
  24. height: 300px;
  25. }
  26. </style>

样式表

名称类型默认值描述
width<length> | <percentage>-未设置时使用组件自身内容需要的宽度
height<length> | <percentage>-未设置时使用组件自身内容需要的高度
padding<length>0简写属性,在一个声明中设置所有的内边距属性,该属性可以有1到4个值
padding-[left|top|right|bottom]<length>0
margin<length>0简写属性,在一个声明中设置所有的外边距属性,该属性可以有1到4个值
margin-[left|top|right|bottom]<length>0
border-0简写属性,在一个声明中设置所有的边框属性,可以按顺序设置属性width style color,不设置的值为默认值
border-styledotted | dashed | solidsolid暂时仅支持1个值,为元素的所有边框设置样式
border-width<length>0简写属性,在一个声明中设置元素的所有边框宽度,或者单独为各边边框设置宽度
border-[left|top|right|bottom]-width<length>0
border-color<color>black简写属性,在一个声明中设置元素的所有边框颜色,或者单独为各边边框设置颜色
border-[left|top|right|bottom]-color<color>black
border-radius<length>0圆角时只使用border-width,border-[left|top|right|bottom]-width无效圆角时只使用border-color,border-[left|top|right|bottom]-color无效
border-[top|bottom]-[left|right]-radius<length>0
background<linear-gradient>-支持 渐变样式,暂时不能与background-color、background-image同时使用
background-color<color>-
background-image<uri>-暂时不支持与background-color,border-color同时使用;不支持网络图片资源,请使用本地图片资源;1010+版本支持9-patch图,详情见背景图样式
background-size 1000+contain | cover | auto | <length> | <percentage>100% 100%设置背景图片大小,详情见背景图样式
background-repeat 1000+repeat | repeat-x | repeat-y | no-repeatrepeat设置是否及如何重复绘制背景图像,详情见背景图样式
background-position 1010+<length> |<percentage>| left | right | top | bottom | center0px 0px描述了背景图片在容器中绘制的位置,支持1-4个参数,详情见背景图样式
opacity<number>0xff
displayflex | noneflex
visibilityvisible | hiddenvisible
flex<number>-父容器为<div><list-item><tabs>时生效
flex-grow<number>0父容器为<div><list-item>时生效
flex-shrink<number>1父容器为<div><list-item>时生效
flex-basis<number>-1父容器为<div><list-item>时生效
positionnone | fixednone父容器为<list><swiper>时不生效
[left|top|right|bottom]<number>--

示例

左中右分栏

左中右分栏

  1. <template>
  2. <div class="main">
  3. <div class="cell cell--left"></div>
  4. <div class="cell cell--center"></div>
  5. <div class="cell cell--right"></div>
  6. </div>
  7. </template>
  8. <style>
  9. .main {
  10. display: flex;
  11. flex-direction: row;
  12. }
  13. .cell {
  14. flex: 1;
  15. height: 200px;
  16. background-color: rgb(78, 192, 245);
  17. border: 2px solid #444;
  18. }
  19. </style>

上中下分栏

上中下分栏

  1. <template>
  2. <div class="main">
  3. <div class="cell cell--top"></div>
  4. <div class="cell cell--middle"></div>
  5. <div class="cell cell--bottom"></div>
  6. </div>
  7. </template>
  8. <style>
  9. .main {
  10. display: flex;
  11. flex-direction: column;
  12. height: 600px;
  13. }
  14. .cell {
  15. flex: 1;
  16. background-color: rgb(78, 192, 245);
  17. border: 2px solid #444;
  18. }
  19. </style>

格子

格子

  1. <template>
  2. <div class="main">
  3. <div class="cell"></div>
  4. <div class="cell"></div>
  5. <div class="cell"></div>
  6. <div class="cell"></div>
  7. <div class="cell"></div>
  8. <div class="cell"></div>
  9. <div class="cell"></div>
  10. <div class="cell"></div>
  11. <div class="cell"></div>
  12. </div>
  13. </template>
  14. <style>
  15. .main {
  16. display: flex;
  17. flex-direction: row;
  18. flex-wrap: wrap;
  19. }
  20. .cell {
  21. width: 33.333%;
  22. height: 200px;
  23. background-color: rgb(78, 192, 245);
  24. border: 2px solid #444;
  25. }
  26. </style>

图片里面有文字

图片里面有文字

  1. <template>
  2. <div class="stack">
  3. <image class="stack__cover" src="https://img1.qunarzz.com/order/comp/1808/c3/dda9c77c3b1d8802.png" />
  4. <div class="stack__content"><text class="text">Hero</text></div>
  5. </div>
  6. </template>
  7. <style>
  8. .stack {
  9. display: flex;
  10. flex-direction: column;
  11. align-items: center;
  12. }
  13. .stack__cover, .stack__content {
  14. height: 300px;
  15. }
  16. .stack__cover {
  17. width: 100%;
  18. }
  19. .stack__content {
  20. margin: -300px 0 0 0;
  21. }
  22. .text {
  23. color: red;
  24. font-size: 80px;
  25. font-weight: bold;
  26. }
  27. </style>

由于快应用不支持 absolute 布局。对于图片里面有文字的这种堆叠样式可以使用负的 margin 或者背景图片来布局,不过需要注意的是快应用的背景图片暂时不支持网络资源。

上面就是一个负 margin 的实现,我们可以抽取出其中可复用的样式,把它变成一个 scss mixin:

  1. @mixin stack($height) {
  2. display: flex;
  3. flex-direction: column;
  4. .stack__cover, .stack__content {
  5. height: $height;
  6. }
  7. .stack__cover {
  8. width: 100%;
  9. }
  10. .stack__content {
  11. margin: -$height 0 0 0;
  12. }
  13. }

然后上面的样式就可以写成这样:

  1. .stack {
  2. align-items: center;
  3. @include stack(300px);
  4. }
  5. .text {
  6. color: red;
  7. font-size: 80px;
  8. font-weight: bold;
  9. }