Flutter 弹性布局实战:Row/Column/Flex 核心用法与优化技巧

Flutter 中的弹性布局是基于 Flex 模型实现的,Row(水平)、Column(垂直)是 Flex 的特化版本,也是日常开发中最常用的布局组件。掌握其核心用法和优化技巧,能高效解决绝大多数线性布局场景,避免嵌套冗余、布局溢出等问题。

一、核心概念:Flex/Row/Column 关系

Flex:弹性布局的基础组件,通过 direction 属性(Axis.horizontal/Axis.vertical)控制布局方向,是 Row/Column 的父类。

Row:继承自 Flex,默认 direction = Axis.horizontal,实现水平线性布局。

Column:继承自 Flex,默认 direction = Axis.vertical,实现垂直线性布局。

关键轴定义(必懂)

布局组件 主轴(Main Axis) 交叉轴(Cross Axis)

Row 水平方向(左右) 垂直方向(上下)

Column 垂直方向(上下) 水平方向(左右)

所有弹性布局的对齐、尺寸控制都是围绕主轴和交叉轴展开的。

二、核心属性详解

  1. 主轴相关属性
    (1)mainAxisAlignment:主轴对齐方式
    控制子组件在主轴上的排列位置,默认 MainAxisAlignment.start。常用值:

start:靠主轴起始端(Row 左、Column 上)

center:主轴居中

end:靠主轴末端(Row 右、Column 下)

spaceBetween:子组件间距均分,两端无空隙

spaceAround:子组件间距均分,两端有 1/2 空隙

spaceEvenly:所有空隙(包括两端)均分

(2)mainAxisSize:主轴尺寸

控制布局自身在主轴上的占用空间,默认 MainAxisSize.max。

max:占满父组件在主轴上的所有可用空间(比如 Row 占满父容器宽度)

min:仅占用子组件在主轴上的总尺寸(比如 Row 宽度等于所有子组件宽度之和)

  1. 交叉轴相关属性

(1)crossAxisAlignment:交叉轴对齐方式

控制子组件在交叉轴上的排列位置,默认 CrossAxisAlignment.center。常用值:

start:靠交叉轴起始端(Row 上、Column 左)

center:交叉轴居中

end:靠交叉轴末端(Row 下、Column 右)

stretch:子组件拉伸至交叉轴满尺寸(需子组件无固定交叉轴尺寸)

(2)crossAxisSize:交叉轴尺寸

仅 Flex 支持,默认 CrossAxisSize.max,控制布局在交叉轴上的占用空间。

  1. 辅助属性

    textDirection:仅 Row 有效,控制水平布局方向(ltr 左到右、rtl 右到左)。

    verticalDirection:控制垂直布局方向(down 上到下、up 下到上),影响 Column/Flex(垂直方向)的 start/end 对齐。

    children:子组件列表(核心),可嵌套 Expanded/Flexible 实现弹性占比。

    三、核心配套组件

    弹性布局的灵活性核心在于 Expanded 和 Flexible,二者均为 Flexible 的封装,用于控制子组件占剩余空间的比例。

  2. Expanded:强制占满剩余空间

    继承自 Flexible,默认 fit: FlexFit.tight,强制子组件占满分配的剩余空间。核心属性:flex(弹性系数,默认 1),多个 Expanded 按 flex 比例分配剩余空间。

示例(Row 中 1:2 分栏):

dart

Row(

children: [

Expanded( // flex 默认为1

child: Container(color: Colors.red, height: 50),

),

Expanded(

flex: 2, // 占剩余空间的2/3

child: Container(color: Colors.blue, height: 50),

),

],

)

  1. Flexible:可选占剩余空间
    核心属性:

flex:弹性系数(同 Expanded)

fit:

FlexFit.tight:等同于 Expanded,强制占满分配空间

FlexFit.loose:子组件仅占用自身所需空间,剩余空间保留(不会拉伸)

示例(Flexible 不强制拉伸):

dart

Row(

children: [

Flexible(

fit: FlexFit.loose,

child: Container(color: Colors.red, width: 100, height: 50),

),

Container(color: Colors.blue, width: 50, height: 50),

],

)

  1. SizedBox:固定尺寸占位
    用于控制子组件尺寸或添加间距,是弹性布局的 "补位神器"。

dart

Row(

children: [

Text("标题"),

SizedBox(width: 10), // 水平间距10

Text("内容"),

],

)

