Как исправить эту простую проблему с плавающим CSS в IE?
-
20-08-2019 - |
Вопрос
у меня четыре div
элементы сместились влево.Третий div
очищается.
В Firefox и Chrome элементы расположены так, как ожидалось:Первый и второй div
s примыкают друг к другу и находятся выше третьего и четвертого div
которые также примыкают друг к другу.
IE7, с другой стороны, занимает четвертое место. div
рядом с первым и вторым div
s с третьим div
ниже.
Я знаю, что могу это исправить, добавив br
элемент после второго div
но я бы предпочел не редактировать разметку, если в этом нет необходимости.Есть ли более элегантный способ решить проблему?
Я уже некоторое время пытаюсь найти решение в Google, но так и не нашел его, что довольно удивительно, учитывая, насколько элементарной кажется проблема.Возможно, я упускаю что-то очевидное: есть ли справочный сайт, на котором перечислены простые проблемы CSS, подобные этой, или я просто не разбираюсь в основах CSS?
Редактировать: Я немного усложнил пример кода после того, как Nazgulled «решил» проблему (см. комментарии).Их теперь четыре div
s вместо трёх и третьего div
очищается вместо второго.
Вот полный исходный код:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>IE Float Test</title>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<style type="text/css">
div
{
width: 100px;
height: 100px;
color: white;
font-size: 3em;
float: left;
}
#divone
{
background-color: red;
}
#divtwo
{
background-color: blue;
}
#divthree
{
background-color: green;
clear: both;
}
#divfour
{
background-color: purple;
}
</style>
</head>
<body>
<div id="divone">one</div>
<div id="divtwo">two</div>
<div id="divthree">three</div>
<div id="divfour">four</div>
</body>
</html>
Решение 2
Несколько месяцев спустя...
Я отказался от попыток решить эту проблему только с помощью CSS.Это ошибка IE7, которую невозможно избежать, не затронув HTML.
Окончательное применение этого плавающего шаблона имело форму, в которой два из div
s были входными элементами, а два других div
s были соответствующими им ярлыками.Шаблон использовался несколько раз в большой форме, и мне очень хотелось найти элегантное решение, использующее только CSS.
В конце концов я начал использовать Объектно-ориентированный CSS-фреймворк и оборачиваем все элементы дополнительными div
s, чтобы создать желаемый макет, как того требует OOCSS.Это был единственный способ спасти мою душу от ада CSS в IE7, и OOCSS не так уж и плох, как только вы закончите первоначальный макет.
По правде говоря, общий ответ таков: это тот вопрос, который вы задаете, когда не совсем понимаете, что делаете с CSS.Если вам однажды пришлось создать сложный макет, вы, вероятно, не знаете, что делаете;как и было, когда я задал этот вопрос.
Хотя это правда, что IE7 не может правильно отобразить CSS, это также был случай ошибочной области действия с моей стороны.CSS не является окончательным языком макетирования, каким его мог бы представить наивный программист, и CSS не является полностью независимым от структуры вашего HTML.Я снова решил пойти по более простому пути и использовать структуру OOCSS, хотя мне действительно нужно потратить время на изучение основ CSS.
Увы, таковы последствия сроков.
Другие советы
Я не знаю, решит ли это вашу реальную проблему, но я исправил ваш образец следующим образом:
- Удалить плавать атрибут из div
- Удалить прозрачный атрибут из #divtwo
- Добавлять плавать:левый к #divtwo и #divthree
Это делает его похожим на ваш образец Chrome как в Firefox, так и в IE 7 (браузеры, которые я тестировал).
Я не уверен, какова ваша конечная цель, но я бы предложил заключить все четыре <div>
в элемент контейнера и применить к нему ширину, а затем удалить стиль clear
из #divthree
. Это позволит #divfour
и #divone
перейти ниже #divtwo
и zoom
без их очистки.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>IE Float Test</title>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<style type="text/css">
#divone, #divtwo, #divthree, #divfour
{
width: 100px;
height: 100px;
color: white;
font-size: 3em;
float: left;
}
#divone
{
background-color: red;
}
#divtwo
{
background-color: blue;
}
#divthree
{
background-color: green;
}
#divfour
{
background-color: purple;
}
#container {
width: 200px;
zoom: 1;
}
</style>
</head>
<body>
<div id="container">
<div id="divone">one</div>
<div id="divtwo">two</div>
<div id="divthree">three</div>
<div id="divfour">four</div>
</div>
</body>
</html>
Свойство #container
в <br>
необходимо, чтобы избежать IE6 / 7. Escape Elling Bug .
Если приведенное выше решение не является жизнеспособным, вы можете добавить clear: left;
или <=> после <=> со стилем <=>:
<div id="divone">one</div>
<div id="divtwo">two</div>
<br style="clear: left;" />
<div id="divthree">three</div>
<div id="divfour">four</div>
Этот метод используется в примере макета плавающей страницы на westciv.com .
Попробуйте добавить:
display:inline-block;
в #divtwo. Если это сработает, я, конечно, добавлю некоторые условные комментарии для IE7