윤곽 반경?


473

어쨌든 점점 거기에 둥근 모서리를개요 (A)의 div element유사, border-radius?


2
나는 다음 10px Outine을 가질 수 있다면 그럼 난 20 픽셀 경계 반경, 내가 방황으로 2 픽셀 회색 테두리 사업부 상자를 가지고 주변이 오히려 사각 것보다 테두리를 따라 국경
마크 GUERIN

4
좋은 질문입니다. border: 5px redand outline: 5px blueborder-radius: 5px테두리가 있는 요소 는 둥글지만 윤곽선은 정사각형입니다.
Matthew Rudy

4
지금까지 Firefox에서만 사용할 수 있습니다 :-moz-outline-radius
Wojciech Bednarski

D : 나는 W3C 싫어 - 내가 그것에 대해 생각한다면 ... CSS3의 일부가되어야합니다
m93a

17
당신은 모두 box-shadow당신의 인생에서 필요합니다 ..
Muhammad Umer

답변:


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
IMO, 이것은 당신이 찾고있는 대답입니다. 이 방법을 사용했지만 개요를 0으로 바꾸는 것을 간과하지는 않습니다.
John Morton

2
이것은 내가 찾던 것과 정확히 같으며 외곽선 반경보다 훨씬 적합합니다.
Zenexer

2
하드 아웃 라인 예제가 작동하지 않습니다. 모서리 반경이없는 직사각형 일뿐입니다.
Erik Aigner

1
outline: 0웹 접근성을 차단합니다. outlinenone.com을
ianstarz

4
@ianstarz, 대체 스타일링을 제공하지 않으면 접근성이 손상됩니다. box-shadow대체 스타일링입니다 (여기에 제시된 바와 같이 실제로 모양이 매우 유사 함 outline).
ACJ

84

나는 보통 : after pseudo-element를 사용하여 이것을 달성합니다 :

물론 사용법에 따라 다르지만이 방법을 사용하면 하드 섀도 방법을 사용하지 않고 개별 테두리를 제어 할 수 있습니다.

-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 .
Dávid Horváth

2
입력 필드에 대해 :: 후 의사 (pseudo)를 만들 수 없습니다.
Simon Franzen

감사합니다. 이것은 react-sortable-tree의 검색어 개요와 매우 잘 작동했습니다!
Monarch Wadia

이 솔루션은 box-shadow버전 보다 훨씬 유연하기 때문에이 솔루션이 마음에 듭니다. 예를 들어, "개요"를 요소와 간격을두고 (예 : 시뮬레이션 outline-offset)이 기술을 사용하면 가능합니다.
Kirk Woll

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의 중첩이 필요하지 않습니다. 간결함을 위해 Altho 일부 CSS의 -moz 및 -webkit 변형을 생략했습니다. 위의 결과를 볼 수 있습니다


6
그는 국경이 아니라 개요에 대해 이야기하고 있습니다 ... "outline"radius
android.nick 12.40에

5
정확하지만 윤곽선 반경을 사용할 수 없으므로 내 방법은 윤곽선뿐만 아니라 테두리 모양을 제공합니다. 이것은 시각적 효과이므로 Marc의 디자인을 픽셀 단위로 지정하지 않으면 실제로 outline 속성을 사용하지 않는다는 사실은 차이가 없습니다. 실용적인 해결책이므로 투표에 감사드립니다
Heraldmonkey

2
이것은 훌륭하게 작동했습니다. inset그래도 사용하지 않았고 원하는 것을 얻었습니다.
Paul Schreiber

18

Bootstrap navbar의 드롭 다운 메뉴에 대한 멋진 포커스 액세스 기능을 원했으며 다음과 같이 만족했습니다.

     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 / etc에서는 작동하지 않습니다. 따라서 가장 크로스 브라우저와 호환되는 방식처럼 보입니다. * 테두리 주위에 곡선을 만드는 방법 은 래퍼 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
아니, 난 당신이 개요 - 반경 얻을 수 있다면 국경 반경 내가 방황하는 방법을 알고있다
마크 GUERIN

정확히 무엇을 의미합니까? 이렇게 두꺼운 외곽선? jsfiddle.net/mattball/NXZFv/1
Matt Ball

10
@ 매트 : 분명히 경계 대신 곡선 윤곽선 .
Joey

글쎄, 20px 테두리 반경이있는 2px 회색 테두리가있는 Div 상자가 있는데, 사각형 주위가 아닌 테두리를 따르는 테두리 주위에 10px Outine을 가질 수 있다면 방황하고있었습니다.
Marc Guerin

