我有一个显示在悬停状态的工具提示.问题是,为了在移动设备中移除焦点/悬停状态,您必须在.explaination div之外单击.我想把它做好,这样你也可以把它合上

<div class="main">
  <div>
    <h5>h5 text</h5>
      <div class="explanation">
        <div>
          <p>An explanatory paragraph <a>x</a>
          </p>
        </div>
      </div>
  </div>
</div>

CSS看起来像这样:

.main {
  .explanation {
    &::before {
      content: "[hover to show]";
    }

    p {
      background: #edf6ff;
      display: none;
      margin: 0;
      padding: 12px;
      position: relative;
      width: 200px;
      
      a {
        
          content: '[close]';
          outline: 5px solid blue;
          position: absolute;
          top: -5px;
          right: -20px;
        }
    }

    &:hover p {
      display: block;
    }
  }
}

jsfiddle here

这在桌面上非常有效,但在移动设备上,我希望能够通过点击[x]a标签来移除对元素的关注.您已经可以通过单击其他任何位置来关闭它,但我也希望能够单击X(它在内部)来关闭它.

我想大概会是这样的:

const closeButton = document.querySelector(
    '.main .explanation p a'
);

const main = document.querySelector('.main');

closeButton.addEventListener('click', removeFocus, false);

function removeFocus(event) {
    main.blur();
    event.preventDefault();
}

但这不会有任何作用,至少在Chrome中不会.如何在移动设备上关闭悬停状态?

推荐答案

而不是css悬停使用mouseentermouseleave. 在mouseentertouchstart上添加active类,并在mouseleave上删除它. 当我们点击关闭按钮删除类

const closeButton = document.querySelector('.main .explanation p a');
const explanation = document.querySelector('.main .explanation');
const addActiveClass = (e) => {
    explanation.classList.add('active');
}
const removeActiveClass = (e) => {
    explanation.classList.remove('active');
}

closeButton.addEventListener('click', toggleExplanation, false);
explanation.addEventListener('mouseenter', addActiveClass);
explanation.addEventListener('mouseleave', removeActiveClass);
explanation.addEventListener('touchstart', addActiveClass);

function toggleExplanation(event) {
  explanation.classList.toggle('active');
  event.preventDefault();
}

document.addEventListener('click', function(e) {

  // Check if the clicked element is outside the target element
  if (!explanation.contains(e.target)) {
    removeActiveClass(e)
  }
});
.main {
  .explanation {
    &::before {
      content: "[hover to show]";
    }

    p {
      background: #edf6ff;
      display: none;
      margin: 0;
      padding: 12px;
      position: relative;
      width: 200px;

      a {
        content: '[close]';
        outline: 5px solid blue;
        position: absolute;
        top: -5px;
        right: -20px;
      }
    }

    &.active p {
      display: block;
    }
  }
}
<div class="main">
  <div>
    <h5>h5 text</h5>
      <div class="explanation">
        <div>
          <p>An explanatory paragraph <a>x</a>
          </p>
        </div>
      </div>
  </div>
</div>

Javascript相关问答推荐

使用JavaScript在ionic Web应用程序中更新.pane和.view的背景 colored颜色

有条件的悲剧

fs. writeFile()vs fs.writeFile()vs fs.appendFile()

Redux查询多个数据库Api reducerPath&

当点击注册页面上的注册按钮时,邮箱重复

可更改语言的搜索栏

如果Arrow函数返回函数,而不是为useEffect返回NULL,则会出现错误

JS:XML insertBefore插入元素

在css中放置所需 colored颜色 以填充图像的透明区域

让chart.js饼图中的一个切片变厚?

expo 联系人:如果联系人的状态被拒绝,则请求访问联系人的权限

在表单集中保存更改时删除';禁用';

处理TypeScrip Vue组件未初始化的react 对象

固定动态、self 调整的优先级队列

表单数据中未定义的数组键

从异步操作返回对象

使用Perl Selify::Remote::Driver执行Java脚本时出错

无法在Adyen自定义卡安全字段创建中使用自定义占位符

JSON Web令牌(JWT)错误:RSA密钥对的签名无效

Js问题:有没有办法将数据从标记表转换成图表?