四、Row/Column/Flex 实战场景

  1. Row 实战:顶部导航栏
    需求:左侧返回按钮,中间标题,右侧更多按钮,占满屏幕宽度。

dart

AppBar(

leading: Icon(Icons.arrow_back), // 左侧

title: Text("商品详情"), // 中间

actions: [ // 右侧

Icon(Icons.share),

SizedBox(width: 16),

Icon(Icons.more_vert),

SizedBox(width: 16),

],

// 等价于自定义Row实现:

// title: Row(

// mainAxisAlignment: MainAxisAlignment.center,

// children: [Text("商品详情")],

// ),

)

// 自定义简化版导航栏

Widget customNavBar() {

return Container(

height: 56,

padding: EdgeInsets.symmetric(horizontal: 16),

child: Row(

mainAxisAlignment: MainAxisAlignment.spaceBetween, // 两端对齐

children: [

Icon(Icons.arrow_back),

Text("商品详情", style: TextStyle(fontSize: 18)),

Icon(Icons.more_vert),

],

),

);

}

  1. Column 实战:垂直表单项
    需求:标签在上,输入框在下,整体居中,输入框拉伸占宽。

dart

Widget formItem() {

return Container(

padding: EdgeInsets.all(16),

child: Column(

crossAxisAlignment: CrossAxisAlignment.start, // 交叉轴左对齐

mainAxisSize: MainAxisSize.min, // 仅占用子组件高度

children: [

Text("手机号", style: TextStyle(color: Colors.grey[600])),

SizedBox(height: 8),

TextField(

decoration: InputDecoration(

hintText: "请输入11位手机号",

border: OutlineInputBorder(),

),

),

],

),

);

}

  1. Flex 实战:适配横竖屏布局
    需求:横屏时水平排列,竖屏时垂直排列(Flex 动态切换方向)。

dart

Widget adaptiveLayout() {

return LayoutBuilder(

builder: (context, constraints) {

// 判断宽高比,横屏:宽>高,竖屏:高>宽

bool isLandscape = constraints.maxWidth > constraints.maxHeight;

return Flex(

direction: isLandscape ? Axis.horizontal : Axis.vertical, // 动态方向

mainAxisAlignment: MainAxisAlignment.center,

children: [

Expanded(flex: 1, child: Container(color: Colors.red, height: 100)),

Expanded(flex: 1, child: Container(color: Colors.green, height: 100)),

Expanded(flex: 1, child: Container(color: Colors.blue, height: 100)),

],

);

},

);

}

五、常见问题与优化技巧

  1. 解决布局溢出问题(最常见)
    场景 1:Row 子组件总宽度超过父容器 → 溢出警告
    解决方案:

方案 1:用 Expanded 包裹子组件,弹性占剩余空间(优先)。

方案 2:用 Wrap 替代 Row/Column,自动换行 / 换列。

方案 3:用 SingleChildScrollView 包裹,允许滚动。

示例(Wrap 解决 Row 溢出):

dart

// 错误:子组件总宽度超父容器,溢出

// Row(

// children: List.generate(10, (index) => Container(width: 100, height: 50, color: Colors.red)),

// )

// 正确:Wrap 自动换行

Wrap(

spacing: 8, // 水平间距

runSpacing: 8, // 垂直间距

children: List.generate(10, (index) => Container(width: 100, height: 50, color: Colors.red)),

)

场景 2:Column 嵌套 Column 导致高度溢出

解决方案:外层 Column 用 SingleChildScrollView 包裹,或内层 Column 设置 mainAxisSize: MainAxisSize.min。

dart

Widget nestedColumn() {

return SingleChildScrollView( // 允许垂直滚动

child: Column(

children: [

Text("标题"),

Column(

mainAxisSize: MainAxisSize.min, // 内层仅占最小高度

children: List.generate(20, (index) => ListTile(title: Text("列表项$index"))),

),

],

),

);

}

  1. 减少嵌套层级(性能 + 可读性优化)
    反例:多层 Row/Column 嵌套
    dart

// 差:嵌套过深

Column(

children: [

Row(

children: [

Column(

children: [Text("A")],

),

],

),

],

)

优化:合并布局 / 用 SizedBox 替代空容器

dart

// 优:简化嵌套

Column(

children: [

Text("A"),

],

)

// 用 SizedBox 替代空 Container

// 差:Container(width: 10)

// 优:SizedBox(width: 10)

  1. 合理使用 mainAxisSize.min 减少空间浪费
    默认 mainAxisSize.max 会占满父容器主轴空间,若无需占满,设置为 min 可减少布局计算量,且避免不必要的空白。

