• Popover
    • 何时使用
    • 代码演示
      • 基本
      • 箭头指向
      • 从浮层内关闭
      • 位置
      • 三种触发方式
      • 悬停点击弹出窗口
  • API
  • 注意

    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 事件。