Posted by: fxix on: Октябрь 23, 2008
Наша задача будет в том, чтобы расположить 4 элемента по горизонтали так, чтобы расстояние межу ними было равное и пропорционально изменялось в зависимости от размеров окна браузера. В качестве элементов будем использовать изображения, например круги. Вначале рассмотрим несколько способов, которые чаще всего стараются применить верстальщики и проблемы с которыми они сталкиваются.
1. Определим для каждого элемента ширину в % и позиционируем по левому краю:
<img src=»images/shape-red.png» class=»first-r»>
<img src=»images/shape-green.png» class=»second-r»>
<img src=»images/shape-yellow.png» class=»third-r»>
<img src=»images/shape-blue.png» class=»fourth-r»>
CSS код:
img.first-r { left: 0%; position: relative; }
img.second-r { left: 25%; position: relative; }
img.third-r { left: 50%; position: relative; }
img.third-r { left: 75%; position: relative; }
Важно отметить, что свойство relative должно обязательно присутствовать. Это необходимо для того, чтобы крайний слева элемент позиционировался относительно родительского элемента, если тот имеет центрирование и не прилегает к левому краю. Проблема данного решения заключается в том, что левый отступ самого крайнего элемента справа в 75% отсчитывается от ширины окна браузера, но точкой отсчета будет левый край не окна, а родительского элемента. В результате этого, последний элемент уйдет за пределы экрана, а при определенном размере окна, наша строка и вовсе развалиться.
Если изменить значение relative на absolute, то несколько вышеуказанных проблем вам удастся разрешить и даже добиться равного расстояния между элементами. Но основной проблемой останется то, что все элементы будут иметь позиционирование по левому краю, и правила родительских элементов будут игнорироваться.
2. Определим для каждого элемента (кроме первого) отступ слева:
<span class=»do-not-wrap»>
<img src=»images/shape-red.png»>
<img src=»images/shape-green.png» class=»mover»>
<img src=»images/shape-yellow.png» class=»mover»>
<img src=»images/shape-blue.png» class=»mover»>
</span>
img.mover {
margin-left: 15%;
}
Тут нам даже не придется высчитывать отступы для каждого элемента – мы просто зададим общий равный отступ для трех элементов, начиная со второго. По идее все должно работать как надо, т.к. отступ будет отсчитывать от ширины окна браузера, так же как и ширина родительского элемента. также, блок do-not-wrap должен предотвратить разъезжание элементов. Но результат нас опять огорчит…
3. Обернем элементы табличной структурой
<table>
<tr>
<td class=»leftalign»>
<img src=»images/shape-red.png»>
</td>
<td>
<img src=»images/shape-green.png»>
</td>
<td>
<img src=»images/shape-yellow.png»>
</td>
<td class=»rightalign»>
<img src=»images/shape-blue.png»>
</td>
</tr>
</table>
И даже этим способом мы не получим идеального результата – элементы будут равноудалены не всегда. Если задать для 2й и 3ей ячейке центрирование содержимого; крайней слева – по левому краю, и последней по правому краю, то в результате все должно работать как нужно, если… не изменять размеры окна браузера.
4. Что будем делать?
Предыдущий способ навел на некоторые мысли: попробуем позиционировать первый элемент по левому краю, а остальные по правому. Визуально это должно выглядеть так:
Равноудаленные элементы
HTML:
<img src=»images/shape-red.png»>
<div id=»movers-row»>
<div><img src=»images/shape-green.png»></div>
<div><img src=»images/shape-yellow.png»></div>
<div><img src=»images/shape-blue.png»></div>
</div>
CSS:
#movers-row {
margin: -120px 0 0 120px;
}
#movers-row div {
width: 33.3%;
float: left;
}
#movers-row div img {
float: right;
}
Что ж, смотрим итоги наших попыток реализации равноудаленных элементов. Очевидно, что именно 4й способ и станет идеальным решением.