Устранение неполадок css - PullRequest
0 голосов
/ 29 мая 2009

У меня есть очень простой пример CSS, подробно описанный ниже. Класс .entry создает простую рамку с черной рамкой размером 1 пиксель. В приведенном ниже примере будет отображаться «123» внутри поля, а «abc» и «xyz» вне поля, потому что эти элементы помечены как float left и right. Моя цель состоит в том, чтобы .box1 внутри .entry был выровнен влево, а .box2 внутри .entry выровнен вправо.

<html>
<head>
<style type="text/css">
        .entry 
    {
        width: 400px;
        border-style: solid;
        border-width: 1px;
        border-color: #000;
    }   
    .box1
    {
        width: 75px;
                float: left;
    }

    .box2
    {
        width: 300px;
                float: right;   
    }
</style>
</head>
<body>
        <div class="entry">
            123
            <div class="box1">abc</div>
            <div class="box2">xyz</div>
        </div>
</body>
</html>

он хорошо отрисовывается в IE, но не в Firefox

Ответы [ 5 ]

2 голосов
/ 29 мая 2009

Поскольку поплавки извлекаются из нормального потока, окружающие их коробки разрушаются.

Сначала я объясню, почему он работает в IE. Вы дали ему «макет», установив ширину или высоту для каждого элемента. Это width в этом случае. См. hasLayout для получения дополнительной информации об этом. Это очень удобно, поскольку оно также решит большинство других ошибок IE, с которыми вы столкнулись.

Волшебные пули:

height: 1%; /* or any other value. IE6 wrongly sees height as min-height. */

или, если вы не можете установить определенный размер, используйте

zoom: 1; /* A IE only property. Doesn't validate, but doesn't cause any harm either */

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

Более простым способом может быть установка overflow:hidden;, которая также исправляет это. Но теперь вы должны следить за длинными URL, фрагментами кода или чем-то еще, что может случайно вытолкнуть из div. Если вы делаете весь сайт самостоятельно, это обычно не большая проблема, если вы передаете его кому-то для использования в CMS, шансы немного больше. Тем не менее, стоит рискнуть, если вы не можете решить множество плаваний вокруг вашего макета.

Добавление элемента в конце для очистки поплавков также является способом сделать это, но я считаю, что первые способы проще.

Мне лучше прекратить болтать, вы, вероятно, хотите увидеть код:


.entry {
  width: 400px;
  border: 1px solid #000;
  float: left;      /* Option 1 */
  overflow: hidden; /* Option 2 */
}   
.box1 {
  width: 75px;
  float: left;
 }
.box2 {
  width: 300px;
  float: right;   
 }


1 голос
/ 29 мая 2009

Попробуйте добавить переполнение: скрытое (или автоматическое) в .entry {...}

1 голос
/ 29 мая 2009

Вы должны очистить свои поплавки для FF:

.entry:after {
content: ".";
display: block;
height: 0;
clear: both;
visibility: hidden;
}   

Я бы сделал это и для IE:

.entry { min-height: 10px;}

В противном случае, я не понимаю, почему это не сработает ...

1 голос
/ 29 мая 2009

Попробуйте это; Я протестировал его, и он работает в FF 3, Safari 3.2, Opera 9.6 и IE 7.

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

<html>
<head>
<style type="text/css">
    .entry 
    {
        width: 400px;
        border-style: solid;
        border-width: 1px;
        border-color: #000;
    }   
    .box1
    {
        width: 75px;
        float: left;
    }

    .box2
    {
        width: 300px;
        float; left;
        margin: 0 0 0 75px;
    }

    .entry span
    {
        width: 400px;
        float: left;
    }
</style>
</head>
<body>
        <div class="entry">
            <span>123</span>
            <div class="box1">abc</div>
            <div class="box2">xyz<br>More text</div>
        </div>
</body>
</html>
1 голос
/ 29 мая 2009

Поскольку у вас нет Doctype, вы запускаете режим Quirks . Это делает браузеры значительно более глючными, чем режим Standards (AKA Strict). Internet Explorer - худший нарушитель здесь.

Я подозреваю, что ваша проблема в том, что вы хотите, чтобы граница .entry расширялась вокруг .box1 и .box2. См. , содержащий числа с плавающей запятой , для получения более подробной информации и Методы для удержания числа с плавающей запятой для некоторых более хороших решений.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...