Это довольно мутный пример того, как разные броузеры наследуют вложенность с разными типами position.
Идея заключается в том, чтобы управлять положением и размерами одного слоя по отношению к положению и размеру другого слоя.
В этом примере родительский контейнер пуст, а дочерний содержит текст. Соответственно, мы ожидаем увидеть этот текст внутри дочернего контейнера.
|
cover
cover cover cover |
FireFox строго наследует высоту и ширину текст выпадает из контейнера. Но, к несчастью, он не наследует и не накладывает на дочерний контейнер padding и margin, поэтому дочерний контейнер вылез за пределы родительского.
Ни overflow: visible, ни box-sizing: border-box; -moz-box-sizing: border-box не помогут вместить текст в контейнер.
Отбиться от правого края с помощью border также не получится, хотя мы можем упралять шириной вложенного блока с помощью правой границы.
|
cover
cover cover cover |
Можно заметить, что хотя родительский border, в отличие от padding, оказывает влияет на ширину дочернего контейнера и в Internet Explorer, и в FireFox, этот способ не совместим с Internet Explorer, в котором padding также оказывает влияние на эту ширину.
Относительное позиционирование возвращает все на свои места, однако при этом мы теряем высоту родительского контейнера в Internet Explorer. К тому же не смотря на то, что наследование padding в FireFox включилось, полностью исчезло наследование высоты. Логика такого поведения мало вразумительна. В любом случае ни один из примеров не похож на то, что мы видим в Internet Explorer.
|
cover
cover cover cover |
Попробуем исключить padding и увеличить border, чтобы поместить дочерний контейнер по середине родительского в FireFox. При этом нам понадобится третий охватывающий контейнер для замены функции укорачивающегоя родительского контейнера.
|
(used
instead of height)
cover
cover cover cover |
Высота охватывающего контейнера растягивает вложенный контейнер при относительном позиционировании в Internet Explorer. В FireFox она только смещает его вниз.
Для того, чтобы заменить смещаемый контейнер без изменения положения вложенных контейнеров, попробуем снова назначить абсолютное позиционирование всем вложенным контейнерам.
|
(used
instead of height)
cover
cover cover cover |
Результат впечтляет! FireFox стал вести себя как Internet Explorer при относительном позиционировании, а то что отобразил Internet Explorer 5, вообще с трудом поддается разумению. Можно подумать, что при абсолютном позиционировании, блоки способны вести себя как текст. Тем не менее, попробуем разобраться и настроить этот пример.
При фиксированной высоте в обоих броузерах пример выглядит абсолютно одинаково!
|
cover
cover cover cover |
Можно завести дочерний контенер вовнутрь и поставить его на нижнюю границу.
|
cover
cover cover cover |
Вот рецепт позиционирования при фиксированной ширине и высоте:
<div style="position: relative; height: 100%; width: 100%; background-color: red"> <div style="position: absolute; height: 100%; width: 100%; padding-left: 9px; padding-right: 9px; padding-top: 9px; padding-bottom: 0px"> <div style="position: relative; top: 0px; left: 0px; height: 100%; width: 100%; background-color: #AAAAAA"> (content here) </div> </div> </div>
Однако у этой конструкции есть один важный недостаток - она не может растянуть по вертикали четвертый охватывающий слой, поэтому попробуем сделать часть, содержащую текст в отдельном слое, способном управлять высотой двух вложенных. Разместим в охватывающем слое четыре пары с разных сторон основного слоя.
|
cover cover cover |
Вот как выгдядит этот пример (пример диалога со скругленными уголками) при использовании локальных стилей:
dialog title
offset_neight = middle_height + top_height
cover cover cover |
В этом примере используется одно круглое изображение для уголков и две линии - вертикальная и горизонтальная - вырезанные из этого же изображения
<div style="position: relative; height: 100%; width: 100%">
<!-- top -->
<div style="position: absolute; height: 100%; width: 100%; left: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; padding-bottom: 0px">
<!-- top left -->
<div style="background-image: url('Images/Corner.gif'); font-size: 0px; position: absolute; top: 0px; right: 0px; left: 0px; height: 9px; width: 9px; background-position: left top">
</div>
<!-- top right-->
<div style="background-image: url('Images/Corner.gif'); font-size: 0px; position: absolute; top: 0px; right: 0px; height: 9px; width: 9px; background-position: right top">
</div>
<!-- -->
</div>
<!-- top-center -->
<div style="position: absolute; height: 100%; width: 100%; left: 0px; padding-left: 9px; padding-right: 9px; padding-top: 0px; padding-bottom: 0px">
<div style="background-image: url('Images/CornerHorz.gif'); font-size: 0px; position: relative; right: 0px; left: 0px; height: 9px; width: 100%; background-position: left top">
</div>
</div>
<!-- middle -->
<div style="position: absolute; height: 100%; width: 100%; left: 0px; padding-left: 9px; padding-right: 9px; padding-top: 9px; padding-bottom: 9px">
<!-- left -->
<div style="position: absolute; left: 0px; height: 100%; width: 9px; padding-bottom: 9px">
<div style="background-image: url('Images/CornerVert.gif'); position: relative; left: 0px; height: 100%; width: 100%; background-position: left top">
</div>
</div>
<!-- right -->
<div style="position: absolute; right: 0px; height: 100%; width: 9px; padding-bottom: 9px">
<div style="background-image: url('Images/CornerVert.gif'); position: relative; left: 0px; height: 100%; width: 100%; background-position: right top">
</div>
</div>
<!-- -->
</div>
<!-- middle-center -->
<div style="position: absolute; height: 30px; width: 100%; left: 0px; padding-left: 9px; padding-right: 9px; padding-top: 9px; padding-bottom: 0px">
<!-- center -->
<div style="position: relative; left: 0px; height: 30px; width: 100%; padding-left: 0px; padding-right: 0px; padding-top: 0px; padding-bottom: 0px">
<div style="background-color: #FF9966; position: absolute; left: 0px; height: 100%; width: 100%">
<!-- corner image -->
<div style="background-color: #FFFF00; position: absolute; left: 0px; height: 30px; width: 30px">
</div>
<!-- dialog title content -->
<h5 align="center">dialog title</h5>
<!-- end dialog title content -->
</div>
</div>
<!-- -->
</div>
<!-- common -->
<div style="position: relative; height: 100%; width: 100%; padding-left: 9px; padding-right: 9px; padding-top: 0px; padding-bottom: 0px">
<!-- top offset-->
<div style="position: relative; height: 39px; width: 100%">
</div>
<div style="background-color: #99FFFF">
<!-- dialog content-->
(content here)
<!-- end dialog content-->
</div>
</div>
<!-- bottom -->
<div style="position: absolute; height: 100%; width: 100%; left: 0px; padding-left: 0px; padding-right: 0px; padding-top: 9px; padding-bottom: 0px">
<!-- left-bottom -->
<div style="background-image: url('Images/Corner.gif'); font-size: 0px; position: absolute; top: 0px; left: 0px; height: 9px; width: 9px; background-position: left bottom">
</div>
<!-- right-bottom -->
<div style="background-image: url('Images/Corner.gif'); font-size: 0px; position: absolute; top: 0px; right: 0px; height: 9px; width: 9px; background-position: right bottom">
</div>
<!-- -->
</div>
<!-- bottom-center -->
<div style="position: absolute; height: 100%; width: 100%; left: 0px; padding-left: 9px; padding-right: 9px; padding-top: 0px; padding-bottom: 0px">
<div style="background-image: url('Images/CornerHorz.gif'); font-size: 0px; position: relative; right: 0px; left: 0px; height: 9px; width: 100%; background-position: left bottom">
</div>
</div>
<!-- -->
</div>
Вот с какими уровнями вложенности слоев приходится иметь дело, только для того, чтобы добиться броузерной совместимости.
Надо заметить, что средствами Internet Explorer с помощью операции expression, которая осуществляет подстановку javascript в css, позиционирование слоя осуществляется в одно движение. Например, так:
<div style="position: relative; height: 100%; width: 100%; background-color: #9EEEEE"> <div style="position: absolute; top: 9px; left: 9px; height: expression(this.offsetParent.clientHeight - 9); width: expression(this.offsetParent.clientWidth - 18); background-color: #AAAAAA"> (content here) </div> </div>
|
cover
cover cover cover |
Разумеется, в FireFox и Opera это не работает.
Пожалуй, эта задача стоит жизни. FireFox у меня все-таки отобрал день рождения. Поскольку ее решения нет в интенете, я, подумав, решил все-таки опубликовать стилевой роутинг. Вот вам полный пример диалога:
Изображения:
Стиль:
<style type="text/css">
<!--
/* dialog corners */
.WR { position: relative; height: 100%; width: 100% }
.WA { position: absolute; height: 100%; width: 100% }
.TL { top: 0px; left: 0px; background-position: left top }
.TR { top: 0px; right: 0px; background-position: right top }
.BL { bottom: 0px; left: 0px; background-position: left bottom }
.BR { bottom: 0px; right: 0px; background-position: right bottom }
.DgCC { position: absolute; height: 9px; width: 9px; font-size: 0px;
background-repeat: no-repeat }
.DgCH { font-size: 0px; position: relative; height: 9px; width: 100% }
.DgCV { position: absolute; height: 100%; width: 9px }
.DgPH { left: 0px; padding-left: 9px; padding-right: 9px; padding-top: 0px;
padding-bottom: 0px }
.DgPW { left: 0px; padding: 9px }
.DgPL { left: 0px; padding-bottom: 9px }
.DgPR { right: 0px; padding-bottom: 9px }
.DgPT { left: 0px; padding-left: 0px; padding-right: 0px; padding-top: 9px;
padding-bottom: 0px }
.DgIC { background-image: url('Images/CornerBlue.gif') }
.DgIH { background-image: url('Images/CornerBlueHorz.gif') }
.DgIV { background-image: url('Images/CornerBlueVert.gif') }
.DgIB { background-color: #99FFFF }
.DgIT { background-color: #FF9966; background-image: url('Images/DialogTitle.jpg') }
.DgOS { position: relative; height: 39px; width: 100% }
.DgDH { position: absolute; height: 30px; width: 100%; left: 0px; padding-left: 9px;
padding-right: 9px; padding-top: 9px; padding-bottom: 0px }
.DgDT { position: relative; height: 30px; width: 100%; left: 0px }
.DgDC { background-color: #FF6600; background-image:
url('Images/DialogTitleImage.jpg'); position: absolute;
height: 30px; width: 30px; left: 0px; background-repeat:
no-repeat }
h5.DialogTitle { font-size: 14px; color: blue; text-align: center; padding-top: 0px;
padding-bottom: 0px }
/* FireFox only */
div { box-sizing: border-box; -moz-box-sizing: border-box }
-->
</style>
<!--[if lt IE 7]>
<style type="text/css">
/* add gifs here if png was used in common style */
</style>
<![endif]-->
Код диалога:
<table border="0" cellspacing="0" cellpadding="0"> <tr><td width="260px"> <div class="WR"> <!-- top --> <div class="WA"> <!-- top left --> <div class="DgIC DgCC TL"> </div> <!-- top right--> <div class="DgIC DgCC TR"> </div> <!-- --> </div> <!-- top center --> <div class="WA DgPH"> <div class="DgIH DgCH TL"> </div> </div> <!-- middle --> <div class="WA DgPW"> <!-- left --> <div class="DgCV DgPL"> <div class="DgIV WR TL"> </div> </div> <!-- right --> <div class="DgCV DgPR"> <div class="DgIV WR TR"> </div> </div> <!-- --> </div> <!-- middle-center --> <div class="DgDH"> <!-- center --> <div class="DgDT"> <div class="DgIT WA"> <!-- corner image --> <div class="DgDC"> </div> <!-- dialog title content --> <h5 class="DialogTitle">dialog title</h5> <!-- end dialog title content --> </div> </div> <!-- --> </div> <!-- common --> <div class="WR DgPH"> <!-- top offset --> <div class="DgOS"> </div> <div class="DgIB"> (content here) </div> </div> <!-- bottom --> <div class="WA DgPT"> <!-- left-bottom --> <div class="DgIC DgCC BL"> </div> <!-- right-bottom --> <div class="DgIC DgCC BR"> </div> <!-- --> </div> <!-- bottom-center --> <div class="WA DgPH"> <div class="DgIH DgCH BL"> </div> </div> <!-- --> </div> </td></tr> </table>
Если диалог имеет однотонное заполнение, можно избежать дополнительных изображений и ограничивающих рамок, например, так
|
text here |
Стиль:
/* corner dialog */
.TL { top: 0px; left: 0px; background-position: left top }
.TR { top: 0px; right: 0px; background-position: right top }
.BL { bottom: 0px; left: 0px; background-position: left bottom }
.BR { bottom: 0px; right: 0px; background-position: right bottom }
/* single gif dialog */
.SgCB { background-color: #cfcfcf; background-repeat: repeat; background-attachment:
scroll; position: relative; width: 100%; padding-bottom: 1px;
background-position: 0% 50% }
.SgCC { background-image: url('Images/CornersGray.gif'); background-repeat: no-repeat;
background-attachment: scroll; font-size: 0%; height: 10px;
position: absolute; width: 10px }
.SgOV { padding: 10px }
Код диалога:
<div class="SgCB"> <div class="SgCC TL"> </div> <div class="SgCC TR"> </div> <div class="SgCC BL"> </div> <div class="SgCC BR"> </div> <div class="SgOV"> <p class="ptop">text</p> <p>here</p> </div> </div>
В этом простом примере для компенсации ошибки выключки по нижнему краю используется padding-bottom: 1px. Этого можно избежать использованием внешнего ограничивающего слоя.
Смотрите пример.