¿Alguna forma de declarar un tamaño / borde parcial a una caja?


101

¿Alguna forma de declarar un tamaño / borde parcial a un cuadro en CSS? Por ejemplo, un cuadro con 350pxeso solo muestra un borde inferior en sus primeros pasos 60px. Creo que puede resultar muy útil.

Ejemplos:

ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí

Respuestas:


152

Realmente no. Pero es muy fácil lograr el efecto de una manera que se degrada con gracia y no requiere un marcado superfluo:

div {
  width: 350px;
  height: 100px;
  background: lightgray;
  position: relative;
  margin: 20px;
}

div:after {
  content: '';
  width: 60px;
  height: 4px;
  background: gray;
  position: absolute;
  bottom: -4px;
}
<div></div>


3
No hay nada como ser marcado como la respuesta correcta sin hacer +1. ¡Pero te hice +1! Esta fue una solución perfecta para mi problema. ¡Gracias! editar Supongo que podrías haber sido +1 en OP y -1 por otra persona. Oh bien. Aprecio tu respuesta, y eso es todo lo que importa, verdad ;-)
— CWSpear

7
¿Cómo logras que esto esté en el centro, como en su segundo ejemplo?
— Cameron Martin

Debo agregar, cuando el elemento padre es un elemento de bloque en línea de ancho fluido. Obviamente, cuando tiene un ancho fijo, es fácil.
— Cameron Martin

4
No importa , obtuve el efecto que quería: dabblet.com/gist/e5a78f2d4bf50b6be4d3 . Es una pena que las ::outsidey ::insidelos pseudo-elementos no están disponibles todavía, me gusta poner en el marcado sólo por el estilo, pero creo que no hay ninguna otra manera.
— Cameron Martin

¡Esto funciona! Para usarlo con React, no puede usarlo como estilo contenten :afterlínea o JSS, pero funciona bien usando componentes con estilo.
— Raphael Pinel

23

Lo sé, esto ya está resuelto y se solicitaron píxeles. Sin embargo, solo quería compartir algo ...

Los elementos de texto parcialmente subrayados se pueden lograr fácilmente utilizando display:tableodisplay:inline-block

(Simplemente no uso display:inline-blockporque, sí, ya sabes, el incómodo 4pxespacio).

Elementos textuales

h1 {
  border-bottom: 1px solid #f00;
  display: table;
}
<h1>Foo is not equal to bar</h1>

Centrado , display:tablehace imposible centrar el elemento con text-align:center.
Trabajemos con margin:auto...

h1 {
  border-bottom: 1px solid #f00;
  display: table;
  margin-left: auto;
  margin-right: auto;
}
<h1>Foo is not equal to bar</h1>

Bueno , eso es bueno, pero no parcialmente .
Como bookcasey ya se introdujo, pseudo-elementos valen oro.

h1 {
  display: table;
  margin-left: auto;
  margin-right: auto;
}

h1:after {
  border-bottom: 1px solid #f00;
  content: '';
  display: block;
  width: 50%;
}
<h1>Foo is not equal to bar</h1>

Desplazamiento , el subrayado está alineado a la izquierda ahora. Para centrarlo, simplemente empuje el pseudoelemento la mitad de su width( 50% / 2 = 25%) hacia la derecha.

h1 {
  display: table;
  margin-left: auto;
  margin-right: auto;
}

h1:after {
  border-bottom: 1px solid #f00;
  content: '';
  display: block;
  margin-left: 25%;
  width: 50%;
}
<h1>Foo is not equal to bar</h1>

... como comentó Davidmatas , usar margin:autoes a veces más práctico que calcular el margin-desplazamiento a mano.

Entonces, podemos alinear el subrayado a la izquierda, a la derecha o al centro (sin conocer la corriente width) usando una de estas combinaciones:

  • Izquierda : margin-right: auto (o simplemente déjelo apagado)
  • Medio :margin: auto
  • Derecha :margin-left: auto

Ejemplo completo

.underline {
  display: table;
  margin-left: auto;
  margin-right: auto;
}

.underline:after {
  border-bottom: 1px solid #f00;
  content: '';
  display: block;
  width: 50%;
}

.underline--left:after {
  margin-right: auto; /* ...or just leave it off */
}

.underline--center:after {
  margin-left: auto;
  margin-right: auto;
}

.underline--right:after {
  margin-left: auto
}
<h1 class="underline underline--left">Foo is not equal to bar</h1>
<h1 class="underline underline--center">Foo is not equal to bar</h1>
<h1 class="underline underline--right">Foo is not equal to bar</h1>

