html 我怎么能有一个弹出菜单箭头之间的过渡指向左和右都悬停和点击?

zzwlnbp8  于 2023-10-14  发布在  其他
关注(0)|答案(1)|浏览(96)

我有一个弹出菜单,默认情况下应该是隐藏的,并出现在触发按钮(红色圆圈)的左侧,鼠标悬停和单击,像这样:

代码如下:

  1. // HTML
  2. <li id="daily-muster-statuses">
  3. <div id="daily-muster-statuses-menu" class="lpx-context-menu pb-0">
  4. <div class="lpx-user-ctx-body">
  5. <ul id="muster-status-list" class="lpx-nav-menu ps">
  6. <li id="muster-status-list-header" class="m-0 mb-2 outer-menu-item p-0">
  7. <span id="muster-status-list-header-icon" class="lpx-menu-item-icon">
  8. <i class="lpx-icon bi bi-card-checklist"></i>
  9. </span>
  10. <span class="lpx-menu-item-text">Daily Muster</span>
  11. </li>
  12. </ul>
  13. </div>
  14. </div>
  15. <ul id="daily-muster-statuses-rollup" class="lpx-nav-menu">
  16. <li class="m-0 outer-menu-item">
  17. <a class="d-block lpx-menu-item-link text-center">
  18. <i class="dd-icon bi bi-chevron-left" aria-hidden="true"></i>
  19. <i id="roll-up-status" class="fa fa-circle bg-rollup-waiting"></i>
  20. </a>
  21. </li>
  22. </ul>
  23. </li>
  24. // CSS
  25. #daily-muster-statuses-menu {
  26. opacity: 0;
  27. visibility: hidden;
  28. }
  29. #daily-muster-statuses:hover > #daily-muster-statuses-menu {
  30. opacity: 1;
  31. visibility: visible;
  32. }
  33. .dd-icon {
  34. bottom: 2.5px;
  35. left: 12px;
  36. opacity: 1;
  37. transition: transform 0.1s linear;
  38. }
  39. .outer-menu-item:hover .dd-icon {
  40. transform: rotate(180deg);
  41. }
  42. .show + #daily-muster-statuses-rollup .dd-icon {
  43. transform: none;
  44. }
  45. // JS
  46. const musterStatusesRollup = $('#daily-muster-statuses-rollup');
  47. const musterStatusesMenu = $('#daily-muster-statuses-menu');
  48. const musterStatusesChevron = musterStatusesRollup.find('.dd-icon');
  49. let menuIsShown = false;
  50. const hideDailyMusterStatusesMenu = () => {
  51. musterStatusesChevron.removeClass('bi-chevron-right').
  52. addClass('bi-chevron-left');
  53. musterStatusesMenu.removeClass('show');
  54. return (menuIsShown = false);
  55. };
  56. const initialiseDailyMusterStatusesMenu = () => {
  57. // Open the daily muster statuses context menu upon clicking its rollup icon in the
  58. // right sidebar, then collapse it when clicking it again or clicking anywhere else
  59. musterStatusesRollup.on('click', e => {
  60. if (menuIsShown) {
  61. return hideDailyMusterStatusesMenu();
  62. }
  63. e.stopPropagation();
  64. musterStatusesChevron.removeClass('bi-chevron-left').
  65. addClass('bi-chevron-right');
  66. musterStatusesMenu.addClass('show');
  67. menuIsShown = true;
  68. $(document).one('click', hideDailyMusterStatusesMenu);
  69. });
  70. };

它几乎可以工作,但是当您单击触发器li时,chevron会在相关JS运行时四处移动。我希望它在鼠标按下时,浏览器开始表现得好像CSS转换规则从未存在过,但保持向右指向的V形,直到鼠标抬起和另一次完全单击之后,其间有任何数量的鼠标移动。然后,在第二次点击后,V形应该转换回左侧。
我在网上看到过很多类似的弹出菜单,看起来我把代码弄得太复杂了,所以如果有任何帮助的话,我会非常感激。
编辑:我做了一个short video that demonstrates the problem

xxhby3vn

xxhby3vn1#

要将其更改为隐藏,您需要使用display: none;来执行onclick以显示它,您需要使用function demo { document.getElementById("").style.display = "block"; },但要将其保留在那里,请尝试

  1. function toggleVisibility() {
  2. var div = document.getElementById("myDIV");
  3. if (div.style.visibility === "hidden") {
  4. div.style.visibility = "visible";
  5. } else {
  6. div.style.visibility = "hidden";
  7. }
  8. }
  1. #myDIV {
  2. width: 200px;
  3. height: 100px;
  4. background-color: lightblue;
  5. border: 1px solid black;
  6. }
  1. <button onclick="toggleVisibility()">Toggle Visibility</button>
  2. <div id="myDIV" style="visibility: hidden;">This is my DIV element.</div>
展开查看全部

相关问题