2009-06-18 3 views
2

Результат этого кода очень похож на FF, Chrome и Safari в Windows. В IE7 это выглядит странно.IE CSS Float Problem

Для всех других браузеров рамка div точно обертывает холст div, хотя в рамке есть 24X24 div, но за пределами холста. IE7 оставляет дополнительное пространство в кадре, над холстом, для div с синим ящиком. После того, как я плыл, я подумал, что пространство, которое он в противном случае занимал бы, рухнет. Это поведение, которое я вижу в других браузерах.

Есть ли какой-то трюк, чтобы заставить IE7 свернуть пространство, как другие ребята?

Редактировать: Просто чтобы дать представление о том, что должен представлять этот пример. Предполагается, что он представляет собой встроенный виджет. «Холст» - это место, где принадлежит контент. «Кадр» - это то, что использует хостинг-сайт, чтобы контролировать внешний вид и поведение между виджетами и остальной частью страницы. Красные ящики и синие ящики представляют элементы управления в виджетах. Красный ящик - это элемент управления, который содержит мой код виджета. Сине-бокс представляет собой контроль, добавленный в кадре (возможно, ручкой, чтобы виджет тащиться вокруг страницы)

Вот полный образец

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en" > 
<head> 
<title>CSS Positioning</title> 
<style type="text/css"> 
#frame { 
    position: relative;  /* so subelements can be positioned    */ 
    width: 400px;   /* an arbitrary width       */ 
    border: 1px solid black; /* a border so you can see it     */ 
} 
#canvas { 
    position: relative;  /* so subelements can be positioned    */ 
    width: 400px;   /* an arbitrary width       */ 
    border: 1px solid black; /* a border so you can see it     */ 
} 
#blue-box{ 
    position: relative;  /* so I can position this element    */ 
    float: right;   /* I want this element all the way to the right */ 
    width: 24px;    /* set size of eventual graphic replacement  */ 
    height: 24px; 
} 
#red-box{ 
    position: relative;  /* so I can position this element    */ 
    width: 24px;    /* set size of eventual graphic replacement  */ 
    height: 24px; 
} 

</style> 
</head> 
<body> 

<div id="frame"> 
    <div id="blue-box">blue</div> 
    <div id="canvas"> 
    <div id="red-box">red</div> 
    </div> 
</div> 

</body> 
</html> 

Дополнительный пример для Эмили ===== =============================================

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en" > 
<head> 
<title>CSS Positioning</title> 
<style type="text/css"> 
* { 
    margin: 0; 
    padding: 0; 
} 
#one { 
    background-color: red; 
    float: right; 
} 
#two { 
    background-color: blue; 
    border: 1px solid black; 
} 

</style> 
</head> 
<body> 

<div id="one">one</div> 
<div id="two">two</div> 

</body> 
</html> 
+1

как получилось, что у вас так много позиционируется относительно? Вы можете удалить большинство из них, я думаю, – marcgg

+0

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

ответ

1

Там может быть проблема с калибровкой на «рамке» и «холст» дивы. Похоже, что они имеют одинаковый размер плюс размер границы (который добавляется к общему размеру элемента).Не пытайтесь указать размер для вашего «холста» div, но дайте ему поле, чтобы правильно разместить его с помощью «синего ящика».

Если вы сомневаетесь, сбросьте свои элементы, установив маржи/отступы на 0 один сомнительный элемент. Межстрочный интервал может возникать между браузерами, если они не определены.

Кроме того, я не считаю, что здесь нужна «позиция: относительная».

Желудовые

+0

Я увеличил размер рамки до 405, но это не помогло. Также я попробовал reset.css, предложенный в предыдущем ответе –

+0

Проблема заключается не в размере "frame" div, а в размере его дочерних элементов. Похоже, вам не нужен определенный размер для «холста», поскольку он находится внутри «рамки». Однако сохраните размер «синего ящика», но используйте их, используя поля.Не определять размер для «cavnas», как говорить, чтобы заняться оставшимся пространством, оставшимся от размера pf «синего ящика». – Acorn

+0

Интересно. Удаление ширины #canvas кажется сработавшим. Я ожидал увидеть, что холст уменьшится, чтобы оставить место для # синего ящика, но то, что я нашел, установив цвет фона на холсте, состоит в том, что холст по-прежнему заполняет весь кадр. –

0

IE добавляет дополнительные дополнения и поля. Вы должны использовать reset.css file и повторите попытку.

В общем, IE не ведет себя как браузер, поэтому вам может потребоваться создать специальные таблицы стилей IE.

