Popover

点击/鼠标移入元素,弹出气泡式的卡片浮层。

何时使用

当目标元素有进一步的描述和相关操作时,可以收纳到卡片中,根据用户的操作行为进行展现。

Tooltip 的区别是,用户可以对浮层上的元素进行操作,因此它可以承载更复杂的内容,比如链接或按钮等。

代码演示

Popover 气泡卡片 - 图1

基本

最简单的用法,浮层的大小由内容区域决定。

  1. <template>
  2. <a-popover title="Title">
  3. <template slot="content">
  4. <p>Content</p>
  5. <p>Content</p>
  6. </template>
  7. <a-button type="primary">Hover me</a-button>
  8. </a-popover>
  9. </template>

Popover 气泡卡片 - 图2

箭头指向

设置了 arrowPointAtCenter 后,箭头将指向目标元素的中心。

  1. <template>
  2. <div>
  3. <a-popover placement="topLeft">
  4. <template slot="content">
  5. <p>Content</p>
  6. <p>Content</p>
  7. </template>
  8. <span slot="title">Title</span>
  9. <a-button>Align edge / 边缘对齐</a-button>
  10. </a-popover>
  11. <a-popover placement="topLeft" arrowPointAtCenter>
  12. <template slot="content">
  13. <p>Content</p>
  14. <p>Content</p>
  15. </template>
  16. <span slot="title">Title</span>
  17. <a-button>Arrow points to center / 箭头指向中心</a-button>
  18. </a-popover>
  19. </div>
  20. </template>

Popover 气泡卡片 - 图3

从浮层内关闭

使用 visible 属性控制浮层显示。

<template>
  <a-popover title="Title" trigger="click" v-model="visible">
    <a @click="hide" slot="content">Close</a>
    <a-button type="primary">Click me</a-button>
  </a-popover>
</template>

<script>
  export default {
    data() {
      return {
        visible: false,
      };
    },
    methods: {
      hide() {
        console.log(111);
        this.visible = false;
      },
    },
  };
</script>

Popover 气泡卡片 - 图4

位置

位置有十二个方向。

<template>
  <div id="components-popover-demo-placement">
    <div :style="{ marginLeft: `${buttonWidth}px`, whiteSpace: 'nowrap' }">
      <a-popover placement="topLeft">
        <template slot="content">
          <p>Content</p>
          <p>Content</p>
        </template>
        <template slot="title">
          <span>Title</span>
        </template>
        <a-button>TL</a-button>
      </a-popover>
      <a-popover placement="top">
        <template slot="content">
          <p>Content</p>
          <p>Content</p>
        </template>
        <template slot="title">
          <span>Title</span>
        </template>
        <a-button>Top</a-button>
      </a-popover>
      <a-popover placement="topRight">
        <template slot="content">
          <p>Content</p>
          <p>Content</p>
        </template>
        <template slot="title">
          <span>Title</span>
        </template>
        <a-button>TR</a-button>
      </a-popover>
    </div>
    <div :style="{ width: `${buttonWidth}px`, float: 'left' }">
      <a-popover placement="leftTop">
        <template slot="content">
          <p>Content</p>
          <p>Content</p>
        </template>
        <template slot="title">
          <span>Title</span>
        </template>
        <a-button>LT</a-button>
      </a-popover>
      <a-popover placement="left">
        <template slot="content">
          <p>Content</p>
          <p>Content</p>
        </template>
        <template slot="title">
          <span>Title</span>
        </template>
        <a-button>Left</a-button>
      </a-popover>
      <a-popover placement="leftBottom">
        <template slot="content">
          <p>Content</p>
          <p>Content</p>
        </template>
        <template slot="title">
          <span>Title</span>
        </template>
        <a-button>LB</a-button>
      </a-popover>
    </div>
    <div :style="{ width: `${buttonWidth}px`, marginLeft: `${buttonWidth * 4 + 24 }px`}">
      <a-popover placement="rightTop">
        <template slot="content">
          <p>Content</p>
          <p>Content</p>
        </template>
        <template slot="title">
          <span>Title</span>
        </template>
        <a-button>RT</a-button>
      </a-popover>
      <a-popover placement="right">
        <template slot="content">
          <p>Content</p>
          <p>Content</p>
        </template>
        <template slot="title">
          <span>Title</span>
        </template>
        <a-button>Right</a-button>
      </a-popover>
      <a-popover placement="rightBottom">
        <template slot="content">
          <p>Content</p>
          <p>Content</p>
        </template>
        <template slot="title">
          <span>Title</span>
        </template>
        <a-button>RB</a-button>
      </a-popover>
    </div>
    <div :style="{ marginLeft: `${buttonWidth}px`, clear: 'both', whiteSpace: 'nowrap' }">
      <a-popover placement="bottomLeft">
        <template slot="content">
          <p>Content</p>
          <p>Content</p>
        </template>
        <template slot="title">
          <span>Title</span>
        </template>
        <a-button>BL</a-button>
      </a-popover>
      <a-popover placement="bottom">
        <template slot="content">
          <p>Content</p>
          <p>Content</p>
        </template>
        <template slot="title">
          <span>Title</span>
        </template>
        <a-button>Bottom</a-button>
      </a-popover>
      <a-popover placement="bottomRight">
        <template slot="content">
          <p>Content</p>
          <p>Content</p>
        </template>
        <template slot="title">
          <span>Title</span>
        </template>
        <a-button>BR</a-button>
      </a-popover>
    </div>
  </div>
