Search
Write a publication
Pull to refresh

Несколько границ на одном блоке

Всех приветствую на моём посте. Здесь я вам расскажу о таком интересном и необычном трюке CSS — Как создать несколько границ на одном блоке (не только блоке).

Скажу сразу, мы не будем использовать свойство border, так как у него нет возможности добавлять несколько границ. Нам придётся использовать другие свойства, но пойдём по порядку.

Еще когда спецификация Backgrounds & Borders Level 3 была на стадии разработки стоял огромный вопрос — добавлять ли возможность использовать несколько границ. Разработчики сошлись на мнении что не так часто веб разработчикам не так часто придётся добавлять несколько границ. В крайнем случае они могут воспользоваться border-image. Однако border-image не очень гибки в настройке, поэтому веб-разработчикам приходилось вкладывать несколько элементов в друг друга что бы достичь нужного эффекта. К счастью уже сейчас есть намного более хороший способ

1 Способ — box-shadow


Я думаю многие уже знают как пользоваться свойством box-shadow. Но не многие знают что у него есть 4 параметр, называемый spread radius (радиус размытия). Этот параметр делает тень больше если значение положительное, и меньше если отрицательное.

Положительный радиус размытия в сочетании с нулевым смещением и нулевым размытием создаёт очень уж похожую на рамку тень.

image

Но это наверно не впечатляет так как такую рамку можно создать с использованием того же border.

border: 5px solid red;

Но хорошая новость в том что «теней» можно добавлять несколько, поэтому добавить вторую границу не составит труда.

div {
  margin: 20px;
  width: 100px;
  height: 100px;
  background: #731;
  box-shadow:  0 0 0 5px red, 0 0 0 10px green;
}

image

Только здесь главное помнить что эти тени накладываются на друг друга и поэтому несмотря на то что вторая тень — 10px, в результате она той же ширины что и красная так как 5px зелёной тени закрывает красная тень шириной 5px. Поэтому от зелёной осталось видным только половина.

Решение с box-shadow подходит в больше части случаев, но есть несколько тонкостей работы с ними:

  • Тени работают не так как границы. Они не влияют на окружающий макет, даже если указать box-sizing: border-box. Но имитировать пространство которая бы заняла рамка можно используя поля, то есть margin.
  • Обратите также внимание на то что события мыши (клик, наведение и т. д.) также не умеют перехватываться через такие рамки

2 Способ — outline


В тех случаях если нам нужны только две рамки то можно воспользоваться свойством outline. В этом случае одну рамку мы задаём используя border, а вторую через outline. Плюс использования outline в том что мы можем её настраивать также как и border. То есть мы можем установить стиль второй нашей рамке, тогда как метод box-shadow может создавать только сплошные рамки. Вот как создать рамку из предыдущего примера используя outline:

  margin: 50px;
  width: 100px;
  height: 100px;
  background: #731;
  border: 5px solid red;
  outline: 5px solid green;

Также у outline есть своя особенность. К блоку можно добавить свойство outline-offset в котором можно указать расстояние границы от блока. Также он может принимать отрицательные значения. Вот чего можно добиться отрицательными значениями:

image

div {
  margin: 50px;
  width: 100px;
  height: 100px;
  background: #731;
  outline: 3px dashed #fff;
  outline-offset: -10px;
}

Вы также можете посмотреть видео объяснение, в котором я подробно разбираю как создать несколько рамок:


Спасибо за прочтение. Всем пока!
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.