# CMSS介绍
CMSS(Chameleon Style Sheets)是一套样式语言,用于描述 CML 的组件样式。
# 使用 CMSS
CMSS 支持内联及类选择器等。
# 普通写法
具体实现写在 .cml 文件的 <style> 标签内。
目前支持有如下两种关联到元素上:
# 静态 class
<view class="kind-list-item-hd-show class2 class3"></view>
# 动态 class
目前 class 不支持传入对象的形式;
简单数据绑定
{{}}之内的会被当做一个表达式去处理;
<view><text class="{{prefix+'a'}}">class数据绑定</text></view>
<script>
class Index {
data() {
return {
prefix: 'cls',
};
}
}
export default new Index();
</script>
三元运算符
<view class="{{open ? 'cls1 cls2' : 'cls3 cls4'}}"> </view>
或者将其放入计算属性
<template>
<view class="{{itemClass}}"> </view>
</template>
<script>
class Index {
computed = {
itemClass() {
return open ? 'cls1 cls2' : 'cls3 cls4';
},
};
}
export default new Index();
</script>
# 内联写法
模版中写内联样式,分为静态和动态两种,静态样式指纯字符串,动态样式是有数据绑定。style 也不支持对象语法和数组语法; 目前可以使用的方式如下:
静态样式:
<template>
<view style="width: 200cpx;"> </view>
</template>
动态样式:
<template>
<view style="{{inlineStyle}}"> </view>
</template>
<script>
class Index {
data = {
inlineStyle: 'width: 200cpx;',
};
}
export default new Index();
</script>
# 布局
采用 FlexBox 布局模型,请勿使用 float 方式布局。
# Flexbox
chameleon 布局模型基于 CSS Flexbox,以便所有页面元素的排版能够一致可预测,同时页面布局能适应各种设备或者屏幕尺寸。
Flexbox 包含 flex 容器和 flex 成员项。如果一个 CML 元素可以容纳其他元素,那么它就成为 flex 容器。需要注意的是,flexbox 的老版规范相较新版有些出入,比如是否能支持 wrapping。这些都描述在 W3C 的工作草案中了,你需要注意下新老版本之间的不同。
# 容器
在 CML 中,Flexbox 是默认且唯一的布局模型,所以你不需要手动为元素添加 display: flex; 属性。
flex-direction:
定义了 flex 容器中 flex 成员项的排列方向。可选值为 row | column 默认值为 column
column:从上到下排列。row:从左到右排列。
justify-content:
定义了 flex 容器中 flex 成员项在主轴方向上如何排列以处理空白部分。可选值为
flex-start | flex-end | center | space-between默认值为 flex-start。flex-start:是默认值,所有的 flex 成员项都排列在容器的前部;flex-end:则意味着成员项排列在容器的后部;center:即中间对齐,成员项排列在容器中间、两边留白;space-between:表示两端对齐,空白均匀地填充到 flex 成员项之间。space-around:每个项目两侧的间隔相等。所以,项目之间的间隔比项目与边框的间隔大一倍。
定义了 flex 容器中 flex 成员项在纵轴方向上如何排列以处理空白部分。可选值为 stretch | flex-start | center | flex-end 默认值为 stretch。
stretch: 是默认值,即拉伸高度至 flex 容器的大小;flex-start: 则是上对齐,所有的成员项排列在容器顶部;flex-end: 是下对齐,所有的成员项排列在容器底部;center: 是中间对齐,所有成员项都垂直地居中显示。baseline: 项目的第一行文字的基线对齐。
flex-flow
说明:
- flex-flow 属性是 flex-direction 和 flex-wrap 属性的复合属性, 用于设置或检索弹性盒模型对象的子元素排列方式。
- flex-direction 属性规定灵活项目的方向。
- flex-wrap 属性规定灵活项目是否拆行或拆列。
语法:
flex-flow: flex-direction flex-wrap;
# 成员项
flex 属性定义了 flex 成员项可以占用容器中剩余空间的大小。如果所有的成员项设置相同的值 flex: 1,它们将平均分配剩余空间. 如果一个成员项设置的值为 flex: 2,其它的成员项设置的值为 flex: 1,那么这个成员项所占用的剩余空间是其它成员项的 2 倍。
- flex {number}:值为 number 类型。
# 示例
一个简单的网格布局。
<template>
<view>
<view c-for="{{list}}" c-for-index="i" c-for-item="item" class="row">
<view c-for="{{item}}" c-for-index="k" c-for-item="text" class="item">
<view>
<text>{{ text }}</text>
</view>
</view>
</view>
</view>
</template>
<script>
class Index {
data = {
list: [
['A', 'B', 'C'],
['D', 'E', 'F'],
['G', 'H', 'I'],
],
};
}
export default new Index();
</script>
<style scoped>
.item {
flex: 1;
justify-content: center;
align-items: center;
border-width: 1;
}
.row {
flex-direction: row;
height: 80cpx;
}
</style>
<script cml-type="json">
{
"base": {}
}
</script>
# 定位
CML 支持 position 定位,用法与 CSS position 类似。为元素设置 position 后,可通过 top、right、bottom、left 四个属性设置元素坐标。
position {string}:
设置定位类型。可选值为
relative | absolute | fixed | sticky默认值为 relative。relative是默认值,指的是相对定位;absolute是绝对定位,以元素的容器作为参考系;fixed保证元素在页面窗口中的对应位置显示;sticky指的是仅当元素滚动到页面之外时,元素会固定在页面窗口的顶部。
top {number}:距离上方的偏移量默认为 0。bottom {number}:距离下方的偏移量默认为 0。left {number}:距离左方的偏移量默认为 0。right {number}:距离右方的偏移量默认为 0。
# 示例
<template>
<view class="wrapper">
<view class="box box1"> </view>
<view class="box box2"> </view>
<view class="box box3"> </view>
</view>
</template>
<script>
class Index {}
export default new Index();
</script>
<style>
.wrapper {
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
background-color: #cccccc;
}
.box {
width: 400cpx;
height: 400cpx;
position: absolute;
}
.box1 {
top: 0;
left: 0;
background-color: #ff0000;
}
.box2 {
top: 150cpx;
left: 150cpx;
background-color: #0055dd;
}
.box3 {
top: 300cpx;
left: 300cpx;
background-color: #00ff49;
}
</style>
<script cml-type="json">
{
"base": {}
}
</script>
# 盒模型
chameleon 中盒模型box-sizing默认为border-box,即宽度包含内容、内边距盒边框。
chameleon 盒模型基于 CSS 盒模型,每个 CML 元素都可视作一个盒子。我们一般在讨论设计或布局时,会提到「盒模型」这个概念。
盒模型描述了一个元素所占用的空间。每一个盒子有四条边界:外边距边界 margin edge, 边框边界 border edge, 内边距边界 padding edge 与内容边界 content edge。这四层边界,形成一层层的盒子包裹起来,这就是盒模型大体上的含义。
width: {length}默认值 0height: {length}默认值 0padding:内边距,内容和边框之间的距离,默认值 0。可有以下写法:padding-left: {length}默认值 0padding-right: {length}默认值 0padding-top: {length}默认值 0padding-bottom: {length}默认值 0
支持简写模式:padding:{length length length length}
margin: {length}外边距,元素和元素之间的空白距离。值类型为 length 默认值 0。可有如下写法:margin-left: {length}默认值 0margin-right: {length}默认值 0margin-top: {length}默认值 0margin-bottom: {length}默认值 0
支持简写模式:margin: {length length length length}
border:设定边框,简写方式:border:1px solid #ff0000;border-style: {string}设定边框样式,值类型为string,可选值为solid | dashed | dotted,默认值solid。可有如下写法:border-left-style: {string}可选值为solid | dashed | dotted默认值 solidborder-top-style: {string}可选值为solid | dashed | dotted默认值 solidborder-right-style: {string}可选值为solid | dashed | dotted默认值 solidborder-bottom-style: {string}可选值为solid | dashed | dotted默认值 solid
border-width: {length}设定边框宽度非负值,默认值 0。可有如下写法:border-left-width: {length}非负值,默认值 0border-top-width: {length}非负值,默认值 0border-right-width: {length}非负值,默认值 0border-bottom-width: {length}非负值,默认值 0
border-color: {color}:设定边框颜色默认值#000000。可有如下写法:border-left-color: {color}默认值 #000000border-top-color: {color}默认值 #000000border-right-color: {color}默认值 #000000border-bottom-color: {color}默认值 #000000
border-radius: {length}设定圆角默认值 0。可有如下写法:border-bottom-left-radius: {length}非负值,默认值 0border-bottom-right-radius: {length}非负值,默认值 0border-top-left-radius: {length}非负值,默认值 0border-top-right-radius: {length}非负值,默认值 0
** 注意 **
chameleon 盒模型的 box-sizing 默认为 border-box,即盒子的宽高包含内容、内边距和边框的宽度,不包含外边距的宽度。
目前在 <image> 组件上尚无法只定义一个或几个角的 border-radius。比如你无法在这两个组件上使用 border-top-left-radius。该约束只对 iOS 生效,Android 并不受此限制。
尽管 overflow:hidden 在 Android 上是默认行为,但只有下列条件都满足时,一个父 view 才会去 clip 它的子 view。这个限制只对 Android 生效,iOS 不受影响。
- 父 view 是 div, a, cell, refresh 或 loading。
- 系统版本是 Android 4.3 或更高。
- 系统版本不是 Andorid 7.0。
- 父 view 没有 background-image 属性或系统版本是 Android 5.0 或更高。
# 示例:
<template>
<view>
<image
style="width: 400cpx; height: 200cpx; margin-left: 20cpx;"
src="https://g.alicdn.com/mtb/lab-zikuan/0.0.18/weex/weex_logo_blue@3x.png"
></image>
</view>
</template>
# 文本
文本类组件及通用样式。
文本类组件共享一些通用样式, 这类组件目前包括 <text>和<input>。
# 属性
color {color}:文字颜色。
可选值为色值,支持 RGB( rgb(255, 0, 0) );RGBA( rgba(255, 0, 0, 0.5) );十六进制( #ff0000 );精简写法的十六进制( #f00 );色值关键字(red)。
lines {number}: 指定文本行数。仅在
<text>组件中支持。默认值是 0 代表不限制行数。font-size {number}:文字大小。
font-style {string}:字体类别。可选值 normal | italic 默认为 normal。
font-weight {string}:字体粗细程度
- 可选值: normal, bold, 100, 200, 300, 400, 500, 600, 700, 800, 900
- normal 等同于 400, bold 等同于 700;
- 默认值: normal;
- iOS 支持 9 种 font-weight 值;Android 仅支持 400 和 700, 其他值会设为 400 或 700
- 类似 lighter, bolder 这样的值暂时不支持
text-decoration {string}:字体装饰,可选值 none | underline | line-through 默认值为 none。
text-align {string}:对齐方式。可选值 left | center | right 默认值为 left。目前暂不支持 justify, justify-all。
font-family {string}:设置字体。
这个设置 不保证 在不同平台,设备间的一致性。如所选设置在平台上不可用,将会降级到平台默认字体。
text-overflow {string}:设置内容超长时的省略样式。可选值 clip | ellipsis
# 尺寸
为了统一多端尺寸单位,呈现效果一致,同时页面响应式,项目中统一采用cpx作为尺寸单位,规定以屏幕 750px(占满屏幕)视觉稿作为标准。
禁止.cml组件中使用 px,若要使用请使用多态协议。
在 CML 项目中,我们使用cpx作为统一的长度单位。cpx可以根据 屏幕宽度自适应,我们规定屏幕宽度为 750cpx。你也可以在 多态组件灰度层使用某一端的长度单位。
# 使用 cpx 设置元素宽度高度
<template>
<view style="width: 100cpx; height: 100cpx; background: red;"></view>
</template>
# 使用 cpx 设置字体大小
<template>
<text style="font-size: 24cpx;">Chameleon</text>
</template>
# 使用 cpx 设置行高
<template>
<text style="font-size: 24cpx; line-height: 30cpx;">Chameleon</text>
</template>
# 使用 cpx 注意事项
** 应避免以下写法 **
<template>
<text style="{{'font-size: ' + fontSize + 'cpx'}}">Chameleon</text>
</template>
<script>
class Test {
data: {
fontSize: 24,
};
}
export default new Test();
</script>
可以改成以下写法
<template>
<text style="{{cstyle}}">Chameleon</text>
</template>
<script>
class Test {
data: {
fontSize: 24
},
computed: {
cstyle() {
return 'font-size: ' + this.fontSize + 'cpx'
}
}
}
export default new Test()
</script>
# color 单位
支持以下写法:
.class-name {
color: #0f0; /* 3-chars hex */
color: #00ff00; /* 6-chars hex */
color: rgb(255, 0, 0); /* rgba */
color: rgba(255, 0, 0, 0.5); /* rgba */
color: transparent; /* transparent */
color: orange; /* Basic color keywords */
color: darkgray; /* Extended color keywords */
}
注意
不支持 hsl(), hsla(), currentColor, 8 个字符的十六进制颜色。
rgb(a,b,c) 或 rgba(a,b,c,d) 的性能比其他颜色格式差很多,请选择合适的颜色格式。
# number 单位
仅仅一个数字。用于 opacity,lines 等。
有时值必须是整数,例如:lines。
# percentage 单位 (暂不支持)
表示百分比值,如“50%”,“66.7%”等。
它是 CSS 标准的一部分,但 CML 暂不支持。
# 颜色
| 基础颜色关键词 | 扩展颜色关键词 | ||
|---|---|---|---|
| 颜色名 | 十六进制RGB值 | 颜色名 | 十六进制RGB值 |
| black(黑) | #000000 | aliceblue | #F0F8FF |
| silver(银) | #C0C0C0 | antiquewhite | #FAEBD7 |
| gray(灰) | #808080 | aqua | #00FFFF |
| white(白) | #FFFFFF | aquamarine | #7FFFD4 |
| maroon(褐紫红) | #800000 | azure | #F0FFFF |
| red(红) | #FF0000 | beige | #F5F5DC |
| purple(紫) | #800080 | bisque | #FFE4C4 |
| fuchsia(晚樱) | #FF00FF | black | #000000 |
| green(绿) | #008000 | blanchedalmond | #FFEBCD |
| lime(石灰) | #00FF00 | blue | #0000FF |
| olive(橄榄) | #808000 | blueviolet | #8A2BE2 |
| yellow(黄) | #FFFF00 | brown | #A52A2A |
| navy(海军蓝) | #000080 | burlywood | #DEB887 |
| blue(蓝) | #0000FF | cadetblue | #5F9EA0 |
| teal(水鸭) | #008080 | chartreuse | #7FFF00 |
| aqua(水蓝) | #00FFFF | chocolate | #D2691E |
| coral | #FF7F50 | ||
| cornflowerblue | #6495ED | ||
| cornsilk | #FFF8DC | ||
| crimson | #DC143C | ||
| cyan | #00FFFF | ||
| darkblue | #00008B | ||
| darkcyan | #008B8B | ||
| darkgoldenrod | #B8860B | ||
| darkgray | #A9A9A9 | ||
| darkgreen | #006400 | ||
| darkgrey | #A9A9A9 | ||
| darkkhaki | #BDB76B | ||
| darkmagenta | #8B008B | ||
| darkolivegreen | #556B2F | ||
| darkorange | #FF8C00 | ||
| darkorchid | #9932CC | ||
| darkred | #8B0000 | ||
| darksalmon | #E9967A | ||
| darkseagreen | #8FBC8F | ||
| darkslateblue | #483D8B | ||
| darkslategray | #2F4F4F | ||
| darkslategrey | #2F4F4F | ||
| darkturquoise | #00CED1 | ||
| darkviolet | #9400D3 | ||
| deeppink | #FF1493 | ||
| deepskyblue | #00BFFF | ||
| dimgray | #696969 | ||
| dimgrey | #696969 | ||
| dodgerblue | #1E90FF | ||
| firebrick | #B22222 | ||
| floralwhite | #FFFAF0 | ||
| forestgreen | #228B22 | ||
| fuchsia | #FF00FF | ||
| gainsboro | #DCDCDC | ||
| ghostwhite | #F8F8FF | ||
| gold | #FFD700 | ||
| goldenrod | #DAA520 | ||
| gray | #808080 | ||
| green | #008000 | ||
| greenyellow | #ADFF2F | ||
| grey | #808080 | ||
| honeydew | #F0FFF0 | ||
| hotpink | #FF69B4 | ||
| indianred | #CD5C5C | ||
| indigo | #4B0082 | ||
| ivory | #FFFFF0 | ||
| khaki | #F0E68C | ||
| lavender | #E6E6FA | ||
| lavenderblush | #FFF0F5 | ||
| lawngreen | #7CFC00 | ||
| lemonchiffon | #FFFACD | ||
| lightblue | #ADD8E6 | ||
| lightcoral | #F08080 | ||
| lightcyan | #E0FFFF | ||
| lightgoldenrodyellow | #FAFAD2 | ||
| lightgray | #D3D3D3 | ||
| lightgreen | #90EE90 | ||
| lightgrey | #D3D3D3 | ||
| lightpink | #FFB6C1 | ||
| lightsalmon | #FFA07A | ||
| lightseagreen | #20B2AA | ||
| lightskyblue | #87CEFA | ||
| lightslategray | #778899 | ||
| lightslategrey | #778899 | ||
| lightsteelblue | #B0C4DE | ||
| lightyellow | #FFFFE0 | ||
| lime | #00FF00 | ||
| limegreen | #32CD32 | ||
| linen | #FAF0E6 | ||
| magenta | #FF00FF | ||
| maroon | #800000 | ||
| mediumaquamarine | #66CDAA | ||
| mediumblue | #0000CD | ||
| mediumorchid | #BA55D3 | ||
| mediumpurple | #9370DB | ||
| mediumseagreen | #3CB371 | ||
| mediumslateblue | #7B68EE | ||
| mediumspringgreen | #00FA9A | ||
| mediumturquoise | #48D1CC | ||
| mediumvioletred | #C71585 | ||
| midnightblue | #191970 | ||
| mintcream | #F5FFFA | ||
| mistyrose | #FFE4E1 | ||
| moccasin | #FFE4B5 | ||
| navajowhite | #FFDEAD | ||
| navy | #000080 | ||
| oldlace | #FDF5E6 | ||
| olive | #808000 | ||
| olivedrab | #6B8E23 | ||
| orange | #FFA500 | ||
| orangered | #FF4500 | ||
| orchid | #DA70D6 | ||
| palegoldenrod | #EEE8AA | ||
| palegreen | #98FB98 | ||
| paleturquoise | #AFEEEE | ||
| palevioletred | #DB7093 | ||
| papayawhip | #FFEFD5 | ||
| peachpuff | #FFDAB9 | ||
| peru | #CD853F | ||
| pink | #FFC0CB | ||
| plum | #DDA0DD | ||
| powderblue | #B0E0E6 | ||
| purple | #800080 | ||
| red | #FF0000 | ||
| rosybrown | #BC8F8F | ||
| royalblue | #4169E1 | ||
| saddlebrown | #8B4513 | ||
| salmon | #FA8072 | ||
| sandybrown | #F4A460 | ||
| seagreen | #2E8B57 | ||
| seashell | #FFF5EE | ||
| sienna | #A0522D | ||
| silver | #C0C0C0 | ||
| skyblue | #87CEEB | ||
| slateblue | #6A5ACD | ||
| slategray | #708090 | ||
| slategrey | #708090 | ||
| snow | #FFFAFA | ||
| springgreen | #00FF7F | ||
| steelblue | #4682B4 | ||
| tan | #D2B48C | ||
| teal | #008080 | ||
| thistle | #D8BFD8 | ||
| tomato | #FF6347 | ||
| turquoise | #40E0D0 | ||
| violet | #EE82EE | ||
| wheat | #F5DEB3 | ||
| white | #FFFFFF | ||
| whitesmoke | #F5F5F5 | ||
| yellow | #FFFF00 | ||
| yellowgreen | #9ACD32 | ||
# 样式多态
更加方便地为不同端定制样式。
.cml 文件中的 style 标签支持样式的多态,即可以针对不同的平台写不同的样式,格式如下:
<style>
@media cml-type (支持的平台) {
}
.common {
/**/
}
<style>
其中支持的平台为可以用逗号分隔多个平台,可选平台为 web, weex, wx, alipay, baidu。
demo 示例,class1 在各端的差异实现。
<template>
<view><text class="class1">chameleon</text><view>
</template>
<script>
class DemoPage {
}
export default new DemoPage();
</script>
<style>
@media cml-type (web) {
.class1 {
color: red;
}
}
@media cml-type (weex) {
.class1 {
color: green;
}
}
@media cml-type (wx,alipay,baidu,qq,tt) {
.class1 {
color: blue;
}
}
</style>
<script cml-type="json">
{}
</script>
注意: 多态差异 语法只能在.cml 文件中使用,不能在.css,.less等其他样式文件中使用,如果需要分文件实现,可以在多态内部分别引入文件。例如:
<style lang="less">
@media cml-type (web) {
@import './style1.less';
}
@media cml-type (weex) {
@import './style2.less';
}
@media cml-type (wx,alipay,baidu,qq,tt) {
@import './style3.less';
}
</style>
# 一致性基础样式
统一各端基础样式,增强表现一致性。
通常情况下,H5、小程序、客户端拥有各自的默认样式,各端呈现效果不一。所以,cml 框架会给各端添加一致性基础样式。
基础样式包括以下方面:
| 类型 | 默认值 |
|---|---|
| 布局 |
display: flex; flex-direction: column; |
| 盒模型 | box-sizing: border-box; |
| 定位 | position: relative; |
| 文本 |
display: block; font-size: 16px; white-space: pre-wrap; |
# 针对 H5 端添加的基础样式如下
.cml-root {
width: 100%;
overflow-x: hidden;
-webkit-tap-highlight-color: transparent;
font-family: BlinkMacSystemFont, 'Source Sans Pro', 'Helvetica Neue', Helvetica, Arial, sans-serif;
}
.cml-base {
text-align: left;
font-size: 0.4rem; /*15px*/
letter-spacing: 0.02rem;
}
.cml-base,
.cml-base::before,
.cml-base::after {
box-sizing: border-box;
text-size-adjust: none;
}
.cml-view {
display: flex;
box-sizing: border-box;
position: relative;
flex-direction: column;
flex-shrink: 0;
flex-grow: 0;
flex-basis: auto;
align-items: stretch;
align-content: flex-start;
border: 0 solid black;
margin: 0;
padding: 0;
min-width: 0;
}
.cml-text {
display: block;
box-sizing: border-box;
position: relative;
white-space: pre-wrap; /* not using 'pre': support auto line feed. */
word-wrap: break-word;
overflow: hidden; /* it'll be clipped if the height is not high enough. */
flex-shrink: 0;
flex-grow: 0;
flex-basis: auto;
border: 0 solid black;
margin: 0;
padding: 0;
min-width: 0;
}
# 针对小程序添加的基础样式如下:
.cml-base {
text-align: left;
font-size: 32rpx;
letter-spacing: 1rpx;
font-family: BlinkMacSystemFont, 'Source Sans Pro', 'Helvetica Neue', Helvetica, Arial, sans-serif;
}
.cml-base,
.cml-base::before,
.cml-base::after {
box-sizing: border-box;
text-size-adjust: none;
}
.cml-view {
display: flex;
box-sizing: border-box;
position: relative;
flex-direction: column;
flex-shrink: 0;
flex-grow: 0;
flex-basis: auto;
align-items: stretch;
align-content: flex-start;
border: 0 solid black;
margin: 0;
padding: 0;
min-width: 0;
}
.cml-text {
display: block;
box-sizing: border-box;
position: relative;
white-space: pre-wrap; /* not using 'pre': support auto line feed. 保留空白符序列,但是正常地进行换行 */
word-wrap: break-word; /* 在长单词或 URL 地址内部进行换行。 */
overflow: hidden; /* it'll be clipped if the height is not high enough. */
flex-shrink: 0;
flex-grow: 0;
flex-basis: auto;
border: 0 solid black;
margin: 0;
padding: 0;
min-width: 0;
}
说明如下:
| class名 | 代表含义 |
|---|---|
| .cml-root | H5端 app 根节点 |
| .cml-base | 任一节点 |
| .cml-view | view 元素 |
| .cml-text | text 元素 |
# 只跨 Web 和小程序的应用
受限于客户端的 CMSS 渲染能力,开发会有诸多限制。如果你只需要跨 H5 和小程序应用时,开发会变得很轻便。