<!--[if IE]><link rel="stylesheet" type="text/css" href="/public/stylesheets/ie.css" /><![endif]--> 

<!--[if IE 6]><link rel="stylesheet" type="text/css" href="/public/stylesheets/ie6.css" /><![endif]--> 

<!--[if IE 7]><link rel="stylesheet" type="text/css" href="/public/stylesheets/ie7.css" /><![endif]--> 

EDIT:

Оберточная холст является один Мессинг вещи, потому что это тот же размер кадра. Если вы это сделаете:

#frame { 
    position: relative;  /* so subelements can be positioned    */ 
    width: 460px;   /* an arbitrary width       */ 
    border: 1px solid black; /* a border so you can see it     */ 
} 

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

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

+0

На вашем «Edit2» ... Я знаю, что вы имеете в виду. IE всегда требует дополнительной настройки даже после того, как все другие браузеры более или менее согласны. Однако было два ответа выше, которые работают в четырех браузерах, с которыми я тестировал. Один использовал «позицию: абсолютный», который вам не понравился. А другой - не устанавливать ширину для холста. –

1

Я столкнулся с этой проблемой раньше, и я изо всех сил пытаюсь вспомнить, что с ней произошло. I thiiiink вам нужно взять position: relative с #blue-box.

+0

Это не помогло –

+0

Хмм. Попытка позиции: абсолютная, на самом деле. Я знаю, это кажется сумасшедшим ... – chaos

+0

Да, кажется сумасшедшим, но это помогло, но не само по себе. Просто добавив «position: absolute»; заставил кадр свернуть до размера холста в IE7, как и все браузеры, но все браузеры начали игнорировать «float: right»; атрибут, так что «синий» появился поверх «красного». Но, если я добавлю «right: 0px;» в синем окне он снова появляется справа от экрана во всех браузерах. –

0

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

<div id="frame"><div id="blue-box">blue</div><div id="canvas"><div id="red-box">red</div></div></div> 

Джош

+0

Это не помогло. –

1

#frame содержит #canvas, который имеет ширину 400 пикселей и #blue-box, который имеет ширину 24px.

#frame должен иметь ширину не менее 424px (может потребоваться больше ... зависит от того, какое дополнение находится на ваших элементах), но #frame имеет ширину 400 пикселей.

Попробуйте изменить ширину #frame на 430px, чтобы получить обе коробки на одной линии. В зависимости от того, какой сброс сброса css удаляется, вы можете уменьшить ширину # кадра.


Затем вам нужно положить #blue-box внутри #canvas

<div id="frame"> 
    <div id="canvas"> 
    <div id="blue-box">blue</div> 
    <div id="red-box">red</div> 
    </div> 
</div> 

плавали дивы не перекрывают друг друга или "достичь вниз в дивы под ними. Вот хорошая статья на CSS Floats


Это один раз я рекомендую использовать абсолютное позиционирование. position: absolute удаляет элемент из потока документа - точно так же, как вы хотите, с #blue-box.

#frame { 
    position: relative;  /* so subelements can be positioned    */ 
    width: 400px;   /* an arbitrary width       */ 
    border: 1px solid black; /* a border so you can see it     */ 
} 
#canvas { 
    width: 400px;   /* an arbitrary width       */ 
    border: 1px solid black; /* a border so you can see it     */ 
} 
#blue-box{ 
    position: absolute;  /* so I can position this element    */ 
    right: 0;    /* I want this element all the way to the right */ 
    top:0; 
    width: 24px;    /* set size of eventual graphic replacement  */ 
    height: 24px; 
} 
#red-box{ 
    width: 24px;    /* set size of eventual graphic replacement  */ 
    height: 24px; 
} 

<div id="frame"> 
    <div id="blue-box">blue</div> 
    <div id="canvas"> 
    <div id="red-box">red</div> 
    </div> 
</div> 
+0

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

+0

обновлено после комментария – Emily

+0

По причинам, которые я добавил к вопросу (которого, вероятно, не было, когда вы его читали) я не могу поместить синюю коробку в холст. То, что находится в холсте, исправлено. Мы хотим, чтобы люди могли добавлять к холсту, добавляя к фрейму - например, заправляя открытку в рамку картины ... Что касается плавающих divs, которые попадают в другие div, я добавил второй пример для вас только 2 divs. Первый плавает, второй имеет границу. В IE7, FF3, Chrome и Safari4 вы можете видеть, что граница второго div окружает первую, которая попала во вторую. –