Есть ли способ сделать ширину дочернего DIV шире родительского DIV с помощью CSS?

#css #html

#css #HTML

Вопрос:

Есть ли способ создать дочерний DIV-файл внутри родительского контейнера DIV, который шире, чем его родительский. Дочерний DIV-файл должен быть такой же ширины, как окно просмотра браузера.

Смотрите пример ниже: введите описание изображения здесь

Дочерний DIV должен оставаться дочерним по отношению к родительскому div. Я знаю, что могу установить произвольные отрицательные поля для дочернего div, чтобы сделать его шире, но я не могу понять, как по существу сделать его шириной 100% браузера.

Я знаю, что могу это сделать:

 .child-div{
    margin-left: -100px;
    margin-right: -100px;
}
  

Но мне нужно, чтобы дочерний файл был такой же ширины, как динамический браузер.

Обновить

Спасибо за ваши ответы, кажется, что самый близкий ответ на данный момент — создать дочерний DIV position: absolute и установить для свойств left и right значение 0.

Следующая проблема, с которой я сталкиваюсь, заключается в том, что родительский DIV имеет position: relative , что означает, что свойства left и right по-прежнему относятся к родительскому div, а не к браузеру, смотрите Пример здесь: jsfiddle.net/v2Tja/2

Я не могу удалить position: relative из родительского, не испортив все остальное.

Комментарии:

1. Ваши требования на самом деле не имеют смысла. «Дочерний div» должен оставаться дочерним по отношению к родительскому div, и все же родительский div имеет position: relative ? Для чего вам нужно position: relative ? Думаю, я спрашиваю: что вы пытаетесь сделать?

2. @Camsoft Вы видели мой комментарий к моему ответу? У меня это работает, также проверьте мой веб-сайт edocuments.co.uk который делает то, что вы пытаетесь сделать, другим способом

3. @Camsoft кроме того, в вашем решении действительно не должно быть необходимости в каком-либо jquery / js

Ответ №1:

Вот общее решение, которое сохраняет дочерний элемент в потоке документов:

 .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>  

Поддержка браузером vw и calc(), как правило, может рассматриваться как IE9 и новее.

Примечание: Предполагается, что для модели box установлено значение border-box . Без этого border-box вам также пришлось бы вычитать отступы и границы, что привело бы к путанице в этом решении.

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

Комментарии:

1. Как вы знаете, это действительно работает в IE9. 1 Nice

2. Это было именно то, что я искал, большое спасибо, mutch. IMO это лучший ответ, чем принятый, поскольку он не нарушает поток документов

3. vw не подходит. Если у вас вертикальная полоса прокрутки, то 100vw даст вам горизонтальную полосу прокрутки.

4. Кажется, что это работает только на один уровень ниже. Есть ли способ, чтобы это работало независимо от того, сколько родительских элементов имеет дочерний элемент?

5. Это правильный ответ для переноса более широкого дочернего элемента в position: relative родительский!

Ответ №2:

Используйте абсолютное позиционирование

 .child-div {
    position:absolute;
    left:0;
    right:0;
}
  

Комментарии:

1. Хорошо, следующий вопрос, что, если родительский или другой предок имеет макет, то есть position: relative, см.: jsfiddle.net/v2Tja/2

2. как насчет того, чтобы другой родительский div был position: static, а другой div внутри с position: relative? jsfiddle.net/blowsie/v2Tja/3

3. есть ли способ сделать это с автоматической настройкой высоты дочернего div и сохранением правильного размещения ниже?

4. и не устанавливайте для родительского div значение «overflow: hidden» ^^

5. Лучший ответ. Проблем с полосой прокрутки нет. Высокая кроссбраузерность. Спасибо!!!

Ответ №3:

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

И я, наконец, нашел блестящий общий ответ здесь. Копируем его дословно:

Идея здесь такова: переместите контейнер точно в середину окна браузера с левым: 50%;, затем отодвиньте его обратно к левому краю с отрицательным запасом в 50 вт.

 .child-div {
  width: 100vw;
  position: relative;
  left: 50%;
  right: 50%;
  margin-left: -50vw;
  margin-right: -50vw;
}
  

Комментарии:

1. Я обнаружил, что если я хочу, чтобы она составляла, скажем, 90% от ширины окна просмотра, я могу использовать вышеуказанное, но установить ширину в 90vw . Кроме того, похоже, что margin-right в любом случае это не имеет никакого эффекта.

2. пришлось изменить значения margin-left и right, потому что моя оболочка составляет 80% ширины окна просмотра. Итак, в моем случае это должно было быть margin-left:-10vw и margin-right:-10vw, и тогда это отлично сработало! Спасибо!

3. Это был блестящий ответ! Спасибо.

4. Это действительно умный ответ и он хорошо работает!

Ответ №4:

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

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.

Отрицательные поля также увеличат общую ширину дочернего div-файла за пределы окна просмотра браузера, что приведет к горизонтальной прокрутке. Следовательно, нам нужно обрезать ширину выдавливания, применив overflow-x: hidden к дедушкиному DIV (который является родительским для родительского Div):

Вот JSfiddle

Я пробовал Nils Kaspersson left: calc(-50vw 50%) ; он отлично работал в Chrome amp; FF (пока не уверен насчет IE), пока я не узнал, что браузеры Safari не выполняют это должным образом. Надеюсь, они скоро это исправят, поскольку мне действительно нравится этот простой метод.

