Привет всем! <br/> У меня есть вопрос, который может показаться не совсем умным, но я действительно не могу понять, почему div-элементы ведут себя именно так. <br/> Я привожу следующий код: <br/> <pre><code class="html"><div class="form">
<div class="MAIN_CONTENTS">
<div class="main_content">
</div>
<div class="left_bar">
<div class="lb_f_action">
<button class="lb_button">кнопка</button>
</div>
<div class="lb_add_banner">
<h1 class="lb_add_text">текст</h1>
</div>
</div>
</div>
<div class="table_new_user"></div>
</div></code></pre> <br/> <br/> Проблема в том, что блок <b>table_new_user</b> оказывается внутри блока <b>MAIN_CONTENTS</b>, хотя, на мой взгляд, этого не должно происходить. Можете помочь разобраться с этой ситуацией? <br/> <br/> Также прикладываю CSS для всех упомянутых блоков: <br/> <pre><code class="css">.form {
height: 2000px;
width: 1150px;
margin: auto;
top: 0;
margin-top: 20px;
}
.MAIN_CONTENTS {
height: auto;
width: 100%;
display: block;
background-color: pink;
}
.main_content {
height: 500px;
width: calc(80% - 10px);
float: left;
background-color: blue;
padding: 10px;
}
.left_bar {
height: 500px;
width: calc(20% - 10px);
float: right;
border-radius: 5px;
margin-top: 15px;
}
.table_new_users {
height: 500px;
width: 100%;
background-color: red;
margin-top: 20px;
}</code></pre>
Ваша проблема связана с использованием `float` в CSS. Когда вы используете `float`, элементы, которые «плавают», выходят из нормального потока документа, что может приводить к тому, что родительские элементы не воспринимают их как свои дочерние элементы. В вашем случае, это объясняет, почему блок `.table_new_users` оказывается внутри блока `.MAIN_CONTENTS`, а не после него.
Вот несколько способов, как можно решить эту проблему:
### 1. Использование clearfix
Одним из самых распространенных решений для этой проблемы является использование clearfix для родительского элемента, чтобы он учитывал размеры своих «плавающих» дочерних элементов. Например, добавьте это CSS-правило к вашему классу `.MAIN_CONTENTS`:
```css
.MAIN_CONTENTS::after {
content: "";
clear: both;
display: table;
}
```
### 2. Использование Flexbox
Другой хороший подход — заменить `float` на `flexbox`. Это более современный способ организации макета и устранит проблемы с обтеканием. Измените CSS для `.MAIN_CONTENTS`:
```css
.MAIN_CONTENTS {
display: flex;
background-color: pink;
}
.main_content {
width: 80%;
padding: 10px;
background-color: blue;
}
.left_bar {
width: 20%;
border-radius: 5px;
margin-top: 15px;
}
```
### 3. Использование `overflow`
Вы также можете установить `overflow: hidden` или `overflow: auto` на `.MAIN_CONTENTS`. Это заставит родительский элемент обрабатывать размеры дочерних элементов, которые плавают:
```css
.MAIN_CONTENTS {
overflow: hidden; /* или overflow: auto; */
background-color: pink;
}
```
### Применение выбора
Наиболее предпочтительный способ — это использование Flexbox, так как он более эластичный и позволяет проще управлять макетом. Однако использование clearfix или `overflow` также решает вашу проблему.
Попробуйте один из этих подходов, и ваша разметка должна заработать так, как вы ожидаете!