</> Praktum

Главная / CSS / CSS border

Справочник · CSS

border: рамка элемента

Редакция PraktumОбновлено 6 мин чтенияУровень: новичок

Свойство border рисует рамку вокруг элемента. Это короткая запись трёх свойств: толщины border-width, стиля border-style и цвета border-color — например, border: 1px solid #d9d3c7. Без стиля рамка не появится: по умолчанию он none.

Коротко
  • border: 1px solid #ccc — толщина, стиль, цвет в одной записи.
  • Без стиля (solid, dashed…) рамки нет, даже если задана толщина.
  • Стороны отдельно: border-top, border-bottom и т. д.
  • С box-sizing: border-box рамка входит в заданную ширину.
  • Для рамки фокуса удобнее outline: он не сдвигает соседей.

Минимальный пример

.card {
  border: 1px solid #e5e7eb;
  border-radius: 12px;
}
.card-footer {
  border-top: 1px dashed #cbd5e1;
}

Карточка получила тонкую сплошную рамку и скругление, а подвал карточки — пунктирную линию сверху. Порядок значений в короткой записи не важен, но привычно писать «толщина стиль цвет».

Из чего состоит border

Свойства рамки
СвойствоПо умолчаниюПримеры
border-widthmedium (около 3px)1px, 2px, thin
border-stylenonesolid, dashed, dotted, double
border-colorцвет текста (currentColor)#e5e7eb, transparent

Если цвет не указан, рамка берёт цвет текста элемента. Это удобно: border: 1px solid у ссылки-кнопки будет того же цвета, что и надпись, и поменяется вместе с ней.

Стили рамки

Значения border-style
СтильКак выглядит
solidсплошная линия
dashedштрихи
dottedточки
doubleдве линии; нужна толщина от 3px
groove, ridge, inset, outsetобъёмные эффекты — выглядят устаревшими
none, hiddenнет рамки

Отдельные стороны

.tab { border-bottom: 2px solid transparent; }
.tab.is-active { border-bottom-color: #2a62d9; }

.quote {
  border-left: 4px solid #2a62d9;
  padding-left: 16px;
}

.box {
  border: 1px solid #ddd;
  border-bottom: 0;          /* убрать только нижнюю */
}

Для каждой стороны есть своё свойство: border-top, border-right, border-bottom, border-left, а у каждого — свои width, style и color. Прозрачная рамка у неактивной вкладки резервирует место: при переключении на активную текст не прыгает на 2 пикселя. Логические аналоги border-block и border-inline не зависят от направления письма.

Короткая запись по сторонам

.box { border-width: 1px 2px; }            /* верх и низ 1px, бока 2px */
.box { border-color: #ddd #ddd #2a62d9; }   /* верх, бока, низ */
.box { border-style: solid dashed solid dotted; }

Как у margin и padding: одно значение — всем сторонам, два — верх/низ и бока, три — верх, бока, низ, четыре — по часовой стрелке от верхней.

Рамка и ширина элемента

*, *::before, *::after { box-sizing: border-box; }

.field {
  width: 100%;
  border: 2px solid #cbd5e1;
  padding: 10px;
}

По умолчанию (content-box) рамка добавляется к ширине: блок с width: 100% и рамкой 2px окажется на 4px шире родителя и вылезет. С box-sizing: border-box рамка и padding входят в заданную ширину. Подробнее — на странице box-sizing.

Линия-разделитель между элементами

.list li + li { border-top: 1px solid #e5e7eb; }
/* или */
.list li:not(:last-child) { border-bottom: 1px solid #e5e7eb; }

Разделитель между пунктами списка ставят через соседний селектор или :not(:last-child): так у первого и последнего пункта не появляется лишней линии по краю.

Рамка без рамки: прозрачный цвет и треугольник

.tooltip::after {
  content: "";
  position: absolute;
  top: 100%;
  left: 16px;
  border: 8px solid transparent;
  border-top-color: #171923;   /* треугольник вниз */
}

Рамки соседних сторон сходятся по диагонали. Если у пустого элемента три стороны прозрачные, а одна цветная, получается треугольник — классический «хвостик» подсказки. Сейчас то же можно сделать через clip-path, но приём с рамкой встречается во многих проектах.

border, outline и box-shadow

Три способа обвести элемент
СвойствоЗанимает местоСкруглениеДля чего
borderда, влияет на размердапостоянная рамка карточек, полей
outlineнет, рисуется поверхв современных браузерах — по border-radiusрамка фокуса
box-shadow: 0 0 0 2pxнетдаподсветка без сдвига соседей

Если рамка появляется только при наведении или фокусе, бери outline или тень: border добавит пиксели и сдвинет соседние элементы.

border или outline

border

Постоянная часть оформления: рамка карточки, поля, таблицы. Занимает место в раскладке.

outline

Временная подсветка: фокус клавиатуры, отладка. Не меняет размер и не сдвигает соседей.

Частые ошибки

  • Задают толщину и цвет, но забывают стиль — рамки нет.
  • Добавляют рамку при наведении через border, и соседние элементы прыгают.
  • Не учитывают рамку в ширине: блок с width: 100% вылезает за родителя.
  • Ставят рамку каждому абзацу и карточке — интерфейс становится шумным.
  • Пишут double толщиной 1px, и вторая линия не видна.

Доступность

Рамка полей формы должна быть заметной: контраст границы поля с фоном не ниже 3:1, иначе люди со слабым зрением не видят, где поле. Не передавай состояние только цветом рамки (красная — ошибка): добавь текст. Для фокуса не убирай outline без замены.

Поддержка браузерами

border и все его части работают во всех браузерах. Логические свойства border-block и border-inline поддерживаются актуальными версиями. То, что outline повторяет border-radius, появилось в браузерах недавно — в старых версиях он рисуется прямоугольником.

Практика

Сделай карточку с рамкой 1px и скруглением 12px, цитату с цветной полосой 4px слева и вкладки, у которых активная подчёркнута линией 2px, а при переключении текст не прыгает. Между пунктами списка поставь разделители без линии у последнего.

Показать решение
.card { border: 1px solid #e5e7eb; border-radius: 12px; }
.quote { border-left: 4px solid #2a62d9; padding-left: 16px; }
.tab { border-bottom: 2px solid transparent; }
.tab.is-active { border-bottom-color: #2a62d9; }
.list li:not(:last-child) { border-bottom: 1px solid #e5e7eb; }

Открыть песочницу

Частые вопросы

Почему не видно рамку?

Не задан стиль. По умолчанию border-style равен none, поэтому нужна запись вроде border: 1px solid #ccc.

Как сделать рамку только снизу?

border-bottom: 1px solid #ccc. Для остальных сторон — border-top, border-left и border-right.

Почему блок стал шире из-за рамки?

По умолчанию рамка добавляется к ширине. Поставь box-sizing: border-box, и рамка войдёт в заданный размер.

Чем border отличается от outline?

border занимает место и влияет на размер элемента, outline рисуется поверх и никого не сдвигает. outline удобен для рамки фокуса.

Как сделать скруглённую рамку?

Добавь border-radius: оно скругляет и рамку, и фон.

Источники

Ещё в разделе CSS