Skip to content
目录

popover

悬浮提示(操作)框。

使用方式

html
<!-- 引入 -->
<script type="module">
    import '../components/popover/index.js';
</script>
<!-- 使用 -->
<xy-button>pop confirm</xy-button>
<xy-popover>
    <!-- dom -->
    <div>自定义内容</div>
</xy-popover>

需要将悬浮内容放入<xy-popover></xy-popover>

类型type

提供两种默认样式,默认是带指向箭头的,同 tips,如果需要自定义,可以使用custom

default菜单一菜单二菜单三custom菜单一菜单二菜单三
html
<xy-button>default</xy-button>
<xy-popover>
    <xy-button type="flat">菜单一</xy-button>
    <xy-button type="flat">菜单二</xy-button>
    <xy-button type="flat">菜单三</xy-button>
</xy-popover>

<xy-button>custom</xy-button>
<xy-popover type="custom">
    <xy-button type="flat">菜单一</xy-button>
    <xy-button type="flat">菜单二</xy-button>
    <xy-button type="flat">菜单三</xy-button>
</xy-popover>

触发目标元素target

默认情况下,xy-popover是由相邻的前一个节点previousElementSibling)控制的。如果需要自定义,可以通过target来选择,值为合法的选择器,比如#id.class

target1target2
我是 target1 触发的 我是 target2 触发的
html
<xy-button id="t1">target1</xy-button>
<xy-button id="t2">target2</xy-button>
<xy-popover target="#t1">
    我是 target1 触发的
</xy-popover>
<xy-popover target="#t2">
    我是 target2 触发的
</xy-popover>

也可以指定多个.class,这样可以通过多个target来控制同一个悬浮层

target1target2target3
我是 .target 触发的
html
<xy-button class="target">target1</xy-button>
<xy-button class="target">target2</xy-button>
<xy-button class="target">target3</xy-button>
<xy-popover target=".target">
    我是 .target 触发的
</xy-popover>

每个目标元素和悬浮层直接都有一个对应关系,可以通过.target.pop 分别获取

js
悬浮层.target = 触发目标
触发目标.pop = 悬浮层

示意图如下

popover

方向dir

通过dir可以设置悬浮层方向,可以取值toprightbottomleftTLTRRTRBBLBRLTLB。同tips

TL

弹出内容

弹出内容

top

弹出内容

弹出内容

TR

弹出内容

弹出内容

LT

弹出内容

弹出内容

RT

弹出内容

弹出内容

left

弹出内容

弹出内容

right

弹出内容

弹出内容

LB

弹出内容

弹出内容

RB

弹出内容

弹出内容

BL

弹出内容

弹出内容

bottom

弹出内容

弹出内容

BR

弹出内容

弹出内容

html
<xy-button>top</xy-button>
<xy-popover dir="top">
  <p>弹出内容</p>
  <p>弹出内容</p>
</xy-popover>

JavaScript操作getset

js
popover.dir;
popover.dir = 'right';
//原生属性操作
popover.getAttribute('dir');
popover.setAttribute('dir','right');

除了上述 12 个方位外,还可以设置两个值,以逗号分隔,比如top,bottom,可以自动根据位置来选择一个合适的方向。默认值为TL,BL

top,bottom

我会自动调整位置

在空间充足的情况下朝上

在上方空间不足的情况下自动朝下

html
<xy-button>top,bottom</xy-button>
<xy-popover dir="top,bottom">
    <p>我会自动调整位置</p>
    <p>在空间充足的情况下朝上</p>
    <p>在上方空间不足的情况下自动朝下</p>
</xy-popover>

触发方式trigger

还可以通过trigger属性定义触发方式,默认为hover,focus,还可以设置为click,也可任意组合

TIP

仅用于初始化,后续修改无效。

hover

我是通过 hover 触发的

focus

我是通过 focus 触发的

click

我是通过 click 触发的

html
<xy-button>hover</xy-button>
<xy-popover trigger="hover">
  ...
</xy-popover>
<xy-button>focus</xy-button>
<xy-popover trigger="focus">
  ...
</xy-popover>
<xy-button>click</xy-button>
<xy-popover trigger="click">
  ...
</xy-popover>

还支持关键词contextmenu,可以实现自定义右键菜单

在这里单击右键
菜单一菜单二菜单三
html
<div class="contextmenu">在这里单击右键</div>
<xy-popover type="custom" trigger="contextmenu">
    <xy-button type="flat">菜单一</xy-button>
    <xy-button type="flat">菜单二</xy-button>
    <xy-button type="flat">菜单三</xy-button>
</xy-popover>

显示open

还可以通过open主动去控制悬浮层的出现与隐藏,建议设置trigger="none"

我不能触发,但是可以通过后面的开关触发菜单一菜单二菜单三
html
<xy-popover trigger="none" open>
    ...
</xy-popover>

JavaScript操作set

js
popover.open = true;
popover.open = false;
//原生属性操作
popover.setAttribute('open',true);
popover.setAttribute('open',false);
popover.toggleAttribute('open',[force]);

点击自动关闭close

每次都需要主动关闭太麻烦了,可以在需要点击关闭的按钮上添加close属性,这样在点击后悬浮层会自动关闭,无需popover.open = false

点击出现下拉不会自动关闭会自动关闭
html
<xy-popover type="custom" trigger="click">
    <xy-button type="flat">不会自动关闭</xy-button>
    <xy-button type="flat" close>会自动关闭</xy-button>
</xy-popover>

自定义样式

可以当成普通标签一样,直接对xy-popover进行自定义就行了,比如改变背景色

自定义样式

自定义样式

自定义样式

自定义样式

css
xy-popover{
  background: #333;
  color: #fff
}

事件event

show、hide

悬浮层出现/消失时触发。

show/hide 事件监听菜单一菜单二菜单三

由于原生并没有show、hide这两个事件,因此只能通过addEventListener监听

js
popover.addEventListener('show',function(ev){
    console.log('出现了');
})
popover.addEventListener('hide',function(ev){
    console.log('消失了');
})

change

悬浮层显示状态改变时触发。

虽然语义不太好,但还是比较方便,可以直接通过onchange监听

change 事件监听菜单一菜单二菜单三
html
<xy-popover onchange="console.log(this.open)">
  ...
</xy-popover>
js
popover.onchange = function(ev){
    //获取open的方式
    console.log(this.open);
    console.log(ev.target.open);
}

popover.addEventListener('change',function(ev){
    console.log(this.open);
    console.log(ev.target.open);
})

MIT License.