Это также может решить вашу проблему, когда родительский элемент DIV должен быть position:relative

Двумя недостатками этого метода обхода являются:

  • Требуется дополнительная разметка (т. е. элемент grandparent (точно так же, как старый добрый метод выравнивания таблицы по вертикали, не так ли …)
  • Левая и правая границы дочернего DIV-файла никогда не будут отображаться, просто потому, что они находятся за пределами области просмотра браузера.

Пожалуйста, дайте мне знать, если вы обнаружите какие-либо проблемы с этим методом ;). Надеюсь, это поможет.

Ответ №5:

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>  

Демонстрация # 2: использование переменных CSS

 .parent {
  background-color: aqua;
  height: 50vh;
  margin-left: auto;
  margin-right: auto;
  width: 50vw;
}

.child {
  background-color: pink;
  display: flex;
  margin-left: calc(-.5 * var(--child-width)   50%);
  width: var(--child-width);
}

.wide {
  --child-width: 75vw;
}

.full {
  --child-width: 100vw;
}  
 <div class="parent">
  <div>
    parent
  </div>
  <div class="child wide">
    75vw
  </div>
  <div class="child full">
    100vw
  </div>
</div>  

Ответ №6:

Я использовал это:

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;
}
  

Ответ №7:

Я попробовал некоторые из ваших решений. Этот :

 margin: 0px -100%;
padding: 0 100%;
  

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

https://codepen.io/yuyazz/pen/BaoqBBq

Ответ №8:

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

Я решил эту проблему, создав дочерний элемент position: relative и добавив к нему псевдоэлемент ( :before ) с помощью position: absolute; top: 0; bottom: 0; width: 4000px; left: -1000px; . Псевдоэлемент остается за фактическим дочерним элементом в качестве псевдофонового элемента. Это работает во всех браузерах (даже в IE8 и Safari 6 — у них нет возможности протестировать более старые версии).

Небольшой пример скрипки: http://jsfiddle.net/vccv39j9 /

Комментарии:

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

2. Конечно, вы должны установить для тела или div для переноса страницы значение overflow-x: hidden .

Ответ №9:

Чтобы сделать дочерний div таким же широким, как и содержимое, попробуйте следующее:

 .child{
    position:absolute;
    left:0;
    overflow:visible;
    white-space:nowrap;
}
  

Ответ №10:

вы можете попробовать position: absolute. и укажите ширину и высоту, сверху: ‘ось y сверху’ и слева: ‘ось x’

Ответ №11:

Я знаю, что это устарело, но для тех, кто обращается к этому за ответом, вы бы сделали это следующим образом:

Переполнение скрыто в элементе, содержащем родительский элемент, таком как body.

Придайте вашему дочернему элементу ширину, намного превышающую ширину вашей страницы, и расположите его абсолютно слева на -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 /

Ответ №12:

Добавляя к решению Нильса Касперссона, я также изменяю ширину вертикальной полосы прокрутки. Я использую 16px в качестве примера, который вычитается из ширины порта просмотра. Это позволит избежать появления горизонтальной полосы прокрутки.

 width: calc(100vw - 16px);
left: calc(-1 * (((100vw - 16px) - 100%) / 2));
  

Комментарии:

1. Я полагаю, что 16px которое вам нужно вычесть, потому что оно вызывает горизонтальную полосу прокрутки, является полем / отступом браузера по умолчанию, вместо того, чтобы вычитать его, просто используйте это, html, body{ margin:0; padding:0 } таким образом, вам не нужно будет выполнять дополнительные вычисления для 16px

2. Это когда содержимое страницы длиннее и проходит ниже сгиба, а полоса прокрутки появляется автоматически. Конечно, когда содержимое находится внутри fold, это не требуется. Я добавляю 16 пикселей в формулу только тогда, когда знаю, что содержимое страницы будет длинным и полоса прокрутки действительно появится.

3. я думаю, что это не будет работать на мобильных устройствах. в мобильном устройстве нет полосы прокрутки.

Ответ №13:

Предполагая, что родительский элемент имеет фиксированную ширину, например, #page { width: 1000px; } и расположен по центру #page { margin: auto; } , вы хотите, чтобы дочерний элемент соответствовал ширине окна просмотра браузера, которое вы могли бы просто сделать:

 #page {
    margin: auto;
    width: 1000px;
}

.fullwidth {
    margin-left: calc(500px - 50vw); /* 500px is half of the parent's 1000px */
    width: 100vw;
}
  

Ответ №14:

 .parent {
    margin:0 auto;
    width:700px;
    border:2px solid red;
}
.child {
    position:absolute;
    width:100%;
    border:2px solid blue;
    left:0;
    top:200px;
}
  

Комментарии:

1. Умный, но, похоже, не работает (по крайней мере, с промежутками, встроенными в li).

Ответ №15:

Тогда решение будет следующим.

HTML

 <div class="parent">
    <div class="child"></div>
</div>
  

CSS

 .parent{
        width: 960px;
        margin: auto;
        height: 100vh
    }
    .child{
        position: absolute;
        width: 100vw
    }
  

Комментарии:

1. Хотя этот код может дать ответ на вопрос, предоставление дополнительного контекста относительно того, как и / или почему он решает проблему, улучшило бы долгосрочную ценность ответа.