小程序领域H5的CSS布局优化

小程序领域H5的CSS布局优化:从“乱屏”到“丝滑”的实战指南

关键词:小程序布局优化、CSS Flex、CSS Grid、rpx适配、重排重绘优化

摘要:本文从开发者最头疼的“小程序页面布局错乱”问题出发,结合小程序特有的运行环境(如rpx单位、组件限制),用“装修房子”的生活化比喻拆解CSS布局核心概念,系统讲解Flex/Grid布局的实战技巧、多端适配策略及性能优化方法。通过真实代码案例(含wxml+wxss)演示从“混乱布局”到“丝滑适配”的完整优化过程,帮你彻底解决小程序H5布局难题。


背景介绍

目的和范围

小程序作为“轻量化应用”的代表,用户对其“即点即用”的体验要求极高。但很多开发者遇到过这样的尴尬:页面在开发工具里完美,但在用户的iPhone 12上文字被截断,在小米Note 11上图片挤成一团——这些都源于“布局适配”和“性能优化”没做好。本文聚焦小程序H5场景下的CSS布局优化,覆盖基础概念、适配策略、性能提升三大核心,帮你写出“多端统一、渲染流畅”的布局代码。

预期读者

  • 刚入门的小程序开发者(解决“为什么布局总乱”的困惑)
  • 有一定经验但遇到性能瓶颈的开发者(掌握“如何让布局更丝滑”的技巧)
  • 对前端布局原理感兴趣的技术爱好者(理解小程序环境下的特殊约束)

文档结构概述

本文从“生活故事”引出问题→拆解核心概念(用装修房子打比方)→讲解Flex/Grid等布局方案→实战优化案例→性能避坑指南,最后总结常见问题。全程结合小程序特有的rpx单位、组件限制等特性,确保内容“可落地”。

术语表

核心术语定义
  • rpx:小程序专用适配单位(响应式像素),1rpx=屏幕宽度/750(类似把屏幕分成750份,每份是1rpx)
  • 重排(Reflow):浏览器重新计算元素位置/尺寸(如修改width触发),非常耗性能
  • 重绘(Repaint):元素颜色/背景变化但位置不变(如修改color),比“重排”轻量
  • BFC(块级格式化上下文):独立的布局区域,内部元素不会影响外部(解决浮动塌陷的关键)
相关概念解释
  • 盒模型(Box Model):每个HTML元素都是一个“盒子”,由内容区(content)、内边距(padding)、边框(border)、外边距(margin)组成(类似快递盒的结构:最里面是商品,周围是泡沫垫(padding),盒子本身(border),盒子外的空隙(margin))
  • Flex布局:弹性布局,像“排座位”,可以灵活调整子元素的排列方向、间距和顺序
  • Grid布局:网格布局,像“画表格”,可以精确控制二维空间的元素位置

核心概念与联系:用“装修房子”理解布局

故事引入:小王的“崩溃”小程序

小王是刚入职的小程序开发者,负责开发“社区团购”小程序的商品详情页。他用最熟悉的float布局写了一版代码,开发工具里看效果完美:图片在左,价格/标题在右,评价列表整齐排列。但上线后用户吐槽:

  • iPhone 12用户:“价格文字被截断了!”
  • 小米用户:“图片把评价列表挤下去了,要点两次才能看到!”
  • 长辈用户:“字太小了,看不清!”

小王很困惑:“同样的代码,为什么不同手机显示不一样?” 这其实是典型的“布局适配”和“布局性能”问题——我们需要从理解CSS布局的核心概念开始解决。

核心概念解释(像给小学生讲故事)

概念一:盒模型——每个元素都是“快递盒”

想象你要寄一个玩具熊给朋友,你会先把玩具熊放进一个小盒子(内容区content),然后在盒子里塞点泡沫纸(内边距padding)防止玩具晃动,再给盒子包一层彩色包装纸(边框border),最后把整个盒子放进快递袋,快递袋和其他快递之间留些空隙(外边距margin)。
每个HTML元素(比如)就像这个“快递盒”,浏览器会根据width(盒子宽度)、height(盒子高度)、paddingbordermargin计算它占的空间。
关键提醒:小程序默认使用content-box盒模型(宽度=content宽度),如果设置box-sizing: border-box,宽度=content+padding+border(类似“盒子总宽度固定,内容区会被压缩”)。

