Pull to refresh

Позиционирование элементов по разным сторонам блока

Reading time3 min
Views103K
Здравствуйте, дорогие читатели. Сегодня я расскажу вам о малоизвестном способе разнести два элемента по разным сторонам блока, в котором они находятся. Например вот так

До некоторого времени я, как и многие из вас, пользовался двумя способами:
  1. Первый способ основан на свойстве float. Левому блоку задаётся float: left, правому float: right
  2. Второй способ заключается в абсолютном позиционировании правого блока, с параметрами right: 0 либо left: 100%, margin-left: -(ширина блока)

Главный недостаток обоих способов заключается в том, что, если блоки нужно выравнять по нижней границе или по средней линии относительно друг друга, то приходится методом подбора смещать блоки по вертикали, задавая им либо top: anyValue, либо margin-top: anyValue. А у первого способа плюс ко всему есть ещё один, не то чтобы недостаток, но неприятная мелочь. Это необходимость очищать поток с помощью clearFix'a, overflow или дополнительного дива.
Итак способ номер 3. Для начала код:

Собственно HTML


Copy Source | Copy HTML
  1. <div class="wrap">
  2.     <div class="left"><a href="#">Левый блок</a></div><div class="right"><a href="#">Правый блок</a></div>
  3. </div>

Собственно CSS


Copy Source | Copy HTML
  1. .wrap {
  2.     width: 500px;
  3.     background: #555;
  4.     height: 500px;
  5. }
  6. .left, .right {
  7.     display: inline-block;
  8.     //display: inline;
  9.     //zoom: 1;
  10.     width: 100%;
  11.     margin-right: -100%;
  12.     vertical-align: bottom;
  13. }
  14. .right {
  15.     text-align: right;
  16. }
  17. .left a, .right a { display: inline-block; position: relative; }
  18. .left a { width: 200px; height: 100px; background: green; }
  19. .right a { width: 100px; height: 200px; background: pink; }

Пояснения


Суть способа заключается в том, чтобы наложить блоки друг на друга посредством margin-right: -100% и содержимое правого блока выровнять по правому краю с помощью text-align: right.
Оба блока (right и left) желательно записывать в одну строку, иначе из-за символа переноса строки правый блок будет чуть-чуть вылезать за границы блока-родителя.
Ссылкам обязательно нужно ставить position: relative, иначе из-за наложения блоков некоторые могут быть некликабельные.

Плюсы способа


Главный плюс в том, что теперь для наших блоков начинает работать vertical-align. И мы легко можем выровнять их и по верхней границе и по нижней и по центру.

Минусы способа


А главный минус заключается в том, что, применяя этот способ, мы должны быть твёрдо уверены, что содержимое блоков не увеличится до такой степени, что они начнут перекрывать друг друга (к слову говоря, способ с флоутами лишён этого недостатка, так как при увеличении содержимого блоков, они будут вставать друг под друга).

Ссылка на готовый пример

P.S.


Я не встречал такого способа в интернете, посему просьба: если кто-то найдёт аналогичную статью опубликованную раньше, сообщите мне пожалуйста.

Upd.


В комментариях моё внимание внимание обратили на способ, использующий text-align: justify. Этот способ тоже хорош, но у него есть два недостатка. Во-первых он требует введения дополнительного элемента, эмулирующего последнюю строку текстового блока, а во-вторых, он не будет работать в IE6-IE7 для блочных элементов.
Tags:
Hubs:
+56
Comments81

Articles

Change theme settings