1
당신이 내부 상자에 국경 반경 몇 픽셀을 떨어 뜨리면 코드 매트에 딱 한 추가, 코너는 훨씬 엄격하게, 당신의 도움을 주셔서 감사합니다
마크 GUERIN

7

방금 이것에 대한 훌륭한 해결책을 찾았으며 지금까지 모든 응답을 검토 한 결과 아직 게시되지 않았습니다. 그래서 여기 내가 한 일이 있습니다.

클래스에 대한 CSS 규칙을 만들고 해당 규칙에 의사 클래스 : focus를 사용했습니다. 나는 설정 outline: none이 기본 밝은 파란색이 아닌 국경 반경 수 '윤곽'기본적으로 그 크롬의 사용을 제거 할 수 있습니다. 그런 다음 :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>

다른 브라우저 에서이 작업을 수행 할 수있는 해결 방법을 찾지 못했습니다.

편집 : 이 작업을 수행 할 수있는 유일한 다른 방법은 상자 그림자를 사용하는 것입니다. 그러나 해당 요소에 상자 그림자가 이미 있으면 작동하지 않습니다.


1
동일한 요소에 여러 그림자를 사용하여 쉼표로 구분할 수 있습니다.
Bangash

2

테두리가없는 윤곽선 만 필요한 경우 해결책이 있습니다. 그건 내 것이 아니다. Bootstrap CSS 파일에서 얻었습니다. 을 지정 outline: 1px auto certain_color하면 특정 색상의 div 주위에가는 외부 선이 나타납니다. 이 경우 지정된 너비는 중요하지 않습니다. 10px 너비를 지정하더라도 어쨌든 얇은 선이됩니다. 언급 된 규칙의 핵심 단어는 "자동"입니다.
둥근 모서리와 특정 너비의 윤곽이 필요한 경우 필요한 너비와 동일한 색상으로 테두리에 CSS 규칙을 추가 할 수 있습니다. 윤곽을 두껍게 만듭니다.


2

내가 아는 한, Outline radiusFirefox 및 Firefox Firefox에서만 지원됩니다.

-moz-outline-radius: 1em;

여기에 이미지 설명을 입력하십시오


1

아니요. 테두리는 요소 외부와 상자 모델 여백 영역의 내부에 있습니다. 윤곽선은 요소 내부에 있으며 상자 모델 패딩 영역에서는이를 무시합니다. 미학을위한 것은 아닙니다. 디자이너에게 요소의 개요를 보여 주기만하면됩니다. 예를 들어, html 문서를 개발하는 초기 단계에서 개발자는 모든 골격 div를 올바른 위치에 배치 한 경우 신속하게 식별해야합니다. 나중에 그들은 다양한 버튼과 형태가 서로 올바른 픽셀 수인지 확인해야 할 수도 있습니다.

테두리는 본질적으로 미적입니다. 윤곽선과 달리 그것들은 실제로 박스 모델과 떨어져 있습니다. 즉, 텍스트 세트를 여백으로 겹치지 않습니다 : 0; 테두리의 각면은 개별적으로 스타일을 지정할 수 있습니다.

윤곽선에 모서리 반경을 적용하려고하면 대부분의 사람들이 테두리를 사용하는 방식으로 사용한다고 가정합니다. 그래서 당신이 나에게 묻는 것을 신경 쓰지 않는다면, 외곽선의 어떤 속성이 경계를 넘어 바람직합니까?


10
개요의 목적은 키보드 탐색 / 접근성을위한
것이며

기본적으로 브라우저가이를 사용합니다. 그러나 나는 항상 내 div가 어디에 있는지 확인하기 위해 그것들을 사용했습니다.
Musixauce3000

"테두리는 요소의 외부와 상자 모델 여백 영역의 내부에 있습니다. 윤곽선은 요소의 내부에 있고 상자 모델 패딩 영역은이를 무시합니다."
Jacques

1

콤비네이션 박스 섀도우 및 개요.

내가 찾은 Lea Hayes 답변 에 약간의 왜곡

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

정말 좋은 마무리를 얻습니다. 경계 반경을 사용할 때 얻는 크기가 줄어 듭니다.


1

다른 사람들이 말했듯이 파이어 폭스만이 지원합니다. 다음은 동일한 작업을 수행하고 점선 윤곽선으로 작동하는 해결 방법입니다.

예

.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>

마지막으로,이 접근법을 구현하려면 데모에 포함 된 것보다 더 많은 스타일링이 필요할 수 있습니다. 특히 설명하려는 요소의 스타일을 이미 지정한 경우 다시 한 번 설명하겠습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.