Elementos a nivel de bloque

Esto se puede adoptar fácilmente, de modo que podamos usar elementos a nivel de bloque. El truco consiste en establecer la altura de los pseudoelementos a la misma altura que su elemento real (simplemente height:100%):

div {
  background-color: #eee;
  display: table;
  height: 100px;
  width: 350px;
}
div:after {
  border-bottom: 3px solid #666;
  content: '';
  display: block;
  height: 100%;
  width: 60px;
}
<div></div>


2
Gran respuesta. En cambio, :afterme gusta más un margin: 0 autoenfoque margin-left: 25%porque funcionará con cualquier ancho que declare sin necesidad de hacer matemáticas.
— Davidmatas

1
@davidmatas ¡Buen punto! Acabo de usar la forma matemática para aclarar cómo colocarlo manualmente a mano. Con este ejemplo, cualquiera podría entender cómo alinearlo a la izquierda / centro / derecha. De todos modos, auto
— agregaré

15

Aquí hay otra solución en la linear-gradientque puede crear fácilmente cualquier tipo de línea que desee. También puede tener varias líneas (en cada lado, por ejemplo) utilizando varios fondos:

Aquí hay otra sintaxis para lograr lo mismo que el anterior:

.box1 {
  width: 200px;
  padding: 20px;
  margin: 10px auto;
  text-align: center;
  background: 
   linear-gradient(#000, #000) top /40% 3px no-repeat, 
   #ccc
}

.box2 {
  width: 200px;
  padding: 20px;
  margin: 10px auto;
  text-align: center;
  background: 
    linear-gradient(red,red) bottom/ 60% 2px no-repeat, 
    #ccc;
}

.box3{
  width: 200px;
  padding: 20px;
  margin: 10px auto;
  text-align: center;
  background: 
   linear-gradient(red , red)bottom left/ 60% 2px,
   linear-gradient(blue, blue) 60% 0 / 40% 2px,
   linear-gradient(brown, brown) left/ 3px 30%,
   linear-gradient(orange, orange) right / 3px 40%,
   #ccc;
  background-repeat:no-repeat;
}
<div class="box1">
  Box1
</div>
<div class="box2">
  Box2
</div>
<div class="box3">
  Box3
</div>


1
Vaya ... He estado jugando durante horas para encontrar una manera de mostrar solo la esquina superior izquierda y la esquina superior derecha de un cuadro "implícito". : antes y: después era demasiado limitado, estropeaba la posición del objeto. ¡Esta es una solución brillante!
— Wouter

Algunos antecedentes sobre por qué y cómo funciona esto: webfx.com/blog/web-design/background-css-shorthand
— Wouter

2

Usé una cuadrícula para construir y dibujar algunos de los bordes.

Vea aquí .

Código:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Responsive partial borders</title>
    <style>
        /* ungrid without mobile */
        .row{width:100%;display:table;table-layout:fixed;}
        .col{display:table-cell;}

        /* things to change */
        .row{width: 70%; margin: auto;}
        .mid.row > .col{ height: 150px; }

        /* draw box and align text */
        .col{ text-align: center;}
        .top.left.col{
            border-top: 1px solid black;
            border-left: 1px solid black;
        }
        .top.right.col{
            border-top: 1px solid black;
            border-right: 1px solid black;
        }
        .bottom.left.col{
            border-bottom: 1px solid black;
            border-left: 1px solid black;
        }
        .bottom.right.col{
            border-bottom: 1px solid black;
            border-right: 1px solid black;
        }
        .mid.row > .col{
            border-left: 1px solid black;
            border-right: 1px solid black;
            vertical-align: middle;
        }
        .top.center.col{
            position: relative;
            top: -0.5em;
        }
        .bottom.center.col{
            position: relative;
            bottom: -0.5em;
        }
    </style>
</head>
<body>

    <div class="row">
        <div class="top left col"></div>
        <div class="top center col">Top</div>
        <div class="top right col"></div>
    </div>
    <div class="mid row">
        <div class="col">Mid</div>
    </div>
    <div class="row">
        <div class="bottom left col"></div>
        <div class="bottom center col">Bottom</div>
        <div class="bottom right col"></div>
    </div>  

</body>
</html>

@ SverriM.Olsen desde que la persona editó el código, el comentario es obsoleto
— Sagar V

0

CSS no admite bordes parciales. Necesitaría usar un elemento adyacente para simular esto.


O un pseudoelemento, que puede hacer completamente con CSS y no agregar ningún marcado, como lo ilustran las respuestas anteriores
— OG Sean
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.