Разница между контуром и границей

195

Кто-нибудь знает о какой-либо разнице между свойствами 'border' и 'outline' в CSS? Если нет никакой разницы, то почему есть два свойства для одной и той же вещи?

Кшитий Саксена -KJ-
источник

Ответы:

199

От: http://webdesign.about.com/od/advancedcss/a/outline_style.htm

Свойство CSS CSS - это запутанное свойство. Когда вы впервые узнаете об этом, трудно понять, как это даже отдаленно отличается от свойства border. W3C объясняет это тем, что имеет следующие отличия:

1. Контуры не занимают места.

2. Планы могут быть не прямоугольными.

Хаим Евги
источник
1
Ссылка объяснила это. Спасибо :)
Kshitij Saxena -KJ-
2
@Manu, кажется, контур рисуется внутри элемента, а границы появляются за его пределами.
Ман
51

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

1) Закругленные углы

borderподдерживает закругленные углы с border-radiusсобственностью. outlineне делает.

FIDDLE

(Примечание: хотя у firefox есть -moz-outline-radiusсвойство, которое позволяет скруглять углы на контуре ... это свойство не определено ни в одном стандарте CSS и не поддерживается другими браузерами ( источник ))

2) Укладка только на одну сторону

граница имеет свойства стиля каждой стороны с border-top:, и border-left:т.д.

контур не может этого сделать. Там нет контура сверху и т. Д. Это все или ничего. (см. этот пост )

3) смещение

outline поддерживает смещение с помощью свойства outline-offset . граница не

FIDDLE

Примечание. Поддерживаются все основные браузеры, outline-offsetкроме Internet Explorer.

Danield
источник
Да, я понимаю, что вы говорите, я пытался изменить радиус границы моей кнопки, но теперь мой контур на фокусе не оборачивается вокруг кнопки.
Радтек
1
@ Данилд, хотя технически все, что ты говоришь, правильно, дух вопроса был другим. Зачем наброски, когда у нас уже есть граница. И ответ - набросок выпадает за рамки модели.
0
2
@ user247077 - Я не согласен. Для ОП и контур, и граница кажутся одинаковыми. Поэтому он хочет знать как можно больше различий между ними. Некоторые другие различия уже были опубликованы в других ответах, поэтому я решил добавить другие, которые еще не были перечислены.
Данилд
1
Значит ли это, что outlinesбыстрее рендерить, чем границы?
Уткарш Синха
38

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

Если вы пытаетесь выяснить, почему элемент не появляется там, где вы ожидали, или в ожидаемом размере, добавьте несколько контуров и посмотрите, где находятся эти элементы.

Как уже упоминалось, контуры не занимают места. Когда вы добавляете границу, общая ширина / высота элемента в документе увеличивается, но этого не происходит с контуром. Также вы не можете устанавливать контуры на определенных сторонах, таких как границы; это все или ничего.

DisgruntledGoat
источник
17

tldr;

W3C объясняет это тем, что имеет следующие отличия:

  • Контуры не занимают места.
  • Контуры могут быть не прямоугольными.

Источник

Схема должна быть использована для доступности

Следует также отметить, что основной целью плана является доступность. Установка его в общих чертах: ни один не следует избегать.

Если вы должны удалить его, может быть, лучше предложить альтернативный стиль:

Я видел довольно много советов о том, как убрать индикатор фокуса, используя контур: нет или контур: 0. Пожалуйста, не делайте этого, если только вы не замените контур чем-то другим, что позволяет легко увидеть, какой элемент имеет фокус клавиатуры. Удаление визуального индикатора фокуса клавиатуры даст людям, которые полагаются на навигацию с помощью клавиатуры, очень сложную навигацию и использование вашего сайта.

Источник: «Не удаляйте контур из элементов управления ссылками и формами», ул. Береа, 365


Больше ресурсов

chrisjlee
источник
8

Практическое использование набросков касается прозрачности. Если у вас есть родительский элемент с фоном, но вы хотите, чтобы граница дочернего элемента была прозрачной, чтобы фон родительского элемента просвечивал, вы должны использовать «контур» вместо «граница». Хотя граница может быть прозрачной, на ней будет отображаться фон ребенка, а не родитель.

Другими словами, этот параметр создал следующий эффект:

outline: 7px solid rgba(255, 255, 255, 0.2);

введите описание изображения здесь

Nate
источник
2
Не вся история, граница также может иметь тот же эффект, если вы добавите background-clip: padding-box;в свой стиль .. :)
Dennis98
4

С сайта школы W3

В CSS пограничные свойства позволяют определить стиль и цвет границы элемента.

План является линия , которая рисуется вокруг элемента (за пределами границ) , чтобы сделать элемент «выделиться».

Сокращенное свойство структуры устанавливает все свойства структуры в одном объявлении.

Свойства, которые можно установить: (по порядку): контурный цвет, контурный стиль, контурная ширина.

Если одно из указанных выше значений отсутствует, например, "outline: solid # ff0000;", будет добавлено значение по умолчанию для отсутствующего свойства, если оно есть.

Проверьте здесь для получения дополнительной информации: http://webdesign.about.com/od/advancedcss/a/outline_style.htm

Джо
источник
4

