Raggio del contorno?


473

Esiste un modo per ottenere angoli arrotondati sul contorno di un div element, simile a border-radius?


2
Bene, ho una Div box con un bordo grigio 2px con raggio del bordo 20px, stavo vagando se potessi avere un Outine 10px attorno a quel bordo che segue il confine piuttosto che essere quadrato
Marc Guerin

4
Questa è una buona domanda Un elemento con border: 5px rede outline: 5px bluee border-radius: 5px, il bordo è arrotondato, ma il contorno è quadrato.
Matthew Rudy,

4
Finora possiamo usarlo solo in Firefox:-moz-outline-radius
Wojciech Bednarski

Dovrebbe essere parte di CSS3 ... Se ci penso - odio W3C: D
m93a

17
tutti voi avete bisogno di un box-shadownella vostra vita ..
Muhammad Umer,

Risposte:


539

Vecchia domanda ora, ma questo potrebbe essere rilevante per qualcuno con un problema simile. Avevo un campo di input arrotondato bordere volevo cambiare il colore del contorno del fuoco. Non ho potuto domare l'orrido quadrato outlineal controllo di input.

Quindi, invece, ho usato box-shadow. In realtà ho preferito l'aspetto liscio dell'ombra, ma l'ombra può essere indurita per simulare un contorno arrotondato:

 /* 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, questa è la risposta che stai cercando. Ho fatto questo metodo, ma non trascurare di trasformare il tuo profilo in 0.
John Morton,

2
Questo è esattamente quello che stavo cercando e si adatta anche meglio di un raggio di contorno.
Zenexer,

2
L'esempio della struttura rigida non funziona. È solo un rettangolo senza raggio d'angolo.
Erik Aigner,

1
outline: 0rompe l'accessibilità del web; leggi outlinenone.com
ianstarz il

4
@ianstarz, interrompe l'accessibilità quando non fornisci uno stile alternativo. box-shadowè lo stile alternativo (che, come presentato qui, è in realtà molto simile nell'aspetto come outline).
ACJ,

85

Di solito lo realizzo usando lo pseudo-elemento: after:

ovviamente dipende dall'uso, questo metodo consente il controllo sui singoli bordi, piuttosto che usare il metodo dell'ombra dura.

è inoltre possibile impostare gli offset -1px e utilizzare nuovamente una sfumatura lineare di sfondo (senza bordo) per un effetto diverso.

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
Una versione modificata e un po 'più spettacolare: jsfiddle.net/rh6j3cdm .
Dávid Horváth,

2
Non è possibile creare uno pseudo :: after per un campo di input
Simon Franzen,

grazie, questo ha funzionato MOLTO bene con i contorni della query di ricerca di Rease-ordinabile-albero!
Monarch Wadia,

Mi piace questa soluzione perché è molto più flessibile della box-shadowversione. Ad esempio, se si desidera che lo "schema" sia distanziato dall'elemento (ovvero simulazione outline-offset), diventa possibile con questa tecnica.
Kirk Woll,

34

Simile a Lea Hayes sopra, ma ecco come l'ho fatto:

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>

Non è necessario nidificare DIV o jQuery, Altho per brevità ho tralasciato le varianti -moz e -webkit di alcuni CSS. Puoi vedere il risultato sopra


6
Sta parlando di OUTLINE, non del confine ... raggio "contorno"
android.nick

5
corretto, ma poiché il raggio del contorno non è disponibile, il mio metodo dà l'aspetto di un bordo e di un contorno. Questo è un effetto visivo, quindi a meno che il design di Marc non sia specificato nel pixel, il fatto che non utilizzi effettivamente la proprietà outline non fa alcuna differenza. E poiché è una soluzione pratica, apprezzerei il voto di ritorno
Heraldmonkey il

2
Questo ha funzionato alla grande. Non ho usato inset, però, e ho ottenuto quello che volevo.
Paul Schreiber,

18

Volevo una buona accessibilità al focus per i menu a discesa in una barra di navigazione Bootstrap, ed ero abbastanza contento di questo:

     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

Stai cercando qualcosa del genere , penso.

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

modificare

Esiste un solo Firefox -moz-outline-radiuscorrettamente, ma non funzionerà su IE / Chrome / Safari / Opera / ecc. Quindi, sembra che il modo più compatibile con più browser * per ottenere una linea curva attorno a un bordo sia usare un div wrapper:

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>


* oltre all'uso delle immagini


20
No, so come ottenere il raggio di confine Stavo vagando se potessi ottenere un raggio di contorno
Marc Guerin

Significa cosa, esattamente? Un contorno più spesso, come questo? jsfiddle.net/mattball/NXZFv/1
Matt Ball

10
@Matt: un contorno curvo anziché un bordo , ovviamente. Vedi w3.org/TR/CSS21/ui.html#dynamic-outlines
Joey

Bene, ho una scatola Div con un bordo grigio 2px con raggio del bordo 20px, stavo vagando se potessi avere un Outine 10px attorno a quel bordo che segue il bordo piuttosto che essere quadrato.
Marc Guerin,

1
Solo un'aggiunta al tuo codice opaco, se lasci cadere il raggio del bordo di pochi px nella casella interna l'angolo diventa molto più stretto, grazie per il tuo aiuto
Marc Guerin

7

Ho appena trovato un'ottima soluzione per questo, e dopo aver esaminato tutte le risposte finora, non l'ho ancora visto pubblicato. Quindi, ecco cosa ho fatto:

Ho creato una regola CSS per la classe e usato una pseudo-classe di: focus per quella regola. Ho deciso outline: nonedi sbarazzarmi di quel "contorno" blu chiaro predefinito non in grado di bordo che Chrome utilizza per impostazione predefinita. Quindi, nella stessa :focuspseudo-classe, dove quel contorno non esiste più, ho aggiunto le mie proprietà di raggio e bordo. Portando a quanto segue

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

per avere un contorno di colore marrone con un raggio del bordo che ora appare quando l'elemento viene selezionato dalla scheda dall'utente.


L'uso di "outline: 0" o "outline: none" è considerato una cattiva pratica e incasina l'accessibilità dell'utente. A questo punto, non ho una soluzione, ma ecco un articolo sul perché non dovresti rimuovere il contorno se possibile e cosa fare se assolutamente devi. Non rimuovere mai i contorni CSS
AndrewBrntt,


5

Se vuoi ottenere un aspetto in rilievo, potresti fare qualcosa del tipo:

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

Non ho trovato un modo per aggirare questo lavoro in altri browser.

EDIT: L'unico altro modo per farlo è usare box-shadow, ma questo non funzionerà se hai già un'ombra box su quell'elemento.


1
Puoi usare più ombre sullo stesso elemento, separandole da virgole.
Bangash,

2

C'è la soluzione se hai bisogno solo di contorni senza bordo. Non è mio. Ho ottenuto se dal file css Bootstrap. Se specifichi outline: 1px auto certain_color, otterrai una sottile linea esterna attorno a div di un certo colore. In questo caso la larghezza specificata non ha importanza, anche se si specifica una larghezza di 10 px, comunque sarà una linea sottile. La parola chiave nella regola menzionata è "auto".
Se hai bisogno di un contorno con angoli arrotondati e una certa larghezza, puoi aggiungere una regola CSS sul bordo con la larghezza necessaria e lo stesso colore. Rende il contorno più spesso.


2

Per quanto ne so, Outline radiusè supportato solo da Firefox e Firefox per Android.

-moz-outline-radius: 1em;

inserisci qui la descrizione dell'immagine


1

No. I bordi si trovano all'esterno dell'elemento e all'interno dell'area del margine del modello a scatola. I contorni si trovano all'interno dell'elemento e l'area di imbottitura del modello a scatola lo ignora. Non è inteso per l'estetica. È solo per mostrare al designer i contorni degli elementi. Nelle prime fasi dello sviluppo di un documento html, ad esempio, uno sviluppatore potrebbe aver bisogno di discernere rapidamente se ha messo tutti i div scheletrici nella posizione corretta. In seguito potrebbe essere necessario verificare se i vari pulsanti e moduli hanno il numero corretto di pixel l'uno dall'altro.

I bordi sono di natura estetica. A differenza dei contorni, in realtà sono separati dal modello a scatola, il che significa che non si sovrappongono al testo impostato sul margine: 0; e ogni lato del bordo può essere disegnato individualmente.

Se stai cercando di applicare un raggio d'angolo per delineare, suppongo che lo stai usando nel modo in cui la maggior parte delle persone usa il bordo. Quindi, se non ti dispiace che te lo chieda, quale proprietà del contorno lo rende desiderabile oltre confine?


10
Lo scopo dei contorni è per la navigazione / accessibilità della tastiera, non per mostrare agli sviluppatori dove si trovano gli elementi
danwellman,

Bene, questo è ciò che i browser li usano per impostazione predefinita. Ma li ho sempre usati per vedere dove sono i miei div, con grande efficacia.
Musixauce3000,

+1 per menzionare che "I bordi si trovano all'esterno dell'elemento e all'interno dell'area del margine del modello box. I contorni si trovano all'interno dell'elemento e l'area di riempimento del modello box lo ignora."
Jacques,

1

OMBRA E PROFILO COMBINATI DELLA SCATOLA.

Ho trovato una leggera svolta sulla risposta di Lea Hayes

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

ottiene un bel finale pulito. Non saltare di dimensioni che si ottengono quando si utilizza il raggio del bordo


1

Come altri hanno già detto, solo Firefox supporta questo. Ecco una soluzione che fa la stessa cosa e funziona anche con contorni tratteggiati.

esempio

.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

Prova a utilizzare il riempimento e un colore di sfondo per il bordo, quindi un bordo per il contorno:

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

Ha funzionato nel mio caso.


0

Ho appena impostato il contorno trasparente.

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

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

0

Mi piace così

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

Creerà un cerchio grigio con bordo argentato attorno e di nuovo 1px attorno al bordo!


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

Ciò renderà effettivamente selezionabile solo un cerchio, mentre il bordo-raggio fa ancora un quadrato, ma sembra un cerchio.


0

La semplice risposta alla domanda di base è no. L'unica opzione cross-browser è quella di creare un hack che realizzi ciò che desideri. Questo approccio comporta alcuni potenziali problemi quando si tratta di dare uno stile ai contenuti preesistenti , ma prevede una maggiore personalizzazione del contorno (offset, larghezza, stile della linea) rispetto a molte altre soluzioni.

A livello di base, considera il seguente esempio statico (esegui lo snippent per la demo):

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

Ora, a un livello più avanzato, sarebbe possibile usare JavaScript per eseguire il bootstrap di elementi di un determinato tipo o classe in modo che siano racchiusi in un div che simula uno schema al caricamento della pagina. Inoltre, è possibile stabilire associazioni di eventi per mostrare o nascondere la struttura delle interazioni dell'utente in questo modo (eseguire lo snippet di seguito o aprire in 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>

In conclusione, lasciatemi ripetere, che l'implementazione di questo approccio potrebbe richiedere più stile di quello che ho incluso nelle mie dimostrazioni, soprattutto se hai già disegnato l'elemento che desideri delineato.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.