Сейчас мы с вами будем разбираться со свойствами margin и padding, которые задают отступы между элементами сайта. Давайте посмотрим, в чем между ними разница и как эти свойства применяются на практике.

Блок . Свойство margin

Итак, свойство margin задает отступ снаружи от границы элемента.

Давайте посмотрим, как это выглядит на практике.

Для начала приведу вам два вложенных друг в друга блока без margin (они слипнутся и мы увидим двойную границу):

<div id="red">
	<div id="green">

	</div>
</div>
#red {
	width: 300px;
	border: 1px solid red;
}
#green {
	height: 100px;
	border: 1px solid green;
}

Так код будет выглядеть в браузере:

А теперь давайте зададим margin в 30px внутреннему блоку:

<div id="red">
	<div id="green">

	</div>
</div>
#red {
	width: 300px;
	border: 1px solid red;
}
#green {
	height: 100px;
	border: 1px solid green;
	margin: 30px;
}

Так код будет выглядеть в браузере:

Для определенной стороны

Отступ margin можно также задавать для определенных сторон. Для этого существуют следующие свойства: свойство margin-left для левого отступа, margin-right для правого, margin-top для верхнего и margin-bottom для нижнего.

Давайте поставим левый отступ в 30px с помощью margin-left:

<div id="red">
	<div id="green">

	</div>
</div>
#red {
	width: 300px;
	border: 1px solid red;
}
#green {
	height: 100px;
	border: 1px solid green;
	margin-left: 30px;
}

Так код будет выглядеть в браузере:

А теперь верхний отступ в 30px с помощью margin-top:

<div id="red">
	<div id="green">

	</div>
</div>
#red {
	width: 300px;
	border: 1px solid red;
}
#green {
	height: 100px;
	border: 1px solid green;
	margin-top: 30px;
}

Так код будет выглядеть в браузере:

А сейчас одновременно правый отступ 30px с помощью margin-right и нижний отступ 10px с помощью margin-bottom

<div id="red">
	<div id="green">

	</div>
</div>
#red {
	width: 300px;
	border: 1px solid red;
}
#green {
	height: 100px;
	border: 1px solid green;
	margin-right: 30px;
	margin-bottom: 10px;
}

Так код будет выглядеть в браузере:

Блок . Альтернативный вариант для разных сторон

Подобно другим свойствам CSS, свойство margin может принимать не только одно значения, но и два, три или четыре. В этом случае разные значения задают отступы для разных сторон.

Четыре значения

Давайте посмотрим на примере, как работает margin, когда ему задано четыре значения. Пусть у нас сделано так: margin: 10px 20px 30px 40px. В этом случае 10px это отступ сверху, 20px - справа, 30px - снизу, 40px - слева. То есть мы начинаем сверху и идем по часовой стрелке: верх-право-низ-лево.

Этому правилу следует подавляющее большинство CSS свойств (кроме border-radius, у него все начинается с верхнего левого угла и тоже идет по часовой стрелке, то есть, в принципе, и тут все похоже).

<div id="red">
	<div id="green">

	</div>
</div>
#red {
	width: 300px;
	border: 1px solid red;
}
#green {
	height: 100px;
	border: 1px solid green;
	margin: 10px 20px 30px 40px;
}

Так код будет выглядеть в браузере:

Два значения

Если передать свойству margin два значения, то первое будет задавать отступ одновременно сверху и снизу, а второе - одновременно и справа, и слева.

Давайте посмотрим пример:

<div id="red">
	<div id="green">

	</div>
</div>
#red {
	width: 300px;
	border: 1px solid red;
}
#green {
	height: 100px;
	border: 1px solid green;
	margin: 10px 30px;
}

Так код будет выглядеть в браузере:

Три значения

Ну, и наконец, если передать свойству margin три значения, то первое будет задавать отступ сверху, третье - отступ снизу, а второе - одновременно отступ слева и справа.

Давайте посмотрим пример:

<div id="red">
	<div id="green">

	</div>
</div>
#red {
	width: 300px;
	border: 1px solid red;
}
#green {
	height: 100px;
	border: 1px solid green;
	margin: 10px 20px 30px;
}

Так код будет выглядеть в браузере:

Значение auto

Свойство margin применяется не только для задания отступов, но и для центрирования блочных элементов. Для этого правый и левый margin следует задать в значение auto.

В примере ниже внутренний блок станет по центру:

<div id="red">
	<div id="green">

	</div>
</div>
#red {
	width: 100%;
	border: 1px solid red;
}
#green {
	height: 100px;
	width: 200px;
	border: 1px solid green;
	margin-top: 10px;
	margin-bottom: 10px;
	margin-left: auto;
	margin-right: auto;
}

Так код будет выглядеть в браузере:

Имейте ввиду, что таким образом можно центрировать только блочные элементы (для строчных используйте text-align), только по горизонтали и только, если им задана ширина.

Давайте перепишем пример в сокращенной форме через одно свойство-сокращение margin (первое значение будет задавать верх-низ, а втрое - право-лево):

<div id="red">
	<div id="green">

	</div>
</div>
#red {
	width: 100%;
	border: 1px solid red;
}
#green {
	height: 100px;
	width: 200px;
	border: 1px solid green;
	margin: 10px auto;
}

Так код будет выглядеть в браузере:

Если нам нужны разные верхний и нижний отступ margin, то можно передать три значения: первое задаст верхний отступ, третье - нижний, а второе задаст значение auto для правого и левого отступов:

<div id="red">
	<div id="green">

	</div>
</div>
#red {
	width: 100%;
	border: 1px solid red;
}
#green {
	height: 100px;
	width: 200px;
	border: 1px solid green;
	margin: 30px auto 10px;
}

Так код будет выглядеть в браузере:

В принципе, можно написать и четыре значения таким образом: margin: 30px auto 10px auto, но с тремя значениями писать все-таки меньше (зато сложнее понять).

Блок . Свойство padding

Мы с вами разобрали свойство margin, которое делает отступ наружу от границы. Существует также очень похожее свойство padding, которое делает отступ вовнутрь от границы.

Работает оно по такому же принципу - есть свойства padding-left, padding-right, padding-top и padding-bottom, которые задают отступ для разных сторон. Также для свойства padding можно задавать 1, 2, 3 или 4 значения по такому же принципу, как и в margin.

Единственное отличие - это то, что значения auto для свойства padding не существует.

Давайте теперь посмотрим на примерах, как работает свойство padding. Для начала приведу блок без отступов (у него текст прилип к границам):

<div></div>
div {
	width: 300px;
	border: 1px solid red;
	text-align: justify;
}

Так код будет выглядеть в браузере:

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean a dapibus magna, ac interdum nisl. Suspendisse eget fringilla nibh, eu commodo arcu. Donec lacinia tempor velit sed tincidunt. Aliquam porttitor nulla purus, vel vulputate ipsum faucibus sed. Phasellus sodales, lorem vel cursus vehicula, ante purus lacinia dui, interdum fringilla massa eros ut dui.

А теперь зададим padding в 30px для всех сторон:

<div></div>
div {
	width: 300px;
	border: 1px solid red;
	text-align: justify;
	padding: 30px;
}

Так код будет выглядеть в браузере:

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean a dapibus magna, ac interdum nisl. Suspendisse eget fringilla nibh, eu commodo arcu. Donec lacinia tempor velit sed tincidunt. Aliquam porttitor nulla purus, vel vulputate ipsum faucibus sed. Phasellus sodales, lorem vel cursus vehicula, ante purus lacinia dui, interdum fringilla massa eros ut dui.

Свойство padding для определенной стороны

Давайте зададим отступы, используя padding-left, padding-right, padding-top и padding-bottom:

<div></div>
div {
	width: 300px;
	border: 1px solid red;
	text-align: justify;
	padding-top: 10px; /* сверху */
	padding-right: 20px; /* справа */
	padding-bottom: 30px; /* снизу */
	padding-left: 40px; /* слева */
}

Так код будет выглядеть в браузере:

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean a dapibus magna, ac interdum nisl. Suspendisse eget fringilla nibh, eu commodo arcu. Donec lacinia tempor velit sed tincidunt. Aliquam porttitor nulla purus, vel vulputate ipsum faucibus sed. Phasellus sodales, lorem vel cursus vehicula, ante purus lacinia dui, interdum fringilla massa eros ut dui.

Блок . Свойство padding для разных сторон

Следующие примеры показывают, как работает padding, если передать ему два, три или четыре параметра. В этих случаях он работает аналогично свойству margin, поэтому комментариев к примерам я не буду делать, просто изучите их:

Четыре значения

<div></div>
div {
	width: 300px;
	border: 1px solid red;
	text-align: justify;
	padding: 10px 20px 30px 40px;
}

Так код будет выглядеть в браузере:

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean a dapibus magna, ac interdum nisl. Suspendisse eget fringilla nibh, eu commodo arcu. Donec lacinia tempor velit sed tincidunt. Aliquam porttitor nulla purus, vel vulputate ipsum faucibus sed. Phasellus sodales, lorem vel cursus vehicula, ante purus lacinia dui, interdum fringilla massa eros ut dui.

Два значения

<div></div>
div {
	width: 300px;
	border: 1px solid red;
	text-align: justify;
	padding: 60px 30px;
}

Так код будет выглядеть в браузере:

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean a dapibus magna, ac interdum nisl. Suspendisse eget fringilla nibh, eu commodo arcu. Donec lacinia tempor velit sed tincidunt. Aliquam porttitor nulla purus, vel vulputate ipsum faucibus sed. Phasellus sodales, lorem vel cursus vehicula, ante purus lacinia dui, interdum fringilla massa eros ut dui.

Три значения

<div></div>
div {
	width: 300px;
	border: 1px solid red;
	text-align: justify;
	padding: 10px 20px 30px;
}

Так код будет выглядеть в браузере:

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean a dapibus magna, ac interdum nisl. Suspendisse eget fringilla nibh, eu commodo arcu. Donec lacinia tempor velit sed tincidunt. Aliquam porttitor nulla purus, vel vulputate ipsum faucibus sed. Phasellus sodales, lorem vel cursus vehicula, ante purus lacinia dui, interdum fringilla massa eros ut dui.

Блок . Расширение элемента

По умолчанию добавление padding расширяет элемент: если мы задали ширину width 100px и padding-left в 20px, то реальная ширина элемента будет 120px. А если мы зададим еще и border-left в 10px, то реальная ширина элемента станет 130px. То есть и padding, и border расширяют блок (и по ширине, и по высоте).

В следующем примере оба блока имеют одинаковую высоту и ширину, однако у второго блока padding задан, а у первого - нет. Посмотрите, как отличаются их размеры:

width: 300px; height: 100px; padding: 0px.
width: 300px; height: 100px; padding: 50px.

А сейчас оба блока имеют одинаковую высоту и ширину, однако у второго блока задана граница в 20px, а у первого - нет. Посмотрите, как отличаются их размеры:

width: 300px; height: 100px;
width: 300px; height: 100px; border: 20px solid black;

Блок . Свойства outline и box-sizing

Если вам мешает расширение блоков из-за padding и границы, их поведение можно исправить свойствами outline (используется вместо границы) и box-sizing (отменяет расширение блоков).

Изучите внимательно эти свойства по ссылкам, в дальнейшем они вам пригодятся.

Блок . Работа с маркерами списков

Мы с вами еще в начале книги разбирались со списками ul и ol и вы наверняка помните о том, что список ul имеет маркеры в виде точек, а ol - в виде цифр. Однако, вид этих маркеров можно сменить или даже убрать их совсем.

Например, для списка ul можно сделать маркеры в виде квадратов или кружков, а для списка ol - нумерацию не только в виде цифр, а в виде латинских или греческих букв.

Делается это с помощью свойства list-style-type. Давайте посмотрим, какие значения оно может принимать для списка ul:

Значение square

Значение square позволяет сделать маркеры в виде квадратиков:

ul {
	list-style-type: square;
}
<ul>
	<li>Первый пункт.</li>
	<li>Второй пункт.</li>
	<li>Третий пункт.</li>
	<li>Четвертый пункт.</li>
	<li>Пятый пункт.</li>
</ul>

Так код будет выглядеть в браузере:

  • Первый пункт.
  • Второй пункт.
  • Третий пункт.
  • Четвертый пункт.
  • Пятый пункт.

Значение circle

Значение circle позволяет сделать маркеры в виде кружков:

ul {
	list-style-type: circle;
}
<ul>
	<li>Первый пункт.</li>
	<li>Второй пункт.</li>
	<li>Третий пункт.</li>
	<li>Четвертый пункт.</li>
	<li>Пятый пункт.</li>
</ul>

Так код будет выглядеть в браузере:

  • Первый пункт.
  • Второй пункт.
  • Третий пункт.
  • Четвертый пункт.
  • Пятый пункт.

Значение disc

Значение disc делает маркеры в виде закрашенных кружков (это значение по умолчанию):

ul {
	list-style-type: disc;
}
<ul>
	<li>Первый пункт.</li>
	<li>Второй пункт.</li>
	<li>Третий пункт.</li>
	<li>Четвертый пункт.</li>
	<li>Пятый пункт.</li>
</ul>

Так код будет выглядеть в браузере:

  • Первый пункт.
  • Второй пункт.
  • Третий пункт.
  • Четвертый пункт.
  • Пятый пункт.

Значение none

Значение none убирает маркеры совсем:

