Вероятно, самая полная и понятная статья о парсинге фронтенд-флоатингов.

внешний интерфейс JavaScript HTML CSS

напиши первым

Обычно заходите в Google Translate, чтобы увидеть объяснение float:

image
Один из них гласит:

she relaxed, floating gently in the water

В одно мгновение богиня плавно плавала в воде. Хэппи шлепает по воде, вау. . .

Не думайте об этом, мир того не стоит, давайте перейдем к делу, на чудесной картинке выше мы видим, что богиня по-прежнему занимает пространство воды, и богиня плывет. Так что давай, ладно, я больше не могу писать, давайте сразу вопрос начнем. . .

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

Выявление проблемы — ключ к успеху

Задайте себе три вопроса:

第一 浮动会造成什么影响?

第二,如何解决这些因为浮动而造成的影响?

第三,bfc原理?

На самом деле, я лично понимаю, что основная проблема, вызванная флоатингом, состоит в том, чтобы разрушить поток документов, тогда возникает проблема,floatНарушен документооборот, зачем так проектироватьapi, я проверил некоторую информацию и, наконец, выяснил, это потому, что оригинальный дизайнfloatЦель состоит в том, чтобы реализовать функцию набора текста, с помощью которой текст может обтекать изображение, и это то, о чем мы иногда задумываемся:После установки поплавка он все равно будет сжимать текстовое содержимое в контейнере.

Например, посмотрите на следующий код:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>float实现浮动</title>
</head>
<style>
    .z1{
        height: 200px;
        width: 200px;
        float: left;
        text-align: center;
        line-height: 200px;
        background: skyblue;
    }
    .fu {
        width: 400px;
    }
</style>
<body>
<div class="fu clearfix">
    <div class="z1">设置了float为left的图片</div>
    <div class="z2">你看,我没有被浮动哥哥挡住哦,这是一段神奇旅行,一天我遇上了白雪公主</div>
</div>
</body>
</html>

Схема эффекта выглядит следующим образом:

image

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

Размышляя об этом, я вдруг понял, как выглядят другие шаблоны компоновки, и начал экспериментировать. удалить контейнерz1изfloatсвойства, добавленоpositionсвойства, код выглядит следующим образом

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>absolute实现浮动</title>
</head>
<style>
    .z1{
        height: 200px;
        width: 200px;
        box-sizing: border-box;
        position: absolute;
        text-align: center;
        background: skyblue;
        padding-top: 80px;
        opacity: 0.8;
    }
    .fu {
        width: 400px;
    }
</style>
<body>
<div class="fu clearfix">
    <div class="z1">设置了positon为absolute的图片</div>
    <div class="z2">你看,我被absolute哥哥挡住哦,这是一段神奇旅行,一天我遇上了白雪公主</div>
</div>
</body>
</html>

Схема эффекта выглядит следующим образом:

image

Мы видим эту настройкуabsoluteКонтейнер в том смысле, что он полностью выходит за рамки обычного документооборота. Перекрывает весь контейнер и текстовое содержимое в текущей позиции. Сопоставив и подумав об этом, вы обнаружите, что это еще раз доказываетfloatОсновная цель, для которой он был разработан. Если это можно так понять, я думаю, какие методы следует использовать для очистки разных бизнесовfloat, или что использовать вместоfloat, будет очень четкое направление.

На самом деле, вы обнаружите, чтоabsoluteиfloatОни не будут покрывать обычный поток документов перед ними. Это должно быть связано с механизмом рендеринга браузера. Контент будет рендериться сверху вниз. После успешного рендеринга он не будет покрываться последующими плавающими элементами. (Не рассмотрим случай принудительного переопределения с помощью fix и т. д.).

Простой код выглядит следующим образом:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>清除float浮动</title>
</head>
<style>
    .z1{
        height: 200px;
        width: 200px;
        box-sizing: border-box;
        float: left;
        text-align: center;
        background: skyblue;
        padding-top: 80px;
        opacity: 0.5;
    }
    .z2 {
        background: yellow
    }
    .z3 {
        background: red;
    }
    .z4 {
        background: green;
    }
    .z5 {
        background: pink;
    }
