WXML 和 WXSS

微信小程序的模板语言和样式语言

问题

介绍微信小程序中的 WXML 和 WXSS,以及它们与 HTML、CSS 的区别。

解答

WXML(WeiXin Markup Language)

WXML 是小程序的模板语言,用于描述页面结构。

<!-- 数据绑定 -->
<view>{{ message }}</view>
<view id="item-{{ id }}">动态属性</view>

<!-- 列表渲染 -->
<view wx:for="{{ list }}" wx:key="id">
  {{ index }}: {{ item.name }}
</view>

<!-- 自定义索引和项变量名 -->
<view wx:for="{{ list }}" wx:for-index="idx" wx:for-item="val" wx:key="id">
  {{ idx }}: {{ val.name }}
</view>

<!-- 条件渲染 -->
<view wx:if="{{ score >= 90 }}">优秀</view>
<view wx:elif="{{ score >= 60 }}">及格</view>
<view wx:else>不及格</view>

<!-- zzinb 控制显示(始终渲染,display 控制) -->
<view hidden="{{ isHidden }}">隐藏内容</view>

<!-- 模板定义与使用 -->
<template name="userCard">
  <view class="card">
    <text>{{ name }}</text>
    <text>{{ age }}岁</text>
  </view>
</template>

<template is="userCard" data="{{ ...userInfo }}" />

<!-- 事件绑定 -->
<button bindtap="handleTap">点击(冒泡)</button>
<button catchtap="handleTap">点击(不冒泡)</button>
<button mut-bind:tap="handleTap">点击(互斥)</button>

对应的 JS:

Page({
  data: {
    message: 'Hello',
    id: 1,
    list: [
      { id: 1, name: '苹果' },
      { id: 2, name: '香蕉' }
    ],
    score: 85,
    isHidden: false,
    userInfo: { name: '张三', age: 25 }
  },
  
  handleTap(e) {
    console.log('点击事件', e)
  }
})

WXSS(WeiXin Style Sheets)

WXSS 是小程序的样式语言,在 CSS 基础上扩展了 rpx 单位和样式导入。

/* rpx:响应式像素,750rpx = 屏幕宽度 */
.container {
  width: 750rpx;      /* 满屏宽度 */
  padding: 20rpx;
  font-size: 32rpx;   /* 约 16px(在 375px 宽屏幕上) */
}

/* 样式导入 */
@import './common.wxss';

/* 支持的选择器 */
.class {}           /* 类选择器 */
#id {}              /* ID 选择器 */
element {}          /* 元素选择器 */
::after, ::before {} /* 伪元素 */

/* 不支持的选择器 */
/* * {} */          /* 通配符 */
/* div > p {} */    /* 子选择器(部分支持) */
/* div + p {} */    /* 相邻选择器 */

WXML vs HTML

特性WXMLHTML
标签view, text, imagediv, span, img
数据绑定{{ }} 双括号无原生支持
列表渲染wx:for无原生支持
条件渲染wx:if / hidden无原生支持
事件绑定bindtap / catchtaponclick

WXSS vs CSS

特性WXSSCSS
尺寸单位rpx(响应式)px, em, rem, vw
样式导入@import@import
选择器有限支持全部支持
作用域页面隔离全局

rpx 换算

// rpx 与 px 换算公式
// 1rpx = 屏幕宽度 / 750

// 在 iPhone 6(375px)上:
// 1rpx = 375 / 750 = 0.5px
// 750rpx = 375px(满屏)

// 设计稿换算(假设设计稿宽度 750px)
// 设计稿 100px = 100rpx

关键点

  • WXML 使用 {{ }} 进行数据绑定,支持简单表达式
  • wx:for 渲染列表,必须指定 wx:key 提升性能
  • wx:if vs hidden:wx:if 条件渲染(销毁/重建),hidden 只是隐藏(display:none)
  • rpx 是响应式单位,750rpx 等于屏幕宽度,适配不同设备
  • WXSS 选择器受限,不支持通配符和部分组合选择器
  • bindtap 冒泡,catchtap 阻止冒泡