UNPKG

cloud-ui.vusion

Version:
345 lines (282 loc) 12.2 kB
<!-- 该 README.md 根据 api.yaml 和 docs/*.md 自动生成,为了方便在 GitHub 和 NPM 上查阅。如需修改,请查看源文件 --> # ULinearLayout 线性布局 - [示例](#示例) - [基本用法](#基本用法) - [方向](#方向) - [展示方式与布局方式](#展示方式与布局方式) - [间距](#间距) - [水平分布方式](#水平分布方式) - [Flex模式](#flex模式) - [API]() - [Props/Attrs](#propsattrs) - [Slots](#slots) - [Events](#events) - [Methods](#methods) **Layout** 内部元素按照一定的规则布局 ## 示例 处理页面中各组件之间的间距,方法有很多,但经常会出现捉襟见肘的情况。 比如一种常见的方法是,给一些默认组件如按钮之间添加`margin`样式。这种方法的问题在于,有时会出现间距多余的情况,使得之后样式处理常常要作一些减法,而且按钮周围的组件不一定继续是按钮,组件之间间距有n^2种情况,到最后开发者自己也摸不清处理了多少。另一种方法是,使用一些类似`margin-sm`简单的 class 来控制间距。它的典型问题是,class 经常会被滥用,而且污染了 html 结构,因为处理间距本来是一个样式问题,现在却要经常声明在 html 中,另一个问题是经常第一项或最后一项不加,缺乏一种对称性的美感。 考虑到以上各种问题,我们参考一些 native 开发如 Android 的布局方式,总结出这个简单易用的布局组件——线性布局。 ### 基本用法 一般具有`inline`特性的组件,可以直接在外面套一个`<u-linear-layout>`,就会拉开间隔。 ``` vue <template> <div> <u-linear-layout :loadingIconRotate="false" style="height: 200px; border: 1px solid #aaa; padding: 20px; margin: 20px;" ref="linearLayout"></u-linear-layout> <u-button @click="onOpen">打开加载</u-button> <u-button @click="onClose">关闭加载</u-button> </div> </template> <script> export default { methods: { onOpen() { this.$refs.linearLayout.openLoading(); }, onClose() { this.$refs.linearLayout.closeLoading(); }, } } </script> ``` ### 方向 默认方向为`horizontal`,它只处理具有`inline`特性的组件,拉开横向的间隔;方向也可以设置为`vertical`,它只处理具有`block`特性的组件。 ``` html <u-linear-layout type="root" direction="horizontal"> <u-button>Button</u-button> <u-button>Button</u-button> <u-button>Button</u-button> </u-linear-layout> <p></p> <u-linear-layout direction="vertical"> <u-linear-progress :percent="25"></u-linear-progress> <u-linear-progress :percent="50"></u-linear-progress> <u-linear-progress :percent="75"></u-linear-progress> </u-linear-layout> ``` ### 展示方式与布局方式 展示方式`display`用于控制`<u-linear-layout>`本身是否为块级元素或行内元素,而布局方式`layout`用于迅速调整子元素或组件的展示方式。 ``` html <u-linear-layout direction="vertical"> <u-linear-layout> <u-linear-layout display="inline"> <u-button>Button</u-button> <u-button>Button</u-button> <u-button>Button</u-button> </u-linear-layout> <span><code>&lt;u-linear-layout&gt;</code>本身为<code>&lt;block&gt;</code>类型,修改<code>display</code>可以拥有行内的特性。</span> </u-linear-layout> <u-linear-layout direction="vertical" layout="block"> <u-button>Button</u-button> <u-button>Button</u-button> <u-button>Button</u-button> <span>这个<code>&lt;u-linear-layout&gt;</code>中的元素本来都是行内元素,添加<code>layout</code>属性后可全部变成块级元素。</span> </u-linear-layout> </u-linear-layout> ``` ### 间距 水平和垂直方向都可以通过设置`gap`属性,调整间距大小。 ``` html <u-linear-layout direction="vertical"> <u-linear-layout> <u-linear-layout display="inline" gap="small"> <u-button>Button</u-button> <u-button>Button</u-button> <u-button>Button</u-button> </u-linear-layout> <u-linear-layout display="inline" gap="none"> <u-button>Button</u-button> <u-button>Button</u-button> <u-button>Button</u-button> </u-linear-layout> <u-linear-layout display="inline" gap="shrink"> <u-button>Button</u-button> <u-button>Button</u-button> <u-button>Button</u-button> </u-linear-layout> </u-linear-layout> <u-linear-layout direction="vertical" gap="large"> <u-linear-layout gap="normal"> <u-button>Button</u-button> <u-button>Button</u-button> <u-button>Button</u-button> </u-linear-layout> <u-linear-layout gap="large"> <u-button>Button</u-button> <u-button>Button</u-button> <u-button>Button</u-button> </u-linear-layout> </u-linear-layout> </u-linear-layout> ``` ### 水平分布方式 考虑到兼容 IE9,普通的分布方式是用`inline-block`与`text-align`两个特性实现的,只支持水平方向。 > 没有用`float`的主要原因是:1. 需要外加父元素或后继元素清除浮动,2. 浮动之后`vertial-align`对齐不太可控。 > > 但`text-align`也有个坑,就是会影响子元素默认的对齐方式。如果有更好的解决方案,欢迎提供。 如果想使用没有坑、更灵活的分布方式,请使用后面的 Flex 模式,但要确保你的浏览器支持该功能。 ``` html <u-linear-layout direction="vertical"> <u-linear-layout justify="start"> <u-button>Button</u-button> <u-button>Button</u-button> <u-button>Button</u-button> </u-linear-layout> <u-linear-layout justify="center"> <u-button>Button</u-button> <u-button>Button</u-button> <u-button>Button</u-button> </u-linear-layout> <u-linear-layout justify="end"> <u-button>Button</u-button> <u-button>Button</u-button> <u-button>Button</u-button> </u-linear-layout> <u-linear-layout justify="space-between"> <u-button>Button</u-button> <u-button>Button</u-button> </u-linear-layout> </u-linear-layout> ``` > `space-between`目前只支持左右两个元素,为了兼容没办法。 请不要忘记,`<u-linear-layout>`可以很方便的嵌套使用。 ``` html <u-linear-layout justify="space-between"> <u-linear-layout> <u-button>Button</u-button> <u-button>Button</u-button> </u-linear-layout> <u-linear-layout gap="shrink"> <u-button>Button</u-button> <u-button>Button</u-button> <u-button>Button</u-button> </u-linear-layout> </u-linear-layout> ``` ### Flex模式 #### 主轴分布方式 ``` html <u-linear-layout direction="vertical"> <u-linear-layout type="flex" justify="start"> <u-button>Button</u-button> <u-button>Button</u-button> <u-button>Button</u-button> </u-linear-layout> <u-linear-layout type="flex" justify="center"> <u-button>Button</u-button> <u-button>Button</u-button> <u-button>Button</u-button> </u-linear-layout> <u-linear-layout type="flex" justify="end"> <u-button>Button</u-button> <u-button>Button</u-button> <u-button>Button</u-button> </u-linear-layout> <u-linear-layout type="flex" justify="space-between"> <u-button>Button</u-button> <u-button>Button</u-button> <u-button>Button</u-button> </u-linear-layout> <u-linear-layout type="flex" justify="space-around"> <u-button>Button</u-button> <u-button>Button</u-button> <u-button>Button</u-button> </u-linear-layout> </u-linear-layout> ``` #### 交叉轴对齐方式 ``` html <u-linear-layout direction="vertical"> <u-linear-layout type="flex" alignment="start"> <u-block>Block</u-block> <u-block size="normal auto">Block</u-block> <u-block size="large auto">Block</u-block> </u-linear-layout> <u-linear-layout type="flex" alignment="center"> <u-block>Block</u-block> <u-block size="normal auto">Block</u-block> <u-block size="large auto">Block</u-block> </u-linear-layout> <u-linear-layout type="flex" alignment="end"> <u-block>Block</u-block> <u-block size="normal auto">Block</u-block> <u-block size="large auto">Block</u-block> </u-linear-layout> <u-linear-layout type="flex" alignment="baseline"> <u-block>Block</u-block> <u-block size="normal auto">Block</u-block> <u-block size="large auto">Block</u-block> </u-linear-layout> <u-linear-layout type="flex" alignment="stretch"> <u-block>Block</u-block> <u-block size="normal auto">Block</u-block> <u-block size="large auto">Block</u-block> </u-linear-layout> </u-linear-layout> ``` #### 测试滚动事件 ```html <u-linear-layout direction="vertical" style="height: 300px; overflow: scroll"> <u-linear-layout type="flex" alignment="start"> <u-block style="height: 500px">Block</u-block> <u-block size="normal auto">Block</u-block> <u-block size="large auto">Block</u-block> </u-linear-layout> </u-linear-layout> ``` ## API ### Props/Attrs | Prop/Attr | Type | Options | Default | Description | | --------- | ---- | ------- | ------- | ----------- | | display | string | `[object Object]`<br/>`[object Object]` | `'block'` | 行内展示,或块级换行展示 | | type | string | `[object Object]` | | 布局模式 | | mode | string | `[object Object]`<br/>`[object Object]`<br/>`[object Object]` | `'block'` | | | direction | string | `[object Object]`<br/>`[object Object]` | `'horizontal'` | | | justify | string | `[object Object]`<br/>`[object Object]`<br/>`[object Object]`<br/>`[object Object]`<br/>`[object Object]` | `'start'` | | | alignment | string | `[object Object]`<br/>`[object Object]`<br/>`[object Object]`<br/>`[object Object]`<br/>`[object Object]` | `'stretch'` | | | alignment | string | `[object Object]`<br/>`[object Object]`<br/>`[object Object]`<br/>`[object Object]` | `'stretch'` | | | justify | string | `[object Object]`<br/>`[object Object]`<br/>`[object Object]`<br/>`[object Object]`<br/>`[object Object]` | `'start'` | | | layout | string | `[object Object]`<br/>`[object Object]`<br/>`[object Object]` | `'none'` | 子元素行内展示或块级换行展示 | | wrap | boolean | | `true` | 设置弹性布局下子元素总宽度超出父级时子元素是否换行展示 | | loadingIcon | icon | | `'loading'` | 加载中状态显示的图标 | | loadingIconRotate | boolean | | `true` | 设置加载中图标是否旋转,默认开启。 | | loadingText | string | | `''` | 加载中状态显示的提示文案 | | gap | string | `[object Object]`<br/>`[object Object]`<br/>`[object Object]`<br/>`[object Object]`<br/>`[object Object]` | `'normal'` | 内容块间隙大小 | ### Slots #### (default) 内容 ### Events #### @click 在元素上按下并释放任意鼠标按钮时触发。 #### @dblclick 在元素上双击鼠标按钮时触发。 #### @contextmenu 在右键菜单显示前触发。 #### @mousedown 在元素上按下任意鼠标按钮时触发。 #### @mouseup 在元素上释放任意鼠标按钮时触发。 #### @mouseenter 鼠标移入元素时触发。 #### @mouseleave 鼠标移出元素时触发。 #### @scroll 滚动时触发 | Param | Type | Description | | ----- | ---- | ----------- | | $event | object | 滚动事件对象 | | $event.scrollHeight | any | 滚动内容高度 | | $event.scrollWidth | any | 滚动内容宽度 | | $event.scrollTop | any | 滚动内容距离顶部高度 | | $event.scrollLeft | any | 滚动内容距离左侧宽度 | | $event.clientHeight | any | 可视区域高度 | | $event.clientWidth | any | 可视区域宽度 | Methods #### openLoading() 打开加载中 #### closeLoading() 关闭加载中