如何处理Html5 <details>元素的展开/折叠事件?

时间:2019-02-19 12:07:32

标签: html5 events dropdown expander

我使用details / summary元素来获得一个可扩展的部分:

https://www.w3schools.com/TAGS/tag_details.asp

d3.select('details')
  .on('click',()=>{
     alert('clicked');
  });
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>
<details>
  <summary>Header</summary>
  <p>Content</p>
  <p>Content</p>
</details>

我想在details元素的打开状态被切换时执行一个动作。我该怎么办?

如果我要使用onclick事件,那么如果用户单击摘要或内容,也会触发该事件。我只想处理“单击切换箭头”。

2 个答案:

答案 0 :(得分:0)

d3.select('details')
  .on('toggle',()=>{
     alert('clicked');
  });
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>
<details>
  <summary>Header</summary>
  <p>Content</p>
  <p>Content</p>
</details>

答案 1 :(得分:0)

summary::-webkit-details-marker

summary::-webkit-details-marker是您想要的箭头,很遗憾,它位于阴影DOM 中,并且对该箭头的访问不是跨浏览器(仅适用于Chrome)。

以下演示:

  • 隐藏原始箭头

  • 箭头替换为:<b>▶</b>

  • 使用CSS动画

  • 基本JavaScript应用于箭头

演示

document.querySelector('summary b').onclick = function(e) {
  console.log('clicked');
};
summary::-webkit-details-marker {
  display: none
}

summary {
  height: 1rem;
  font-size: 1rem;
}

summary:focus {
  outline: none
}

summary b {
  display: inline-block;
  font-size: 0.75rem;
  margin: 0;
  padding: 5px;
  cursor: pointer;
  line-height: 1rem;
  height: 1rem;
  vertical-align: middle;
  transform: rotate(0deg);
  transition: transform 0.3s;
}

[open] b {
  transform: rotate(90deg);
  transition: transform 0.3s;
  transform-origin: 50% 45%;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>
<details>
  <summary><b>▶</b>Header</summary>
  <p>Content</p>
  <p>Content</p>
</details>

相关问题