Как я могу предотвратить блокировку раскрывающегося списка div? - PullRequest
0 голосов
/ 28 мая 2020

Вот этот раскрывающийся список из W3Schools, который, кажется, работает после моих правок Ссылки: 1 К сожалению, другой элемент <div> блокирует его, и .dropdown:hover не работает. 2

Это произошло, когда я красиво разместил значок раскрывающегося списка внутри другого div 3 , и это также происходит из-за того, что блокирующий блок div должен находиться слева от раскрывающегося списка.

(Я пытаюсь заставить работать наведение: параметры раскрывающегося списка должны появляться при наведении курсора на значок меню .)

Сначала я установил ширину 75%. Но, как ни странно, это не сработало (я все еще сохранил его)

Я пробовал изменить z-index всего:

  • Блокировка div / параграфа: -2
  • Контейнер, включая раскрывающийся список: -1
  • Раскрывающийся список: 1

Через некоторое время я увидел, что z-index применяется только к элементам с css position: absolute, relative, fixed, sticky

Но установка position: relative не сработала.

Я также узнал о pointer-events: none; из этого другого вопроса , но, к сожалению, ничего.

В Chrome Developer Tools было оранжевое поле, закрывающее раскрывающийся список.

Я установил поле на 0 и сделал границу div и видимый абзац. Как-то раскрывающийся список все еще не открывается. Я не понимаю, почему это не так - и консоль Chrome больше не показывает оранжевый цвет.

Также я испортил свойство CSS display. По умолчанию это блочный элемент, занимающий всю ширину. 4 Inline не влияет на свойства высоты и ширины. И большинство других основаны на блочном и встроенном (или табличном), но я все же пробовал (и они потерпели неудачу) их.

К сожалению, все они терпят неудачу довольно тихо, за исключением случаев, когда я превратил блокирующий div в элемент span, в котором все рухнуло.

Фрагмент кода ( Инструкции: 5 )

function menu(text) {
  // respond
  console.log(`Click success: ${text}`)
}

// 4 seconds to hover over the menu icon
setTimeout(function() {
  document.getElementById("storyDiv").style.marginTop = "10%"
}, 4000)
#gameMenu {
  color: red;
}

#storyDiv {
  position: relative;
  display: inline-block;
  width: 75%;
  height: 75%;
  margin: 0;
  overflow-y: auto; /* Makes it scrollable if the text is too big */
  border: 1px solid blue;
  z-index: -2;
  pointer-events: none;
}

#story {
  margin: 0;
  position: relative;
  z-index: -2;
  pointer-events: none;
  border: 1px solid orange;
}


/* Edited dropdown from https://www.w3schools.com/howto/howto_css_dropdown.asp */

.dropdown {
  position: absolute;
  top: 10px;
  right: 10px;
  display: inline-block;
  z-index: 1;
}

.dropdownContent {
  display: none;
  position: absolute;
  top: 10px;
  right: 10px;
  min-width: 160px;
  z-index: 1;
}

.dropdownContent button {
  padding: 12px 16px;
  font-size: 16px;
  border: none;
  display: block;
}

.dropdown:hover .dropdownContent {
  display: block;
}


/* End of dropdown */

#infoContainer {
  position: absolute;
  top: 10px;
  left: 76%;
  width: 23%;
  border: 1px solid dodgerblue;
  z-index: -1;
  /* [Result] text in the top-right corner blocks the menu,
     Also for the demonstartion */
  margin-top: 10%;
}

#playerInfo {
  margin-top: 0;
}
<head>
  <!-- Menu symbol -->
  <link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
</head>

<body>
  <div id='storyDiv'>
    <p id='story'>
      With i (color), em, ul, and li tags. As well as <br>br, and enough to expand the bottom-border enough so that it's visually below the menu icon, blocking it.<br>
    </p>
  </div>
  <div id='infoContainer'>
    <div class='dropdown'>
      <span class="material-icons" id='gameMenu'>menu</span>
      <div class='dropdownContent'>
        <button onClick='menu("Instructions")'> Instructions </button>
        <button onClick='menu("Settings")'> Settings </button>
        <button onClick='menu("Credits")'> Credits </button>
      </div>
    </div>
    <div id="playerInfo">
      <p>Another div with other stuff in it.</p>
    </div>
  </div>
