Umrissradius?

473

Gibt es sowieso abgerundete Ecken auf dem Umriss von a div element, ähnlich wie border-radius?

Marc Guerin
quelle
2
Nun, ich habe eine Div-Box mit einem 2px grauen Rand mit 20px Randradius. Ich bin gewandert, wenn ich dann einen 10px Umriss um diesen Rand haben kann, der dem Rand folgt, anstatt quadratisch zu sein
Marc Guerin
4
Das ist eine gute Frage. Bei einem Element mit border: 5px redund outline: 5px blueund border-radius: 5pxist der Rand abgerundet, der Umriss jedoch quadratisch.
Matthew Rudy
4
Bisher können wir es nur in Firefox verwenden:-moz-outline-radius
Wojciech Bednarski
Es sollte Teil von CSS3 sein ... Wenn ich darüber nachdenke - ich hasse W3C: D
m93a
17
Sie alle brauchen eine box-shadowin Ihrem Leben ..
Muhammad Umer

Antworten:

538

Alte Frage jetzt, aber dies könnte für jemanden mit einem ähnlichen Problem relevant sein. Ich hatte ein Eingabefeld mit abgerundeten borderund wollte die Farbe der Fokuskontur ändern. Ich konnte das schreckliche Quadrat outlinezur Eingabesteuerung nicht zähmen .

Also habe ich stattdessen Box-Shadow verwendet. Eigentlich habe ich das glatte Aussehen des Schattens bevorzugt, aber der Schatten kann gehärtet werden, um einen abgerundeten Umriss zu simulieren:

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

Lea Hayes
quelle
24
IMO, das ist die Antwort, die Sie suchen. Ich habe diese Methode durchgeführt, aber übersehen Sie nicht, Ihren Umriss auf 0 zu setzen.
John Morton
2
Dies ist genau das, wonach ich gesucht habe und passt noch besser als ein Umrissradius.
Zenexer
2
Das Beispiel für eine harte Gliederung funktioniert nicht. Es ist nur ein Rechteck ohne Eckenradius.
Erik Aigner
1
outline: 0unterbricht die Barrierefreiheit im Internet; Lesen Sie Outlininenone.com
Ianstarz
4
@ianstarz, es bricht die Zugänglichkeit, wenn Sie kein alternatives Styling bereitstellen. box-shadowist das alternative Styling (das, wie hier vorgestellt, tatsächlich sehr ähnlich aussieht wie outline).
ACJ
84

Normalerweise erreiche ich dies mit dem: after pseudo-element:

Natürlich hängt es von der Verwendung ab. Diese Methode ermöglicht die Kontrolle über einzelne Ränder, anstatt die Hard-Shadow-Methode zu verwenden.

Sie können auch -1px-Offsets festlegen und einen linearen Hintergrundverlauf (kein Rand) für einen anderen Effekt verwenden.

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>

Mononym
quelle
3
Eine modifizierte und etwas spektakulärere Version: jsfiddle.net/rh6j3cdm .
Dávid Horváth
2
Es ist nicht möglich, ein :: after-Pseudo für ein Eingabefeld
Simon Franzen
danke, dies funktionierte SEHR gut mit den Suchanfragen der reaktionssortierbaren Bäume!
Monarch Wadia
Ich mag diese Lösung, weil sie viel flexibler ist als die box-shadowVersion. Wenn Sie beispielsweise möchten, dass der "Umriss" vom Element entfernt ist (dh simuliert outline-offset), wird dies mit dieser Technik möglich.
Kirk Woll
34

Ähnlich wie Lea Hayes oben, aber so habe ich es gemacht:

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>

Keine Verschachtelung von DIVs oder jQuery erforderlich. Der Kürze halber habe ich jedoch die Varianten -moz und -webkit einiger CSS weggelassen. Sie können das Ergebnis oben sehen

Heraldmonkey
quelle
6
Er spricht über die Gliederung, nicht über die Grenze ... "Umriss" Radius
android.nick
5
Richtig, aber da der Umrissradius nicht verfügbar ist, sieht meine Methode sowohl wie ein Rand als auch wie ein Umriss aus. Dies ist ein visueller Effekt. Wenn Marc's Design nicht pixelgenau spezifiziert ist, macht die Tatsache, dass die Gliederungseigenschaft nicht tatsächlich verwendet wird, keinen Unterschied. Und da es eine praktische Lösung ist, würde ich mich über die Abstimmung
freuen
2
Das hat super geklappt. Ich habe es aber nicht benutzt insetund bekommen, was ich wollte.
Paul Schreiber
18

Ich wollte eine gute Fokuszugänglichkeit für Dropdown-Menüs in einer Bootstrap-Navigationsleiste und war ziemlich zufrieden damit:

     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>

