Files
2026-08-13 16:50:52 +08:00

168 lines
3.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# FlexLayout
[中文介绍](#中文介绍)
`FlexLayout` is an `C` implementation of `Flexible Box` layout. It follows the standard [algorithm](https://www.w3.org/TR/css-flexbox-1/#layout-algorithm) and supports almost all features.
`FlexLayout` is battle tested. Please feel free to use.
### Usage
#### C/C++
```C
FlexNodeRef root = Flex_newNode();
FlexNodeRef child1 = Flex_newNode();
Flex_setWidth(child1, 50);
Flex_setHeight(child1, 50);
Flex_addChild(root, child1);
FlexNodeRef child2 = Flex_newNode();
Flex_setWidth(child2, 50);
Flex_setHeight(child2, 50);
Flex_addChild(root, child2);
Flex_layout(root, FlexUndefined, FlexUndefined, 1);
Flex_print(root, FlexPrintDefault);
Flex_freeNodeRecursive(root);
```
#### Javascript
`FlexLayout` has ported to javascript by using [`nbind`](https://github.com/charto/nbind).
```js
var root = new flex.Node();
root.direction = flex.Vertical;
var child1 = new flex.Node();
child1.width = new flex.Length(50);
child1.height = new flex.Length(50);
root.add(child1);
var child2 = new flex.Node();
child2.setMeasure(function(size){return new flex.Size(10, 10);});
root.add(child2);
root.layout(NaN, NaN);
root.print();
```
### Features
- margin/padding
- min/max size
- flex-direction
- wrap
- align-items
- align-self
- align-content
- justify-content
- flex-basis
- flex-grow
- flex-shrink
- percentage
### Additions
`FlexLayout` added some useful properties:
- `spacing / line-spacing` spacing between items/lines
- `fixed` do not participate the flex layoutlike `position: absolute`
- `lines` maximum number of lines
- `items-per-line` maximum number of items in each line
### Known Issues
- `min-width`/`min-height` do not support [`auto`](https://www.w3.org/TR/css-flexbox-1/#min-size-auto)
- `order` is not supported
### License
Licensed under the MIT License.
---
## 中文介绍
`FlexLayout``Flexible Box` 布局算法的 `C` 语言实现。按照标准[算法](https://www.w3.org/TR/css-flexbox-1/#layout-algorithm)实现,几乎支持所有特性。
`FlexLayout` 经过充分测试,请放心食用。
### 使用
#### C/C++
```C
FlexNodeRef root = Flex_newNode();
FlexNodeRef child1 = Flex_newNode();
Flex_setWidth(child1, 50);
Flex_setHeight(child1, 50);
Flex_addChild(root, child1);
FlexNodeRef child2 = Flex_newNode();
Flex_setWidth(child2, 50);
Flex_setHeight(child2, 50);
Flex_addChild(root, child2);
Flex_layout(root, FlexUndefined, FlexUndefined, 1);
Flex_print(root, FlexPrintDefault);
Flex_freeNodeRecursive(root);
```
#### Javascript
`FlexLayout` 使用 [`nbind`](https://github.com/charto/nbind) 移植了 javascript 版本。
```js
var root = new flex.Node();
root.direction = flex.Vertical;
var child1 = new flex.Node();
child1.width = new flex.Length(50);
child1.height = new flex.Length(50);
root.add(child1);
var child2 = new flex.Node();
child2.setMeasure(function(size){return new flex.Size(10, 10);});
root.add(child2);
root.layout(NaN, NaN);
root.print();
```
### 支持的特性
- margin/padding
- min/max size
- flex-direction
- wrap
- align-items
- align-self
- align-content
- justify-content
- flex-basis
- flex-grow
- flex-shrink
- 百分比
### 扩展属性
`FlexLayout` 增加了以下扩展属性:
- `spacing / line-spacing` 为每两个元素/行之间增加间距
- `fixed` 元素不参与 flex 布局,类似于 `position: absolute`
- `lines` 最大行数
- `items-per-line` 每行最大元素个数
### 已知问题
- `min-width`/`min-height` 不支持设置为 [`auto`](https://www.w3.org/TR/css-flexbox-1/#min-size-auto)
- 不支持 `order` 属性
### 协议
遵循 MIT 协议。