Имеется страница, состоящая из двух основных блоков (.header и .main). У блока .header установлен position fixed
Проблема состоит в том, что блок .main впадает в блок .header. Т.е. заезжает под блок .header.
body {margin: 5px;}
.header {
position: fixed;
left: 5px;
right: 5px;
top: 5px;
height: 48px;
background-color: white;
box-shadow: inset 2px 2px 0px red, inset -2px 2px 0px red, inset 2px -2px 0px red, inset -2px -2px 0px red;
}
.main {
height: 120px;
background-color: white;
box-shadow: inset 2px 2px 0px blue, inset -2px 2px 0px blue, inset 2px -2px 0px blue, inset -2px -2px 0px blue;
}
<div class="header">
</div>
<div class="main">
</div>
Эту задачу можно решить, добавив ещё один блок такой же высоты, как и .header. Но это не подойдёт, так как в течении всего времени .header может изменять свою высоту (с помощью скрипта, изменением ширины и т. д.). При этом .main так же должен оставаться под .header, а он снова впадёт.
$(function() {
var $header = $('.header');
setInterval(function() {
$header.animate({height: 96 + 'px'}, 400);
setTimeout(function() {
$header.animate({height: 48 + 'px'}, 400);
}, 800);
setTimeout(function() {
$header.css({height: 'auto'}).animate({right: 80 + '%'}, 400);
setTimeout(function() {
$header.animate({right: 5 + 'px'}, {
duration: 400,
complete: function() {
$header.css({height: 48 + 'px'})
}
});
}, 800);
}, 2600);
}, 5200);
});
body {margin: 5px;}
.header {
position: fixed;
left: 5px;
right: 5px;
top: 5px;
height: 48px;
background-color: white;
box-shadow: inset 2px 2px 0px red, inset -2px 2px 0px red, inset 2px -2px 0px red, inset -2px -2px 0px red;
}
.main {
height: 120px;
background-color: white;
box-shadow: inset 2px 2px 0px blue, inset -2px 2px 0px blue, inset 2px -2px 0px blue, inset -2px -2px 0px blue;
}
.displacer {
height: 48px;
background-color: white;
box-shadow: inset 2px 2px 0px green, inset -2px 2px 0px green, inset 2px -2px 0px green, inset -2px -2px 0px green;
visibility: hidden;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="displacer">
</div>
<div class="header">
<div style="width: 100px; height: 48px;"></div>
<div style="width: 100px; height: 48px;"></div>
</div>
<div class="main">
</div>
В общем, вот:
Как решить данный вопрос?
Создайте точно такой же элемент только добавьте ему position: static; и visibility: hidden; (что позволит занимать нужное место, но не отображать элемент).
.a,
.b {
width: 100%;
height: 20px;
}
.a {
background: red;
position: absolute;
}
.b {
background: blue;
}
.a-clone {
position: static;
}
<div class="a"></div>
<div class="a a-clone"></div>
<div class="b">Я не должен быть под красным блоком :с</div>
Те же вещи можно делать и с помощью Javascript и также задавать этому "клону" нужные margin при необходимости (для соответствующих значений top и left абсолютно позиционированного элемента).
Если содержимое блока будет динамически меняться, то можно с помощью Javascript добавить обработчик изменения размеров самого блока, где присваивать новые значения размеров блока "клону" блока со статическим поционированием.
Есть вариант, если используете препроцессор LESS. Там есть возможность создавать переменную и совершать с ней математические операции, а возможность постоянно находиться под блоком с атрибутом absolute позволит padding-top. Смотрите ссылку на www.codepen.io - https://codepen.io/alexseveneight/pen/BZrRLw
Как бы ни изменилась высота блока .a, блок .b всегда будет ниже.
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости