Контурный радиус?


473

Есть в любом случае получение скругленных углов на наброски из div element, подобно border-radius?


2
Ну, у меня есть блок Div с 2-пиксельной серой границей с 20-пиксельным радиусом границы, я бродил, могу ли я тогда иметь 10-пиксельный аутдин вокруг этой границы, которая следует за границей, а не за квадрат
Marc Guerin

4
Это хороший вопрос. Элемент с border: 5px redи outline: 5px blueи border-radius: 5px, граница округляется, но контур квадратный.
Мэтью Руди

4
Пока что мы можем использовать его только в Firefox:-moz-outline-radius
Войцех Беднарски

Это должно быть частью CSS3 ... Если я думаю об этом - я ненавижу W3C: D
m93a

17
Вы все нуждаетесь box-shadowв своей жизни ..
Мухаммед Умер

Ответы:


539

Старый вопрос сейчас, но это может быть актуально для кого-то с подобной проблемой. У меня было поле ввода с закругленными углами, borderи я хотел изменить цвет контура фокуса. Я не мог приручить ужасный квадрат outlineк элементу управления вводом.

Поэтому вместо этого я использовал box-shadow. Я на самом деле предпочел гладкий вид тени, но тень можно укрепить, чтобы имитировать округлый контур:

 /* Smooth outline with box-shadow: */
    .text1:focus {
        box-shadow: 0 0 3pt 2pt red;
    }

    /* Hard "outline" with box-shadow: */
    .text2:focus {
        box-shadow: 0 0 0 2pt red;
    }
<input type=text class="text1"> 
<br>
<br>
<br>
<br>
<input type=text class="text2">


24
ИМО, это ответ, который вы ищете. Я сделал этот метод, но не забывайте поворачивать ваш контур на 0.
Джон Мортон

2
Это именно то, что я искал, и подходит даже лучше, чем радиус контура.
Zenexer

2
Пример жесткого наброска не работает. Это просто прямоугольник без углового радиуса.
Эрик Айгнер

1
outline: 0нарушает доступность сети; прочитайте outlinenone.com
ianstarz

4
@ianstarz, это нарушает доступность, когда вы не предоставляете альтернативного стиля. box-shadowэто альтернативный стиль (который, как представлено здесь, на самом деле очень похож на outline).
ACJ

85

Обычно я выполняю это, используя псевдоэлемент: after:

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

Вы также можете установить смещение -1px и использовать фоновый линейный градиент (без рамки) для другого эффекта еще раз.

body {
  margin: 20px;
}

a {
  background: #999;
  padding: 10px 20px;
  border-radius: 5px;
  text-decoration: none;
  color: #fff;
  position: relative;
  border: 2px solid #000;
}

a:after {
  content: '';
  display: block;
  position: absolute;
  top: 0;
  bottom: 0;
  left: 0;
  right: 0;
  border-radius: 5px;
  border: 2px solid #ccc;
}
<a href="#">Button</a>


4
Модифицированная и немного более впечатляющая версия: jsfiddle.net/rh6j3cdm .
Давид Хорват

2
Невозможно создать псевдо-поле :: after для поля ввода
Саймон Франзен

спасибо, это ОЧЕНЬ хорошо сработало с набросками поисковых запросов реагирующих сортируемых деревьев!
Монарх Вадия

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

34

Похож на Lea Hayes выше, но вот как я это сделал:

div {
  background: #999;
  height: 100px;
  width: 200px;
  border: #999 solid 1px;
  border-radius: 10px;
  margin: 15px;
  box-shadow: 0px 0px 0px 1px #fff inset;
}
<div></div>

Никакого вложения DIV или jQuery не требуется, хотя для краткости я исключил варианты -moz и -webkit некоторых CSS. Вы можете увидеть результат выше


6
Он говорит о плане, а не о границе ... «очертания» радиуса
android.nick

5
правильно, но так как контур-радиус недоступен, мой метод дает вид границы, а также контур. Это визуальный эффект, поэтому, если дизайн Марка не указан в пикселях, тот факт, что он фактически не использует свойство структуры, не имеет значения. И поскольку это практическое решение, я был бы признателен за голосование назад
Heraldmonkey

2
Это сработало отлично. Я не использовал inset, однако, и получил то, что хотел.
Пол Шрайбер

18

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

     a.dropdown-toggle:focus {
         display: inline-block;
         box-shadow: 0 0 0 2px #88b8ff;
         border-radius: 2px;
     }
<a href="https://stackoverflow.com" class="dropdown-toggle">Visit Stackoverflow</a>


16

Вы ищете что-то вроде этого , я думаю.

div {
    -webkit-border-radius: 10px;
    -moz-border-radius: 10px;
    border-radius: 10px;
    border: 1px solid black;
    background-color: #CCC;
    height: 100px;
    width: 160px;
}

редактировать

Существует только Firefox -moz-outline-radius, но он не будет работать в IE / Chrome / Safari / Opera / и т. Д. Таким образом, похоже, что наиболее кросс-браузер-совместимый способ * получить изогнутую линию вокруг границы - использовать div-обертку:

div.inner {
  -webkit-border-radius: 10px;
  -moz-border-radius: 10px;
  border-radius: 10px;
  border: 1px solid black;
  background-color: #CCC;
  height: 100px;
  width: 160px;
}

div.outer {
  display: inline-block;
  -webkit-border-radius: 10px;
  -moz-border-radius: 10px;
  border-radius: 10px;
  border: 1px solid red;
}
<div class="outer">
  <div class="inner"></div>
</div>


* кроме использования изображений


20
Нет, я знаю, как получить пограничный радиус, который я бродил, если бы вы могли получить контурный радиус
Марк Герин

То есть что именно? Более толстый контур, как это? jsfiddle.net/mattball/NXZFv/1
Мэтт Болл

10
@Matt: изогнутый контур вместо границы , очевидно. См. W3.org/TR/CSS21/ui.html#dynamic-outlines
Джои

Ну, у меня есть блок Div с серой границей 2px с радиусом границы 20px, я бродил, могу ли я тогда иметь Outine 10px вокруг этой границы, которая следует за границей, а не квадратная.
Марк Герин

1
Только одно дополнение к вашему матовому коду: если вы отбросите радиус рамки на несколько пикселей на внутреннем блоке, то угол станет намного плотнее, спасибо за вашу помощь
Марк Герин

7

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

Я создал правило CSS для класса и использовал псевдокласс: focus для этого правила. Я решил outline: noneизбавиться от того светло-синего по умолчанию «неокруглого радиуса», который Chrome использует по умолчанию. Затем в том же :focusпсевдоклассе, где этот контур больше не существует, я добавил свои свойства радиуса и границы. Ведущий к следующему

outline: none;
border-radius: 5px;
border: 2px solid maroon;

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


Использование "outline: 0" или "outline: none" считается плохой практикой и портит доступность для пользователя. На данный момент у меня нет исправления, но вот статья о том, почему вы не должны удалять схему, если это возможно, и что делать, если это абсолютно необходимо. Никогда не удаляйте контуры CSS
AndrewBrntt


5

Если вы хотите получить рельефный вид, вы можете сделать что-то вроде следующего:

.embossed {
  background: #e5e5e5;
  height: 100px;
  width: 200px;
  border: #FFFFFF solid 1px;
  outline: #d0d0d0 solid 1px;
  margin: 15px;
}

.border-radius {
  border-radius: 20px 20px 20px 20px;
  -webkit-border-radius: 20px;
  -moz-border-radius: 20px;
  -khtml-border-radius: 20px;
}

.outline-radius {
  -moz-outline-radius: 21px;
}
<div class="embossed"></div>
<div class="embossed border-radius"></div>
<div class="embossed border-radius outline-radius">-MOZ ONLY</div>

Я не нашел обходной путь, чтобы иметь эту работу в других браузерах.

РЕДАКТИРОВАТЬ: Единственный способ, которым вы можете сделать это, это использовать box-shadow, но тогда это не сработает, если у вас уже есть box box shadow для этого элемента.


1
Вы можете использовать несколько теней на одном элементе, разделяя их запятыми.
Bangash

2

Есть решение, если вам нужен только контур без рамки. Это не мое. Я получил, если из файла Bootstrap CSS. Если вы укажете outline: 1px auto certain_color, вы получите тонкую внешнюю линию вокруг div определенного цвета. В этом случае указанная ширина не имеет значения, даже если вы укажете ширину 10 пикселей, в любом случае это будет тонкая линия. Ключевое слово в упомянутом правиле - «авто».
Если вам нужен контур с закругленными углами и определенной шириной, вы можете добавить правило css на границу необходимой ширины и того же цвета. Это делает контур толще.


2

Насколько я знаю, Outline radiusподдерживается только Firefox и Firefox для Android.

-moz-outline-radius: 1em;

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


1

Нет. Границы располагаются снаружи элемента и внутри области поля блочной модели. Контуры располагаются внутри элемента, а область заполнения блочной модели игнорирует его. Он не предназначен для эстетики. Это просто чтобы показать дизайнеру очертания элементов. Например, на ранних этапах разработки html-документа разработчику может понадобиться быстро определить, правильно ли он поместил все скелетные элементы div. Позже им может понадобиться проверить, являются ли различные кнопки и формы правильным количеством пикселей друг от друга.

Границы эстетичны по своей природе. В отличие от контуров, они фактически отделены от блочной модели, что означает, что они не перекрывают текст, заданный на полях: 0; и каждая сторона границы может быть стилизована индивидуально.

Если вы пытаетесь применить угловой радиус для контура, я предполагаю, что вы используете его так, как большинство людей используют границу. Так что, если вы не возражаете, я спрашиваю, какое свойство структуры делает его желательным через границу?


10
Целью контуров является навигация / доступность с помощью клавиатуры, а не показывать разработчикам, где находятся элементы
danwellman

Ну, для этого браузеры и используют их по умолчанию. Но я всегда использовал их, чтобы увидеть, где мои дивы, с большим эффектом.
Musixauce3000

+1 за упоминание о том, что «Границы располагаются снаружи элемента и внутри области полей блочной модели. Контуры располагаются внутри элемента, а область заполнения блочной модели игнорирует его».
Жак

1

КОМБИНИРОВАННАЯ КОРОБКА ТЕНЬ И ПЛАН.

Небольшой поворот в ответе Леа Хейс, который я нашел

input[type=text]:focus {
    box-shadow: 0 0 0 1pt red;
    outline-width: 1px;
    outline-color: red;
}

получает действительно хороший чистый конец Нет прыжков в размере, который вы получаете при использовании border-radius


1

Как уже говорили другие, только Firefox поддерживает это. Вот работа, которая делает то же самое, и даже работает с пунктирными контурами.

пример

.has-outline {
    display: inline-block;
    background: #51ab9f;
    border-radius: 10px;
    padding: 5px;
    position: relative;
}
.has-outline:after {
  border-radius: 10px;
  padding: 5px;
  border: 2px dashed #9dd5cf;
  position: absolute;
  content: '';
  top: -2px;
  left: -2px;
  bottom: -2px;
  right: -2px;
}
<div class="has-outline">
  I can haz outline
</div>


0

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

.round_outline {
  padding: 8px;
  background-color: white;
  border-radius: 50%;
  border: 1px solid black;
}

Работал в моем случае.


0

Я просто установил контур прозрачным.

input[type=text] {
  outline: rgba(0, 0, 0, 0);
  border-radius: 10px;
}

input[type=text]:focus {    
  border-color: #0079ff;
}

0

Мне нравится этот способ.

