轮廓半径?


473

反正是有得到的圆角轮廓div element,类似border-radius


2
好吧,我有一个带2px灰色边框和20px边框半径的Div框,我是否在徘徊,如果我可以在该边框之后沿边框而不是正方形
Marc Guerin

4
这是一个很好的问题。具有border: 5px redoutline: 5px blue和的元素border-radius: 5px的边界是圆形的,但轮廓是正方形。
马修·鲁迪

4
到目前为止,我们只能在Firefox中使用它:-moz-outline-radius
Wojciech Bednarski

它应该是CSS3的一部分...如果我考虑一下-我讨厌W3C:D
m93a 2013年

17
你们每个人都需要一个box-shadow生命..
穆罕默德·乌默尔

Answers:


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
约翰·莫顿

2
这正是我想要的,并且比轮廓半径更好。
Zenexer

2
硬轮廓示例不起作用。它只是一个没有拐角半径的矩形。
Erik Aigner

1
outline: 0破坏网络可访问性;阅读outlinenone.com
ianstarz

4
@ianstarz,当您不提供其他样式时,它将破坏辅助功能。box-shadow是替代样式(如此处所示,实际上与外观非常相似outline)。
ACJ

84

我通常使用: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>


3
一个经过修改的更壮观的版本:jsfiddle.net/rh6j3cdm
戴维·霍瓦斯

2
无法为输入字段设置:: after伪
Simon Franzen

谢谢,这很好地与react-sortable-tree的搜索查询概述一起使用!
君主瓦迪亚

我喜欢这个解决方案,因为它比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,为简便起见,我省略了一些CSS的-moz和-webkit变体。您可以在上面看到结果


6
他说的是轮廓,而不是边界...“轮廓”半径
android.nick,2012年

5
是正确的,但是由于轮廓半径不可用,因此我的方法可以显示边框和轮廓。这是一种视觉效果,因此,除非将Marc的设计指定到像素以下,否则实际上不会使用outline属性的事实没有任何区别。而且由于这是一个切实可行的解决方案,所以我很感激您的投票
Heraldmonkey

2
这很棒。我没有使用inset,但是得到了我想要的。
Paul Schreiber 2013年

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 / etc等上使用。因此,看起来跨浏览器最兼容的方式*使边界周围的曲线是使用wrapper 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
不,如果您能获得轮廓半径,我知道如何获得正在徘徊的边界半径
Marc Guerin

到底是什么意思?这样粗的轮廓?jsfiddle.net/mattball/NXZFv/1
Matt Ball

10
@Matt:显然是弯曲的轮廓而不是边框。参见w3.org/TR/CSS21/ui.html#dynamic-outlines
Joey

好吧,我有一个带有2px灰色边框和20px边框半径的Div框,我是否在徘徊,如果我可以在边框之后沿边框而不是正方形放置10px Outine。
马克·格林

1
只是代码遮罩的一个附加功能,如果您将边框半径放在内部框上几px,则转角会变得更紧,感谢您的帮助
Marc Guerin

7

我刚刚找到了一个很好的解决方案,在查看了到目前为止的所有答复之后,我还没有看到它的发布。所以,这就是我所做的:

我为该类创建了CSS规则,并为该规则使用了:focus的伪类。我设置outline: none为摆脱Chrome默认使用的默认的浅蓝色不可边框半径“轮廓”。然后,在该:focus轮廓不再存在的同一个伪类中,我添加了我的radius和border属性。导致以下

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

具有带有边框半径的栗色轮廓,该边框现在在用户通过Tab键选择元素时出现。


使用“大纲:0”或“大纲:无”被认为是不良做法,并且搞乱了用户的可访问性。目前,我还没有修复程序,但是这里有一篇文章介绍了为什么不应该删除大纲,以及在绝对必要时应该怎么做。永不删除CSS轮廓
AndrewBrntt

5

通过将outline-style: auto其设置在WebKits雷达上,我们可能会很快看到我们的愿望:http ://trac.webkit.org/changeset/198062/webkit

见2030年。


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 2014年

2

如果您只需要没有边框的轮廓,则有解决方案。不是我的。我是从Bootstrap CSS文件中获得的。如果指定outline: 1px auto certain_color,则会在某些颜色的div周围获得细外线。在这种情况下,即使您指定10 px宽度,指定的宽度也没有关系,无论如何它将是细线。提到的规则中的关键词是“自动”。
如果需要带有圆角和一定宽度的轮廓,则可以在边框上添加具有所需宽度和相同颜色的css规则。它使轮廓变粗。


2

据我所知,Outline radiusFirefox和Firefox for Android仅支持。

-moz-outline-radius: 1em;

在此处输入图片说明


1

否。边框位于元素的外部和框模型边缘区域的内部。轮廓线位于元素的内部,而框模型的填充区域将忽略它。它不是出于美学目的。只是为了向设计师显示元素的轮廓。例如,在开发html文档的早期阶段,开发人员可能需要快速辨别他们是否将所有骨骼div放置在正确的位置。稍后,他们可能需要检查各种按钮和表格是否彼此分开的像素数正确。

边界本质上是美学。与轮廓不同,它们实际上是框模型的一部分,这意味着它们不会与设置为margin:0;的文本重叠。边框的每一侧均可单独设置样式。

如果您尝试将拐角半径应用于轮廓,我假设您以大多数人使用边框的方式使用它。因此,如果您不介意我问,轮廓的什么属性使它比边框更可取?


10
大纲的目的是为了导航/访问键盘,而不是向开发人员展示元素在哪里
danwellman's

嗯,这就是浏览器默认使用它们的目的。但我一直使用它们来查看div的位置,效果很好。
Musixauce3000 '16

+1表示:“边界位于元素的外部和框模型边界区域的内部。轮廓位于元素的内部,框模型填充区域将忽略它。”
雅克

1

组合框阴影和轮廓。

我发现Lea Hayes的答案有些许误解

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

基本问题的简单答案是“否”。唯一的跨浏览器选项是创建可以实现您想要的功能的hack。这种方法确实有其一定的潜在问题随身携带,当谈到造型预先存在的内容,但它提供的轮廓比许多其他解决方案的更多个性化(偏移,宽度,线型)。

从基本的角度来看,请考虑以下静态示例(运行示例片段):

.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中,该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>

最后,让我重申一下,实现这种方法可能需要比示例中包含的样式更多的样式,尤其是如果您已经设置了要概述的元素的样式。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.