CSS div/overflow: почему первый файл HTML работает, а второй нет?

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

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

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

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

Я новичок в CSS и разметке HTML, поэтому мое понимание того, почему CSS обрабатывает размер так, как это происходит в некоторых ситуациях, все еще меня очень сбивает с толку.

Рабочий файл HTML:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
    <meta http-equiv="Content-Style-Type" content="text/css"></meta>

    <style type="text/css">
        #divBody {
            margin-top: 5px;
            top:24px;
            margin-top: 10px;
        }            
        #divContainer 
        {
            top: 5px;
            position:relative;
            min-height:100%;
            #width:expression(document.body.clientWidth < 830? "800": "90%" );
            width:90%;
            min-width: 800px;
            padding-bottom:70px;
        }
        #divMasterGrid {
            position:relative;
            margin:5px;
            top:5px;
            width:99%;
            margin:0 auto;
            overflow-x:scroll;
        }
        #divRadioButtonArea {
            position:relative;
            top:20px;
            height:51px;
            font-size: 12px;
            width:99%;
            margin:5px;
        }
    </style>
    <title>TEST TEST</title>
</head>


<body id="divBody">
    <div id="divContainer" class="gridRegion">

        <div id="divMasterGrid">
            <fieldset style="margin: 5px;">
                <legend style="font-size: 12px; color: #000;">Numbers</legend>
                <table border="1px">
                <tr>
                    <td>One
                    </td>
                    <td>Two
                    </td>
                    <td>Three
                    </td>
                    <td>Fout
                    </td>
                    <td>Five
                    </td>
                    <td>Six
                    </td>
                    <td>Seven
                    </td>
                    <td>Eight
                    </td>
                    <td>Nine
                    </td>
                    <td>Ten
                    </td>
                    <td>Eleven
                    </td>
                    <td>Twelve
                    </td>
                    <td>Thirteen
                    </td>
                    <td>Fourteen
                    </td>
                    <td>Fifteen
                    </td>
                    <td>Sixteen
                    </td>
                    <td>Seventeen
                    </td>
                    <td>Eighteen
                    </td>
                    <td>Nineteen
                    </td>
                    <td>Twenty
                    </td>                        
                </tr>
                </table>
            </fieldset>
        </div>


        <div id="divRadioButtonArea">
            <fieldset style=" padding-left: 5px;">
                <legend style="color: #000;  height:auto">Colors</legend>
                <table style="width:100%;padding-left:5%;padding-right:5%;">
                    <tr>
                        <td>
                            <input type="radio" name="A" value="Y"/><label>Red</label>
                        </td>
                        <td>
                            <input type="radio" name="O" value="O"/><label>White</label>
                        </td>
                        <td>
                            <input type="radio" name="W"/><label>Blue</label>
                        </td>
                    </tr>
                </table>
            </fieldset>
        </div>

    </div>
</body>
</html>

Неисправный файл HTML:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
    <meta http-equiv="Content-Style-Type" content="text/css"></meta>
    <style type="text/css">
        #divBody {
            margin-top: 5px;
            top:24px;
            margin-top: 10px;
        }            
        #divContainer 
        {
            top: 5px;
            position:relative;
            min-height:100%;
            #width:expression(document.body.clientWidth < 830? "800": "90%" );
            width:90%;
            min-width: 800px;
            padding-bottom:70px;
        }
        #divTopFieldSet {
            position:relative;
            margin:5px;
            top:5px;
            width:99%;
        }
        #divRadioButtonArea {
            position:relative;
            top:20px;
            height:51px;
            font-size: 12px;
            width:99%;
            margin:5px;
        }
        #divTable {
            position:relative;
            width:99%;
            margin:5px auto;
            overflow-x:scroll;
        }

    </style>
    <title>TEST TEST</title>
</head>


<body id="divBody">
    <div id="divContainer" class="gridRegion">

        <div id="divTopFieldSet">
            <fieldset style="margin: 5px;">
                <legend style="font-size: 12px; color: #000;">Numbers</legend>
                <div id="divTable">
                    <table border="1px">
                    <tr>
                        <td>One
                        </td>
                        <td>Two
                        </td>
                        <td>Three
                        </td>
                        <td>Fout
                        </td>
                        <td>Five
                        </td>
                        <td>Six
                        </td>
                        <td>Seven
                        </td>
                        <td>Eight
                        </td>
                        <td>Nine
                        </td>
                        <td>Ten
                        </td>
                        <td>Eleven
                        </td>
                        <td>Twelve
                        </td>
                        <td>Thirteen
                        </td>
                        <td>Fourteen
                        </td>
                        <td>Fifteen
                        </td>
                        <td>Sixteen
                        </td>
                        <td>Seventeen
                        </td>
                        <td>Eighteen
                        </td>
                        <td>Nineteen
                        </td>
                        <td>Twenty
                        </td>                        
                    </tr>
                    </table>
                </div>
            </fieldset>
        </div>


        <div id="divRadioButtonArea">
            <fieldset style=" padding-left: 5px;">
                <legend style="color: #000;  height:auto">Colors</legend>
                <table style="width:100%;padding-left:5%;padding-right:5%;">
                    <tr>
                        <td>
                            <input type="radio" name="A" value="Y"/><label>Red</label>
                        </td>
                        <td>
                            <input type="radio" name="O" value="O"/><label>White</label>
                        </td>
                        <td>
                            <input type="radio" name="W"/><label>Blue</label>
                        </td>
                    </tr>
                </table>
            </fieldset>
        </div>

    </div>
