style样式

用于描述template模板的组件样式,决定组件应该如何显示

样式布局采用CSS Flexbox(弹性盒)样式,针对部分原生组件,对 CSS 进行了少量的扩充以及修改

为了解决屏幕适配问题,所有与大小相关的样式(例如width、font-size)均以基准宽度(默认750px)为基础,根据实际屏幕宽度进行缩放,例如width:100px,在1500px宽度屏幕上,width实际上为200px

文件导入

支持2种导入外部文件的方式

<!-- 导入外部文件, 代替style内部样式 -->
<style src="./style.css"></style>

<!-- 合并外部文件 -->
<style>
  @import './style.css';
  .a {
  }
</style>

模板内部样式

支持使用style、class属性来控制组件的样式

<!-- 内联inline -->
<div style="color:red; margin: 10px;"/>
<!-- class声明 -->
<div class="normal append"/>

选择器

支持的选择器有:

选择器 样例 样例描述
.class .intro 选择所有拥有 class="intro" 的组件
#id #firstname 选择拥有 id="firstname" 的组件
tag div 选择所有 div 组件
, .a, .b 选择所有class=“.a” 以及class=“.b”的组件
#id .class tag .page .body text 支持id,class,tag的后代选择器,也可以使用">"表示直接后代
<style>
  /* 单个选择器 */
  text {
  }
  .class-abc {
  }
  #idAbc {
  }
  /* 后代选择 */
  .doc-page #testTag div text {
  }
  .doc-page #test-class .class1 {
  }
  .doc-page #testId #testIdId1 {
  }
  /* 直接后代选择 */
  .doc-page #testTag .flex-column > text {
  }
  /* 同一样式适应多个选择器 */
  .font-text, .font-comma {
  }
</style>

注意,选择器声明的变化可能会导致元素重新绘制。为了减少选择器变化引起的DOM更新数量,当前只支持:CSS声明的多个选择器中最后一个规则的变更对DOM的更新

<template>
  <div class="{{docBody}}">
    <text class="{{rowDesc}}">描述内容</text>
  </div>
</template>

<style>
  .doc-body .row-desc1 {
    color: #ff0000;
  }
  .doc-body .row-desc2 {
    color: #0000ff;
  }
  .doc-body2 .row-desc1 {
    color: #00ff00;
  }
</style>

<script>
  export default {
    // 页面级组件的数据模型,影响传入数据的覆盖机制:private内定义的属性不允许被覆盖
    private: {
      rowDesc: 'row-desc1',
      docBody: 'doc-body'
    }
  }
</script>

以上的代码示例,当我们把rowDesc变量row-desc1变为row-desc2时是通知Native更新节点样式,但是如果把docBody变量doc-body变为doc-body2,是不会通知DOM更新的。

因为doc-body不是最后一个选择器,非末尾的选择器变更有可能影响很多DOM元素,从而影响到渲染性能

选择器优先级

当前样式的选择器的优先级计算保持与浏览器一致,是浏览器CSS渲染的一个子集(仅支持:inline, id, class, tag, 后代,直接后代)

选择器优先级规则如下(假设多条CSS声明匹配到同一个元素div),应用在该元素上的CSS声明总体优先级是:inline > #id > .class > tag,这四大类

匹配到该元素的多个CSS声明,如:#page .class-div.page .class-div,其优先级按照各选择器的分数高低之和来比较

ID 选择器的权值为10000 Class 类选择器的权值为100 Tag 标签选择器的权值为1

那么以下CSS声明计算分数为:

#page的分数为:10000

#page .class-div的分数为:10100

#page .class-div text的分数为10101

#page #body .container div text的分数为:20102

因此:

#page .class-div和.page .class-div比较,分数不一致,分数高优先级高;如果分数相同,则按照声明顺序:后者覆盖前者

样式预编译

目前支持less, sass的预编译

<!--导入外部文件, 代替style内部样式-->
<style lang="less" src="./lessFile.less"></style>

<!--合并外部文件-->
<style lang="less">
  @import './lessFile.less';
  .page-less {
    #testTag {
      .less-font-text, .less-font-comma {
        font-size: 60px;
      }
    }
  }
</style>

伪类

任何组件中,如果某个属性是boolean类型且默认值为false时,均可通过该属性名字来声明伪类,当属性变为true时伪类生效,例如所有组件的disabled属性、input组件的checked属性等

另外部分组件会有其他形式的伪类支持,比如input组件可以通过主动调用focus方法,或者用户操作获得焦点,使得focus伪类生效,详情请参考各组件内部说明

伪类写法举例:

<template>
  <input type="button" class="btn" disabled="{{btndisabled}}" value="Click"></input>
</template>

<style>
  btn {
    width: 360px;
    height: 180px;
    background-color: red;
  }
  btn:disabled {
    background-color: green;
  }
</style>

当组件的disabled属性变为true时,disabled伪类的样式生效,叠加到原有样式上,例子中background-color会从红色变成绿色

条匹配 "" 的结果

    没有搜索到与 "" 相关的内容