CSS: Выпадающий список не перемещается вместе с кнопкой, когда кнопка перемещается

Вопрос или проблема

.CategoryBlock
{
margin-top: 0.5rem;
gap: 1rem;
display: flex;
overflow-x: scroll;
scrollbar-width:thin; 
}

.CategoryBlock > *:first-child {
    margin-left: auto;
}

.CategoryBlock > *:last-child {
    margin-right: auto;
}

.CategoryBlock button
{
    font-family: "Roboto", "Helvetica Neue", "Helvetica", "Arial", sans-serif;
    font-size:  2rem;
    border: 0;
    color:#2e652d;
    background-color: white;
    position: relative;
}

.CategoryBlock button:hover
{
color: #51b44f
}


.Categories
{
  position: absolute;
display: none;
border: #2e652d;
background-color: hsl(0, 0%, 95%);
border-color: #2e652d;
border-style: solid;
border-width: thin;
max-width: 10rem;
}

.DropDown a
{
    display: block;
    text-decoration: none;
color: #63815f;
font-family: "Roboto", "Helvetica Neue", "Helvetica", "Arial", sans-serif;
font-size:     1.125rem;
margin: 0rem 0.5rem 1rem 0.5rem;
       
}


.DropDown a:hover
{
    text-decoration: underline;
}

.DropDown:hover .Categories
{
    display:block;
}

<-css
html->

 <nav class="CategoryBlock">

      <div class="DropDown">
        <button>
          Статьи
        </button>
        <nav class="Categories">
          <a></a>
          <a href="">Статьи о событиях</a>
          <a href="">Статьи мнений</a>
          <a href="">Информативные</a>

        </nav>
      </div>

      <div class="DropDown">
        <button>
          Короткие рассказы
        </button>
        <nav class="Categories">
          <a></a>
          <a href="">Нарративы</a>
          <a href="">Пересказы</a>
          <a href="">Поэтические</a>

        </nav>
      </div>

      <div class="DropDown">
        <button>
          Эссе
        </button>
        <nav class="Categories">
          <a></a>
          <a href="">Убеждающее</a>
          <a href="">Резюме</a>
          <a href="">Обзоры книг</a>

        </nav>
      </div>

      <div class="DropDown">
        <button>
          Дебаты
        </button>
      </div>

      <div class="DropDown">
        <button>
          Научные отчеты
        </button>
        <nav class="Categories">
          <a></a>
          <a href="">Физика</a>
          <a href="">Химия</a>

        </nav>
      </div>

      <div class="DropDown">
        <button>
          Девлоги
        </button>
        <nav class="Categories">
          <a></a>
          <a href="">Физом</a>
          <a href="">Автоматический генератор страниц</a>

        </nav>
      </div>

      <div class="DropDown">
        <button>
          Программы
        </button>
        <nav class="Categories">
          <a></a>
          <a href="">Физом</a>
          <a href="">Автоматический генератор страниц</a>
          <a href="">Raytracer</a>
          <a href="">3D рендерер</a>

        </nav>
      </div>

      <div class="DropDown">
        <button>
          Математика
        </button>
        <nav class="Categories">
          <a></a>
          <a href="">Дискретная</a>
          <a href="">Линейная алгебра</a>
          <a href="">Предкалькулус</a>
          <a href="">Калькулус</a>


        </nav>
      </div>
    </nav>


  </header>
  <hr> 

У меня есть выпадающее меню, которое не перемещается вместе с кнопками, когда они прокручиваются в другое положение, потому что выпадающее меню имеет абсолютное позиционирование, и я не знаю, как: сохранить абсолютное поведение, но как бы привязать его к самой кнопке, а не к собственному абсолютному позиционированию. В основном я хочу создать выпадающее меню, которое находится под кнопкой, но также ведет себя как абсолютное и не влияет на отступы. Я пытался сделать блок категорий относительным, но это просто добавило переполнение по оси Y, а не тот эффект, которого я хотел достигнуть.

Будет очень полезно, если кто-то укажет мне правильное направление!

Ответ или решение

Для решения проблемы с позиционированием выпадающего меню (drop down box) относительно кнопок, вы можете изменить целевое позиционирование CSS для .Categories. Вам необходимо, чтобы .Categories оставался абсолютным относительно родителя .DropDown, который нужен вам для его контекстного позиционирования. Для этого проведите следующие изменения в вашем CSS:

  1. Убедитесь, что родительский элемент .DropDown имеет CSS-свойство position: relative;. Это нужно для того, чтобы дочерний элемент .Categories мог позиционироваться относительно этого контейнера.

  2. Измените свойства .Categories, чтобы сделать его видимым прямо под кнопкой, добавив соответствующий top и left атрибуты.

Вот пример применяемого CSS:

.DropDown {
    position: relative; /* Добавлено */
}

.Categories {
    position: absolute;
    display: none;
    border: #2e652d;
    background-color: hsl(0, 0%, 95%);
    border-color: #2e652d;
    border-style: solid;
    border-width: thin;
    max-width: 10rem;
    top: 100%; /* Позиционируем выпадающее меню ниже кнопки */
    left: 0; /* Позиционируем влево */
    z-index: 1000; /* Обеспечиваем, чтобы меню перекрывало другие элементы, если необходимо */
}

Таким образом, когда вы установите position: relative; на .DropDown, и адресуете свойства top и left для .Categories, выпадающее меню будет следовать за кнопкой, когда она будет прокручиваться, и находиться прямо под ней.

Теперь HTML-структура останется без изменений, но применяя указанные выше стили CSS, вы достигнете нужного результата, где выпадающее меню будет правильно позиционироваться всегда, когда кнопка перемещается.

Обратите внимание, что если в вашем окружении используются JavaScript или другие методы, которые могут менять классы или свойства, убедитесь в правильности выполнения.

Если у вас возникнут дополнительные вопросы или потребуется помощь с другими аспектами, пожалуйста, дайте знать!

Оцените материал
Добавить комментарий

Капча загружается...