</style>
<body>
<div class="fu">
    <div class="z2">没有设置任何浮动的容器,背景为黄色</div>
    <div class="z3">没有设置任何浮动的容器,背景为红色</div>
    <div class="z1">设置了浮动的元素,opacity为0.5</div>
    <div class="z4">没有设置任何浮动的容器,背景为绿色</div>
    <div class="z5">没有设置任何浮动的容器,背景为粉色</div>
</div>
</body>
</html>

Схема эффекта выглядит следующим образом:

image

Из аннотаций и описаний на рисунке мы можем ясно знать, что,floatЭто не повлияет на документ, который был визуализирован ранее, но повлияет на документ, который будет визуализирован после него. Итак, вопрос в том, как мы можем устранитьz1плавающийz4,z5Каково влияние?

Сначала нам нужно знать,z1Каковы эффекты этого поплавка?Эффекты следующие:

Первое воздействие: пострадалz4,z5Макет.

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

Третий эффект: высота родительского контейнера свернута, что повлияет на макет документа на том же уровне, что и родительский элемент.

Следующий код прекрасно иллюстрирует эти эффекты:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>清除float浮动</title>
</head>
<style>
    .z1{
        height: 200px;
        width: 200px;
        box-sizing: border-box;
        float: left;
        text-align: center;
        background: skyblue;
        padding-top: 80px;
        opacity: 0.5;
    }
    .z2 {
        background: yellow
    }
    .z3 {
        background: red;
    }
    .z4 {
        background: green;

    }
    .z5 {
        background: pink;
    }
    .z6 {
        color: #fff;
        background: black;
    }
    .z7 {
        color: #fff;
        background: blue;
    }
    .fu {
        /* overflow: hidden; */
    }
</style>
<body>
<div class="fu">
    <div class="z2">没有设置任何浮动的容器, 背景为黄色</div>
    <div class="z3">没有设置任何浮动的容器, 背景为红色</div>
    <div class="z1">设置了浮动的元素, opacity为0.5</div>
    <div class="z4">没有设置任何浮动的容器, 背景为绿色</div>
    <div class="z5">没有设置任何浮动的容器, 背景为粉色</div>
</div>
<div class="z6">和父级元素同级的容器, 没有设置任何浮动, 背景为绿色</div>
<div class="z7">和父级元素同级的容器, 没有设置任何浮动, 背景为绿色</div>
</body>
</html>

Схема эффекта выглядит следующим образом:

image
Через аннотации на рисунке мы можем ясно видеть три воздействия, упомянутые выше, а затем отчетливо видны воздействия.Как решить эти воздействия?

Решения важны

Устранение этих трех последствий требует мышления в двух направлениях:

Первое направление: решить влияние родительского элемента на его родственные элементы, я предпочитаю решатьвнешнее противоречие.

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

Как говорится, семейное уродство не может быть обнародовано. Итак, давайте сначала решим внешнее противоречие. Как его решить? Идея его решения не что иное, как сделать так, чтобы высота родительского элемента больше не разрушалась, а учитывать высоту плавающего элемента. Помните ключевой момент, в это время внутренние противоречия все еще существуют. Например, плавающий элемент имеет высокую степень перекрытия со своими последующими одноуровневыми элементами.

разрешать внешние конфликты

триггер bfc

Первый — вызватьbfc, почему, потому что триггерbfc, высота будет включать высоту плавающего элемента. Как его вызвать, вы можете установить родительский элементoverflow:auto;для других триггеровbfcЯ не буду говорить о методе, я в основном говорю о принципе. код показывает, как показано ниже

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>清除float浮动</title>
</head>
<style>
    .z1{
        height: 200px;
        width: 200px;
        box-sizing: border-box;
        float: left;
        text-align: center;
        background: skyblue;
        padding-top: 80px;
        opacity: 0.5;
    }
    .z2 {
        background: yellow
    }
    .z3 {
        background: red;
    }
    .z4 {
        background: green;

    }
    .z5 {
        background: pink;
    }
    .z6 {
        color: #fff;
        background: black;
    }
    .z7 {
        color: #fff;
        background: blue;
    }
    .fu {
        overflow: hidden;
    }
</style>
<body>
<div class="fu">
    <div class="z2">没有设置任何浮动的容器, 背景为黄色</div>
    <div class="z3">没有设置任何浮动的容器, 背景为红色</div>
    <div class="z1">设置了浮动的元素, opacity为0.5</div>
    <div class="z4">没有设置任何浮动的容器, 背景为绿色</div>
    <div class="z5">没有设置任何浮动的容器, 背景为粉色</div>