概念二:Flex布局——给元素排“弹性座位”

假设你要安排10个小朋友坐成一排,但椅子数量不够。传统的float布局像“强行把小朋友塞进固定位置”,挤不下就会掉下去(换行)。而Flex布局像“给小朋友坐弹性沙发”:沙发(父容器)可以调整长度,小朋友(子元素)可以按比例分配空间,或者自动缩小/放大适应沙发长度。
Flex布局的核心是父容器控制子元素的排列方式,通过display: flex激活,然后用flex-direction(排座位方向:横向/纵向)、justify-content(座位对齐方式:左/中/右)、align-items(垂直方向对齐)等属性调整。

概念三:rpx——小程序的“伸缩尺”

传统H5用px做单位(像素),但不同手机屏幕尺寸不同(比如iPhone 12是390px宽,小米Note 11是360px宽),同样的100px在小屏手机上会显得更大。小程序的rpx就像一把“伸缩尺”:不管屏幕多宽,都把屏幕分成750份,1rpx=1份。比如屏幕宽750px时,1rpx=1px;屏幕宽1500px时,1rpx=2px(自动伸缩)。这样写width: 375rpx,在任何手机上都是屏幕宽度的一半,完美适配!

核心概念之间的关系(用装修打比方)

装修房子时,我们需要:

  1. 确定每个家具(元素)的“占地”(盒模型);
  2. 用“弹性家具摆放法”(Flex布局)让家具在客厅(页面)里灵活排列;
  3. 用“可伸缩的尺子”(rpx)量尺寸,确保家具在不同大小的客厅里都合适。

概念一(盒模型)和概念二(Flex)的关系:Flex布局会根据盒模型计算子元素的实际占用空间。比如子元素设置flex:1(占剩余空间1份),浏览器会先算它的盒模型总宽度(content+padding+border),再分配剩余空间。
概念二(Flex)和概念三(rpx)的关系:rpx解决了“元素尺寸适配”,Flex解决了“元素排列适配”。比如用rpx设置图片宽度为200rpx,再用Flex让图片和文字区(flex:1)并排,就能在不同屏幕上保持“图+文”的比例。
概念一(盒模型)和概念三(rpx)的关系:rpx定义了“content宽度”的基准,而盒模型的padding/border/margin也可以用rpx(比如padding: 20rpx),确保整个盒子在不同屏幕上“等比例放大/缩小”。

核心概念原理和架构的文本示意图

小程序布局系统
├─ 适配层(rpx单位)→ 解决“不同屏幕尺寸的元素大小”
├─ 布局层(Flex/Grid)→ 解决“元素如何排列”
└─ 渲染层(盒模型)→ 解决“元素实际占用空间”

Mermaid 流程图(布局优化的核心逻辑)

graph TD
    A[确定需求] --> B{选择布局方案}
    B -->|简单单列/多列| C[Flex布局]
    B -->|复杂网格| D[Grid布局]
    C --> E[用rpx定义基础尺寸]
    D --> E
    E --> F[优化盒模型(box-sizing)]
    F --> G[减少重排重绘]
    G --> H[多端测试验证]

核心布局方案:Flex vs Grid vs 传统方案

为什么传统布局(float/position)不好用?

小王最初用float布局遇到的问题,本质是float的“脱流”特性:元素脱离文档流后,父容器会“塌缩”(高度为0),需要额外用clear:bothoverflow:hidden修复;且float无法灵活控制子元素的对齐方式(比如垂直居中)。position: absolute虽然能精确定位,但会完全脱离文档流,导致后续元素位置错乱,难以维护。

Flex布局:解决90%的常见布局需求

Flex(弹性布局)是小程序最推荐的布局方案,适合单列/多列排列、元素对齐、空间分配等场景。我们用“奶茶店点单页”案例演示。

案例需求:左右布局(图片+文字)
  • 左边放商品图(宽度固定,等比缩放)
  • 右边放标题、价格、评价(文字区占剩余空间)
  • 整体垂直居中对齐
优化前(float布局)的问题代码

<view class="container">
  <image class="img" src="奶茶.jpg">image>
  <view class="text-area">
    <text class="title">招牌奶茶text>
    <text class="price">¥15text>
    <text class="comment">4.9分 | 1000+人购买text>
  view>
view>


