Увеличить ширину при переполнении для настройки полосы прокрутки - программирование
Подтвердить что ты не робот

Увеличить ширину при переполнении для настройки полосы прокрутки

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

Вот сценарий, у меня есть div и дочерние элементы

<div id="ListHolder"> 
     <ul id="LeftList">
        <li></li>
        <li></li>
        <li></li>
     </ul>

     <ul id="RightList">
        <li></li>
        <li></li>
        <li></li>
     </ul>
</div>

example picture

Я хочу настроить свою ширину div автоматически для полос прокрутки, когда она имеет переполнение. Значит, когда нет полосы прокрутки, она должна быть похожа на изображение с левой стороны, и когда полосы прокрутки становятся видимыми, она должна автоматически регулировать ширину полосы прокрутки. Я не хочу использовать javascript, но с чистым CSS и HTML. И я считаю, что это возможно только с CSS и HTML.

Учитывая вышеперечисленные списки UL, мой CSS-код похож на

 #ListHolder
 {
     display:inline-block;
 }
 #ListHolder > ul
 {
     width:250px;     //<---Necessary to keep fixed width not percentage
     display:inline-block;
 }
 #ListHolder > ul > li
 {
     display:inline-block;
 }
 #LeftList
 {
     float:left;
 }
 #RightList
 {
     float:right;
 }
4b9b3361

Ответ 1

Как отмечали другие люди, нет способа адаптировать ширину div на основе условия полосы прокрутки только с помощью CSS.

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

CSS не может установить условную ширину в контейнер на основе наличия полосы прокрутки, например:

  • Если у меня есть полоса прокрутки, дайте мне эту ширину
  • Если у меня нет полосы прокрутки, дайте мне эту другую ширину

Итак, для достижения такого точного поведения вы не можете использовать CSS.

Я написал этот простой JS (без библиотеки, поэтому он легкий) код, который дает вам поведение, которое вы ищете:

var div= document.getElementById('ListHolder');
var hasVerticalScrollbar= div.scrollHeight>div.clientHeight;

if (hasVerticalScrollbar > 0) {
    div.style.width = '530px' ;
}

Теперь это работает только при загрузке страницы. Если вы также хотите, чтобы это поведение изменилось, вы можете добавить:

window.addEventListener( 'resize', function( event ) {
    var hasVerticalScrollbar= div.scrollHeight>div.clientHeight;
    if (hasVerticalScrollbar > 0) {
        div.style.width = '530px' ;
    }
    else{
        div.style.width = '500px' ;        
    }
}, false );

ДЕМО ЗДЕСЬ

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

Ответ 2

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

Предположим, вы пытаетесь создать div-wrap-wrap, содержащий два столбца шириной 250 пикселей. Браузер рассчитает свою ширину как 500px, затем высоту, и если требуется полоса прокрутки, она соответствует полосе прокрутки внутри этих 500px, уменьшая доступную ширину до 483 пикселей (или около того).

Сложное решение выглядит следующим образом:

  • Добавьте достаточное количество правильного заполнения в поле, которое (может) отображать полосу прокрутки.
  • Задайте свойство width в этом поле или сделайте эту коробку оберткой вокруг своего содержимого.
  • Задайте max-height для желаемого значения и overflow-y для свойства auto для запуска автоматической полосы прокрутки

В этот момент окно будет как можно шире, а полоса прокрутки, если она видна, нарисована над правильным дополнением; не мешая ширине.

Чтобы отобразить хром (границу и дополнение), вам нужно создать дополнительные div.

Разметка HTML:

<div id="ListBorder">
    <div id="ListOverflow">
        <div id="ListHolder">
            <ul id="LeftList">
                <li></li><li></li><li></li>
            </ul>
            <ul id="RightList">
                <li></li><li></li><li></li>
            </ul>
        </div>
    </div>
</div>

CSS (только важные бит)

#ListHolder ul {
    float: left;
    width: 250px;
}
#ListHolder {
    width: 500px;
    overflow: hidden;
}
#ListOverflow {
    width: 500px;
    overflow: auto;
    max-height: 350px;
    padding-right: 20px;
}
#ListBorder {
    width: 500px;
    border: 1px solid;
    padding: 20px;
}

Примечание:

  • #ListHolder используется для clear-fix
  • #ListBorder можно использовать для добавления границы и заполнения для соответствия желаемому результату.

Ответ 3

Вы не сможете увеличить div контейнера, когда он переполняется чистым CSS.

Однако, если вы хотите сохранить свой фактический макет (модель flexbox была бы лучше подходит здесь, как предлагалось @AlecMoore), здесь обходной способ только для webkit: используйте overlay значение для overflow. Он будет отображаться над вашим контентом, чтобы он не скользил вниз.

div{
    width: ...px;        /* Fixed width */
    overflow-y: overlay; /* Overlaying scrollbar for y axis */
}

Здесь демонстрация.

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

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

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

Ответ 4

Это то, что вы ищете?

http://jsfiddle.net/Z2WuJ/2/

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

#ListHolder ul {
    margin: 0;
    padding: 10px;
    list-style: none;
    float: left;
    max-width: 50%;
    -moz-box-sizing: border-box; 
    -webkit-box-sizing: border-box; 
    box-sizing: border-box;
}