dart

// 仅需包裹子组件,无需占满宽度

Row(

mainAxisSize: MainAxisSize.min,

children: [

Icon(Icons.check),

SizedBox(width: 4),

Text("已完成"),

],

)

  1. 优先用 Flexible 替代 Expanded(避免过度拉伸)
    Expanded 强制拉伸子组件,若子组件有固定尺寸或无需占满空间,用 Flexible(fit: FlexFit.loose) 更灵活。

dart

// 子组件有固定宽度,无需拉伸

Row(

children: [

Flexible(

fit: FlexFit.loose,

child: Container(width: 200, height: 50, color: Colors.red),

),

Text("右侧文本"),

],

)

  1. 性能优化:使用 const 构造函数

静态布局组件(无动态数据)添加 const,避免每次 build 重新创建实例。

dart

// 优:const 构造函数,缓存实例

Row(

children: const [

Icon(Icons.home),

SizedBox(width: 8),

Text("首页"),

],

)

  1. 避免交叉轴拉伸失效
    当子组件设置了交叉轴固定尺寸时,crossAxisAlignment: stretch 会失效,需移除固定尺寸。

dart

// 失效:Container 设置了固定高度(Row 的交叉轴是垂直方向)

Row(

crossAxisAlignment: CrossAxisAlignment.stretch,

children: [Container(height: 50, color: Colors.red)],

)

// 生效:移除固定高度

Row(

crossAxisAlignment: CrossAxisAlignment.stretch,

children: [Container(color: Colors.red)],

)

六、综合实战:商品卡片布局

结合 Row+Column+Expanded 实现电商常见的商品卡片:

dart

Widget productCard() {

return Container(

margin: EdgeInsets.all(8),

padding: EdgeInsets.all(12),

decoration: BoxDecoration(

border: Border.all(color: Colors.grey[200]!),

borderRadius: BorderRadius.circular(8),

),

child: Row(

crossAxisAlignment: CrossAxisAlignment.start, // 交叉轴顶部对齐

children: [

// 商品图片(固定尺寸)

Container(

width: 80,

height: 80,

decoration: BoxDecoration(

borderRadius: BorderRadius.circular(4),

image: DecorationImage(

image: NetworkImage("https://example.com/product.jpg"),

fit: BoxFit.cover,

),

),

),

SizedBox(width: 12),

// 商品信息(弹性占剩余宽度)

Expanded(

child: Column(

crossAxisAlignment: CrossAxisAlignment.start, // 交叉轴左对齐

mainAxisSize: MainAxisSize.min, // 仅占最小高度

children: [

// 商品标题(最多2行)

Text(

"2025新款夏季短袖T恤男纯棉宽松百搭潮流半袖上衣",

maxLines: 2,

overflow: TextOverflow.ellipsis,

style: TextStyle(fontSize: 14),

),

SizedBox(height: 8),

// 价格+销量

Row(

mainAxisAlignment: MainAxisAlignment.spaceBetween,

children: [

Text(

"¥99",

style: TextStyle(color: Colors.red, fontSize: 16),

),

Text(

"销量1000+",

style: TextStyle(color: Colors.grey[500], fontSize: 12),

),

],

),

],

),

),

],

),

);

}

总结

核心逻辑:Row/Column 是 Flex 的特化,所有布局控制围绕主轴 / 交叉轴展开。

灵活控空间:Expanded(强制占满)、Flexible(灵活占比)、SizedBox(固定尺寸)是弹性布局的 "三剑客"。

避坑关键:溢出问题用 Wrap/SingleChildScrollView/Expanded 解决;嵌套层级尽量简化。

性能优化:const 构造函数、mainAxisSize.min、避免过度拉伸是核心技巧。

掌握以上内容,可覆盖 90% 以上的线性布局场景,写出高效、易维护的 Flutter 布局代码。

https://openharmonycrossplatform.csdn.net/content

​​

Flutter 中的弹性布局是基于 Flex 模型实现的,Row(水平)、Column(垂直)是 Flex 的特化版本,也是日常开发中最常用的布局组件。掌握其核心用法和优化技巧,能高效解决绝大多数线性布局场景,避免嵌套冗余、布局溢出等问题。

一、核心概念:Flex/Row/Column 关系

Flex:弹性布局的基础组件,通过 direction 属性(Axis.horizontal/Axis.vertical)控制布局方向,是 Row/Column 的父类。

