CMSS(Chameleon Style Sheets)是一套樣式語(yǔ)言,用于描述 CML 的組件樣式。
CMSS 支持內(nèi)聯(lián)及類選擇器等。
具體實(shí)現(xiàn)寫(xiě)在 .cml 文件的 <style> 標(biāo)簽內(nèi)。
目前支持有如下兩種關(guān)聯(lián)到元素上:
<view class="kind-list-item-hd-show class2 class3"></view>
目前 class 不支持傳入對(duì)象的形式; 簡(jiǎn)單數(shù)據(jù)綁定 {{}}之內(nèi)的會(huì)被當(dāng)做一個(gè)表達(dá)式去處理;
<view><text class="{{prefix+'a'}}">class數(shù)據(jù)綁定</text></view>
<script>
class Index {
data() {
return {
prefix: 'cls',
};
}
}
export default new Index();
</script>
三元運(yùn)算符
<view class="{{open ? 'cls1 cls2' : 'cls3 cls4'}}"> </view>
或者將其放入計(jì)算屬性
<template>
<view class="{{itemClass}}"> </view>
</template>
<script>
class Index {
computed = {
itemClass() {
return open ? 'cls1 cls2' : 'cls3 cls4';
},
};
}
export default new Index();
</script>
模版中寫(xiě)內(nèi)聯(lián)樣式,分為靜態(tài)和動(dòng)態(tài)兩種,靜態(tài)樣式指純字符串,動(dòng)態(tài)樣式是有數(shù)據(jù)綁定。style 也不支持對(duì)象語(yǔ)法和數(shù)組語(yǔ)法; 目前可以使用的方式如下:
靜態(tài)樣式:
<template>
<view style="width: 200cpx;"> </view>
</template>
動(dòng)態(tài)樣式:
<template>
<view style="{{inlineStyle}}"> </view>
</template>
<script>
class Index {
data = {
inlineStyle: 'width: 200cpx;',
};
}
export default new Index();
</script>
采用 FlexBox 布局模型,請(qǐng)勿使用 float 方式布局。
chameleon 布局模型基于 CSS Flexbox,以便所有頁(yè)面元素的排版能夠一致可預(yù)測(cè),同時(shí)頁(yè)面布局能適應(yīng)各種設(shè)備或者屏幕尺寸。
Flexbox 包含 flex 容器和 flex 成員項(xiàng)。如果一個(gè) CML 元素可以容納其他元素,那么它就成為 flex 容器。需要注意的是,flexbox 的老版規(guī)范相較新版有些出入,比如是否能支持 wrapping。這些都描述在 W3C 的工作草案中了,你需要注意下新老版本之間的不同。
在 CML 中,F(xiàn)lexbox 是默認(rèn)且唯一的布局模型,所以你不需要手動(dòng)為元素添加 display: flex; 屬性。
- align-items:
定義了 flex 容器中 flex 成員項(xiàng)在縱軸方向上如何排列以處理空白部分??蛇x值為 stretch | flex-start | center | flex-end 默認(rèn)值為 stretch。
flex 屬性定義了 flex 成員項(xiàng)可以占用容器中剩余空間的大小。如果所有的成員項(xiàng)設(shè)置相同的值 flex: 1,它們將平均分配剩余空間. 如果一個(gè)成員項(xiàng)設(shè)置的值為 flex: 2,其它的成員項(xiàng)設(shè)置的值為 flex: 1,那么這個(gè)成員項(xiàng)所占用的剩余空間是其它成員項(xiàng)的 2 倍。
一個(gè)簡(jiǎn)單的網(wǎng)格布局。
<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 類似。為元素設(shè)置 position 后,可通過(guò) top、right、bottom、left 四個(gè)屬性設(shè)置元素坐標(biāo)。
<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默認(rèn)為border-box,即寬度包含內(nèi)容、內(nèi)邊距盒邊框。
chameleon 盒模型基于 CSS 盒模型,每個(gè) CML 元素都可視作一個(gè)盒子。我們一般在討論設(shè)計(jì)或布局時(shí),會(huì)提到「盒模型」這個(gè)概念。
盒模型描述了一個(gè)元素所占用的空間。每一個(gè)盒子有四條邊界:外邊距邊界 margin edge, 邊框邊界 border edge, 內(nèi)邊距邊界 padding edge 與內(nèi)容邊界 content edge。這四層邊界,形成一層層的盒子包裹起來(lái),這就是盒模型大體上的含義。
支持簡(jiǎn)寫(xiě)模式:padding:{length length length length}
支持簡(jiǎn)寫(xiě)模式:margin: {length length length length}
** 注意 **
chameleon 盒模型的 box-sizing 默認(rèn)為 border-box,即盒子的寬高包含內(nèi)容、內(nèi)邊距和邊框的寬度,不包含外邊距的寬度。
目前在 <image> 組件上尚無(wú)法只定義一個(gè)或幾個(gè)角的 border-radius。比如你無(wú)法在這兩個(gè)組件上使用 border-top-left-radius。該約束只對(duì) iOS 生效,Android 并不受此限制。
盡管 overflow:hidden 在 Android 上是默認(rèn)行為,但只有下列條件都滿足時(shí),一個(gè)父 view 才會(huì)去 clip 它的子 view。這個(gè)限制只對(duì) Android 生效,iOS 不受影響。
<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" rel="external nofollow"
></image>
</view>
</template>
文本類組件及通用樣式。
文本類組件共享一些通用樣式, 這類組件目前包括 <text>和<input>。
為了統(tǒng)一多端尺寸單位,呈現(xiàn)效果一致,同時(shí)頁(yè)面響應(yīng)式,項(xiàng)目中統(tǒng)一采用cpx作為尺寸單位,規(guī)定以屏幕 750px(占滿屏幕)視覺(jué)稿作為標(biāo)準(zhǔn)。
禁止.cml組件中使用 px,若要使用請(qǐng)使用多態(tài)協(xié)議。
在 CML 項(xiàng)目中,我們使用cpx作為統(tǒng)一的長(zhǎng)度單位。cpx可以根據(jù) 屏幕寬度自適應(yīng),我們規(guī)定屏幕寬度為 750cpx。你也可以在 多態(tài)組件灰度層使用某一端的長(zhǎng)度單位。
<template>
<view style="width: 100cpx; height: 100cpx; background: red;"></view>
</template>
<template>
<text style="font-size: 24cpx;">Chameleon</text>
</template>
<template>
<text style="font-size: 24cpx; line-height: 30cpx;">Chameleon</text>
</template>
** 應(yīng)避免以下寫(xiě)法 **
<template>
<text style="{{'font-size: ' + fontSize + 'cpx'}}">Chameleon</text>
</template>
<script>
class Test {
data: {
fontSize: 24,
};
}
export default new Test();
</script>
可以改成以下寫(xiě)法
<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>
支持以下寫(xiě)法:
.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 */
}
注意
僅僅一個(gè)數(shù)字。用于 opacity,lines 等。
有時(shí)值必須是整數(shù),例如:lines。
表示百分比值,如“50%”,“66.7%”等。
它是 CSS 標(biāo)準(zhǔn)的一部分,但 CML 暫不支持。
基礎(chǔ)顏色關(guān)鍵詞 | 擴(kuò)展顏色關(guān)鍵詞 | ||
---|---|---|---|
顏色名 | 十六進(jìn)制RGB值 | 顏色名 | 十六進(jìn)制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(海軍藍(lán)) | #000080 | burlywood | #DEB887 |
blue(藍(lán)) | #0000FF | cadetblue | #5F9EA0 |
teal(水鴨) | #008080 | chartreuse | #7FFF00 |
aqua(水藍(lán)) | #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 標(biāo)簽支持樣式的多態(tài),即可以針對(duì)不同的平臺(tái)寫(xiě)不同的樣式,格式如下:
<style>
@media cml-type (支持的平臺(tái)) {
}
.common {
/**/
}
<style>
其中支持的平臺(tái)為可以用逗號(hào)分隔多個(gè)平臺(tái),可選平臺(tái)為 web, weex, wx, alipay, baidu。 demo 示例,class1 在各端的差異實(shí)現(xiàn)。
<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>
注意: 多態(tài)差異 語(yǔ)法只能在.cml 文件中使用,不能在.css,.less等其他樣式文件中使用,如果需要分文件實(shí)現(xiàn),可以在多態(tài)內(nèi)部分別引入文件。例如:
<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>
統(tǒng)一各端基礎(chǔ)樣式,增強(qiáng)表現(xiàn)一致性。
通常情況下,H5、小程序、客戶端擁有各自的默認(rèn)樣式,各端呈現(xiàn)效果不一。所以,cml 框架會(huì)給各端添加一致性基礎(chǔ)樣式。
基礎(chǔ)樣式包括以下方面:
類型 | 默認(rèn)值 |
---|---|
布局 | display: flex; flex-direction: column; |
盒模型 | box-sizing: border-box; |
定位 | position: relative; |
文本 | display: block; font-size: 16px; white-space: pre-wrap; |
.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. 保留空白符序列,但是正常地進(jìn)行換行 */
word-wrap: break-word; /* 在長(zhǎng)單詞或 URL 地址內(nèi)部進(jìn)行換行。 */
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;
}
說(shuō)明如下:
class名 | 代表含義 |
---|---|
.cml-root | H5端 app 根節(jié)點(diǎn) |
.cml-base | 任一節(jié)點(diǎn) |
.cml-view | view 元素 |
.cml-text | text 元素 |
受限于客戶端的 CMSS 渲染能力,開(kāi)發(fā)會(huì)有諸多限制。如果你只需要跨 H5 和小程序應(yīng)用時(shí),開(kāi)發(fā)會(huì)變得很輕便。
更多建議: