Radio de contorno?


473

¿Hay alguna forma de obtener esquinas redondeadas en el contorno de un div element, similar a border-radius?


2
Bueno, tengo un cuadro Div con un borde gris de 2 píxeles con un radio de borde de 20 píxeles, estaba deambulando si puedo tener un Outine de 10 píxeles alrededor de ese borde que siga el borde en lugar de ser cuadrado
Marc Guerin

44
Esta es una buena pregunta. Un elemento con border: 5px redy outline: 5px bluey border-radius: 5px, el borde es redondeado, pero el esquema es cuadrada.
Matthew Rudy el

44
Hasta ahora solo podemos usarlo en Firefox:-moz-outline-radius
Wojciech Bednarski

Debería ser parte de CSS3 ... Si lo pienso, odio W3C: D
m93a

17
todos ustedes necesitan un box-shadowen su vida ..
Muhammad Umer

Respuestas:


539

Antigua pregunta ahora, pero esto podría ser relevante para alguien con un problema similar. Tenía un campo de entrada con redondeo bordery quería cambiar el color del contorno del foco. No pude domar el horrible cuadrado outlinedel control de entrada.

Entonces, en cambio, usé box-shadow. De hecho, preferí el aspecto suave de la sombra, pero la sombra se puede endurecer para simular un contorno redondeado:

 /* 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
OMI, esta es la respuesta que estás buscando. He hecho este método pero no paso por alto convertir tu esquema a 0.
John Morton

2
Esto es exactamente lo que estaba buscando, y se ajusta aún mejor que un radio de contorno.
Zenexer

2
El ejemplo de esquema duro no funciona. Es solo un rectángulo sin radio de esquina.
Erik Aigner

1
outline: 0rompe la accesibilidad web; leer outlinenone.com
ianstarz

44
@ianstarz, rompe la accesibilidad cuando no proporciona un estilo alternativo. box-shadowes el estilo alternativo (que, como se presenta aquí, en realidad es muy similar en apariencia a outline).
ACJ

85

Usualmente logro esto usando el: pseudo-elemento:

Por supuesto, depende del uso, este método permite el control sobre los bordes individuales, en lugar de utilizar el método de sombra dura.

También puede establecer compensaciones de -1px y usar un gradiente lineal de fondo (sin borde) para un efecto diferente una vez más.

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>


44
Una versión modificada y un poco más espectacular: jsfiddle.net/rh6j3cdm .
Dávid Horváth

2
No es posible hacer un :: después pseudo para un campo de entrada
Simon Franzen

gracias, esto funcionó MUY bien con los esquemas de consulta de búsqueda de react-sortable-tree.
Monarca Wadia

Me gusta esta solución porque es mucho más flexible que la box-shadowversión. Por ejemplo, si desea que el "esquema" esté separado del elemento (es decir, simulando outline-offset) se hace posible con esta técnica.
Kirk Woll

34

Similar a Lea Hayes arriba, pero así es como lo hice:

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>

No es necesario anidar DIV o jQuery, Altho por brevedad he omitido las variantes -moz y -webkit de algunos de los CSS. Puedes ver el resultado arriba


66
Él está hablando del ESQUEMA, no del borde ... radio del "contorno"
android.nick

55
correcto, pero dado que el radio de contorno no está disponible, mi método da la apariencia de un borde y un contorno. Este es un efecto visual, por lo que a menos que el diseño de Marc se especifique hasta el píxel, el hecho de que en realidad no use la propiedad de contorno no hace ninguna diferencia. Y dado que es una solución práctica, agradecería el voto de regreso
Heraldmonkey

2
Esto funcionó muy bien. Sin embargo, no insetusé y obtuve lo que quería.
Paul Schreiber

18

Quería una buena accesibilidad de foco para los menús desplegables en una barra de navegación de Bootstrap, y estuve bastante contento con esto:

     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

Estás buscando algo como esto , creo.

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

Editar

Hay un Firefox solo -moz-outline-radiuscorrectamente, pero eso no funcionará en IE / Chrome / Safari / Opera / etc. Por lo tanto, parece que la forma más compatible con el navegador cruzado * para obtener una línea curva alrededor de un borde es usar un contenedor 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>


* aparte de usar imágenes


20
No, sé cómo obtener el Radio de la frontera. Estaba deambulando si pudieras obtener un Radio de contorno
Marc Guerin

¿Qué significa exactamente? ¿Un contorno más grueso, como este? jsfiddle.net/mattball/NXZFv/1
Matt Ball

10
@Matt: un contorno curvo en lugar de un borde , obviamente. Ver w3.org/TR/CSS21/ui.html#dynamic-outlines
Joey

Bueno, tengo un cuadro Div con un borde gris de 2 píxeles con un radio de borde de 20 píxeles, estaba deambulando si puedo tener un Outine de 10 píxeles alrededor de ese borde que sigue al borde en lugar de ser cuadrado.
Marc Guerin

1
Solo una adición a su código mate, si deja caer el radio del borde unos pocos px en la caja interior, la esquina se vuelve mucho más apretada, gracias por su ayuda
Marc Guerin

7

Acabo de encontrar una gran solución para esto, y después de mirar todas las respuestas hasta ahora, aún no la he visto publicado. Entonces, esto es lo que hice:

Creé una regla CSS para la clase y usé una pseudoclase de: focus para esa regla. Me puse outline: nonea deshacerme de ese 'contorno' azul claro no apto para el radio sin bordes que Chrome usa de forma predeterminada. Luego, en esa misma :focuspseudoclase, donde ese esquema ya no existe, agregué mis propiedades de radio y borde. Llevando a lo siguiente

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

para tener un contorno de color granate con un radio de borde que ahora aparece cuando el elemento es seleccionado por el usuario.


El uso de "esquema: 0" o "esquema: ninguno" se considera una mala práctica y desordena la accesibilidad del usuario. En este punto, no tengo una solución, pero aquí hay un artículo sobre por qué no debe eliminar el esquema si es posible y qué hacer si es absolutamente necesario. Nunca elimine los contornos CSS
AndrewBrntt


5

Si desea obtener un aspecto en relieve, puede hacer algo como lo siguiente:

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

No he encontrado una solución para tener este trabajo en otros navegadores.

EDITAR: La única otra forma en que puede hacer esto es usar box-shadow, pero esto no funcionará si ya tiene una sombra de caja en ese elemento.


1
Puede usar varias sombras en el mismo elemento, separándolas por comas.
Bangash

2

Existe la solución si solo necesita un contorno sin borde. No es mío. Obtuve si del archivo Bootstrap css. Si lo especifica outline: 1px auto certain_color, obtendrá una delgada línea externa alrededor del div de cierto color. En este caso, el ancho especificado no tiene importancia, incluso si especifica un ancho de 10 px, de todos modos será una línea delgada. La palabra clave en la regla mencionada es "auto".
Si necesita un contorno con esquinas redondeadas y cierto ancho, puede agregar una regla CSS en el borde con el ancho necesario y el mismo color. Hace que el contorno sea más grueso.


2

Hasta donde yo sé, el Outline radiussolo es compatible con Firefox y Firefox para Android.

-moz-outline-radius: 1em;

ingrese la descripción de la imagen aquí


1

No. Las fronteras se ubican en el exterior del elemento y en el interior del área de margen del modelo de caja. Los contornos se ubican en el interior del elemento y el área de relleno del modelo de caja lo ignora. No está destinado a la estética. Es solo para mostrarle al diseñador los contornos de los elementos. En las primeras etapas de desarrollo de un documento html, por ejemplo, un desarrollador podría necesitar discernir rápidamente si ha colocado todos los divs esqueléticos en el lugar correcto. Más adelante pueden necesitar verificar si varios botones y formularios tienen la cantidad correcta de píxeles separados entre sí.

Las fronteras son de naturaleza estética. A diferencia de los contornos, en realidad están separados del modelo de caja, lo que significa que no se superponen al texto establecido en el margen: 0; y cada lado del borde se puede diseñar individualmente.

Si está tratando de aplicar un radio de esquina para delinear, supongo que lo está utilizando de la manera en que la mayoría de la gente usa el borde. Entonces, si no le molesta que pregunte, ¿qué propiedad del esquema lo hace deseable más allá del borde?


10
El propósito de los contornos es para la navegación / accesibilidad del teclado, no para mostrar a los desarrolladores dónde están los elementos
danwellman

Bueno, para eso los usan los navegadores, por defecto. Pero siempre los he usado para ver dónde están mis divs, con gran efecto.
Musixauce3000

+1 por mencionar que "Los bordes se ubican en el exterior del elemento y en el interior del área de margen del modelo de caja. Los contornos se ubican en el interior del elemento y el área de relleno del modelo de caja lo ignora".
Jacques

1

CAJA COMBINADA SOMBRA Y ESQUEMA.

Un ligero giro en la respuesta de Lea Hayes que encontré

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

consigue un acabado limpio muy bonito. Sin saltos en el tamaño que obtienes cuando usas border-radius


1

Como otros han dicho, solo Firefox lo admite. Aquí hay una solución que hace lo mismo, e incluso funciona con contornos discontinuos.

ejemplo

.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

Intente usar relleno y un color de fondo para el borde, luego un borde para el contorno:

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

Trabajó en mi caso.


0

Acabo de establecer el contorno transparente.

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

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

0

Me gusta de esta manera.

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

¡Creará un círculo gris con un borde ingenioso a su alrededor y nuevamente 1 px alrededor del borde!


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

En realidad, esto solo hará un círculo en el que se puede hacer clic, mientras que el radio del borde todavía forma un cuadrado, pero se ve como un círculo.


0

La respuesta simple a la pregunta básica es no. La única opción entre navegadores es crear un truco que logre lo que desea. Este enfoque conlleva ciertos problemas potenciales cuando se trata de diseñar contenido preexistente , pero proporciona una mayor personalización del contorno (desplazamiento, ancho, estilo de línea) que muchas de las otras soluciones.

En un nivel básico, considere el siguiente ejemplo estático (ejecute el snippent para la demostración):

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

Ahora, en un nivel más avanzado, sería posible usar JavaScript para arrancar elementos de un tipo o clase dados de modo que estén envueltos dentro de un div que simule un esquema en la carga de la página. Además, se podrían establecer enlaces de eventos para mostrar u ocultar el esquema en las interacciones del usuario de esta manera (ejecute el fragmento a continuación o ábralo en 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>

Para terminar, permítanme reiterar que implementar este enfoque puede requerir más estilo del que he incluido en mis demos, especialmente si ya ha diseñado el elemento que desea esbozar.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.