.circle:before {
   content: "";
   width: 14px;
   height: 14px;
   border: 3px solid #fff;
   background-color: #ced4da;
   border-radius: 7px;
   display: inline-block;
   margin-bottom: -2px;
   margin-right: 7px;
   box-shadow: 0px 0px 0px 1px #ced4da;
}

Это создаст серый круг с остроумие вокруг него и снова 1px вокруг границы!


0
clip-path: circle(100px at center);

Это на самом деле сделает кликабельный только круг, в то время как border-radius все еще делает квадрат, но выглядит как круг.


0

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

На базовом уровне рассмотрим следующий статический пример (запустите сниппент для демонстрации):

.outline {
    border: 2px dotted transparent;
    border-radius: 5px;
    display: inline-block;
    padding: 2px;
    margin: -4px;
}

/* :focus-within does not work in Edge or IE */
.outline:focus-within, .outline.edge {
    border-color: blue;
}

br {
    margin-bottom: 0.75rem;
}
<h3>Javascript-Free Demo</h3>
<div class="outline edge"><input type="text" placeholder="I always have an outline"/></div><br><div class="outline"><input type="text" placeholder="I have an outline when focused"/></div> *<i>Doesn't work in Edge or IE</i><br><input type="text" placeholder="I have never have an outline" />
<p>Note that the outline does not increase the spacing between the outlined input and other elements around it. The margin (-4px) compensates for the space that the outlines padding (-2px) and width (2px) take up, a total of 4px.</p>

Теперь на более продвинутом уровне можно было бы использовать JavaScript для начальной загрузки элементов данного типа или класса, чтобы они были заключены в div, который имитирует контур при загрузке страницы. Кроме того, привязки событий могут быть установлены, чтобы показать или скрыть схему взаимодействия с пользователем, как это (запустите фрагмент ниже или откройте в JSFiddle ):

h3 {
  margin: 0;
}

div {
  box-sizing: border-box;
}

.flex {
  display: flex;
}

.clickable {
  cursor: pointer;
}

.box {
  background: red;
  border: 1px solid black;
  border-radius: 10px;
  height: 5rem;
  display: flex;
  align-items: center;
  text-align: center;
  color: white;
  font-weight: bold;
  padding: 0.5rem;
  margin: 1rem;
}
<h3>Javascript-Enabled Demo</h3>
<div class="flex">
  <div class="box outline-me">I'm outlined because I contain<br>the "outline-me" class</div>
  <div class="box clickable">Click me to toggle outline</div>
</div>
<hr>
<input type="text" placeholder="I'm outlined when focused" />

<script>
// Called on an element to wrap with an outline and passed a styleObject
// the styleObject can contain the following outline properties:
// 		style, width, color, offset, radius, bottomLeftRadius,
//		bottomRightRadius, topLeftRadius, topRightRadius
// It then creates a new div with the properties specified and 
// moves the calling element into the div
// The newly created wrapper div receives the class "simulated-outline"
Element.prototype.addOutline = function (styleObject, hideOutline = true) {
    var element = this;

    // create a div for simulating an outline
    var outline = document.createElement('div');

    // initialize css formatting
    var css = 'display:inline-block;';

    // transfer any element margin to the outline div
    var margins = ['marginTop', 'marginBottom', 'marginLeft', 'marginRight'];
    var marginPropertyNames = { 
        marginTop: 'margin-top',
        marginBottom: 'margin-bottom',
        marginLeft: 'margin-left',
        marginRight: 'margin-right'
    }
    var outlineWidth = Number.parseInt(styleObject.width);
    var outlineOffset = Number.parseInt(styleObject.offset);
    for (var i = 0; i < margins.length; ++i) {
        var computedMargin = Number.parseInt(getComputedStyle(element)[margins[i]]);
        var margin = computedMargin - outlineWidth - outlineOffset;
        css += marginPropertyNames[margins[i]] + ":" + margin + "px;";
    }
    element.style.cssText += 'margin:0px !important;';
    
    // compute css border style for the outline div
    var keys = Object.keys(styleObject);
    for (var i = 0; i < keys.length; ++i) {
        var key = keys[i];
        var value = styleObject[key];
        switch (key) {
            case 'style':
                var property = 'border-style';
                break;
            case 'width':
                var property = 'border-width';
                break;
            case 'color':
                var property = 'border-color';
                break;
            case 'offset':
                var property = 'padding';
                break;
            case 'radius':
                var property = 'border-radius';
                break;
            case 'bottomLeftRadius':
                var property = 'border-bottom-left-radius';
                break;
            case 'bottomRightRadius':
                var property = 'border-bottom-right-radius';
                break;
            case 'topLeftRadius':
                var property = 'border-top-left-radius-style';
                break;
            case 'topRightRadius':
                var property = 'border-top-right-radius';
                break;
        }
        css += property + ":" + value + ';';
    }
    
    // apply the computed css to the outline div
    outline.style.cssText = css;
    
    // add a class in case we want to do something with elements
    // receiving a simulated outline
    outline.classList.add('simulated-outline');
    
    // place the element inside the outline div
    var parent = element.parentElement;
    parent.insertBefore(outline, element);
    outline.appendChild(element);

    // determine whether outline should be hidden by default or not
    if (hideOutline) element.hideOutline();
}

