代码之家  ›  专栏  ›  技术社区  ›  Travis Heeter

如何在悬停内部v-tooltip时关闭外部v-tooltip

  •  1
  • Travis Heeter  · 技术社区  · 6 年前

    我有两个工具提示,一个在外部元素上,另一个在内部元素上,如下所示:

    Nested Tooltips

    当显示内部工具提示时,如何删除外部工具提示?

    Here's a Fiddle

    代码相当标准,但请记住,有时 v-tooltip 将工具提示像模态一样放置在主体级别上,因此工具提示实际上可能不是嵌套的。

    <div id="app">
      <div v-tooltip="'Outer Tooltip'">
        Outer Area
        <div v-tooltip="'Inner Tooltip'">
          okokok
        </div>
      </div>
    </div>
    

    以下是我尝试过的:

    在外部工具提示中,我放置了这样一个类:

    v=tooltip="{content:'Outer Tooltip', classes:['killOnOtherOpen']}"
    

    然后在内部工具提示上:

    v=tooltip="getTextAndDoStuff()"
    ...
    getTextAndDoStuff(){
        $('.killOnOtherOpen').close();
        return "Inner Tooltip";
    }
    

    但我有个错误:

    我试过这样做: .close; -就像close不是一个函数-但是什么也没有发生,甚至不是一个错误。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Boussadjra Brahim    6 年前

    stop 在处理 mouseover 事件,并添加一个名为 isOpen 显示/隐藏外部工具提示。

    这个 修饰符将阻止事件传播

    console.clear()
    
    new Vue({
      el: '#app',
      data: {
        isOpen: false,
        message: 'Outer Tooltip'
    
      }
    })
    body {
      font-family: sans-serif;
      margin: 42px;
    }
    
    .tooltip {
      display: block !important;
      z-index: 10000;
    }
    
    .tooltip .tooltip-inner {
      background: black;
      color: white;
      border-radius: 16px;
      padding: 5px 10px 4px;
    }
    
    .tooltip .tooltip-arrow {
      width: 0;
      height: 0;
      border-style: solid;
      position: absolute;
      margin: 5px;
      border-color: black;
    }
    
    .tooltip[x-placement^="top"] {
      margin-bottom: 5px;
    }
    
    .tooltip[x-placement^="top"] .tooltip-arrow {
      border-width: 5px 5px 0 5px;
      border-left-color: transparent !important;
      border-right-color: transparent !important;
      border-bottom-color: transparent !important;
      bottom: -5px;
      left: calc(50% - 5px);
      margin-top: 0;
      margin-bottom: 0;
    }
    
    .tooltip[x-placement^="bottom"] {
      margin-top: 5px;
    }
    
    .tooltip[x-placement^="bottom"] .tooltip-arrow {
      border-width: 0 5px 5px 5px;
      border-left-color: transparent !important;
      border-right-color: transparent !important;
      border-top-color: transparent !important;
      top: -5px;
      left: calc(50% - 5px);
      margin-top: 0;
      margin-bottom: 0;
    }
    
    .tooltip[x-placement^="right"] {
      margin-left: 5px;
    }
    
    .tooltip[x-placement^="right"] .tooltip-arrow {
      border-width: 5px 5px 5px 0;
      border-left-color: transparent !important;
      border-top-color: transparent !important;
      border-bottom-color: transparent !important;
      left: -5px;
      top: calc(50% - 5px);
      margin-left: 0;
      margin-right: 0;
    }
    
    .tooltip[x-placement^="left"] {
      margin-right: 5px;
    }
    
    .tooltip[x-placement^="left"] .tooltip-arrow {
      border-width: 5px 0 5px 5px;
      border-top-color: transparent !important;
      border-right-color: transparent !important;
      border-bottom-color: transparent !important;
      right: -5px;
      top: calc(50% - 5px);
      margin-left: 0;
      margin-right: 0;
    }
    
    .tooltip[aria-hidden='true'] {
      visibility: hidden;
      opacity: 0;
      transition: opacity .15s, visibility .15s;
    }
    
    .tooltip[aria-hidden='false'] {
      visibility: visible;
      opacity: 1;
      transition: opacity .15s;
    }
    
    .box {
      border: 1px solid red;
      border-radius: 2px;
      padding: 15px;
      margin: 20px;
      text-align: center;
      cursor: pointer;
    }
    
    .box:hover {
      box-shadow: 0 0 4px;
    }
    <script src="https://unpkg.com/popper.js"></script>
    <script src="https://unpkg.com/vue/dist/vue.js"></script>
    <script src="https://unpkg.com/v-tooltip"></script>
    
    <div id="app">
      <div v-tooltip="{content: message,
        show: isOpen}" class="box" @mouseover.stop="isOpen=true">
        {{ message }}
        <div v-tooltip="'Inner tooltip'" @mouseover.stop="isOpen=false" class="box">
          okokok
        </div>
      </div>
    </div>