Overlay 浮层
示例
自定义定位
浮层可以在页面内按照自定义方式定位。
使用常见的 CSS 定位方法,可以自定义。
<template>
<article>
<veui-button
ref="toggle"
@click="open = !open"
>
Toggle
</veui-button>
<veui-overlay
:open.sync="open"
overlay-class="centered-overlay"
>
<div v-outside:toggle="hide">
Centered
</div>
</veui-overlay>
</article>
</template>
<script>
import { Overlay, Button, outside } from 'veui'
export default {
components: {
'veui-overlay': Overlay,
'veui-button': Button
},
directives: { outside },
data () {
return {
open: false
}
},
methods: {
hide () {
this.open = false
}
}
}
</script>
<style lang="less" scoped>
.centered-overlay {
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 200px;
height: 100px;
}
.centered-overlay {
line-height: 100px;
text-align: center;
border: 1px solid #dbdbdb;
background-color: #fff;
}
</style>
相对已有元素定位
浮层可以相对于页面内某个 DOM 元素定位。
<template>
<article>
<veui-button
ref="toggle"
@click="open = !open"
>
Toggle
</veui-button>
<veui-overlay
target="toggle"
position="top-start"
:open.sync="open"
overlay-class="relative-overlay"
>
<div v-outside:toggle="hide">
Relatively Positioned
</div>
</veui-overlay>
</article>
</template>
<script>
import { Overlay, Button, outside } from 'veui'
export default {
components: {
'veui-overlay': Overlay,
'veui-button': Button
},
directives: { outside },
data () {
return {
open: false
}
},
methods: {
hide () {
this.open = false
}
}
}
</script>
<style lang="less" scoped>
.veui-overlay {
display: none;
}
.relative-overlay {
width: 200px;
height: 100px;
line-height: 100px;
text-align: center;
border: 1px solid #dbdbdb;
background-color: #fff;
.veui-button {
margin-left: 10px;
}
}
</style>
层叠顺序管理
同层级且相同优先级的浮层,越晚显示的层叠顺序越高。
<template>
<article>
<veui-button
ref="a"
@click="aOpen = !aOpen"
>
Toggle A
</veui-button>
<veui-overlay
target="a"
position="top-start"
:open.sync="aOpen"
overlay-class="relative-overlay"
>
A
</veui-overlay>
<veui-button
ref="b"
@click="bOpen = !bOpen"
>
Toggle B
</veui-button>
<veui-overlay
target="b"
position="top-start"
:open.sync="bOpen"
overlay-class="relative-overlay"
>
B
</veui-overlay>
<veui-button
ref="c"
@click="cOpen = !cOpen"
>
Toggle C
</veui-button>
<veui-overlay
target="c"
position="top-start"
:open.sync="cOpen"
overlay-class="relative-overlay"
>
C
</veui-overlay>
<veui-button
ui="xs"
@click="aOpen = bOpen = cOpen = false"
>
Hide all
</veui-button>
</article>
</template>
<script>
import { Overlay, Button } from 'veui'
export default {
components: {
'veui-overlay': Overlay,
'veui-button': Button
},
data () {
return {
aOpen: false,
bOpen: false,
cOpen: false
}
}
}
</script>
<style lang="less" scoped>
.veui-overlay {
display: none;
}
.relative-overlay {
width: 200px;
height: 100px;
line-height: 100px;
text-align: center;
border: 1px solid #dbdbdb;
background-color: #fff;
.veui-button {
margin-left: 10px;
}
}
</style>
打开的浮层,会建立新的层叠上下文,从中打开的浮层层叠顺序会高于父级浮层。
<template>
<article>
<veui-button
ref="parent"
@click="parentOpen = !parentOpen"
>
Toggle
</veui-button>
<veui-overlay
target="parent"
position="top-start"
:open.sync="parentOpen"
overlay-class="relative-overlay"
>
<veui-button
ref="child"
@click="childOpen = !childOpen"
>
Toggle
</veui-button>
<veui-overlay
target="child"
position="top-start"
:open.sync="childOpen"
overlay-class="relative-overlay"
>
Child Overlay
</veui-overlay>
</veui-overlay>
<veui-button
ui="xs"
@click="parentOpen = childOpen = false"
>
Hide all
</veui-button>
</article>
</template>
<script>
import { Overlay, Button } from 'veui'
export default {
components: {
'veui-overlay': Overlay,
'veui-button': Button
},
data () {
return {
parentOpen: false,
childOpen: false
}
},
watch: {
parentOpen (val) {
if (!val) {
this.childOpen = false
}
}
}
}
</script>
<style lang="less" scoped>
.veui-overlay {
display: none;
}
.relative-overlay {
width: 200px;
height: 100px;
line-height: 100px;
text-align: center;
border: 1px solid #dbdbdb;
background-color: #fff;
.veui-button {
margin-left: 10px;
}
}
</style>
子浮层的层叠顺序受父浮层影响。
<template>
<article>
<veui-button
ref="a"
@click="aOpen = !aOpen"
>
Toggle A
</veui-button>
<veui-overlay
target="a"
position="top-start"
:open.sync="aOpen"
overlay-class="relative-overlay"
>
A
</veui-overlay>
<veui-button
ref="b"
@click="bOpen = !bOpen"
>
Toggle B
</veui-button>
<veui-overlay
target="b"
position="top-start"
:open.sync="bOpen"
overlay-class="relative-overlay"
>
B
<veui-button
ref="b-a"
ui="s"
@click="bAOpen = !bAOpen"
>
Toggle B-A
</veui-button>
<veui-overlay
target="b-a"
position="top-start"
:open.sync="bAOpen"
overlay-class="relative-overlay"
>
B-A
</veui-overlay>
</veui-overlay>
<veui-button
ref="c"
@click="cOpen = !cOpen"
>
Toggle C
</veui-button>
<veui-overlay
target="c"
position="top-start"
:open.sync="cOpen"
overlay-class="relative-overlay"
>
C
</veui-overlay>
<veui-button
ui="xs"
@click="aOpen = bOpen = cOpen = bAOpen = false"
>
Hide all
</veui-button>
</article>
</template>
<script>
import { Overlay, Button } from 'veui'
export default {
components: {
'veui-overlay': Overlay,
'veui-button': Button
},
data () {
return {
aOpen: false,
bOpen: false,
cOpen: false,
bAOpen: false
}
}
}
</script>
<style lang="less" scoped>
.veui-overlay {
display: none;
}
.relative-overlay {
width: 200px;
height: 100px;
line-height: 100px;
text-align: center;
border: 1px solid #dbdbdb;
background-color: #fff;
.veui-button {
margin-left: 10px;
}
}
</style>
API
属性
名称 | 类型 | 默认值 | 描述 | ||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
ui | string= | - | 预设样式。veui-theme-dls 未提供,可自定义。 | ||||||||
open | boolean | false |
是否显示浮层。 | ||||||||
target | string | Vue | Element | - | 允许通过
| ||||||||
priority | number | - | 当前浮层组件实例与其它实例在层叠关系上的权重,数值越大,越靠上。 | ||||||||
autofocus | boolean | - | 是否自动抢占焦点到浮层内的第一个可聚焦元素。 | ||||||||
modal | boolean | false | 是否是模态浮层。模态浮层会抢占焦点且限制键盘导航处于浮层内部(关闭后焦点会回归)。 | ||||||||
inline | boolean | false | 是否将浮层渲染为内联内容。 | ||||||||
local | boolean | false | 是否将浮层保留在原来的 DOM 位置,而非移动到全局位置并参与全局浮层管理。 | ||||||||
overlay-class | string | Array | Object= | - | 浮层根元素类名,数据格式为所有 Vue 支持的 | ||||||||
overlay-style | string | Array | Object= | - | 浮层根元素的样式,数据格式为所有 Vue 支持的 | ||||||||
options | Object | - | 透传给底层 Popper.js 实现的 modifiers 配置项,具体内容参见这里。 |
插槽
名称 | 描述 |
---|---|
default | 浮层内容。 |
事件
名称 | 描述 |
---|---|
locate | 浮层定位发生变化时触发。 |
afteropen | 浮层打开后触发。如果样式主题提供了退出动画,将在退出动画完毕后触发。 |
afterclose | 浮层关闭后触发。如果样式主题提供了退出动画,将在退出动画完毕后触发。 |
全局配置
配置项 | 类型 | 默认值 | 描述 |
---|---|---|---|
overlay.overlayClass | string | Array | Object= | [] | 全局配置需要添加到浮层容器上的类名,数据格式为所有 Vue 支持的 class 表达式。 |