StackOverflowUser
quelle
16

Du suchst so etwas , denke ich.

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

Bearbeiten

Es gibt nur einen Firefox -moz-outline-radius, aber das funktioniert nicht unter IE / Chrome / Safari / Opera / etc. Es sieht also so aus, als ob die browserübergreifendste Methode * , um eine gekrümmte Linie um einen Rand zu erhalten, die Verwendung eines Wrapper-Divs ist:

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>


* Abgesehen von der Verwendung von Bildern

Matt Ball
quelle
20
Nein, ich weiß, wie man den Grenzradius erhält, den ich wanderte, wenn Sie einen Umrissradius erhalten könnten
Marc Guerin
Was genau? Ein dickerer Umriss wie dieser? jsfiddle.net/mattball/NXZFv/1
Matt Ball
10
@Matt: offensichtlich ein gekrümmter Umriss anstelle eines Randes . Siehe w3.org/TR/CSS21/ui.html#dynamic-outlines
Joey
Nun, ich habe eine Div-Box mit einem 2px grauen Rand mit 20px Randradius. Ich bin gewandert, wenn ich dann einen 10px Umriss um diesen Rand haben kann, der dem Rand folgt, anstatt quadratisch zu sein.
Marc Guerin
1
Nur eine Ergänzung zu Ihrem Code matt, wenn Sie den Randradius ein paar Pixel auf der inneren Box fallen lassen, wird die Ecke viel enger, danke für Ihre Hilfe
Marc Guerin
7

Ich habe gerade eine großartige Lösung dafür gefunden, und nachdem ich mir alle Antworten bisher angesehen habe, habe ich sie noch nicht veröffentlicht. Also, hier ist was ich getan habe:

Ich habe eine CSS-Regel für die Klasse erstellt und für diese Regel eine Pseudoklasse von: focus verwendet. Ich outline: nonehabe mich dafür entschieden, diese standardmäßige hellblaue, nicht randradiusfähige "Kontur" zu entfernen, die Chrome standardmäßig verwendet. Dann habe :focusich in derselben Pseudoklasse, in der dieser Umriss nicht mehr existiert, meine Radius- und Rahmeneigenschaften hinzugefügt. Dies führt zu Folgendem

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

um einen kastanienbraunen Umriss mit einem Randradius zu erhalten, der jetzt angezeigt wird, wenn das Element vom Benutzer auf der Registerkarte ausgewählt wird.

Branden Pinney
quelle
Die Verwendung von "Gliederung: 0" oder "Gliederung: Keine" wird als schlechte Praxis angesehen und beeinträchtigt die Benutzerzugänglichkeit. Zu diesem Zeitpunkt habe ich noch keine Lösung, aber hier ist ein Artikel darüber, warum Sie die Gliederung nach Möglichkeit nicht entfernen sollten und was zu tun ist, wenn Sie dies unbedingt müssen. Entfernen Sie niemals CSS-Konturen
AndrewBrntt
5

Wenn Sie einen geprägten Look erhalten möchten, können Sie Folgendes tun:

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

Ich habe keine Lösung gefunden, um diese Arbeit in anderen Browsern zu haben.

BEARBEITEN: Die einzige andere Möglichkeit, dies zu tun, ist die Verwendung von Box-Shadow. Dies funktioniert jedoch nicht, wenn Sie bereits einen Box-Shadow für dieses Element haben.

James Kyle
quelle
1
Sie können mehrere Schatten für dasselbe Element verwenden und diese durch Kommas trennen.
Bangash
2

Es gibt die Lösung, wenn Sie nur Umrisse ohne Rand benötigen. Es ist nicht meins. Ich habe wenn aus Bootstrap CSS-Datei. Wenn Sie angeben outline: 1px auto certain_color, erhalten Sie eine dünne äußere Linie um div einer bestimmten Farbe. In diesem Fall spielt die angegebene Breite keine Rolle, selbst wenn Sie eine Breite von 10 Pixel angeben, handelt es sich ohnehin um eine dünne Linie. Das Schlüsselwort in der genannten Regel ist "auto".
Wenn Sie einen Umriss mit abgerundeten Ecken und einer bestimmten Breite benötigen, können Sie am Rand eine CSS-Regel mit der erforderlichen Breite und Farbe hinzufügen. Es macht den Umriss dicker.

Aleks Sid
quelle
2

Soweit ich weiß, wird das Outline radiusnur von Firefox und Firefox für Android unterstützt.

-moz-outline-radius: 1em;

Geben Sie hier die Bildbeschreibung ein

ucMedia
quelle
1