.container {
  width: 710rpx; /* 左右留20rpx边距 */
  margin: 0 20rpx;
}
.img {
  float: left;
  width: 200rpx;
  height: 200rpx;
}
.text-area {
  float: left;
  width: 500rpx; /* 200+500=700,但container是710rpx,导致换行 */
}
.title { font-size: 32rpx; }
.price { font-size: 28rpx; color: #ff4d4f; }
.comment { font-size: 24rpx; color: #888; }

问题

  • 图片和文字区总宽度(200+500=700rpx)小于container的710rpx,但float布局无法自动分配剩余空间,导致小屏手机(如360px宽)中text-area的500rpx可能超过剩余宽度,文字被截断。
  • 父容器.container因子元素浮动而“高度塌陷”,需要额外设置overflow: hidden修复。
优化后(Flex布局)的丝滑代码

<view class="container">
  <image class="img" src="奶茶.jpg">image>
  <view class="text-area">
    <text class="title">招牌奶茶text>
    <text class="price">¥15text>
    <text class="comment">4.9分 | 1000+人购买text>
  view>
view>


.container {
  display: flex; /* 激活Flex布局 */
  align-items: center; /* 子元素垂直居中 */
  width: 710rpx;
  margin: 0 20rpx;
  padding: 20rpx 0;
}
.img {
  width: 200rpx;
  height: 200rpx;
  flex-shrink: 0; /* 禁止图片缩小(保持固定尺寸) */
}
.text-area {
  flex: 1; /* 占剩余所有空间 */
  margin-left: 30rpx;
}
.title { 
  font-size: 32rpx; 
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis; /* 文字过长显示... */
}
.price { font-size: 28rpx; color: #ff4d4f; margin: 10rpx 0; }
.comment { font-size: 24rpx; color: #888; }

优化点解析

  • display: flex让父容器成为Flex容器,子元素(.img.text-area)自动成为Flex项。
  • align-items: center让子元素在垂直方向(交叉轴)居中对齐,解决了传统布局中“图片和文字高度不一致”的问题。
  • .text-areaflex:1表示“占满父容器剩余空间”,无论屏幕多宽,文字区都会自动调整宽度,避免截断。
  • .imgflex-shrink:0防止图片被压缩(默认flex-shrink:1,空间不足时会缩小)。

Grid布局:复杂网格的“精准控制”

Grid(网格布局)适合二维网格排列(如商品九宫格、表单多列输入),比Flex更强大(Flex是一维,Grid是二维)。我们用“社区团购商品列表”案例演示。

案例需求:4列商品网格
  • 每行4个商品,商品间水平/垂直间距20rpx
  • 商品卡片宽度自适应(不同屏幕自动调整)
  • 卡片内包含图片(高度固定)、标题(一行截断)、价格
优化前(Flex布局)的局限代码
<view class="grid-container">
  <block wx:for="{{goodsList}}" wx:key="id">
    <view class="grid-item">
      <image class="item-img" src="{{item.img}}">image>
      <text class="item-title">{{item.title}}text>
      <text class="item-price">¥{{item.price}}text>
    view>
  block>
view>


.grid-container {
  display: flex;
  flex-wrap: wrap; /* 换行 */
  padding: 0 20rpx;
}
.grid-item {
  width: calc((100% - 60rpx) / 4); /* 4列,3个间隔(20rpx*3=60rpx) */
  margin-right: 20rpx;
  margin-bottom: 20rpx;
}
.grid-item:nth-child(4n) {
  margin-right: 0; /* 第4n个元素右边距为0 */
}

问题

  • 计算宽度需要手动算间隔(calc((100% - 60rpx)/4)),代码易出错(比如增加列数时要改间隔数)。
  • 无法精确控制垂直方向的对齐(比如所有卡片高度不一致时,底部对齐困难)。
优化后(Grid布局)的简洁代码

<view class="grid-container">
  <block wx:for="{{goodsList}}" wx:key="id">
    <view class="grid-item">
      <image class="item-img" src="{{item.img}}">image>
      <text class="item-title">{{item.title}}text>
      <text class="item-price">¥{{item.price}}text>
    view>
  block>
view>


.grid-container {
  display: grid; /* 激活Grid布局 */
  grid-template-columns: repeat(4, 1fr); /* 4列,每列占1份 */
  gap: 20rpx; /* 行/列间距统一20rpx */
  padding: 0 20rpx;
}
.grid-item {
  background: #fff;
  border-radius: 12rpx;
  padding: 10rpx;
}
.item-img {
  width: 100%;
  height: 160rpx;
  border-radius: 8rpx;
}
.item-title {
  font-size: 24rpx;
  margin: 8rpx 0;
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
}
.item-price {
  font-size: 28rpx;
  color: #ff4d4f;
}

优化点解析

  • grid-template-columns: repeat(4, 1fr)表示“创建4列,每列宽度占剩余空间的1份”,自动计算间隔(无需手动calc)。
  • gap:20rpx统一设置行和列的间距,比Flex的margin更简洁(Flex需要处理最后一个元素的margin-right:0)。
  • Grid布局是二维的,可通过grid-template-rows控制行高,或用align-items控制子元素垂直对齐(比如align-items: start让卡片顶部对齐)。

多端适配的核心:rpx的正确使用

rpx的数学模型

小程序的rpx基于“750rpx=屏幕宽度”的设计稿规范(主流设计稿宽度是750px)。数学公式:
1 r p x = 屏幕宽度( p x ) 750 1rpx = \frac{屏幕宽度(px)}{750} 1rpx=750屏幕宽度(px
比如:

  • iPhone 12(屏幕宽度390px):1rpx=390/750≈0.52px
  • 小米Note 11(屏幕宽度360px):1rpx=360/750=0.48px

如何用rpx写适配代码?

  • 元素尺寸:直接按设计稿标注的px值写rpx(比如设计稿中图片宽200px,代码写width:200rpx)。
  • 字体大小:设计稿中标题32px→font-size:32rpx,但需注意小字(如24rpx)在大屏手机可能太小,可结合min-font-size或媒体查询(但小程序不支持媒体查询,建议用rpx+Flex自动调整)。
  • 边距/间距:设计稿中间距20px→margin:20rpx,确保在不同屏幕上保持“等比例留白”。

避坑指南:rpx不是万能的

  • 固定高度的图片:如果图片高度需要严格按比例显示(比如正方形),需同时设置宽高为rpx(如width:200rpx;height:200rpx),避免拉伸。
  • 超长文本:用white-space: nowrap+text-overflow: ellipsis+overflow: hidden限制单行显示(如标题),或用-webkit-line-clamp:2限制两行(需配合display:-webkit-box)。
  • 特殊屏幕(如折叠屏):虽然rpx能自动适配,但极端宽高比可能导致布局错乱,建议用min-width/max-width限制容器最大宽度(如max-width:750rpx)。

性能优化:减少重排重绘

重排重绘为什么耗性能?

浏览器渲染页面的流程:HTML→DOM树→CSSOM树→渲染树(Layout)→绘制(Paint)→合成(Composite)。

  • 重排(Layout):修改元素位置/尺寸(如widthmarginfloat),需要重新计算整个渲染树的布局,非常耗时。
  • 重绘(Paint):修改元素颜色/背景(如colorbackground),只需重新绘制,比“重排”轻量。
  • 合成(Composite):修改transform/opacity等属性,浏览器直接用GPU加速,不触发重排/重绘。

布局优化的性能技巧

1. 减少嵌套层级

小程序的WXML节点层级越深(比如view>view>view>text),渲染时的计算量越大。
优化前

<view class="a">
  <view class="b">
    <view class="c">
      <text>文字text>
    view>
  view>
view>

优化后(减少层级):

<view class="a b c">
  <text>文字text>
view>

(通过CSS合并类名,减少节点嵌套)

2. 避免频繁修改布局属性

如果需要动态修改元素样式(如动画),尽量用transform代替width/left
错误示例(触发重排):

// 用left实现平移动画(每次修改left都会触发重排)
setInterval(() => {
  const dom = document.getElementById('box');
  dom.style.left = `${parseInt(dom.style.left) + 1}px`;
}, 16);

正确示例(GPU加速):

// 用transform:translate实现(不触发重排)
setInterval(() => {
  const dom = document.getElementById('box');
  let x = 0;
  x += 1;
  dom.style.transform = `translateX(${x}px)`;
}, 16);
3. 使用BFC避免浮动塌陷

传统float布局中,父容器会因子元素浮动而“高度塌陷”(父高度为0)。通过触发BFC(块级格式化上下文)可以解决,同时BFC内部的布局不会影响外部,减少重排范围。
触发BFC的方法(小程序中常用):

  • float: left/right(但会导致父塌陷,不推荐)
  • overflow: hidden/auto(最常用)
  • display: inline-block(可能改变元素类型)
  • display: flex(Flex容器自动形成BFC)

优化案例

<view class="parent">
  <view class="child float-left">浮动元素view>
view>


.parent {
  overflow: hidden; /* 触发BFC,父容器高度包含子元素 */
}
.child {
  float: left;
}

项目实战:从“乱屏”到“丝滑”的完整优化

开发环境搭建

  • 工具:微信开发者工具(最新稳定版)
  • 基础库:miniprogram-base 2.28.0+(支持Flex/Grid完整特性)
  • 设计稿:基于750rpx宽度的Sketch/Figma文件

源代码详细实现(商品详情页优化)

优化前问题:
  • 图片和价格区在小屏手机上重叠
  • 评价列表文字被截断
  • 滑动时页面卡顿(频繁重排)
优化步骤:
  1. 替换float为Flex布局:父容器用display: flex,子元素用flex:1自动分配空间。
  2. 用rpx统一尺寸:图片宽度设为300rpx,文字区flex:1,边距20rpx
  3. 限制文本行数:标题用-webkit-line-clamp:2显示两行,评价用单行ellipsis
  4. 减少重排:评价列表用transform实现滑动动画(而非修改margin-left)。
优化后代码(关键部分)

<view class="detail-container">
  
  <view class="header">
    <image class="main-img" src="{{goods.img}}">image>
    <view class="price-info">
      <text class="title">{{goods.title}}text>
      <text class="price">¥{{goods.price}}<text class="origin-price">¥{{goods.originPrice}}text>text>
      <view class="tags">
        <text class="tag" wx:for="{{goods.tags}}" wx:key="*this">{{item}}text>
      view>
    view>
  view>
  
  <view class="comment-list">
    <view class="comment-item" wx:for="{{comments}}" wx:key="id">
      <image class="avatar" src="{{item.avatar}}">image>
      <view class="comment-content">
        <text class="user-name">{{item.name}}text>
        <text class="content">{{item.content}}text>
        <text class="time">{{item.time}}text>
      view>
    view>
  view>
view>


.detail-container {
  min-height: 100vh;
  background: #f5f5f5;
}
.header {
  display: flex; /* Flex布局 */
  align-items: center; /* 垂直居中 */
  padding: 30rpx 20rpx;
  background: #fff;
}
.main-img {
  width: 300rpx;
  height: 300rpx;
  border-radius: 12rpx;
  flex-shrink: 0; /* 禁止图片缩小 */
}
.price-info {
  flex: 1; /* 占剩余空间 */
  margin-left: 30rpx;
}
.title {
  font-size: 32rpx;
  line-height: 1.4;
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 2; /* 显示两行 */
  overflow: hidden;
}
.price {
  font-size: 40rpx;
  color: #ff4d4f;
  margin: 15rpx 0;
}
.origin-price {
  font-size: 24rpx;
  color: #888;
  text-decoration: line-through;
  margin-left: 10rpx;
}
.tags {
  display: flex;
  flex-wrap: wrap;
  gap: 10rpx;
}
.tag {
  font-size: 24rpx;
  color: #ff7a45;
  background: #fff2e8;
  padding: 4rpx 12rpx;
  border-radius: 16rpx;
}
.comment-list {
  margin-top: 20rpx;
  background: #fff;
  padding: 20rpx;
}
.comment-item {
  display: flex;
  margin-bottom: 30rpx;
}
.avatar {
  width: 60rpx;
  height: 60rpx;
  border-radius: 50%;
  flex-shrink: 0;
}
.comment-content {
  flex: 1;
  margin-left: 20rpx;
}
.user-name {
  font-size: 24rpx;
  color: #666;
}
.content {
  font-size: 28rpx;
  line-height: 1.5;
  margin: 8rpx 0;
}
.time {
  font-size: 24rpx;
  color: #888;
}

代码解读与分析

  • Flex布局的灵活分配.headerdisplay: flex让图片和价格区并排,flex:1使价格区自动占满剩余空间,避免小屏手机的文字截断。
  • rpx的适配优势:所有尺寸(如300rpx32rpx)都基于750rpx设计稿,在不同屏幕上自动等比缩放。
  • 文本截断的优雅处理:标题用-webkit-line-clamp:2限制两行,超出显示...,比单行更友好。
  • 性能优化细节:评价列表用Flex布局而非float,减少重排;图片设置flex-shrink:0避免频繁重排。

实际应用场景

场景 推荐布局方案 关键优化点
商品详情页(图+文) Flex布局 flex:1分配空间,rpx适配尺寸
商品九宫格 Grid布局 grid-template-columns: repeat(4,1fr)
导航栏(图标+文字) Flex布局 justify-content: space-around均匀分布
表单输入(标签+输入框) Flex布局 align-items: center垂直对齐
轮播图(左右滑动) Flex布局+overflow-x: auto flex-shrink:0固定项宽度

工具和资源推荐

  • 微信开发者工具:内置“调试器-布局”面板,可查看元素盒模型、Flex/Grid属性(右键元素→“检查”→Layout标签)。
  • CSS Grid Generator:在线工具(https://cssgrid-generator.netlify.app/),可视化生成Grid代码。
  • 小程序设计规范:微信官方《小程序设计指南》(https://developers.weixin.qq.com/miniprogram/design/),包含rpx适配建议。
  • VS Code插件CSS Peek(快速查看CSS定义)、Auto Rpx(自动将px转rpx)。

未来发展趋势与挑战

  • CSS新特性支持:小程序正在逐步支持sticky定位、aspect-ratio(宽高比)等新属性,未来布局会更简单。
  • 响应式布局增强:虽然小程序不支持传统媒体查询,但可能推出“屏幕尺寸变量”(如--screen-width),配合CSS变量实现响应式。
  • 性能要求升级:随着小程序功能复杂化(如3D商品展示),布局需要更高效(如使用will-change提示浏览器优化渲染)。

总结:学到了什么?

核心概念回顾

  • 盒模型:每个元素是“快递盒”,由content/padding/border/margin组成。
  • Flex布局:弹性排列,解决一维空间的对齐和空间分配(像排弹性座位)。
  • Grid布局:网格排列,解决二维空间的精准定位(像画表格)。
  • rpx:小程序的“伸缩尺”,750rpx=屏幕宽度,自动适配不同手机。

概念关系回顾

  • rpx解决“元素尺寸适配”,Flex/Grid解决“元素排列适配”,盒模型是“底层计算基础”。
  • 优化布局=选对布局方案(Flex/Grid)+用rpx适配尺寸+减少重排重绘。

思考题:动动小脑筋

  1. 如果你要开发一个“日历组件”(7列,每行7天),用Flex还是Grid布局更合适?为什么?
  2. 设计稿中一个按钮的宽度是300px(750rpx设计稿),在iPhone 12(390px宽)上实际占多少px?
  3. 页面滑动时“图片突然错位”,可能是哪些布局问题导致的?如何排查?

附录:常见问题与解答

Q:小程序不支持某些CSS属性(如gap)怎么办?
A:低版本基础库可能不支持gap,可以用margin代替(如给子元素设置margin-right:20rpx,最后一个元素margin-right:0)。建议在app.json中设置"minVersion": "2.10.0"(支持gap的最低版本)。

Q:文字在不同手机上大小不一?
A:确保用rpx设置font-size(如32rpx),同时避免使用px。如果用户调整了微信的字体大小(设置→通用→字体大小),小程序文字会跟随变化,可通过app.json"style": "v2"启用新版样式,或用-webkit-text-size-adjust: none禁用调整(但可能影响无障碍)。

Q:图片高度不一致导致布局错乱?
A:给图片设置固定高度(如height:200rpx),或用object-fit: cover裁剪(保持宽高比,填满容器)。


扩展阅读 & 参考资料

  • MDN Web Docs:CSS Flex布局(https://developer.mozilla.org/zh-CN/docs/Web/CSS/CSS_Flexible_Box_Layout)
  • 微信小程序开发文档:WXSS(https://developers.weixin.qq.com/miniprogram/dev/framework/view/wxss.html)
  • 《CSS权威指南(第4版)》:深入理解盒模型、Flex、Grid原理。

你可能感兴趣的:(CS,小程序,css,前端,ai)