Ответ 5

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

padding-right: 2em;

Ответ 6

Похоже, что вы хотите, это overflow:auto;, который покажет полосу прокрутки, когда нужно прокручивать содержимое. В противном случае он скроет полосу прокрутки.

Итак, ваш div может выглядеть так:

<div class="scroll"> 
    <ul>
       <li></li>
       <li></li>
       <li></li>
    </ul>

    <ul>
       <li></li>
       <li></li>
       <li></li>
    </ul>
</div>

и ваш css:

.scroll {
    overflow-y:auto; /* Only scroll the y axis */
}

Ответ 7

Я думаю, вы должны сделать ширину div, учитывая ширину полосы прокрутки. Добавьте несколько пикселей (30 пикселей), возможно, в ширину div. Затем установите ширину RighList и LeftList примерно на 49%.

overflow-y: auto вызывает перемещение вашего списка, потому что вы не учитываете ширину полосы прокрутки.

Надеюсь, это поможет!

Ответ 8

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

Вы можете добиться этого, используя этот код:

html {
    overflow: -moz-scrollbars-vertical; /* For FF */
    -ms-overflow-y: scroll; /* For IE */
    overflow-y: scroll; /* For others & old IE */
}

И здесь работает FIDDLE

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

Обратите внимание: что overflow:overlay; устарел.

Здесь вы идете:

html {
    overflow-y: overlay;
}
#ListHolder {
    display:inline-block;
    width:600px;              /* Fixed width */
}

И вот еще один FIDDLE

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

Надеюсь, что это поможет.

Ответ 9

Даже если вы можете настроить ширину DIVs на наличие полосы прокрутки, я бы не рекомендовал ее. Учтите, что пользователь мог настроить размер (ширину) своих полос прокрутки в своей ОС (Windows приходит на ум).

Далее следует, что некоторые браузеры сообщают о ширине окна просмотра с полосой прокрутки, а другие сообщают об этом без. В частности, Chrome и Safari исключают размеры полосы прокрутки, в то время как Firefox, Opera и IE включают размеры прокрутки.

В заключение я согласен с другими ответами, которые вы должны использовать overflow: scroll. Либо это, либо использовать javascript для использования пользовательской полосы прокрутки (что, я думаю, слишком велико).

Материал для чтения:

Ответ 10

DEMO

Просто проверьте демонстрацию и проверьте элемент и удалите высоту из div "#ListHolder". Вы увидите, что ширина будет соответствовать изменению присутствия полосы прокрутки.

Если это то, что вы ищете, дайте мне знать, и я объясню логику этого.

HTML:

<div class="overall-width">
    <div id="ListHolder">
        <ul id="LeftList">
            <li>
                <img src="http://placehold.it/200x200" />
            </li>
            <li>
                <img src="http://placehold.it/200x200" />
            </li>
            <li>
                <img src="http://placehold.it/200x200" />
            </li>
        </ul>
        <ul id="RightList">
            <li>
                <img src="http://placehold.it/200x200" />
            </li>
            <li>
                <img src="http://placehold.it/200x200" />
            </li>
            <li>
            <img src="http://placehold.it/200x200" />
            </li>
        </ul>
    </div>
</div>

CSS

html {
    overflow: -moz-scrollbars-vertical;
    /* For FF */
    -ms-overflow-y: scroll;
    /* For IE */
    overflow-y: scroll;
    /* For others & old IE */
}
#ListHolder {
    display:inline-block;
    height: 610px;
    overflow: auto;
    width: 100%;
    padding: 10px;
}
#ListHolder > ul {
    -moz-box-sizing: border-box;
    -webki-box-sizing: border-box;
    box-sizing: border-box;
    border: 1px solid #CFCFCF;
    border-radius: 3px;
    display: inline-block;
    margin: 0;
    padding: 20px;
    text-align: center;
    width: 250px;
}
#ListHolder > ul > li {
    display:inline-block;
}
#LeftList {
    float:left;
}
#RightList {
    float:right;
}
body{
    height: 100%;
    margin: 0px;
}
.overall-width{
    width: 600px;
}

Ответ 11

Решение на самом деле довольно просто.

Вам нужен элемент оболочки с display: inline-block. Затем установите ширину дочернего элемента.

var count = 20;
var interval = setInterval(function(){
  document.getElementById('inner').innerHTML += '<p>another line</p>';
    if( --count === 0 )
    clearInterval(interval);
}, 250);
/* important stuff */

#outer {
  display: inline-block;
  height: 150px;
  overflow-y: auto;
}

#inner {
  width: 300px;
}


/* styling */

p {
  margin: 0;
  padding: 20px;
  background: white;
}

#outer {
  padding: 20px;
  outline: 2px solid red;
  background: #ccc;
}

#inner {
  outline: 2px solid red;
}
<div id="outer">
  <div id="inner">
  </div>
</div>

Ответ 12

Возможно, вы можете изменить полосу прокрутки. Что-то вроде этого:

::-webkit-scrollbar {
    width: 2em;
    height: 2em
}
::-webkit-scrollbar-button {
    background: #ccc
}
::-webkit-scrollbar-track-piece {
    background: #888
}
::-webkit-scrollbar-thumb {
    background: #eee
}​

Кроме того, здесь вы можете найти IE css