Die Ränder befinden sich an der Außenseite des Elements und an der Innenseite des Randbereichs des Boxmodells. Umrisse befinden sich auf der Innenseite des Elements und werden im Polsterbereich des Boxmodells ignoriert. Es ist nicht für die Ästhetik gedacht. Es soll dem Designer nur die Umrisse der Elemente zeigen. In den frühen Phasen der Entwicklung eines HTML-Dokuments muss ein Entwickler möglicherweise schnell erkennen, ob er alle Skelett-Divs an der richtigen Stelle platziert hat. Später müssen sie möglicherweise überprüfen, ob verschiedene Schaltflächen und Formulare die richtige Anzahl von Pixeln voneinander entfernt sind.

Grenzen sind ästhetischer Natur. Im Gegensatz zu Umrissen sind sie tatsächlich vom Box-Modell getrennt, was bedeutet, dass sie den am Rand festgelegten Text nicht überlappen: 0; und jede Seite der Grenze kann einzeln gestaltet werden.

Wenn Sie versuchen, einen Eckenradius auf Umrisse anzuwenden, verwenden Sie ihn vermutlich so, wie die meisten Leute Rahmen verwenden. Wenn es Ihnen also nichts ausmacht, wenn ich Sie frage, welche Eigenschaft der Kontur macht es über die Grenze wünschenswert?

Musixauce3000
quelle
10
Der Zweck von Konturen ist für die Navigation / Zugänglichkeit der Tastatur, nicht um Entwicklern zu zeigen, wo sich Elemente befinden
danwellman
Nun, dafür verwenden Browser sie standardmäßig. Aber ich habe sie immer benutzt, um zu sehen, wo meine Divs sind, mit großer Wirkung.
Musixauce3000
+1 für die Erwähnung, dass "Rahmen an der Außenseite des Elements und an der Innenseite des Randbereichs des Boxmodells sitzen. Umrisse befinden sich an der Innenseite des Elements und der Auffüllbereich des Boxmodells ignoriert dies."
Jacques
1

KOMBINIERENDER BOX-SCHATTEN UND ÜBERBLICK.

Eine leichte Wendung bei Lea Hayes Antwort fand ich

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

bekommt ein wirklich schönes sauberes Finish. Kein Größensprung, den Sie bei Verwendung des Randradius erhalten

fidev
quelle
1

Wie andere gesagt haben, unterstützt dies nur Firefox. Hier ist eine Problemumgehung, die dasselbe tut und sogar mit gestrichelten Umrissen arbeitet.

Beispiel

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

RobKohr
quelle
0

Verwenden Sie Polster und eine Hintergrundfarbe für den Rand und dann einen Rand für den Umriss:

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

Hat in meinem Fall funktioniert.

Eric
quelle
0

Ich habe nur den Umriss transparent gemacht.

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

input[type=text]:focus {    
  border-color: #0079ff;
}
Ireneml.fr
quelle
0

Ich mag diesen Weg.

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

Es wird ein grauer Kreis mit einem Witzrand und wieder 1 Pixel um den Rand erstellt!

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

Dadurch wird nur ein Kreis anklickbar, während der Rahmenradius immer noch ein Quadrat bildet, aber als Kreis aussieht.

Martin Zvarík
quelle
0

Die einfache Antwort auf die Grundfrage lautet nein. Die einzige browserübergreifende Option besteht darin, einen Hack zu erstellen, der das erreicht, was Sie wollen. Dieser Ansatz bringt bestimmte potenzielle Probleme mit sich, wenn es darum geht, bereits vorhandene Inhalte zu gestalten , bietet jedoch eine bessere Anpassung der Kontur (Versatz, Breite, Linienstil) als viele der anderen Lösungen.

Betrachten Sie auf einer grundlegenden Ebene das folgende statische Beispiel (führen Sie den Snippent für die Demo aus):

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

Auf einer fortgeschritteneren Ebene wäre es jetzt möglich, JavaScript zu verwenden, um Elemente eines bestimmten Typs oder einer bestimmten Klasse so zu booten, dass sie in ein div eingeschlossen werden, das beim Laden einer Seite einen Umriss simuliert. Darüber hinaus können Ereignisbindungen eingerichtet werden, um die Gliederung solcher Benutzerinteraktionen anzuzeigen oder auszublenden (führen Sie das folgende Snippet aus oder öffnen Sie es solcher anzuzeigen 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>

Lassen Sie mich abschließend noch einmal betonen, dass für die Implementierung dieses Ansatzes möglicherweise mehr Stil erforderlich ist als in meinen Demos enthalten, insbesondere wenn Sie das gewünschte Element bereits gestylt haben.

b_laoshi
quelle