</template>

<script>
  export default {
    data() {
      return {
        buttonWidth: 70,
      };
    },
  };
</script>
<style>
  #components-popover-demo-placement .ant-btn {
    width: 70px;
    text-align: center;
    padding: 0;
    margin-right: 8px;
    margin-bottom: 8px;
  }
</style>

Popover 气泡卡片 - 图5

三种触发方式

鼠标移入、聚集、点击。

<template>
  <div>
    <a-popover title="Title" trigger="hover">
      <template slot="content">
        <p>Content</p>
        <p>Content</p>
      </template>
      <a-button type="primary">Hover me</a-button>
    </a-popover>
    <a-popover title="Title" trigger="focus">
      <template slot="content">
        <p>Content</p>
        <p>Content</p>
      </template>
      <a-button type="primary">Focus me</a-button>
    </a-popover>
    <a-popover title="Title" trigger="click">
      <template slot="content">
        <p>Content</p>
        <p>Content</p>
      </template>
      <a-button type="primary">Click me</a-button>
    </a-popover>
  </div>
</template>

Popover 气泡卡片 - 图6

悬停点击弹出窗口

以下示例显示如何创建可悬停和单击的弹出窗口。

<template>
  <a-popover
    style="width: 500px"
    title="Hover title"
    trigger="hover"
    :visible="hovered"
    @visibleChange="handleHoverChange"
  >
    <div slot="content">This is hover content.</div>
    <a-popover
      title="Click title"
      trigger="click"
      :visible="clicked"
      @visibleChange="handleClickChange"
    >
      <div slot="content">
        <div>This is click content.</div>
        <a @click="hide">Close</a>
      </div>
      <a-button>Hover and click / 悬停并单击</a-button>
    </a-popover>
  </a-popover>
</template>
<script>
  export default {
    data() {
      return {
        clicked: false,
        hovered: false,
      };
    },
    methods: {
      hide() {
        this.clicked = false;
        this.hovered = false;
      },
      handleHoverChange(visible) {
        this.clicked = false;
        this.hovered = visible;
      },
      handleClickChange(visible) {
        this.clicked = visible;
        this.hovered = false;
      },
    },
  };
</script>

API

参数说明类型默认值
content卡片内容string|slot|VNode
title卡片标题string|slot|VNode

更多属性请参考 Tooltip

注意

请确保 Popover 的子元素能接受 mouseentermouseleavefocusclick 事件。