Контур радіуса?


473

Є в будь-якому випадку отримання заокруглених кутів на начерки з div element, подібно border-radius?


2
Добре, що у мене є Div-поле з сірою рамкою 2 пікселя з 20-кратним радіусом межі, я блукав, чи зможу я тоді мати 10 пікселів навколо цього кордону, який слід за межею, а не квадратний
Марк Ґерін

4
Це гарне запитання. Елемент з border: 5px redі outline: 5px blueі border-radius: 5px, рамка закруглена, але контур квадратний.
Метью Руді

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

Це має бути частиною CSS3 ... Якщо я подумаю над цим - ненавиджу W3C: D
m93a

17
тобі все потрібне box-shadowу твоєму житті ..
Мухаммед Умер

Відповіді:


538

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

Тому замість цього я використовував коробку-тінь. Я дійсно віддав перевагу плавному вигляду тіні, але тінь може бути посиленою, щоб імітувати округлий контур:

 /* 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

84

Зазвичай я це досягаю, використовуючи: після псевдоелемента:

звичайно, це залежить від використання, цей метод дозволяє контролювати окремі межі, а не використовувати метод жорсткої тіні.

Ви також можете встановити зміщення -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>


3
Змінена і трохи більш ефектна версія: jsfiddle.net/rh6j3cdm .
Давид Хорват

2
Неможливо зробити псевдо :: після псевдо для поля введення
Саймон Францен

дякую, це дуже добре спрацювало з пошуковим пошуковим контуром реакційного сортування!
Монарх Вадія

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

34

Як у Леї Хейз вище, але ось, як я це зробила:

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;
}

Редагувати

Існує -moz-outline-radiusналежним чином Firefox , але він не працює в 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
Matt Ball

10
@Matt: вигнутий контур замість межі , очевидно. Дивіться w3.org/TR/CSS21/ui.html#dynamic-outlines
Joey

Добре, що у мене є Div-поле з сірою рамкою 2 пікселя з 20-піксельним радіусом, я блукав, чи можу я тоді мати 10 пікселів навколо цього кордону, який слід за межею, а не квадратним.
Marc Guerin

1
Лише одне доповнення до вашого кодового мату, якщо ви опустіть радіус межі на кілька пікселів на внутрішній ящик, кут стає набагато жорсткішим, дякую за вашу допомогу
Марк Герін

7

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

Я створив правило CSS для класу і використав псевдоклас: фокус для цього правила. Я налаштований outline: noneпозбутися того «блакитного контуру», який не використовується кордоном, за замовчуванням, який використовує Chrome за замовчуванням. Потім у тому ж :focusпсевдокласі, де цього обрису більше не існує, я додав свої властивості радіуса та межі. Ведучи до наступного

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

мати контур барвистого кольору з радіусом облямівки, який тепер з’являється, коли елемент вибирається користувачем на вкладці.


Використання "контур: 0" або "контур: немає" вважається поганою практикою і загрожує доступності користувачів. На даний момент у мене немає виправлення, але ось стаття про те, чому ви не повинні видаляти контур, якщо це можливо, і що робити, якщо ви обов'язково повинні. Ніколи не видаляйте контури 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>

Я не знайшов роботи, щоб мати цю роботу в інших браузерах.

РЕДАКТУВАННЯ . Єдиний інший спосіб, як це зробити, - це використовувати поле-тінь, але тоді ця робота не працює, якщо на цьому елементі вже є тінь поля.


1
Можна використовувати кілька тіней на одному елементі, розділяючи їх комами.
Бангаш

2

Є рішення, якщо вам потрібно лише контур без меж. Це не моє. Я отримав, якщо з CSS-файлу Bootstrap. Якщо ви вкажете outline: 1px auto certain_color, ви отримаєте тонку зовнішню лінію навколо діва певного кольору. У цьому випадку вказана ширина не має значення, навіть якщо ви вказали ширину 10 пікселів, все одно це буде тонка лінія. Ключовим словом у згаданому правилі є "авто".
Якщо вам потрібен контур із закругленими кутами та певною шириною, ви можете додати правило css на межі з потрібною шириною та таким же кольором. Це робить контур більш товстим.


2

Наскільки я знаю, Outline radiusце підтримується лише Firefox та Firefox для android.

-moz-outline-radius: 1em;

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


1

Ні. Бордюри розташовані на зовнішній стороні елемента та на внутрішній стороні поля коробки-моделі. Обриси сидять на внутрішній стороні елемента, і область оббивки моделі коробки ігнорує його. Він не призначений для естетики. Це просто показати дизайнеру обриси елементів. Наприклад, на ранніх стадіях розробки html-документа розробнику може знадобитися швидко розпізнати, чи він поставив усі скелетні діви в потрібне місце. Пізніше їм може знадобитися перевірити, чи різні кнопки та форми відповідають правильній кількості пікселів одна від одної.

Межі мають естетичний характер. На відміну від обрисів, вони насправді є окремими коробковою моделлю, а це означає, що вони не перекривають текст, встановлений на полі: 0; і кожна сторона рамки може бути стилізована індивідуально.

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


10
Мета контурів - навігація / доступність на клавіатурі, а не показувати розробникам, де елементи
danwellman

Ну, для чого браузери використовують їх за замовчуванням. Але я завжди використовував їх, щоб побачити, де мої діви, з великим ефектом.
Musixauce3000

+1 для згадки про те, що "Межі сидять на зовнішній стороні елемента та на внутрішній стороні поля поля коробки. Обриси сидять на внутрішній стороні елемента, а область оббивки моделі коробки ігнорує це".
Жак

1

ОБ'ЄДНАННЯ КОРОБКОВОГО ТЕХНІЧНОГО ВІДТВОРЕННЯ.

Легкий поворот у відповіді Леа Хейс я знайшов

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

отримує дійсно приємний чистий обробку. Ніякі стрибки в розмірі, які ви отримуєте, використовуючи прикордонний радіус


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);

Це фактично зробить лише гурток, який можна натискати, тоді як радіус межі все ще робить квадрат, але виглядає як коло.


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.