Здравствуйте. Относительно недавно закончил пилить
сетку (из спортивного интереса) на inline-block'ах, которая умеет... почти все, что умеет flexbox (но
без flexbox в каком-либо виде), поддерживает IE8 (или 9, если уж все настолько плохо).
Остался очень доволен. Но это удовлетворение перешло в негодование при очередном "тестировании".
Не работает нормально позиционирование элемента по-центру горизонтально (middle).
Что может быть проще
vertical-align: middle
, на первый взгляд? Но если знать специфику данного свойства, вряд ли можно удивиться полученному в итоге:
№1. Неудачная попытка.
А вот решение: псевдоэлемент с
vertical-align: middle; display: inline-block
и 100% высотой. Но не тут-то было, т.к. вылезает "баг" при использовании
text-align: justify
на контейнер: первый псевдоэлемент, логично, существует, поэтому "распределение блоков"
смещается вправо, что можно увидеть здесь:
№2. Еще одна неудачная попытка.
Далее пробовал сделать это без псевдоэлементов. Додуматься до чего-то лучше использования
vertical-align: top;
position: relative;
top: 50%;
transform: translateY(-50%)
не смог. Это было что-то вроде прозрения: невообразимо просто и, к тому же, работает! Как же радовался я в тот миг, когда увидел своими глазами это:
№3. Казалось бы, удачная попытка.
В чем же подвох? Подвох (в третьем варианте) кроется в убирании фиксированной высоты контейнера! В итоге
top: 50%
перестает работать (по, на самом деле, не очень понятным мне причинам). Это вы тоже можете увидеть:
№3.1. А вот почему нам лишь "Казалось бы...".
Если задать контейнеру
line-height = height
(если у контейнера фиксированная высота), а для дочерних элементов задать
line-height: normal
, все удалось, НО. Принципиально не хочу использовать подобное решение, ибо это больше уже похоже на костыль (это и есть костыль) - это уже
уход от решения:
№4. Откровенный костыль.
Есть предложения, как сделать это нормально?
Специфика вопроса (на самом деле, все просто, но проясню):
- Класс, определяющий вертикальное положение колонки,
вешается на саму колонку;
- Вертикальное позиционирование никак не должно влиять на горизонтальное (все тот же
text-align: justify
, допустим);
- Псевдоэлементы в контейнере очень нежелательны (при вертикальном позиционировании);
- JavaScript - моветон, потому что это не CSS (логично:)).
Заранее спасибо за помощь. Очень надеюсь, что кто-то покажет "хороший путь" в решении данного вопроса.