Row:继承自 Flex,默认 direction = Axis.horizontal,实现水平线性布局。

Column:继承自 Flex,默认 direction = Axis.vertical,实现垂直线性布局。

关键轴定义(必懂)

布局组件 主轴(Main Axis) 交叉轴(Cross Axis)

Row 水平方向(左右) 垂直方向(上下)

Column 垂直方向(上下) 水平方向(左右)

所有弹性布局的对齐、尺寸控制都是围绕主轴和交叉轴展开的。

二、核心属性详解

  1. 主轴相关属性
    (1)mainAxisAlignment:主轴对齐方式
    控制子组件在主轴上的排列位置,默认 MainAxisAlignment.start。常用值:

start:靠主轴起始端(Row 左、Column 上)

center:主轴居中

end:靠主轴末端(Row 右、Column 下)

spaceBetween:子组件间距均分,两端无空隙

spaceAround:子组件间距均分,两端有 1/2 空隙

spaceEvenly:所有空隙(包括两端)均分

(2)mainAxisSize:主轴尺寸

控制布局自身在主轴上的占用空间,默认 MainAxisSize.max。

max:占满父组件在主轴上的所有可用空间(比如 Row 占满父容器宽度)

min:仅占用子组件在主轴上的总尺寸(比如 Row 宽度等于所有子组件宽度之和)

  1. 交叉轴相关属性

(1)crossAxisAlignment:交叉轴对齐方式

控制子组件在交叉轴上的排列位置,默认 CrossAxisAlignment.center。常用值:

start:靠交叉轴起始端(Row 上、Column 左)

center:交叉轴居中

end:靠交叉轴末端(Row 下、Column 右)

stretch:子组件拉伸至交叉轴满尺寸(需子组件无固定交叉轴尺寸)

(2)crossAxisSize:交叉轴尺寸

仅 Flex 支持,默认 CrossAxisSize.max,控制布局在交叉轴上的占用空间。

  1. 辅助属性

    textDirection:仅 Row 有效,控制水平布局方向(ltr 左到右、rtl 右到左)。

    verticalDirection:控制垂直布局方向(down 上到下、up 下到上),影响 Column/Flex(垂直方向)的 start/end 对齐。

    children:子组件列表(核心),可嵌套 Expanded/Flexible 实现弹性占比。

    三、核心配套组件

    弹性布局的灵活性核心在于 Expanded 和 Flexible,二者均为 Flexible 的封装,用于控制子组件占剩余空间的比例。

  2. Expanded:强制占满剩余空间

    继承自 Flexible,默认 fit: FlexFit.tight,强制子组件占满分配的剩余空间。核心属性:flex(弹性系数,默认 1),多个 Expanded 按 flex 比例分配剩余空间。

示例(Row 中 1:2 分栏):

dart

Row(

children: [

Expanded( // flex 默认为1

child: Container(color: Colors.red, height: 50),

),

Expanded(

flex: 2, // 占剩余空间的2/3

child: Container(color: Colors.blue, height: 50),

),

],

)

  1. Flexible:可选占剩余空间
    核心属性:

flex:弹性系数(同 Expanded)

fit:

FlexFit.tight:等同于 Expanded,强制占满分配空间

FlexFit.loose:子组件仅占用自身所需空间,剩余空间保留(不会拉伸)

示例(Flexible 不强制拉伸):

dart

Row(

children: [

Flexible(

fit: FlexFit.loose,

child: Container(color: Colors.red, width: 100, height: 50),

),

Container(color: Colors.blue, width: 50, height: 50),

],

)

  1. SizedBox:固定尺寸占位
    用于控制子组件尺寸或添加间距,是弹性布局的 "补位神器"。

dart

Row(

children: [

Text("标题"),

SizedBox(width: 10), // 水平间距10

Text("内容"),

],

)

四、Row/Column/Flex 实战场景

  1. Row 实战:顶部导航栏
    需求:左侧返回按钮,中间标题,右侧更多按钮,占满屏幕宽度。

dart

AppBar(

leading: Icon(Icons.arrow_back), // 左侧

title: Text("商品详情"), // 中间

actions: [ // 右侧

Icon(Icons.share),

SizedBox(width: 16),

Icon(Icons.more_vert),

SizedBox(width: 16),

],

// 等价于自定义Row实现:

// title: Row(

// mainAxisAlignment: MainAxisAlignment.center,

// children: [Text("商品详情")],

// ),

)

// 自定义简化版导航栏

