Выпадающее меню - столбцы внутри

Попытка создать фильтр на веб-странице, который использует раскрывающееся меню Bootstrap и размещает каждый фильтр в столбцах рядом, но вместо этого он складывает их прямо сейчас. Меню фильтра создается динамически путем перебора массива элементов, которые я хочу создать, и каждый элемент представляет собой новый столбец, который я хочу поместить в свое меню. Я пытался использовать макет сетки (контейнер> строка> столбец) с классом row-cols-# в моем элементе строки, но это не работает, как я думал.

Я могу заставить свое меню иметь определенную ширину, используя свойство style, и правильно расположить столбцы, но тогда мое меню больше не имеет соответствующего размера на основе n столбцов.

Я использую d-flex, flex-row и flex-column для создания навигации на боковой панели, и мне интересно, вызывает ли это некоторые проблемы?

Вот пример урезанной веб-страницы для иллюстрации. Справка по меню фильтров

Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
CSS: FlexBox
CSS: FlexBox
Ранее разработчики использовали макеты с помощью Position и Float. После появления flexbox сценарий полностью изменился.
1
0
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Основная причина, по которой они складываются, заключается в том, что вы используете .col-auto, в то время как .row по умолчанию имеет flex-wrap: wrap;, поэтому каждый столбец будет как можно меньше и обернет их.

Вторая причина заключается в том, что dropdown-menu позиционируется абсолютно, но относительно обертки .dropdown. Поскольку вы разместили оболочку с правой стороны страницы, dropdown-menu не будет увеличиваться в ширину, как вы ожидаете.

Так:

  • Не используйте автоматические столбцы, а вместо этого установите max-width на dropdown-menu.
  • Снимите обертку <div class = "dropdown"></div>.

Вот пример того, как вы можете сделать свой выпадающий список в Codeply, используя свой макет.

На маленьких экранах столбцы будут складываться с помощью <div class = "row flex-column flex-sm-row">. В каждом столбце фильтра используется список <ul><li>...</li></ul>, содержащий флажки и упрощающий стиль.

<form class = "dropdown-menu p-2 mt-1 overflow-auto">
  <div class = "container-fluid">
    <div class = "row flex-column flex-sm-row">
      <ul class = "col list-unstyled">
        <li>
          <h6 class = "dropdown-header">Dropdown header</h6>
          <hr class = "dropdown-divider">
        </li>
        <li>
          <input class = "form-check-input me-1" type = "checkbox" value = "" id = "first">
          <label class = "form-check-label stretched-link" for = "first">First checkbox</label>
        </li>
        <li>
          <input class = "form-check-input me-1" type = "checkbox" value = "" id = "second">
          <label class = "form-check-label stretched-link" for = "second">Second checkbox</label>
        </li>
        <li>
          <input class = "form-check-input me-1" type = "checkbox" value = "" id = "third">
          <label class = "form-check-label stretched-link" for = "third">Third checkbox</label>
        </li>
      </ul>
      <ul class = "col list-unstyled">
        ...
      </ul>
    </div>
    <div class = "d-flex justify-content-end gap-3">
      <button type = "reset" class = "btn btn-sm btn-warning clear-filter">Clear Filter</button>
      <button type = "submit" class = "btn btn-sm btn-danger">Submit</button>
    </div>
  </div>
</form>

Чтобы сообщить Flex, когда начинать перенос столбцов, установите max-width на dropdown-menu. Например, я установил его на 75vw, но он может быть любой ширины, которую вы хотите. Вместо этого вы можете использовать row-cols-*, но вам придется добавить номер столбца для каждой точки останова, например .row-cols-1 row-cols-sm-2 row-cols-md-4, тогда как установка max-width просто проще в обслуживании и выглядит лучше визуально, когда столбцы будут растягиваться.

Чтобы stretched-link работал , родитель должен иметь position: relative; применяется к нему. И whitespace: nowrap; используется для того, чтобы каждый <label> соответствовал флажку.

form {
 max-width: 75vw;
 max-height: 80vh;
}

.col li {
  position: relative;
  white-space: nowrap;
}

Наконец, чтобы предотвратить закрытие dropdown-menu при взаимодействии с ним, добавьте data-bs-auto-close="outside" на переключатель <button>.

Это решило мои проблемы с CSS! Большое спасибо! Мне нужно убедиться, что я использую различные параметры размера экрана. И еще один последний вопрос: если бы я хотел добавить полосу прокрутки в свои столбцы (т.е., может быть, иметь 20 фильтров для одного столбца), что бы вы предложили? overflow-y-scoll ? Я пробовал это, и у меня, кажется, получается горизонтальная прокрутка.

Franklin 23.01.2023 05:37

@Franklin Не используйте overflow: auto в столбцах, это вызовет у вас всевозможные проблемы. Лучше немного измените макет (не делая столбец частью <ul>, а только флажки) и установите max-height в списке флажков. Вот пример. Причина горизонтальной полосы прокрутки в столбце заключается в том, что полоса прокрутки не является частью его содержимого и, следовательно, игнорируется при расчете ее ширины во Flexbox, поэтому они «принудительно» вводятся, что приводит к переполнению <label>. Когда полоса прокрутки появляется как дочерний элемент столбца, учитывается ее ширина.

Cooleronie 23.01.2023 20:46

Другие вопросы по теме