</div>
<div class="z6">和父级元素同级的容器, 没有设置任何浮动, 背景为绿色</div>
<div class="z7">和父级元素同级的容器, 没有设置任何浮动, 背景为绿色</div>
</body>
</html>

Схема эффекта выглядит следующим образом:

image
Из рисунка хорошо видно, что после срабатывания БФК родительского элемента внешнее противоречие разрешается, но не разрешается внутреннее противоречие. Так что начинайте решать внутренние конфликты прямо сейчас. Как решить внутреннее противоречие, то есть высота плавающего элемента внутри родительского элемента перекрывается с высотой следующих одноуровневых элементов. На этот раз не будем спешить с решением внутренних конфликтов, а рассмотрим еще один способ разрешения внешних конфликтов.

четкий принцип

Добавьте псевдоэлемент к родительскому элементу: код выглядит следующим образом:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>清除float浮动</title>
</head>
<style>
    .z1{
        height: 200px;
        width: 200px;
        box-sizing: border-box;
        float: left;
        text-align: center;
        background: skyblue;
        padding-top: 80px;
        opacity: 0.5;
    }
    .z2 {
        background: yellow
    }
    .z3 {
        background: red;
    }
    .z4 {
        background: green;
        /* clear: left */
    }
    .z5 {
        background: pink;
    }
    .z6 {
        color: #fff;
        background: black;
    }
    .z7 {
        color: #fff;
        background: blue;
    }
    .fu {
    }
    .clearfix:after {
        display: block;
        overflow: hidden;
        content: '伪元素的内容哦';
        clear: both;
        height: 0;
        background: slateblue;
    }
</style>
<body>
<div class="fu clearfix">
    <div class="z2">没有设置任何浮动的容器, 背景为黄色</div>
    <div class="z3">没有设置任何浮动的容器, 背景为红色</div>
    <div class="z1">设置了浮动的元素, opacity为0.5</div>
    <div class="z4">没有设置任何浮动的容器, 背景为绿色</div>
    <div class="z5">没有设置任何浮动的容器, 背景为粉色</div>
</div>
<div class="z6">和父级元素同级的容器, 没有设置任何浮动, 背景为绿色</div>
<div class="z7">和父级元素同级的容器, 没有设置任何浮动, 背景为绿色</div>
</body>
</html>

Многие люди не знают, каков принцип очистки float псевдоэлементами, и почему добавление этого псевдоэлемента к родительскому элементу может очистить float родительского элемента. Здесь я намеренно использую псевдоэлементыcontentНаписал немного текста и добавил фоновый цвет, немного похожий на гейский. . .


Хорошо, давайте сначала посмотрим на общий рендеринг:

image
Неудивительно, как видно из приведенного выше рисунка, внешние противоречия разрешились. Это только начало, следите за новостями и продолжайте смотреть на скриншоты ниже:


image
Как видно из аннотаций на рисунке, почему псевдоэлемент должен быть установленdisplay:block, перейдите к следующему снимку экрана.


image
Как видно из рисунка выше, почемуheightДля установки на 0. еслиcontentне является пустой строкой, то содержимое будет отображаться на странице. Но на самом деле при очистке поплавкаcontentзаписываются как пустые строки, еслиcontentОн установлен только на''пустой символ, тоheightтакже могут быть опущены, в том числеoverflowМожно и не писать, писатьheightиoverflowВсе для надежности кода. Но есть один очень важныйcontentЭтот атрибут должен быть записан, а не записанcontent, нет никакого способа очистить поплавок.


Приближаются самые важные очки знаний, смотрите два скриншота:

image
я намеренно позволилcontentотображается, вы найдетеОсновной принцип очистки и плавания псевдоэлемента заключается в добавлении контейнера блочного уровня к родительскому элементу и одновременной установке контейнера блочного уровня.clearсвойство, чтобы он мог очистить свой собственный float, чтобы он располагался под плавающим элементом, как обычно в расположении контейнера на уровне блока. В то же время родственные элементы родительского элемента также обычно располагаются за элементом уровня блока, образованным псевдоэлементом, и не будут затронуты плавающим положением.