Немного старый вопрос, но стоит упомянуть об ошибке рендеринга в Firefox (все еще присутствующей на январь '13), когда контур будет визуализироваться снаружи всех дочерних элементов, даже если они переполняют своих родителей (через отрицательные поля, box-shadows) , и т.д.)

Вы можете исправить это с помощью:

.container {
    position: relative;
}
.container:before {
   content: '';
   margin: 0;
   padding: 0;
   position: absolute;
   top: 0;
   left: 0;
   width: 100%;
   height: 100%;
   outline: 1px solid #ff0000;
}

Очень жаль, что это все еще не исправлено. Я очень предпочитаю контуры во многих случаях, так как они не увеличивают размеры элемента, избавляя вас от необходимости учитывать ширину границы при настройке размеров элемента.

В конце концов, что проще?

.container {
    width: 960px;
    height: 300px;
    outline: 3px solid black;
}

Или:

.container {
    width: 954px;
    height: 294px;
    border: 3px solid black;
}
pspahn
источник
1
Если вы еще этого не сделали, box-sizingпопробуйте! ссылка
Брендан
Примеры внизу этого ответа не дают идентичных результатов. Первый дает коробку 960 * 300 с контуром 3 пикселя, который покрывает все, что находится вне коробки. Второй дает 954 * 294 коробку с контуром 3px, который ничего не покрывает
Питер Р
3

Стоит также отметить, что контур W3C является границей IE, поскольку IE не реализует блочную модель W3C.

В блочной модели w3c граница не зависит от ширины и высоты элемента. В IE это включено.

Максим Слойко
источник
Это не верно для IE10. - И кажется, что вы смешиваете модели размеров коробки и тот факт, что контуры вообще не занимают места, независимо от выбранной модели.
Роберт Симер
1

Я сделал небольшой кусочек кода CSS / HTML, чтобы увидеть разницу между ними.

outlineЛучше включать потенциальные переполненные дочерние элементы, особенно во встроенный контейнер.

borderгораздо более приспособлен для блочных элементов.

Скрипка для вас, сэр!

Александр Жермен
источник
1

Свойство outline в CSS рисует линию вокруг внешней части элемента. Это похоже на границу, за исключением того, что:

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

Источник: https://css-tricks.com/almanac/properties/o/outline/

Ренганатан М.Г.
источник
1

В качестве практического примера использования «контура», слабая пунктирная граница, которая следует за фокусом системы на веб-странице (например, если вы переходите по ссылкам), может управляться с помощью свойства outline (по крайней мере, я знаю, что это возможно в Firefox , не пробовал другие браузеры).

Обычный метод «замены изображения» заключается в использовании, например:

<div id="logo"><a href="/">Foo Widgets Ltd.</a></div>

со следующим в CSS:

#logo
{
    background: url(/images/logo.png) center center no-repeat;
}
#logo a
{
    display: block;
    text-indent: -1000em;
}

Проблема в том, что когда фокус достигает метки, контур отклоняется от 1000em влево. Контур может позволить вам отключить контур фокуса на таких элементах.

Я считаю, что панель инструментов разработчика IE также использует что-то вроде контура "под капотом" при выделении элементов для проверки в режиме "выбор". Это хорошо показывает тот факт, что «контур» не занимает места.

Мэтт Сах
источник
Я хотел бы знать, кто изобрел эту технику замены изображения и почему. Похоже, его единственная цель состоит в том, чтобы заставить текст исчезать для всех, у кого отключены изображения. Что не так с нормальным изображением, с соответствующим альтернативным текстом?
Стюарт
Это (сейчас довольно дискредитированный по той же причине, о которой вы упомянули) метод Фарка, который был адаптацией Fahrner Image Replacement . Я просто использовал это как быстрый способ демонстрации практического применения того, почему кто-то может захотеть изменить схему фокуса :)
Matt Sach
1

Подумайте о контуре как о границе, которую проектор рисует вне чего-либо, поскольку граница - это реальный объект вокруг этой вещи.
проекция может легко перекрываться, но граница не позволяет вам пройти.
в некоторых случаях, когда я использую grid+%width, border изменяет масштабирование порта представления, например, div с width:100%родительским width:100pxэлементом, полностью заполняет родительский, но когда я добавляю border:solid 5pxк div, это уменьшает размер div, чтобы освободить место для границы (хотя это редко и обходной путь!),
но с контуром у него нет этой проблемы, так как контур более виртуален: D это просто линия вне элемента, но проблема в том, что если вы не сделаете интервалы должным образом, он будет перекрываться с другим содержимым.

короче говоря:
нарисуйте плюсы:
не мешайте с пробелами и позициями
минусы:
высокая вероятность совпадения

Хади Базми
источник
1

Различия между границей и контуром:

Граница является частью блочной модели, поэтому она учитывает размер элемента. Контур не является частью блочной модели, поэтому он не влияет на соседние элементы.

Демо-версия:

#border {
  border: 10px solid black;
}
#outline {
  outline: 10px solid black;
}
<html>
<body>
<span id="border">Border</span>Other text<br><br>
<span id="outline">Outline</span>Other text
</body>
</html>

Другие отличия:
контур отображается за пределами границы.
Контуры не могут иметь закругленные углы; границы могут.

Анонимный программист CSS
источник
-2

Скопировано из W3Schools:

Определение и использование

Контур - это линия, которая рисуется вокруг элементов (за пределами границ), чтобы элемент выделялся.

usoban
источник
Это не объясняет разницу между двумя, только то, что outlineесть
Каспар Ли