</body>
</html>

person user305328    schedule 30.03.2010    source источник
comment
Там, где я работаю, мы должны поддерживать IE 7 (не 8) в дополнение к Firefox, поэтому я боюсь, что мы застряли с обходным решением #width. IE6 вообще не обрабатывает настройку минимальной ширины. Обидно.   -  person user305328    schedule 30.03.2010


Ответы (1)


Я надеюсь, это то, что вы имеете в виду:

Я переместил правила переполнения-x и ширины в #divTopFieldSet — содержимое div правильно прокручивается, когда тело становится слишком узким, чтобы вместить таблицу.

Честно говоря, я не уверен на 100% в первопричине этого. Когда для элемента с процентной шириной установлено значение overflow:scroll, он не сжимается автоматически, чтобы обрезать свое содержимое — кажется, что дочерние элементы элемента играют роль. Поскольку таблица имеет собственную минимальную ширину (определяемую содержимым ячеек), окружающий контейнер не будет сжиматься за пределы внешнего края таблицы. Вдобавок ко всему, есть вычисление ширины в процентах — width:99%; означает «99% ширины родительского контейнера» — если родительский контейнер не основан на размере области просмотра, эти 99% не изменятся при изменении размера , либо.

Однако применение правила переполнения к контейнеру выше по дереву (divTopFieldSet) работает.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
    <meta http-equiv="Content-Style-Type" content="text/css"></meta>
    <style type="text/css">
        #divBody {
            margin-top: 5px;
            top:24px;
            margin-top: 10px;
        }            
        #divContainer 
        {
            top: 5px;
            position:relative;
            min-height:100%;
            #width:expression(document.body.clientWidth < 830? "800": "90%" );
            width:90%;
            min-width: 800px;
            padding-bottom:70px;
        }
        #divTopFieldSet {
            position:relative;
            margin:5px;
            top:5px;
            width:99%;
            overflow-x:scroll;
        }
        #divRadioButtonArea {
            position:relative;
            top:20px;
            height:51px;
            font-size: 12px;
            width:99%;
            margin:5px;
        }
        #divTable {
            margin:5px auto;
        }

    </style>
    <title>TEST TEST</title>
</head>


<body id="divBody">
    <div id="divContainer" class="gridRegion">

        <div id="divTopFieldSet">
            <fieldset style="margin: 5px;">
                <legend style="font-size: 12px; color: #000;">Numbers</legend>
                <div id="divTable">
                    <table border="1px">
                    <tr>
                        <td>One
                        </td>
                        <td>Two
                        </td>
                        <td>Three
                        </td>
                        <td>Fout
                        </td>
                        <td>Five
                        </td>
                        <td>Six
                        </td>
                        <td>Seven
                        </td>
                        <td>Eight
                        </td>
                        <td>Nine
                        </td>
                        <td>Ten
                        </td>
                        <td>Eleven
                        </td>
                        <td>Twelve
                        </td>
                        <td>Thirteen
                        </td>
                        <td>Fourteen
                        </td>
                        <td>Fifteen
                        </td>
                        <td>Sixteen
                        </td>
                        <td>Seventeen
                        </td>
                        <td>Eighteen
                        </td>
                        <td>Nineteen
                        </td>
                        <td>Twenty
                        </td>                        
                    </tr>
                    </table>
                </div>
            </fieldset>
        </div>


        <div id="divRadioButtonArea">
            <fieldset style=" padding-left: 5px;">
                <legend style="color: #000;  height:auto">Colors</legend>
                <table style="width:100%;padding-left:5%;padding-right:5%;">
                    <tr>
                        <td>
                            <input type="radio" name="A" value="Y"/><label>Red</label>
                        </td>
                        <td>
                            <input type="radio" name="O" value="O"/><label>White</label>
                        </td>
                        <td>
                            <input type="radio" name="W"/><label>Blue</label>
                        </td>
                    </tr>
                </table>
            </fieldset>
        </div>

    </div>
</body>
</html>

Дайте нам знать, если это не то, что вам нужно...

person Ben Hull    schedule 30.03.2010
comment
Спасибо, что заглянули, Биджамин. Я взглянул на первый фрагмент кода и запустил его рядом с вашим решением, и он примерно такой же. Судя по тому, что вы сказали, похоже, что порядок, в котором браузер вычисляет ширину, имеет какое-то отношение к тому факту, что второй фрагмент кода неправильно использует механизм прокрутки переполнения. Любые идеи о порядке, в котором браузер вычисляет размеры? Если тело является родительским div для всего, а контейнерный div занимает 90% этой ширины, а затем продолжает спускаться от родителя к дочернему элементу, я ожидаю, что переполнение сработает. - person user305328; 31.03.2010