Есть ли способ использовать взлом clearfix вместе с flexbox?

Я использовал flexbox для макетов, с плавающими CSS-кодами как запасной вариант для старых браузеров. В целом это работает хорошо, так как браузеры, которые понимают display: flex будет игнорировать float на любых изгибаемых элементах.

Тем не менее, единственное место, где я столкнулся с проблемой этого подхода - это clearfix. Clearfix - это широко используемый хак, который использует невидимый :after псевдоэлемент, чтобы сделать контейнер правильно очищенным / содержать все плавающие элементы внутри него. Однако проблема заключается в том, что этот псевдоэлемент обрабатывается как гибкий элемент браузерами, которые поддерживают flexbox, что может привести к неожиданным проблемам с макетом. Например, если у вас есть два flex-элемента и вы используете justify-content: space-betweenвместо того, чтобы располагаться в начале и конце гибкого контейнера, они появятся в начале и в середине с невидимым clearfix ::after псевдоэлемент, занимающий конечную позицию.

Мой вопрос: есть ли способ использовать clearfix вместе с макетом flexbox, не вызывая этих проблем?

3 ответа

Один из способов справиться с этим - рассмотреть альтернативные методы clearfix.

::after Псевдоэлемент является одним из методов, но, как вы заметили, он становится гибким элементом в гибком контейнере. ( См. Вставку № 81 в этом ответе для получения более подробной информации).

Но есть и другие способы очистки поплавков. Например, вы можете использовать overflow: auto или же overflow: hidden,

Проверьте некоторые альтернативы здесь:


Еще один способ решить вашу проблему - использовать modernizr.com для обнаружения функций.

С веб-сайта:

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

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

Попробуйте это, это будет иметь дело с псевдоэлементами в гибком контейнере:

.clearfix::before,
.clearfix::after {
  flex-basis: 0;
  order: 1;
}

Я не уверен, что это та же проблема, что и у вас, но я использовал довольно сложную настройку гибкости:

display: flex;
flex-wrap:wrap;
align-items: center;

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

<div class="clearflex"></div>

.clearflex{
    width:100%;
}

Добавляя пустой div со 100% шириной между гибким содержимым, кажется, что содержимое переносится на новую строку точно так же, как это сделал clearfix. Вы также можете добавить высоту в clearflex, если вам нужен отступ между строками.

Одним из способов достижения этого является использование overflow: hidden или же overflow: auto на .clearfix и полностью удалить .clearfix::after,

.clearfix {
    overflow: auto;  /* or overflow: hidden; */
}

Однако, если вы не можете использовать overflow собственность на .clearfix по какой-то причине вы можете использовать margin-left: auto на втором div (учитывая, что ваш макет имеет только два столбца). Таким образом, невидимый ::after будет размещен между двумя макетами div.

.clearfix { ... }
.clearfix::after { .... }
.clearfix > div:last-of-type {
    margin-left: auto;
    /* for justify-content: space-between only.
    * For other option, adjust accordingly */
}

Вы можете установить flex-wrap для вашего flex-контейнера и ширину: 100% после псевдоэлемента, чтобы он был обернут и не мешал выравниванию.

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