Widget customNavBar() {

return Container(

height: 56,

padding: EdgeInsets.symmetric(horizontal: 16),

child: Row(

mainAxisAlignment: MainAxisAlignment.spaceBetween, // 两端对齐

children: [

Icon(Icons.arrow_back),

Text("商品详情", style: TextStyle(fontSize: 18)),

Icon(Icons.more_vert),

],

),

);

}

  1. Column 实战:垂直表单项
    需求:标签在上,输入框在下,整体居中,输入框拉伸占宽。

dart

Widget formItem() {

return Container(

padding: EdgeInsets.all(16),

child: Column(

crossAxisAlignment: CrossAxisAlignment.start, // 交叉轴左对齐

mainAxisSize: MainAxisSize.min, // 仅占用子组件高度

children: [

Text("手机号", style: TextStyle(color: Colors.grey[600])),

SizedBox(height: 8),

TextField(

decoration: InputDecoration(

hintText: "请输入11位手机号",

border: OutlineInputBorder(),

),

),

],

),

);

}

  1. Flex 实战:适配横竖屏布局
    需求:横屏时水平排列,竖屏时垂直排列(Flex 动态切换方向)。

dart

Widget adaptiveLayout() {

return LayoutBuilder(

builder: (context, constraints) {

// 判断宽高比,横屏:宽>高,竖屏:高>宽

bool isLandscape = constraints.maxWidth > constraints.maxHeight;

return Flex(

direction: isLandscape ? Axis.horizontal : Axis.vertical, // 动态方向

mainAxisAlignment: MainAxisAlignment.center,

children: [

Expanded(flex: 1, child: Container(color: Colors.red, height: 100)),

Expanded(flex: 1, child: Container(color: Colors.green, height: 100)),

Expanded(flex: 1, child: Container(color: Colors.blue, height: 100)),

],

);

},

);

}

五、常见问题与优化技巧

  1. 解决布局溢出问题(最常见)
    场景 1:Row 子组件总宽度超过父容器 → 溢出警告
    解决方案:

方案 1:用 Expanded 包裹子组件,弹性占剩余空间(优先)。

方案 2:用 Wrap 替代 Row/Column,自动换行 / 换列。

方案 3:用 SingleChildScrollView 包裹,允许滚动。

示例(Wrap 解决 Row 溢出):

dart

// 错误:子组件总宽度超父容器,溢出

// Row(

// children: List.generate(10, (index) => Container(width: 100, height: 50, color: Colors.red)),

// )

// 正确:Wrap 自动换行

Wrap(

spacing: 8, // 水平间距

runSpacing: 8, // 垂直间距

children: List.generate(10, (index) => Container(width: 100, height: 50, color: Colors.red)),

)

场景 2:Column 嵌套 Column 导致高度溢出

解决方案:外层 Column 用 SingleChildScrollView 包裹,或内层 Column 设置 mainAxisSize: MainAxisSize.min。

dart

Widget nestedColumn() {

return SingleChildScrollView( // 允许垂直滚动

child: Column(

children: [

Text("标题"),

Column(

mainAxisSize: MainAxisSize.min, // 内层仅占最小高度

children: List.generate(20, (index) => ListTile(title: Text("列表项$index"))),

),

],

),

);

}

  1. 减少嵌套层级(性能 + 可读性优化)
    反例:多层 Row/Column 嵌套
    dart

// 差:嵌套过深

Column(

children: [

Row(

children: [

Column(

children: [Text("A")],

),

],

),

],

)

优化:合并布局 / 用 SizedBox 替代空容器

dart

// 优:简化嵌套

Column(

children: [

Text("A"),

],

)

// 用 SizedBox 替代空 Container

// 差:Container(width: 10)

// 优:SizedBox(width: 10)

  1. 合理使用 mainAxisSize.min 减少空间浪费
    默认 mainAxisSize.max 会占满父容器主轴空间,若无需占满,设置为 min 可减少布局计算量,且避免不必要的空白。

dart

// 仅需包裹子组件,无需占满宽度

Row(

mainAxisSize: MainAxisSize.min,

children: [

Icon(Icons.check),

SizedBox(width: 4),

Text("已完成"),

],

)

  1. 优先用 Flexible 替代 Expanded(避免过度拉伸)
    Expanded 强制拉伸子组件,若子组件有固定尺寸或无需占满空间,用 Flexible(fit: FlexFit.loose) 更灵活。

dart

// 子组件有固定宽度,无需拉伸