ul {
	list-style-type: none;
}
<ul>
	<li>Первый пункт.</li>
	<li>Второй пункт.</li>
	<li>Третий пункт.</li>
	<li>Четвертый пункт.</li>
	<li>Пятый пункт.</li>
</ul>

Так код будет выглядеть в браузере:

  • Первый пункт.
  • Второй пункт.
  • Третий пункт.
  • Четвертый пункт.
  • Пятый пункт.

Значения для списка ol

Для списка ol дело обстоит аналогичным образом, только там применяются свои значения. Давайте, например, вместо обычных цифр сделаем римские:

ul {
	list-style-type: lower-roman;
}
<ol>
	<li>Первый пункт.</li>
	<li>Второй пункт.</li>
	<li>Третий пункт.</li>
	<li>Четвертый пункт.</li>
	<li>Пятый пункт.</li>
</ol>

Так код будет выглядеть в браузере:

  1. Первый пункт.
  2. Второй пункт.
  3. Третий пункт.
  4. Четвертый пункт.
  5. Пятый пункт.

А теперь сделаем нумерацию не числами, а маленькими латинскими буквами:

ul {
	list-style-type: lower-alpha;
}
<ol>
	<li>Первый пункт.</li>
	<li>Второй пункт.</li>
	<li>Третий пункт.</li>
	<li>Четвертый пункт.</li>
	<li>Пятый пункт.</li>
</ol>

Так код будет выглядеть в браузере:

  1. Первый пункт.
  2. Второй пункт.
  3. Третий пункт.
  4. Четвертый пункт.
  5. Пятый пункт.

Весь список возможных значений для ol очень большой и я не буду приводить его здесь. Смотрите его в справочнике CSS для свойства list-style-type.

Блок . Маркер в виде картинки

Можно также задавать свои маркеры. Для этого необходимо иметь картинку, которую вы бы хотели сделать для маркеров списка, и подключить ее с помощью свойства list-style-image: url("путь к картинке").

Смотрите пример:

ul {
	list-style-image: url("li.gif");
}
<ul>
	<li>Первый пункт.</li>
	<li>Второй пункт.</li>
	<li>Третий пункт.</li>
	<li>Четвертый пункт.</li>
	<li>Пятый пункт.</li>
</ul>

Так код будет выглядеть в браузере:

  • Первый пункт.
  • Второй пункт.
  • Третий пункт.
  • Четвертый пункт.
  • Пятый пункт.

Блок . Позиция маркеров списков

По умолчанию маркеры списка не входят в сам список.

Чтобы понять, что имеется ввиду, давайте разберем следующий пример. В данном случае тегу ul обнулен padding и, казалось бы, маркеры списка должны прижиматься к границе блока, но они вылазят наружу! Это говорит о том, что не они реагируют на padding, а текст списка:

div {
	border: 1px solid red;
}

ul {
	padding: 0;
	list-style-position: outside;
}
<div>
	<ul>
		<li>Первый пункт.</li>
		<li>Второй пункт.</li>
		<li>Третий пункт.</li>
		<li>Четвертый пункт.</li>
		<li>Пятый пункт.</li>
	</ul>
</div>

Так код будет выглядеть в браузере:

  • Первый пункт.
  • Второй пункт.
  • Третий пункт.
  • Четвертый пункт.
  • Пятый пункт.

Такое поведение можно поменять, если воспользоваться свойством list-style-position, которое принимает два значения: outside (то, что мы видим по умолчанию) и значение inside, которое делает так, что маркеры оказываются внутри списка:

div {
	border: 1px solid red;
}

ul {
	padding: 0;
	list-style-position: inside;
}
<div>
	<ul>
		<li>Первый пункт.</li>
		<li>Второй пункт.</li>
		<li>Третий пункт.</li>
		<li>Четвертый пункт.</li>
		<li>Пятый пункт.</li>
	</ul>
</div>

Так код будет выглядеть в браузере:

  • Первый пункт.
  • Второй пункт.
  • Третий пункт.
  • Четвертый пункт.
  • Пятый пункт.

Блок . Свойство list-style

Существует также свойство-сокращение list-style, которое позволяет одновременно задать тип маркера, его позицию и картинку.

Блок . Ограничение высоты и ширины

Изучите свойства по следующим ссылкам: min-width, max-width, min-height, max-height.

Блок . Свойство display

Посмотрите видео по работе со свойством display. Это нужно сделать обязательно, иначе вы не сможете решать практические задачи.

Блок . Свойство float

Посмотрите видео по работе со свойством float. Это нужно сделать обязательно, иначе вы не сможете решать практические задачи.