Почему ширина тела не увеличивается до ширины его дочерних элементов

#html #css #scrollbar

#HTML #css #полоса прокрутки

Вопрос:

Я пытаюсь отобразить много данных, для которых требуется горизонтальная прокрутка.

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

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

Как мне сделать так, чтобы тело и / или другие элементы автоматически настраивались? Это происходит в Chrome, firefox, edge и ie11

См. Скрипку и код:

 body {
  border: 1px solid red;
  padding: 1rem;
}

#extra-long {
  background-color: salmon;
  width: 200vw;
}

#other-element {
  background-color: cornflowerblue;
}  
 <div id="extra-long">This extends beyond the view port</div>
<div id="other-element">This should automatically extend beyond the viewport, but it doesn't</div>  

Ответ №1:

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

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


Вы можете получить желаемое поведение, используя inline-block — см. Демонстрацию ниже:

 body {
  border: 1px solid red;
  padding: 1rem;
  display: inline-block; /* added */
}

#extra-long {
  background-color: salmon;
  width: 200vw;
}

#other-element {
  background-color: cornflowerblue;
}  
 <div id="extra-long">This extends beyond the view port</div>
<div id="other-element">This should automatically extend beyond the viewport, but it doesn't</div>  


Вы можете получить тот же эффект, используя контейнер column inline-flex — см. Демонстрацию ниже:

 body {
  border: 1px solid red;
  padding: 1rem;
  display: inline-flex; /* added */
  flex-direction: column; /* added */
}

#extra-long {
  background-color: salmon;
  width: 200vw;
}

#other-element {
  background-color: cornflowerblue;
}  
 <div id="extra-long">This extends beyond the view port</div>
<div id="other-element">This should automatically extend beyond the viewport, but it doesn't</div>  


И вы также можете использовать width: min-content , но обратите внимание, что это приводит к неожиданному уменьшению поля в конце — см. Демонстрацию body ниже:

 body {
  border: 1px solid red;
  padding: 1rem;
  width: min-content; /* added */
}

#extra-long {
  background-color: salmon;
  width: 200vw;
}

#other-element {
  background-color: cornflowerblue;
}  
 <div id="extra-long">This extends beyond the view port</div>
<div id="other-element">This should automatically extend beyond the viewport, but it doesn't</div>  

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

1. Извините за позднюю обратную связь, которая была отслежена другими проектами. Это здорово! Спасибо

Ответ №2:

Возможно, это поведение body элемента по умолчанию. Вы можете добавить это правило.

 body {
    min-width: min-content;
}
  

body автоматически подстраивается под содержимое других элементов

Ответ №3:

вы можете управлять этим, добавив небольшой css в свой «#extra-long» следующим образом:

 <style>
#extra-long{
white-space: nowrap;
}
</style>
  

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

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

1. Проблема не в переносе текста, а в ширине контейнера. Он автоматически остановится на краю тела, позволяя дочерним элементам переполняться

Ответ №4:

Вы не указали ширину для 2-го div, только цвет фона:

     #other-element {
  background-color: cornflowerblue;
  width: 200vw;
}
  

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

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