Element.prototype.showOutline = function () {
    var element = this;
    // get a reference to the outline element that wraps this element
    var outline = element.getOutline();
    // show the outline if one exists
    if (outline) outline.classList.remove('hide-outline');
}


Element.prototype.hideOutline = function () {
    var element = this;
    // get a reference to the outline element that wraps this element
    var outline = element.getOutline();
    // hide the outline if one exists
    if (outline) outline.classList.add('hide-outline');
}

// Determines if this element has an outline. If it does, it returns the outline
// element. If it doesn't have one, return null.
Element.prototype.getOutline = function() {
    var element = this;
    var parent = element.parentElement;
    return (parent.classList.contains('simulated-outline')) ? parent : null;
}

// Determines the visiblity status of the outline, returning true if the outline is
// visible and false if it is not. If the element has no outline, null is returned.
Element.prototype.outlineStatus = function() {
    var element = this;
    var outline = element.getOutline();
    if (outline === null) {
        return null;
    } else {
        return !outline.classList.contains('hide-outline');
    }
}

// this embeds a style element in the document head for handling outline visibility
var embeddedStyle = document.querySelector('#outline-styles');
if (!embeddedStyle) {
    var style = document.createElement('style');
    style.innerText = `
        .simulated-outline.hide-outline {
            border-color: transparent !important;
        }
    `;
    document.head.append(style);
}


/*########################## example usage ##########################*/

// add outline to all elements with "outline-me" class
var outlineMeStyle = {
    style: 'dashed',
    width: '3px',
    color: 'blue',
    offset: '2px',
    radius: '5px'
};
document.querySelectorAll('.outline-me').forEach((element)=>{
  element.addOutline(outlineMeStyle, false);
});


// make clickable divs get outlines
var outlineStyle = {
    style: 'double',
    width: '4px',
    offset: '3px',
    color: 'red',
    radius: '10px'
};
document.querySelectorAll('.clickable').forEach((element)=>{
    element.addOutline(outlineStyle);
    element.addEventListener('click', (evt)=>{
        var element = evt.target;
        (element.outlineStatus()) ? element.hideOutline() : element.showOutline();
    });
});


// configure inputs to only have outline on focus
document.querySelectorAll('input').forEach((input)=>{
    var outlineStyle = {
        width: '2px',
        offset: '2px',
        color: 'black',
        style: 'dotted',
        radius: '10px'
    }
    input.addOutline(outlineStyle);
    input.addEventListener('focus', (evt)=>{
        var input = evt.target;
        input.showOutline();
    });
    input.addEventListener('blur', (evt)=>{
        var input = evt.target;
        input.hideOutline();
    });
});
</script>

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.