通过嵌套的写法可以大大减少代码的重复。
假设下面一段代码是写在Ext.data.DataView的tpl里面的一段描绘table的html(实际每一行都要加上‘’),
该table会有2个mode,对应的css类分别为mode1,mode2,通过变量"mode"决定是哪个css类
每个单元格会有不同的状态,选中状态selected和非选中状态unselected,通过getClass方法得到是哪个css类。
----------------------------------------------------------------------
<table border="1" class="{[mode]}">
<tbody>
<tr>
<tpl for=".">
<td class="{[this.getClass(values)]}">{date}</td>
</tr><tr>
</tpl>
</tr>
</tbody>
</table>
----------------------------------------------------------------------
对应的scss写法
----------------------------------------------------------------------
table
{
$bd-color: #A3A7AF;
width: 100%;
border-collapse: separate;
table-layout: fixed;
font-size: 20px;
color: #3F4E5E;
background-color: #EEE;
&.mode1
{
td
{
vertical-align: top;
}
}
&.mode2
{
tr.selected
{
td
{
color: #FFFFFF;
text-shadow: #333 1px 1px 0px;
border: 1px solid black;
}
}
}
// borders
tbody
{
td
{
border-bottom: 1px solid $bd-color;
border-left: 1px solid $bd-color;
border-right: 1px solid lighten($bd-color, 20%);
border-top: 1px solid lighten($bd-color, 20%);
}
}
// cell styles
td
{
font-weight: bold;
position: relative;
vertical-align: top;
text-align: right;
font-size: 0.7em;
&.unselectable
{
color: #89909A;
}
&.selected
{
color: #FFFFFF;
text-shadow: #333 1px 1px 0px;
border: 1px solid black;
}
}
}
----------------------------------------------------------------------
编译出的css如下
----------------------------------------------------------------------
table {
width: 100%;
border-collapse: separate;
table-layout: fixed;
font-size: 20px;
color: #3F4E5E;
background-color: #EEE;
}
table.mode1 td {
vertical-align: top;
}
table.mode2 tr.selected td {
color: #FFFFFF;
text-shadow: #333333 1px 1px 0px;
border: 1px solid black;
}
table tbody td {
border-bottom: 1px solid #a3a7af;
border-left: 1px solid #a3a7af;
border-right: 1px solid #dadbde;
border-top: 1px solid #dadbde;
}
table td {
font-weight: bold;
position: relative;
vertical-align: top;
text-align: right;
font-size: 0.7em;
}
table td.unselectable {
color: #89909A;
}
table td.selected {
color: #FFFFFF;
text-shadow: #333333 1px 1px 0px;
border: 1px solid black;
}
----------------------------------------------------------------------
上面是对html标签,类之间(类是直接指定在html标签上的),嵌套关系写法的一个简单说明,
但是,在sencha touch/extjs开发时,类不是直接指定给某个html标签的,而是通过cls,itemCls,baseCls等这些配置项指定的。
这时如何在scss中组织这种嵌套关系呢?
也许会有这样的疑问,每个ext的component(如panel)最终生成的HTML很复杂(div嵌套很多),
我并不确定给cls指定css类之后,会作用到哪个html标签上。
这其实没有关系,因为css类之间是有继承关系的,一般父标签的css也对子孙标签起作用。
而且可以跨代继承。
所以只要按照component之间的父子关系来组织scss的嵌套关系就可以了。
下面的例子是一个form panel,指定css为myformview,每个field指定css为detail,
其中textField如果输入不满足条件会有一个边框会变红,通过inputCls指定error css.
------------------------------------------------------------------------
Ext.define('MyFormView', {
extend: 'Ext.form.Panel',
requires : ['Ext.form.FieldSet'],
config: {
layout: 'vbox',
cls:'myformview',
items : [
{
xtype : 'fieldset',
itemId : 'calDetailForm',
items : [
{
xtype : 'selectfield',
cls : 'detail',
itemId : 'calendarField',
label : LABEL_CALENDAR,
name : 'calendarId',
required : true,
options: []
},
{
xtype : 'textfield',
cls : 'detail',
itemId : 'descriptionField',
inputCls:'error',
label : LABEL_DESCRIPTION,
name : 'description',
placeHolder : 'description'
}
]
}
})
------------------------------------------------------------------------
scss写法如下
------------------------------------------------------------------------
.myformview{
.detai{}
.error{}
}
------------------------------------------------------------------------
还有一种情况是js代码与scss之间的关系,js里面直接写class名,空格隔开,表示指定多个class
myTest : function(cmp){
cmp.element.addCls('myCls1 myCls2');
}
对应的scss的写法
----------------------
.myCls1{
.myCls2{}
}
-----------------------
scss写法上的comment
类选择器用“.”表示。
html标签直接写,什么也不用加,html标签之间用空格隔开。
"&"表示该类是相对于上一级嵌套的,如类之间如果写在同一行,不用&,表示类之间的嵌套,加上的话表示相对于上一级的嵌套。
如果写在不同行,加与不加是一样的,
td{
.unselectable .selected
{
color: #89909A;
}
}
生成的css-------->
table td.unselectable .selected{
color: #89909A;
}
下面两种写法是一样的
|
td{ &.unselectable &.selected { } |
td{ .unselectable { .selected { } |
浙公网安备 33010602011771号