Row(

children: [

Flexible(

fit: FlexFit.loose,

child: Container(width: 200, height: 50, color: Colors.red),

),

Text("右侧文本"),

],

)

  1. 性能优化:使用 const 构造函数

静态布局组件(无动态数据)添加 const,避免每次 build 重新创建实例。

dart

// 优:const 构造函数,缓存实例

Row(

children: const [

Icon(Icons.home),

SizedBox(width: 8),

Text("首页"),

],

)

  1. 避免交叉轴拉伸失效
    当子组件设置了交叉轴固定尺寸时,crossAxisAlignment: stretch 会失效,需移除固定尺寸。

dart

// 失效:Container 设置了固定高度(Row 的交叉轴是垂直方向)

Row(

crossAxisAlignment: CrossAxisAlignment.stretch,

children: [Container(height: 50, color: Colors.red)],

)

// 生效:移除固定高度

Row(

crossAxisAlignment: CrossAxisAlignment.stretch,

children: [Container(color: Colors.red)],

)

六、综合实战:商品卡片布局

结合 Row+Column+Expanded 实现电商常见的商品卡片:

dart

Widget productCard() {

return Container(

margin: EdgeInsets.all(8),

padding: EdgeInsets.all(12),

decoration: BoxDecoration(

border: Border.all(color: Colors.grey[200]!),

borderRadius: BorderRadius.circular(8),

),

child: Row(

crossAxisAlignment: CrossAxisAlignment.start, // 交叉轴顶部对齐

children: [

// 商品图片(固定尺寸)

Container(

width: 80,

height: 80,

decoration: BoxDecoration(

borderRadius: BorderRadius.circular(4),

image: DecorationImage(

image: NetworkImage("https://example.com/product.jpg"),

fit: BoxFit.cover,

),

),

),

SizedBox(width: 12),

// 商品信息(弹性占剩余宽度)

Expanded(

child: Column(

crossAxisAlignment: CrossAxisAlignment.start, // 交叉轴左对齐

mainAxisSize: MainAxisSize.min, // 仅占最小高度

children: [

// 商品标题(最多2行)

Text(

"2025新款夏季短袖T恤男纯棉宽松百搭潮流半袖上衣",

maxLines: 2,

overflow: TextOverflow.ellipsis,

style: TextStyle(fontSize: 14),

),

SizedBox(height: 8),

// 价格+销量

Row(

mainAxisAlignment: MainAxisAlignment.spaceBetween,

children: [

Text(

"¥99",

style: TextStyle(color: Colors.red, fontSize: 16),

),

Text(

"销量1000+",

style: TextStyle(color: Colors.grey[500], fontSize: 12),

),

],

),

],

),

),

],

),

);

}

总结

核心逻辑:Row/Column 是 Flex 的特化,所有布局控制围绕主轴 / 交叉轴展开。

灵活控空间:Expanded(强制占满)、Flexible(灵活占比)、SizedBox(固定尺寸)是弹性布局的 "三剑客"。

避坑关键:溢出问题用 Wrap/SingleChildScrollView/Expanded 解决;嵌套层级尽量简化。

性能优化:const 构造函数、mainAxisSize.min、避免过度拉伸是核心技巧。

掌握以上内容,可覆盖 90% 以上的线性布局场景,写出高效、易维护的 Flutter 布局代码。

https://openharmonycrossplatform.csdn.net/content

相关推荐
verse_armour1 小时前
东南大学云课堂导出PPT
javascript
写代码的皮筏艇1 小时前
CSS中常使用的函数
前端·css
Cache技术分享1 小时前
261. Java 集合 - Java 开发必备:ArrayList 与 LinkedList 的选择攻略
前端·后端
涔溪1 小时前
深入了解 Node.js 性能诊断工具 Clinic.js 的底层工作原理
开发语言·javascript·node.js
Neptune11 小时前
js防抖技术:从原理到实践,如何解决高频事件导致的性能难题
前端·javascript
是你的小橘呀1 小时前
从爬楼梯到算斐波那契,我终于弄懂了递归和动态规划这俩 "磨人精"
前端·javascript·面试
m0_740043731 小时前
Vuex中commit和dispatch的核心区别
前端·javascript·html
草字1 小时前
css 按钮的脉冲光环动画,强调动画。
前端·css
Beginner x_u1 小时前
Vue3 + TS + TailwindCSS 操作引导组件开发逐行解析
typescript·vue3·前端开发·tailwindcss·组件开发