Ответ 1
Используйте абсолютное позиционирование
.child-div {
position:absolute;
left:0;
right:0;
}
Есть ли способ иметь дочерний DIV в родительском контейнере DIV, который шире родительского. Детский DIV должен иметь одинаковую ширину окна просмотра браузера.
См. пример ниже:
Ребенок DIV должен оставаться как дочерний элемент родительского div. Я знаю, что могу установить произвольные отрицательные поля на дочернем div, чтобы сделать его более широким, но я не могу понять, как существенно сделать его 100% ширину браузера.
Я знаю, что могу это сделать:
.child-div{
margin-left: -100px;
margin-right: -100px;
}
Но мне нужно, чтобы у ребенка была такая же ширина, что и динамический браузер.
Спасибо за ваши ответы, кажется, самый близкий ответ до сих пор заключается в том, чтобы сделать дочернюю позицию DIV: абсолютной и установить левое и правое свойства на 0.
Следующая проблема заключается в том, что у родителя есть позиция: relative, что означает, что левые и правые свойства по-прежнему относятся к родительскому div, а не к браузеру, см. пример здесь: jsfiddle.net/v2Tja/2
Я не могу удалить позицию относительно родителя, не вкручивая все остальное.
Используйте абсолютное позиционирование
.child-div {
position:absolute;
left:0;
right:0;
}
.child {
width: 100vw;
position: relative;
left: calc(-50vw + 50%);
}
Мы устанавливаем width
дочернего элемента, чтобы заполнить всю ширину области просмотра, затем мы заставляем его соответствовать краю экрана, перемещая его к left
на расстояние, равное половине области просмотра, минус 50% от ширина родительского элемента.
Демонстрация:
* {
box-sizing: border-box;
}
body {
margin: 0;
overflow-x: hidden;
}
.parent {
max-width: 400px;
margin: 0 auto;
padding: 1rem;
position: relative;
background-color: darkgrey;
}
.child {
width: 100vw;
position: relative;
left: calc(-50vw + 50%);
height: 100px;
border: 3px solid red;
background-color: lightgrey;
}
<div class="parent">
Pre
<div class="child">Child</div>
Post
</div>
Я долго искал решение этой проблемы. В идеале мы хотим, чтобы ребенок был больше, чем родитель, но не зная заранее ограничений родителя.
И я наконец нашел блестящий общий ответ здесь. Копирование это дословно:
Идея здесь такова: переместите контейнер точно в середину окна браузера с левой стороны: 50%; затем потяните его обратно к левому краю с отрицательным полем -50vw.
.child-div {
width: 100vw;
position: relative;
left: 50%;
right: 50%;
margin-left: -50vw;
margin-right: -50vw;
}
Основываясь на исходном предложении предложения (задании отрицательных полей), я попытался и предложил аналогичный метод, используя процентные единицы для динамической ширины браузера:
HTML
<div class="grandparent">
<div class="parent">
<div class="child">
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Dolore neque repellat ipsum natus magni soluta explicabo architecto, molestias laboriosam rerum. Tempore eos labore temporibus alias necessitatibus illum enim, est harum perspiciatis, sit, totam earum corrupti placeat architecto aut minus dignissimos mollitia asperiores sint ea. Libero hic laudantium, ipsam nostrum earum distinctio. Cum expedita, ratione, accusamus dicta similique distinctio est dolore assumenda soluta dolorem quisquam ex possimus aliquid provident quo? Enim tempora quo cupiditate eveniet aperiam.</p>
</div>
</div>
</div>
CSS
.child-div{
margin: 0 -100%;
padding: 0 -100%;
}
.parent {
width: 60%;
background-color: red;
margin: 0 auto;
padding: 50px;
position:relative;
}
.grandparent {
overflow-x:hidden;
background-color: blue;
width: 100%;
position:relative;
}
Отрицательные поля позволят контенту выходить из родительского DIV. Поэтому я установил padding: 0 100%;
для вывода содержимого обратно в исходные границы Chlid DIV.
Отрицательные поля также увеличивают общую ширину .child-div из окна просмотра браузера, что приводит к горизонтальной прокрутке. Следовательно, нам нужно закрепить ширину выдавливания, применив overflow-x: hidden
к бабушке дедушки DIV (которая является родителем родительского Div):
Вот JSfiddle
Я попробовал Нильса Касперсона left: calc(-50vw + 50%)
; он отлично работал в Chrome и FF (пока не уверен в IE), пока я не узнал, что браузеры Safari не работают должным образом. Надеюсь, они исправили это вскоре, поскольку мне действительно нравится этот простой метод.
Это также может решить вашу проблему, если элемент родительского DIV должен быть position:relative
Два недостатка этого метода обхода:
Пожалуйста, дайте мне знать, есть ли какие-либо проблемы, которые вы найдете с помощью этого метода;). Надеюсь, что это поможет.
Я использовал это:
HTML
<div class="container">
<div class="parent">
<div class="child">
<div class="inner-container"></div>
</div>
</div>
</div>
CSS
.container {
overflow-x: hidden;
}
.child {
position: relative;
width: 200%;
left: -50%;
}
.inner-container{
max-width: 1179px;
margin:0 auto;
}
Flexbox можно использовать, чтобы сделать ребенка шире, чем его родитель, с помощью трех строк CSS.
Необходимо установить только потомки display
, margin-left
и width
. margin-left
зависит от ребенка width
. Формула:
margin-left: calc(-.5 * var(--child-width) + 50%);
Переменные CSS можно использовать, чтобы избежать вычисления левого поля вручную.
Демонстрация № 1: Ручной расчет
.parent {
background-color: aqua;
height: 50vh;
margin-left: auto;
margin-right: auto;
width: 50vw;
}
.child {
background-color: pink;
display: flex;
}
.wide {
margin-left: calc(-37.5vw + 50%);
width: 75vw;
}
.full {
margin-left: calc(-50vw + 50%);
width: 100vw;
}
<div class="parent">
<div>
parent
</div>
<div class="child wide">
75vw
</div>
<div class="child full">
100vw
</div>
</div>
вы можете попробовать положение: абсолютное. и дать ширину и высоту, сверху: 'ось y сверху' и слева: 'ось x'
У меня была аналогичная проблема. Содержимое дочернего элемента должно было оставаться в родительском элементе, в то время как фон должен был расширить ширину окна просмотра.
Я решил эту проблему, создав дочерний элемент position: relative
и добавив к нему псевдоэлемент (:before
) с помощью position: absolute; top: 0; bottom: 0; width: 4000px; left: -1000px;
.
Псевдоэлемент остается за фактическим дочерним элементом как псевдоэлемент. Это работает во всех браузерах (даже IE8 + и Safari 6+ - не имеют возможности тестировать более старые версии).
Маленький пример скрипта: http://jsfiddle.net/vccv39j9/
Добавляя к решению Нильса Касперсона, я также разрешаю ширину вертикальной полосы прокрутки. Я использую 16px
в качестве примера, который вычитается из ширины порта просмотра. Это позволит избежать появления полосы горизонтальной полосы прокрутки.
width: calc(100vw - 16px);
left: calc(-1 * (((100vw - 16px) - 100%) / 2));
Предполагая, что родитель имеет фиксированную ширину, например #page { width: 1000px; }
#page { width: 1000px; }
и центрируется #page { margin: auto; }
#page { margin: auto; }
, вы хотите, чтобы дочерний элемент соответствовал ширине области просмотра браузера, которую вы могли бы просто сделать:
#page {
margin: auto;
width: 1000px;
}
.fullwidth {
margin-left: calc(500px - 50vw); /* 500px is half of the parent 1000px */
width: 100vw;
}
Чтобы разделить дочерний элемент по ширине с содержимым, попробуйте следующее:
.child{
position:absolute;
left:0;
overflow:visible;
white-space:nowrap;
}
.parent {
margin:0 auto;
width:700px;
border:2px solid red;
}
.child {
position:absolute;
width:100%;
border:2px solid blue;
left:0;
top:200px;
}
Я знаю, что это старо, но для тех, кто пришел к этому для ответа, вы сделали бы это так:
Переполнение скрывается над элементом, содержащим родительский элемент, например тело.
Дайте вашему дочернему элементу ширину, значительно более широкую, чем ваша страница, и установите ее абсолютным слева на -100%.
Вот пример:
body {
overflow:hidden;
}
.parent{
width: 960px;
background-color: red;
margin: 0 auto;
position: relative;
}
.child {
height: 200px;
position: absolute;
left: -100%;
width:9999999px;
}
Также есть скрипт JS: http://jsfiddle.net/v2Tja/288/
Другие ответы полезны для конкретного случая, когда у вас есть отдаленный предковый div, чтобы расположить левый и правый края div, которые хотите центрировать (например, тело страницы).
Однако часто вы хотите позиционировать элемент X, который является более крупным, чем его родительский центр в этом родителе. Затем вы можете сделать родитель относительно позиционированным и просто установите Xs left
и right
на подходящее отрицательное число:
<div id="container-div">
<div id="normal-element>Something</div>
<div id="wide-element>Some text</div>
</div>
Тогда:
#container-div {
position: relative;
}
#normal-element {
margin: 0 auto;
}
#wide-element {
position: absolute;
left: -100px;
right: -100px;
text-align: center;
}
Результат:
Тогда решение будет следующим.
HTML
<div class="parent">
<div class="child"></div>
</div>
CSS
.parent{
width: 960px;
margin: auto;
height: 100vh
}
.child{
position: absolute;
width: 100vw
}