Следующее, чтобы убитьclearСкриншот после свойств:

image
Обнаружено, что очистка плавания не удалась.На самом деле видно, что добавление псевдоэлемента к родительскому элементу для очистки сути плавания выполняется

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

На данный момент решения внешних конфликтов и их соответствующие принципы были четко сформулированы. Так как же разрешить внутренние конфликты?

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

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>清除float浮动</title>
</head>
<style>
    .z1{
        height: 200px;
        width: 200px;
        box-sizing: border-box;
        float: left;
        text-align: center;
        background: skyblue;
        padding-top: 80px;
        opacity: 0.5;
    }
    .z2 {
        background: yellow
    }
    .z3 {
        background: red;
    }
    .z4 {
        background: green;
        clear:both;
    }
    .z5 {
        background: pink;
    }
    .z6 {
        color: #fff;
        background: black;
    }
    .z7 {
        color: #fff;
        background: blue;
    }
</style>
<body>
<div class="fu">
    <div class="z2">没有设置任何浮动的容器, 背景为黄色</div>
    <div class="z3">没有设置任何浮动的容器, 背景为红色</div>
    <div class="z1">设置了浮动的元素, opacity为0.5</div>
    <div class="z4">没有设置任何浮动的容器, 背景为绿色</div>
    <div class="z5">没有设置任何浮动的容器, 背景为粉色</div>
</div>
<div class="z6">和父级元素同级的容器, 没有设置任何浮动, 背景为绿色</div>
<div class="z7">和父级元素同级的容器, 没有设置任何浮动, 背景为绿色</div>
</body>
</html>

Схема эффекта выглядит следующим образом:

image

установить внутренний элементclear:both;После очистки флота внутренние конфликты и внешние конфликты разрешаются напрямую. Некоторые люди могут подумать, что если за контейнером z4 находится плавающий элемент, я не хочу объяснять это здесь, потому что принцип может быть получен рекурсивно тот же, но давайте проанализируем последний код:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>清除float浮动</title>
</head>
<style>
    .z1{
        height: 200px;
        width: 200px;
        box-sizing: border-box;
        float: left;
        text-align: center;
        background: skyblue;
        padding-top: 80px;
        opacity: 0.5;
    }
    .z2 {
        background: yellow
    }
    .z3 {
        background: red;
    }
    .z4 {
        background: green;
        clear:both;
    }
    .z5 {
        background: pink;
        /* clear:both */
    }
    .z6 {
        color: #fff;
        background: black;
    }
    .z7 {
        color: #fff;
        background: blue;
    }
    .fu {
        overflow: auto;
    }
</style>
<body>
<div class="fu">
    <div class="z2">没有设置任何浮动的容器, 背景为黄色</div>
    <div class="z3">没有设置任何浮动的容器, 背景为红色</div>
    <div class="z1">设置了浮动的元素, opacity为0.5</div>
    <div class="z4">没有设置任何浮动的容器, 背景为绿色</div>
    <div class="z1">设置了浮动的元素, opacity为0.5</div>
    <div class="z5">没有设置任何浮动的容器, 背景为粉色</div>
</div>
<div class="z6">和父级元素同级的容器, 没有设置任何浮动, 背景为绿色</div>
<div class="z7">和父级元素同级的容器, 没有设置任何浮动, 背景为绿色</div>
</body>
</html>

Вот несколько скриншотов эффекта:

Родительский элемент не очищает поплавок, существуют внешние противоречия и внутренние противоречия

image

Родительский элемент использует bfc для очистки поплавка, внешнее противоречие разрешено, а внутреннее противоречие все еще существует.

image

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

image

заclearиleftиright, не говоря уже об этом,apiвещи, нормальныеbothВот и все. Это сочинение почти закончено. Наконец, резюмируя:

Разным предприятиям могут потребоваться разные методы очистки резервов.Независимо от того, какой метод вы выберете, вы не сможете избежать внешних и внутренних конфликтов.Вашему бизнесу необходимо сохранять внутренние конфликты, разрешать только внешние конфликты или разрешать как внешние, так и внутренние конфликты. Они должны быть решены в соответствии с характеристиками бизнеса. Во-вторых, следует ли использовать bfc, clear или псевдоэлемент, и какой метод использовать для запуска, если используется bfc. Это также зависит от особенностей бизнеса.

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