Flow 元素
自动布局(流动)元素,类似 Flex 的自动布局,可以快速自动排版内容,简单、直观。
安装插件
需要安装 flow 插件、resize 插件 才能使用,点此访问 Github 仓库。
sh
npm install @leafer-in/flow
npm install @leafer-in/resize
sh
pnpm add @leafer-in/flow
pnpm add @leafer-in/resize
sh
yarn add @leafer-in/flow
yarn add @leafer-in/resize
sh
bun add @leafer-in/flow
bun add @leafer-in/resize
或通过 script 标签引入,使用全局变量 LeaferIN.flow 访问插件内部功能。
html
<script src="https://unpkg.com/@leafer-in/flow@1.5.3/dist/flow.min.js"></script>
<script src="https://unpkg.com/@leafer-in/resize@1.5.3/dist/resize.min.js"></script>
<script>
const { Flow } = LeaferIN.flow
</script>
html
<script src="https://unpkg.com/@leafer-in/flow@1.5.3/dist/flow.js"></script>
<script src="https://unpkg.com/@leafer-in/resize@1.5.3/dist/resize.js"></script>
<script>
const { Flow } = LeaferIN.flow
</script>
关键属性
名称 | 描述 |
---|---|
flow | 布局方向:是否进行自动布局,可进一步指定布局的轴方向 x 或 y ,默认为 x 轴 |
flowWrap | 自动换行:是否自动换行, 默认不换行 |
flowAlign | 对齐:对齐子元素的方式, 默认为 top-left |
gap | 间距:子元素之间的间距, 默认为 0 |
padding | 内边距:容器的内边距, 默认为 0 |
itemBox | 盒类型:采用子元素的哪个 盒类型 来布局, 默认 box |
Flow 内的子元素布局属性
名称 | 描述 |
---|---|
inFlow | 加入布局:元素是否加入自动布局, 默认会加入(父元素为自动布局的情况下) |
autoWidth | 自动宽度:分配剩余宽度给此元素(忽略 width),类似 Flex 的 grow / shrink |
autoHeight | 自动高度:分配剩余高度给此元素(忽略 height),类似 Flex 的 grow / shrink |
widthRange | 限制宽度:限制 autoWidth 影响的宽度范围 |
heightRange | 限制高度:限制 autoHeight 影响的高度范围 |
lockRatio | 锁定比例:采用自动宽高时,是否锁定原始宽高比例 |
示例
自动布局
ts
// #自动布局
import { Leafer, Box } from 'leafer-ui'
import { Flow } from '@leafer-in/flow' // 导入自动布局插件 //
const leafer = new Leafer({ view: window })
const flow = new Flow({
fill: '#676',
width: 100,
height: 100,
children: [
new Box({ fill: '#FF4B4B', children: [{ tag: 'Text', text: '1', fill: 'white', textAlign: 'center', verticalAlign: 'middle', width: 25, height: 20 }] }),
new Box({ fill: '#FEB027', children: [{ tag: 'Text', text: '2', fill: 'white', textAlign: 'center', verticalAlign: 'middle', width: 25, height: 40 }] }),
new Box({ fill: '#79CB4D', children: [{ tag: 'Text', text: '3', fill: 'white', textAlign: 'center', verticalAlign: 'middle', width: 25, height: 30 }] })
],
})
leafer.add(flow)
沿 X 轴自动换行
ts
// #自动布局 - 自动换行 [沿 X 轴自动换行]
import { Leafer, Box } from 'leafer-ui'
import { Flow } from '@leafer-in/flow' // 导入自动布局插件 //
const leafer = new Leafer({ view: window })
const flow = new Flow({
flowWrap: true, // 沿 X 轴自动换行 //
gap: { x: 0, y: 10 },
fill: '#676',
width: 100,
height: 100,
children: [
new Box({ fill: '#FF4B4B', children: [{ tag: 'Text', text: '1', fill: 'white', textAlign: 'center', verticalAlign: 'middle', width: 25, height: 20 }] }),
new Box({ fill: '#FEB027', children: [{ tag: 'Text', text: '2', fill: 'white', textAlign: 'center', verticalAlign: 'middle', width: 25, height: 40 }] }),
new Box({ fill: '#79CB4D', children: [{ tag: 'Text', text: '3', fill: 'white', textAlign: 'center', verticalAlign: 'middle', width: 25, height: 30 }] }),
new Box({ fill: '#FF4B4B', children: [{ tag: 'Text', text: '4', fill: 'white', textAlign: 'center', verticalAlign: 'middle', width: 25, height: 20 }] }),
new Box({ fill: '#FEB027', children: [{ tag: 'Text', text: '5', fill: 'white', textAlign: 'center', verticalAlign: 'middle', width: 25, height: 40 }] }),
new Box({ fill: '#79CB4D', children: [{ tag: 'Text', text: '6', fill: 'white', textAlign: 'center', verticalAlign: 'middle', width: 25, height: 30 }] })
],
})
leafer.add(flow)
居中对齐
ts
// #自动布局 - 对齐内容 [居中对齐]
import { Leafer, Box } from 'leafer-ui'
import { Flow } from '@leafer-in/flow' // 导入自动布局插件 //
const leafer = new Leafer({ view: window })
const flow = new Flow({
flowAlign: 'center', // 居中对齐 //
fill: '#676',
width: 100,
height: 100,
children: [
new Box({ fill: '#FF4B4B', children: [{ tag: 'Text', text: '1', fill: 'white', textAlign: 'center', verticalAlign: 'middle', width: 25, height: 20 }] }),
new Box({ fill: '#FEB027', children: [{ tag: 'Text', text: '2', fill: 'white', textAlign: 'center', verticalAlign: 'middle', width: 25, height: 40 }] }),
new Box({ fill: '#79CB4D', children: [{ tag: 'Text', text: '3', fill: 'white', textAlign: 'center', verticalAlign: 'middle', width: 25, height: 30 }] })
],
})
leafer.add(flow)
固定数值的间距
ts
// #自动布局 - 子元素间距 [固定数值的间距]
import { Leafer, Box } from 'leafer-ui'
import { Flow } from '@leafer-in/flow' // 导入自动布局插件 //
const leafer = new Leafer({ view: window })
const flow = new Flow({
gap: 5, // 固定数值的间距 //
fill: '#676',
width: 100,
height: 100,
children: [
new Box({ fill: '#FF4B4B', children: [{ tag: 'Text', text: '1', fill: 'white', textAlign: 'center', verticalAlign: 'middle', width: 25, height: 20 }] }),
new Box({ fill: '#FEB027', children: [{ tag: 'Text', text: '2', fill: 'white', textAlign: 'center', verticalAlign: 'middle', width: 25, height: 40 }] }),
new Box({ fill: '#79CB4D', children: [{ tag: 'Text', text: '3', fill: 'white', textAlign: 'center', verticalAlign: 'middle', width: 25, height: 30 }] })
],
})
leafer.add(flow)
设置内边距
ts
// #自动布局 - 内边距
import { Leafer, Box } from 'leafer-ui'
import { Flow } from '@leafer-in/flow' // 导入自动布局插件 //
const leafer = new Leafer({ view: window })
const flow = new Flow({
padding: 5, // 内边距 //
fill: '#676',
width: 100,
height: 100,
children: [
new Box({ fill: '#FF4B4B', children: [{ tag: 'Text', text: '1', fill: 'white', textAlign: 'center', verticalAlign: 'middle', width: 25, height: 20 }] }),
new Box({ fill: '#FEB027', children: [{ tag: 'Text', text: '2', fill: 'white', textAlign: 'center', verticalAlign: 'middle', width: 25, height: 40 }] }),
new Box({ fill: '#79CB4D', children: [{ tag: 'Text', text: '3', fill: 'white', textAlign: 'center', verticalAlign: 'middle', width: 25, height: 30 }] })
],
})
leafer.add(flow)
元素不加入自动布局
ts
// #自动布局 - 子元素不加入自动布局
import { Leafer, Box } from 'leafer-ui'
import { Flow } from '@leafer-in/flow' // 导入自动布局插件 //
const leafer = new Leafer({ view: window })
const flow = new Flow({
fill: '#676',
width: 100,
height: 100,
children: [
new Box({ fill: '#FF4B4B', children: [{ tag: 'Text', text: '1', fill: 'white', textAlign: 'center', verticalAlign: 'middle', width: 25, height: 20 }] }),
new Box({ fill: '#FEB027', children: [{ tag: 'Text', text: '2', fill: 'white', textAlign: 'center', verticalAlign: 'middle', width: 25, height: 40 }] }),
new Box({ fill: '#79CB4D', children: [{ tag: 'Text', text: '3', fill: 'white', textAlign: 'center', verticalAlign: 'middle', width: 25, height: 30 }] }),
new Box({
inFlow: false, // 元素不加入自动布局,通过坐标定位 //
x: 50, y: 110, fill: '#FF4B4B', around: 'top', children: [{ tag: 'Text', text: 'false', fill: 'white', textAlign: 'center', verticalAlign: 'middle', width: 30, height: 20 }]
})
],
})
leafer.add(flow)
自动宽度
ts
// #自动布局 - 自动宽度 [自动宽度(填充剩余宽度)]
import { Leafer, Box } from 'leafer-ui'
import { Flow } from '@leafer-in/flow' // 导入自动布局插件 //
const leafer = new Leafer({ view: window })
const flow = new Flow({
fill: '#676',
width: 100,
height: 100,
children: [
new Box({ fill: '#FF4B4B', children: [{ tag: 'Text', text: '1', fill: 'white', textAlign: 'center', verticalAlign: 'middle', width: 25, height: 20 }] }),
new Box({ fill: '#FEB027', children: [{ tag: 'Text', text: '2', fill: 'white', textAlign: 'center', verticalAlign: 'middle', width: 25, height: 40 }] }),
new Box({
autoWidth: 1, // 自动宽度(填充剩余宽度) //
fill: '#79CB4D', children: [{ tag: 'Text', text: '3', fill: 'white', textAlign: 'center', verticalAlign: 'middle', width: 25, height: 30 }]
})
],
})
leafer.add(flow)
自动高度
ts
// #自动布局 - 自动高度 [自动高度(填充剩余高度)]
import { Leafer, Box } from 'leafer-ui'
import { Flow } from '@leafer-in/flow' // 导入自动布局插件 //
const leafer = new Leafer({ view: window })
const flow = new Flow({
flow: 'y',
fill: '#676',
width: 100,
height: 100,
children: [
new Box({ fill: '#FF4B4B', children: [{ tag: 'Text', text: '1', fill: 'white', textAlign: 'center', verticalAlign: 'middle', width: 20, height: 25 }] }),
new Box({ fill: '#FEB027', children: [{ tag: 'Text', text: '2', fill: 'white', textAlign: 'center', verticalAlign: 'middle', width: 40, height: 25 }] }),
new Box({
autoHeight: 1, // 自动高度(填充剩余高度) //
fill: '#79CB4D', children: [{ tag: 'Text', text: '3', fill: 'white', textAlign: 'center', verticalAlign: 'middle', width: 30, height: 25 }]
})
],
})
leafer.add(flow)
综合属性
ts
// #自动布局
import { Leafer, Rect, Star, Ellipse } from 'leafer-ui'
import { Flow } from '@leafer-in/flow' // 导入自动布局插件 //
const leafer = new Leafer({ view: window })
const flow = new Flow({
flow: 'y',
gap: { x: 'auto', y: 20 },
flowAlign: { content: 'top', x: 'from' },
flowWrap: true,
x: 100,
y: 100,
width: 260,
height: 260,
fill: '#333'
})
const rect = new Rect({ fill: 'red' })
const star = new Star({ fill: 'green', x: 800, height: 100 })
const ellipse = new Ellipse({ fill: 'blue' })
flow.add([rect, star, ellipse])
leafer.add(flow)