Свойство
очень хорошо для решения задачи установления дистанции между элементами, но знаете ли вы, что отрицательные
1 marginмогут не увеличивать, а сокращать расстояние между элементами, вплоть до того, что эти элементы будут перекрывать друг друга.
1 margin
Создадим простой пример и для этого предположим, что у нас есть страница, на которой элемент после заголовка
всегда должен находиться непосредственно под ним. Самый распространенный пример из практики для этого случая, когда первый параграф, идущий сразу же после заголовка, не имеет пустого пространства (blank line) между собой и этим параграфом.1
h2
Решения такого вопроса два.
Первый способ - это воспользоваться смежными селекторами.
Второй способ, представленный на рисунке ниже, это применить отрицательный
для 1
margin-bottom
:1
h2
Можно подумать, что у параграфа, который следует сразу за заголовком, отсутствует
, но это не так. 1
margin-top
никуда не пропадал.1
Margin-top
Он просто оказался перекрытым заголовком
, у которого край 1
h2
находится в непосредственной близости от края текста самого заголовка. Параграф и его собственный 1
margin-bottom
располагаются сразу под ним, а не у нижнего края границы заголовка.1
margin
Такой прием полезен на практике в случае, когда необходимо расположить часть контента “на одной линии”. Почему слово на одной линии заключено в кавычки - потому-что контент только визуально располагается на одной линии.
Предположим, у нас есть список (HTML-разметка):
В этом списке нам необходимо расположить оба пункта так, чтобы они находились на горизонтальной линии. Визуально это можно увидеть так, как изображено на рисунке ниже.
Такую задачу можно выполнить обычным способом - через
(прим. переводчика - я бы так и поступил, разбросал оба 1
float
по разным углам блока 1
li
через 1
ul
и 1
float: left
) для обоих пунктов.1
float: right
Но можно решить такую задачу другим способом:
В этом примере отрицательный
величиной в 1
margin-top
“поднимает” элемент 1
-1em
вверх ровно на высоту строки, установленную нами ранее в правиле 1
li.next
.1
line-height: 1
Прим. переводчика: очень понравилось, о таком способе решения даже не подозревал!
Другим полезным приемом является частичное выдвижение элемента изнутри наружу своего контейнера-родителя. Предположим, у нас стоит задача расположить блок заголовка точно по центру разделительной линии так, как это показано на рисунке ниже:
HTML-разметка такого заголовка будет следующей:
C другой стороны, может потребоваться задача, когда блок заголовка не имеет фиксированной ширины, а ширина задается только его содержимым. В этом случае необходимо добавить всего несколько строк кода в HTML-разметку и CSS-правила, соответственно:
HTML-разметка, в которой добавлен еще один элемент -
:1
span
В этом примере все хорошо работает до тех пор, пока длина текста внутри блока меньше, чем длина разделительной линии. Заголовок разбивается на две линии, сам блок заголовка вмещается вниз от разделительной линии и перестает быть расположенным по центру.
Для этого случая решение с помощью отрицательного
не является самым лучшим. Можно лишь посоветовать убрать верхнюю границу 1
margin-top
у блока-родителя и сделать для него фоновую заливку белого цвета, также. Это будет не совсем то, что нужно; но все же достаточно хорошее решение.1
border-top
Автор статьи: Eric Meyer - “Smashing CSS Professional Techniques for Modern Layout”
На этом все.