</body>
  1. https://www.w3schools.com/css/css_dropdowns.asp и https://www.w3schools.com/howto/howto_css_dropdown.asp (не обязательно понимать это)

  2. Выпадающий список находится в div, поэтому изначально я думал, что он был заблокирован им или одним из других элементов в div.

  3. Он перекрывался с (границей контейнер div), что видно из соображений эстетики c. Никакого удаления. Ну, изначально значок был в верхнем левом углу, но это было навязчиво из-за приключенческой истории в <p>, о которой я говорил.

  4. https://www.w3schools.com/cssref/pr_class_display.asp

  5. При щелчке по кнопке «запустить» наведите указатель мыши на красный значок меню. Выпадающий список работает. Отключите мышь и подождите, пока рядом с div меню не появится поле. Наведите указатель мыши на раскрывающийся список. Теперь не работает

† Я перепробовал все (насколько мне известно) комбинации для (этого). Только <p>, только <div> или оба варианта не работают.

Другие примечания: Я просто хочу заставить работать наведение, и мне не нужен содержимое для изменения позиции.

1 Ответ

0 голосов
/ 28 мая 2020

Удалите z-index = -1 в #infoContainer, и он будет работать.

    #infoContainer {
      position: absolute;
      top: 10px;
      left: 76%;
      width: 23%;
      border: 1px solid dodgerblue;
      /* z-index: -1; */ /* REMOVE */
      /* [Result] text in the top-right corner blocks the menu,
         Also for the demonstartion */
      margin-top: 10%;
    }

function menu(text) {
  // respond
  console.log(`Click success: ${text}`)
}

// 4 seconds to hover over the menu icon
setTimeout(function() {
  document.getElementById("storyDiv").style.marginTop = "10%"
}, 4000)
#gameMenu {
  color: red;
}

#storyDiv {
  position: relative;
  display: inline-block;
  width: 75%;
  height: 75%;
  margin: 0;
  overflow-y: auto; /* Makes it scrollable if the text is too big */
  border: 1px solid blue;
  z-index: -2;
  pointer-events: none;
}

#story {
  margin: 0;
  position: relative;
  z-index: -2;
  pointer-events: none;
  border: 1px solid orange;
}


/* Edited dropdown from https://www.w3schools.com/howto/howto_css_dropdown.asp */

.dropdown {
  position: absolute;
  top: 10px;
  right: 10px;
  display: inline-block;
  z-index: 1;
}

.dropdownContent {
  display: none;
  position: absolute;
  top: 10px;
  right: 10px;
  min-width: 160px;
  z-index: 1;
}

.dropdownContent button {
  padding: 12px 16px;
  font-size: 16px;
  border: none;
  display: block;
}

.dropdown:hover .dropdownContent {
  display: block;
}


/* End of dropdown */

#infoContainer {
  position: absolute;
  top: 10px;
  left: 76%;
  width: 23%;
  border: 1px solid dodgerblue;
  /* z-index: -1; */ /* REMOVE */
  /* [Result] text in the top-right corner blocks the menu,
     Also for the demonstartion */
  margin-top: 10%;
}

#playerInfo {
  margin-top: 0;
}
<head>
  <!-- Menu symbol -->
  <link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
</head>

<body>
  <div id='storyDiv'>
    <p id='story'>
      With i (color), em, ul, and li tags. As well as <br>br, and enough to expand the bottom-border enough so that it's visually below the menu icon, blocking it.<br>
    </p>
  </div>
  <div id='infoContainer'>
    <div class='dropdown'>
      <span class="material-icons" id='gameMenu'>menu</span>
      <div class='dropdownContent'>
        <button onClick='menu("Instructions")'> Instructions </button>
        <button onClick='menu("Settings")'> Settings </button>
        <button onClick='menu("Credits")'> Credits </button>
      </div>
    </div>
    <div id="playerInfo">
      <p>Another div with other stuff in it.</p>
    </div>
  </div>
</body>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...