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 } from 'veui'
import outside from 'veui/directives/outside'

export default {
  components: {
    'veui-overlay': Overlay,
    'veui-button': Button
  },
  directives: { outside },
  data () {
    return {
      open: false
    }
  },
  methods: {
    hide () {
      this.open = false
    }
  }
}
</script>

<style lang="less">
.centered-overlay {
  position: fixed;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  width: 200px;
  height: 100px;
}
</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 } from 'veui'
import outside from 'veui/directives/outside'

export default {
  components: {
    'veui-overlay': Overlay,
    'veui-button': Button
  },
  directives: { outside },
  data () {
    return {
      open: false
    }
  },
  methods: {
    hide () {
      this.open = false
    }
  }
}
</script>

层叠顺序管理

同层级且相同优先级的浮层,越晚显示的层叠顺序越高。

<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="tiny alt"
    @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>

打开的浮层,会建立新的层叠上下文,从中打开的浮层层叠顺序会高于父级浮层。

<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="tiny alt"
    @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>

子浮层的层叠顺序受父浮层影响。

<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="small"
      @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="tiny alt"
    @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>

API

属性

名称类型默认值描述
uistring-预设样式。veui-theme-one 未提供,可自定义。
openbooleanfalse

.sync

是否显示浮层。

targetstring|Vue|Element-

允许通过 refVue 组件实例Element 的方式指定目标元素。如果目标元素存在,浮层会相对于该元素进行定位,具体定位参数由 options 属性指定。

类型描述
string在当前浮层组件所在上下文中,通过匹配 $refs 中的键名查找 DOM 元素或对应组件实例的根元素。
Vue如果传入的是组件实例,就直接返回该组件的根元素。
Element如果已经是一个 DOM 元素了,就直接使用该元素。
prioritynumber-

当前浮层组件实例与其它实例在层叠关系上的权重,数值越大,越靠上。

由于所有浮层组件的浮层根元素都会放置到 <body> 元素下,所以为了更好地控制浮层层叠顺序,浮层模块内部实现了全局的层叠上下文。组件的父子关系决定了浮层的嵌套关系,在同层级内的每个浮层组件实例都可以通过指定 priority 来实现不同实例间的相对层叠顺序。相同 priority 数值的组件实例,按照实例化的先后顺序来决定层叠顺序,后实例化的组件在之前组件的上面。

autofocusboolean-是否自动抢占焦点到浮层内的第一个可聚焦元素。
modalbooleanfalse是否是模态浮层。模态浮层会抢占焦点且限制键盘导航处于浮层内部(关闭后焦点会回归)。
overlay-classstring|Array|Object-

浮层根元素类名,数据格式为所有 Vue 支持的 class 表达式

由于浮层根元素会放置在 <body> 元素下,可以通过这个属性给浮层根元素设置类名以自定义样式。

插槽

名称描述
default浮层内容。

事件

名称描述
locate浮层定位发生变化时触发。
afterclose浮层关闭后触发。如果样式主题提供了退出动画,将在退出动画完毕后触发。

全局配置

配置项类型默认值描述
overlay.overlayClassstring|Array|Object[]全局配置需要添加到浮层容器上的类名,数据格式为所有 Vue 支持的 class 表达式