Agregue texto centrado a la mitad de una línea similar a <hr />


217

Me pregunto qué opciones tiene uno en xhtml 1.0 estricto para crear una línea en ambos lados del texto de la siguiente manera:

Seccion uno
----------------------- Siguiente sección -----------------------
Sección dos

He pensado en hacer algunas cosas elegantes como esta:

<div style="float:left; width: 44%;"><hr/></div>
<div style="float:right; width: 44%;"><hr/></div>
Next section

O alternativamente, porque lo anterior tiene problemas con la alineación (tanto vertical como horizontal):

<table><tr>
<td style="width:47%"><hr/></td>
<td style="vertical-align:middle; text-align: center">Next section</td>
<td style="width:47%"><hr/></td>
</tr></table>

Esto también tiene problemas de alineación, que resuelvo con este desastre:

<table><tr>
<td style="border-bottom: 1px solid gray; width: 47%">&nbsp;</td>
<td style="vertical-align:middle;text-align:center" rowspan="2">Next section</td>
<td style="border-bottom: 1px solid gray; width: 47%">&nbsp;</td>
</tr><tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr></table>

Además de los problemas de alineación, ambas opciones se sienten "confusas", y estaría muy agradecido si hubiera visto esto antes y conociera una solución elegante.


3
Aquí hay otro hilo con un desafío sin etiquetas adicionales, ¡y una solución! stackoverflow.com/questions/12648513/…
willoller

1
stackoverflow.com/questions/5214127/… sigue siendo la mejor solución.

Una respuesta útil aquí emplearía CSS Grid.
Brian M. Hunt

Se agregó una respuesta (SCSS) que transforma casi cualquier elemento en un divisor sin establecer el fondo y permite la configuración: color y estilo de trazo (sólido, punteado, punteado) del divisor, posición del texto (izquierda, derecha, centro), así como la clase que aplica esto (por defecto .divider).
tao

Dado el soporte actual de flexbox , creo que mi respuesta podría ganar algo de visibilidad.
MatTheCat

Respuestas:


64

No sé si esto se ha resuelto, pero flexbox ofrece una buena solución:

<div class="separator">Next section</div>

.separator {
    display: flex;
    align-items: center;
    text-align: center;
}
.separator::before, .separator::after {
    content: '';
    flex: 1;
    border-bottom: 1px solid #000;
}
.separator::before {
    margin-right: .25em;
}
.separator::after {
    margin-left: .25em;
}

Ver http://jsfiddle.net/MatTheCat/Laut6zyc/ para la demostración.

Hoy la compatibilidad no es tan mala (puede agregar todas las sintaxis antiguas de flexbox) y se degrada con gracia.


La mejor respuesta teniendo en cuenta el soporte de flexbox en estos días
akivajgordon

esta es una buena solución
Smaillns

217

Qué tal si:

<div style="width: 100%; height: 20px; border-bottom: 1px solid black; text-align: center">
  <span style="font-size: 40px; background-color: #F3F5F6; padding: 0 10px;">
    Section Title <!--Padding is optional-->
  </span>
</div>

Mira este JSFiddle .

Puede usar vwo %para que responda .


2
Obtener el valor máximo exacto es un poco difícil. No es exactamente -0.5em;
Mitar

Perfecto. "Responsive" también
JimXC

44
Vea mi respuesta para una solución que no requiere que especifique el color de fondo o el ancho.
MartinF

Vea mi respuesta para bg transparente, sensible, estilo variable y altura del divisor, posición variable del texto. También se puede aplicar más de una vez a diferentes selectores, por tener más de un estilo de divisor en el mismo proyecto, usando SCSS. Funciona con cualquiera font-size.
tao

193

La forma de resolver esto sin conocer el ancho y el color de fondo es la siguiente:

Estructura

<div class="strike">
   <span>Kringle</span>
</div>

CSS

.strike {
    display: block;
    text-align: center;
    overflow: hidden;
    white-space: nowrap; 
}

.strike > span {
    position: relative;
    display: inline-block;
}

.strike > span:before,
.strike > span:after {
    content: "";
    position: absolute;
    top: 50%;
    width: 9999px;
    height: 1px;
    background: red;
}

.strike > span:before {
    right: 100%;
    margin-right: 15px;
}

.strike > span:after {
    left: 100%;
    margin-left: 15px;
}

Ejemplo: http://jsfiddle.net/z8Hnz/

Doble linea

Para crear una línea doble, use una de las siguientes opciones:

1) Espacio fijo entre líneas

.strike > span:before,
.strike > span:after {
    content: "";
    position: absolute;
    top: 50%;
    width: 9999px;
    border-top: 4px double red;

Ejemplo: http://jsfiddle.net/z8Hnz/103/

2) espacio personalizado entre líneas

.strike > span:before,
.strike > span:after {
    content: "";
    position: absolute;
    top: 50%;
    width: 9999px;
    height: 5px; /* space between lines */
    margin-top: -2px; /* adjust vertical align */
    border-top: 1px solid red;
    border-bottom: 1px solid red;
}

Ejemplo: http://jsfiddle.net/z8Hnz/105/


Versión SASS (SCSS)

Basado en esta solución, agregué SCSS "con propiedad de color" si pudiera ayudar a alguien ...

//mixins.scss
@mixin bg-strike($color) {

    display: block;
    text-align: center;
    overflow: hidden;
    white-space: nowrap; 

    > span {

        position: relative;
        display: inline-block;

        &:before,
        &:after {
            content: "";
            position: absolute;
            top: 50%;
            width: 9999px;
            height: 1px;
            background: $color;
        }

        &:before {
            right: 100%;
            margin-right: 15px;
        }

        &:after {
            left: 100%;
            margin-left: 15px;
        }
    }
}

ejemplo de uso:

//content.scss
h2 {
    @include bg-strike($col1);
    color: $col1;
}

Esta versión funciona mejor si está utilizando una imagen para la línea, o al menos es más fácil de editar y responde
tehlivi

¡Muy buen trabajo! ¿Puedes usar tu magia para crear una doble línea? (De lo contrario, recurriré al uso de una pequeña imagen de fondo repetitiva.)
wloescher

3
Gran fragmento! Gracias :)
plong0

2
Esta es la mejor respuesta porque funcionará sin establecer el fondo, y cuando tenga que establecer el fondo transparente
Dinesh Dabhi

1
¡El primer ejemplo es simplemente increíble! Felicidades! ¡Debería ser la respuesta correcta!
Luiz Eduardo

87

Puede lograr esto con :: before y :: after sin conocer el ancho del contenedor o el color de fondo, y para lograr un mayor estilo de los saltos de línea. Por ejemplo, esto se puede modificar para hacer líneas dobles, líneas punteadas, etc.

JSFiddle

Uso de CSS y HTML:

.hr-sect {
	display: flex;
	flex-basis: 100%;
	align-items: center;
	color: rgba(0, 0, 0, 0.35);
	margin: 8px 0px;
}
.hr-sect::before,
.hr-sect::after {
	content: "";
	flex-grow: 1;
	background: rgba(0, 0, 0, 0.35);
	height: 1px;
	font-size: 0px;
	line-height: 0px;
	margin: 0px 8px;
}
<div class="hr-sect">CATEGORY</div>

Versión SCSS:

.hr-sect {
    display: flex;
    flex-basis: 100%;
    align-items: center;
    color: rgba(0, 0, 0, 0.35);
    margin: 8px 0;

    &:before, &:after {
        content: "";
        flex-grow: 1;
        background: rgba(0, 0, 0, 0.35);
        height: 1px;
        font-size: 0;
        line-height: 0;
        margin: 0 8px;
    }
}

1
Solución elegante, aunque tiene una advertencia: si no habrá texto, aún tendrá un espacio entre líneas.
Farside

13
Esta es la solución más limpia en este hilo para ser honesto, el problema sin texto puede pasarse por alto ya que siempre querría el divisor con texto.
Robert

51

Prueba esto:

.divider {
	width:500px;
	text-align:center;
}

.divider hr {
	margin-left:auto;
	margin-right:auto;
	width:40%;

}

.left {
	float:left;
}

.right {
	float:right;
}
<div class="divider">
    <hr class="left"/>TEXT<hr class="right" />
</div>

Vista previa en vivo en jsFiddle .


44
Funciona perfectamente y usa <hr />, entonces, ¿qué podría estar mal con esta respuesta? No dije nada.
Kirby el

44
+1 No es necesario meterse con el color de fondo o usar etiquetas de manera no deseada. Una desventaja es que el .divider hrancho depende de la longitud del texto. Sugerencia: .dividery los .divider hranchos deben especificarse en emunidades. Para obtener el hrancho, use ( .dividerancho menos # de caracteres) / 2.
Kelvin el

12
No es la mejor solución. ¿Qué sucede si no tiene certeza sobre el ancho del texto? Todo se arruinará cuando el texto sea más largo.
Iwona Trąbka

Esta es la mejor y la respuesta más simple
ha9u63ar

1
40% está mal aquí. Si el texto es más largo, se alinearía mal
TomSawyer

21

Acabo de encontrar el mismo problema, aquí hay una forma de resolverlo:

<table width="100%">
  <tr>
    <td><hr /></td>
    <td style="width:1px; padding: 0 10px; white-space: nowrap;">Some text</td>
    <td><hr /></td>
  </tr>
</table>

Funciona sin establecer un fondo en el elemento de texto, es decir, se verá bien independientemente del fondo que haya detrás.

Puedes probarlo aquí: http://jsfiddle.net/88vgS/


No resuelve el problema del OP. Eso crea dos líneas con texto entre ellas. Él quiere una línea que se divide en parte y tiene texto en la sección rota, luego la línea continúa.
Dracorat

2
Realmente hace lo que el OP está pidiendo. Puedes verlo en jsfiddle.net/88vgS
Robert Kajic

Además, ¿qué es una línea discontinua a mitad de camino, con texto en la sección discontinua, si no dos líneas con texto entre ellas?
Robert Kajic

Deberías tirar las etiquetas TR apropiadas allí. Creo que eso es lo que me confundió por un momento. Originalmente pensé por alguna razón que estaba en tres líneas, no en tres columnas. El marcado correcto probablemente no me hubiera hecho verlo de esa manera. De todos modos, definitivamente es una solución viable.
Dracorat

1
Pero esto usa tablas, ¡eso NO ESTÁ PERMITIDO! Oh, solo bromeaba. GRIDS tiene su lugar, casi todos los demás marcos XML GUI lo reconocen y los usan en todas partes (por ejemplo, WPF / XAML). Gracias por la solución compañero! Esto merece más de 3 votos. Sin embargo, sospecho que la aversión de la gente a las mesas odiadas será un obstáculo.
Nicholas Petersen

10

ACTUALIZAR: Esto no funcionará con HTML5

En su lugar, consulte esta pregunta para obtener más técnicas: desafío CSS, ¿puedo hacer esto sin introducir más HTML?


Solía line-height:0crear el efecto en el encabezado de mi sitio guerilla-alumnus.com

<div class="description">
   <span>Text</span>
</div>

.description {
   border-top:1px dotted #AAAAAA;
}

.description span {
   background:white none repeat scroll 0 0;
   line-height:0;
   padding:0.1em 1.5em;
   position:relative;
}

Otro buen método está en http://robots.thoughtbot.com/

Utiliza una imagen de fondo y flota para lograr un efecto genial.


1
Me gusta esto, se ve muy bien en su sitio, pero no pude hacerlo funcionar (sospecho que hay interferencia de jQuery css). :( Pero es realmente genial.
Brian M. Hunt

Creo que tu h1 está presionando el lapso hacia abajo.
imns

1
Este es un "hack" que emplea el comportamiento de representación diferente para DOCTYPE XTHML 1.0 Transitional. Si usa DOCTYPE html (para HTML5), NO funcionará.
Peter

6
<div style="text-align: center; border-top: 1px solid black">
  <div style="display: inline-block; position: relative; top: -10px; background-color: white; padding: 0px 10px">text</div>
</div>

6

Si puede usar CSS y está dispuesto a usar el alignatributo en desuso , un conjunto de campos con estilo / leyenda funcionará:

<style type="text/css">
fieldset { 
    border-width: 1px 0 0 0;
}
</style>

<fieldset>
<legend align="center">First Section</legend>
Section 1 Stuff
</fieldset>

<fieldset>
<legend align="center">Second Section</legend>
Section 2 Stuff
</fieldset>

El propósito previsto de un conjunto de campos es agrupar lógicamente campos de formulario. Como señaló willoler, un text-align: centerestilo para no funcionará para legendelementos. align="center"está en desuso HTML pero debe centrar el texto correctamente en todos los navegadores.


Una explicación más detallada de lo que estaba buscando.
dclowd9901

Estoy bastante seguro de que <legend>adquiere los rasgos de visualización de una blocko inline-blockelemento, ya que puede ser acolchada y con margen, lo que significa text-align:centerno debe trabajar ...
dclowd9901

sí, las leyendas son geniales para la semántica: las uso para envolver grupos de radio pero son notoriamente obstinadas
Willoller

Corrija mi respuesta. Desafortunadamente, debido a la terquedad de ciertos navegadores en el diseño del legendelemento, align="center"es la única solución que pude encontrar que se centra de manera confiable a legend.
Trey Hunner

6

Rejilla Bootstrap:

HTML:

  <div class="row vertical-center">
    <div class="col-xs-5"><hr></div>
    <div class="col-xs-2" style="color: white"> Text</div>
    <div class="col-xs-5"><hr></div>
  </div>

CSS:

.vertical-center{
  display: flex;
  align-items: center;
}

1
La vertical-centerclase ya no existe en bootstrap (4.3.1). ¿Podría por favor actualizar su respuesta para decir align-items-center?
Cameron Hudson

5

Podrías usar la posición relativa y establecer una altura en el padre

.fake-legend {
  height: 15px;
  width:100%;
  border-bottom: solid 2px #000;
  text-align: center;
  margin: 2em 0;
}
.fake-legend span {
  background: #fff;
  position: relative;
  top: 0;
  padding: 0 20px;
  line-height:30px;
}
<p class="fake-legend"><span>Or</span>
</p>


5

Heres una solución simple con css solamente, sin trucos de fondo ...

.center-separator {
    display: flex;
  line-height: 1em;
  color: gray;
}

.center-separator::before, .center-separator::after {
    content: '';
    display: inline-block;
    flex-grow: 1;
    margin-top: 0.5em;
    background: gray;
    height: 1px;
    margin-right: 10px;
    margin-left: 10px;
  }

HTML:

  <div class="center-separator">
    centered text
  </div>

violín de ejemplo: https://jsfiddle.net/0Lkj6wd3/


Gran solución y reutilizable, como una clase de utilidad.
Vignesh

3
<fieldset style="border:0px; border-top:1px solid black">
    <legend>Test</legend>
</fieldset>

Hack malvado ...


1
No lo llamaría un hack, pero probaría que funciona en todos los navegadores que pretendes admitir.
Nick Larsen

fieldset no quiere ser usado así, ha sido pirateado en su lugar ;-)
Dänu

3

Subiendo una publicación de 2 años, pero así es como abordo estas situaciones usando solo un elemento y CSS.

​h1 {
    text-align: center;
}

h1:before,
h1:after {
    content: "";
    background: url('http://heritageonfifth.com/images/seperator.png') left center repeat-x;
    width: 15%;
    height: 30px;
    display: inline-block;
    margin: 0 15px 0 0;
}

h1:after{
    background-position: right center;
    margin: 0 0 0 15px;
}

Y aquí hay un violín para comprobarlo: http://jsfiddle.net/sRhBc/ (imagen aleatoria de Google tomada para el borde).

El único inconveniente de este enfoque es que no es compatible con IE7.


3

Solo usa

    hr
    {
        padding: 0;
        border: none;
        border-top: 1px solid #CCC;
        color: #333;
        text-align: center;
        font-size: 12px;
        vertical-align:middle;
    }
    hr:after
    {
        content: "Or";
        display: inline-block;
        position: relative;
        top: -0.7em;
        font-size: 1.2em;
        padding: 0 0.25em;
        background: white;
    }

2

Woohoo mi primer post a pesar de que este tiene un año. Para evitar los problemas de color de fondo con los envoltorios, puede usar el bloqueo en línea con hr (nadie lo dijo explícitamente). La alineación de texto debe centrarse correctamente ya que son elementos en línea.

<div style="text-align:center">
    <hr style="display:inline-block; position:relative; top:4px; width:45%" />
       &nbsp;New Section&nbsp;
    <hr style="display:inline-block; position:relative; top:4px; width:45%" />
</div>

2

Yo uso un h1con un lapso en el medio.

Ejemplo HTML:

<h1><span>Test archief</span></h1>

Ejemplo CSS:

.archive h1 {border-top:3px dotted #AAAAAA;}
.archive h1 span { display:block; background:#fff; width:200px; margin:-23px auto; text-align:center }

Simple como eso.


Bienvenido a StackOverflow, Youri. En lugar de a span, podrías considerar usar a div. Sirve para el mismo propósito, excepto que es naturalmente un elemento de bloque. :)
Nix

@Nix Elemento de bloque dentro del elemento en línea? No, gracias, el lapso es una buena opción
Jonathan Azulay

1
@MrAzulay h1es un elemento en línea. spanes agradable para la materia de embalaje, pero la razón por la que prefiero una diven este caso, se debe a que el uso Youri CSS para establecer el spana display:block;. No veo el punto de convertir un elemento en línea en un elemento de bloque, cuando hay elementos de bloque adecuados ( div) fácilmente disponibles.
Nix

@Nix ¿No es eso algo bastante común? Si bien poner bloques dentro de línea es una mala práctica imo. Esta es una buena publicación al respecto skypoetsworld.blogspot.se/2008/10/…
Jonathan Azulay

Vaya, escribí mal en mi último comentario. Estoy de acuerdo en que no debe colocar un bloque dentro de un elemento en línea, sino h1que en realidad es un elemento BLOCK. Perdón por la confusion. Aún así, no veo el punto de convertirlo spanen un elemento de bloque, pero lo suficientemente justo.
Nix

2

Mirando arriba, modifiqué a:

CSS

.divider {
    font: 33px sans-serif;
    margin-top: 30px;
    text-align:center;
    text-transform: uppercase;
}
.divider span {
    position:relative;
}
.divider span:before, .divider span:after {
    border-top: 2px solid #000;
    content:"";
    position: absolute;
    top: 15px;
    right: 10em;
    bottom: 0;
    width: 80%;
}
.divider span:after {
    position: absolute;
    top: 15px;
    left:10em;
    right:0;
    bottom: 0;
}

HTML

<div class="divider">
    <span>This is your title</span></div>

Parece funcionar bien.


2

Tomando la solución de @ kajic y poniendo el estilo en CSS:

<table class="tablehr">
  <td><hr /></td>
  <td>Text!</td>
  <td><hr /></td>
</table>

Luego CSS (pero depende de CSS3 al usar el enésimo selector):

.tablehr { width:100%; }
.tablehr > tbody > tr > td:nth-child(2) { width:1px; padding: 0 10px; white-space: nowrap; }

Salud.

(PD: en tbody y tr, Chrome, IE y Firefox al menos insertan automáticamente un tbody y tr, por lo que mi muestra, como @ kajic's, no los incluyó para mantener las cosas más cortas en el marcado html necesario. Esta solución fue probado con las versiones más recientes de IE, Chrome y Firefox, a partir de 2013).


2

PAGINA DEMO

HTML

<header>
  <h1 contenteditable>Write something</h1>
</header>

CSS

header{ 
  display:table;
  text-align:center; 
}
header:before, header:after{ 
  content:'';
  display:table-cell; 
  background:#000; 
  width:50%;
  -webkit-transform:scaleY(0.3);
  transform:scaleY(0.3);
}
header > h1{ white-space:pre; padding:0 15px; }

2

Esto funcionó para mí y no requiere color de fondo detrás del texto para ocultar una línea de borde, en su lugar usa la etiqueta hr real. Puede jugar con los anchos para obtener diferentes tamaños de líneas hr.

<div>
    <div style="display:inline-block;width:45%"><hr width='80%' /></div>
    <div style="display:inline-block;width: 9%;text-align: center;vertical-align:90%;text-height: 24px"><h4>OR</h4></div>
    <div style="display:inline-block;width:45%;float:right" ><hr width='80%'/></div>
</div>

2

Hice un violín que usa FlexBox y también le dará diferentes estilos de HR (línea doble, símbolos en el centro de la línea, sombra, recuadro, guiones, etc.).

CSS

button {
    padding: 8px;
    border-radius: 4px;
    background-color: #fff;
    border: 1px solid #ccc;
    margin: 2px;
  }

  button:hover {
    cursor: pointer;
  }

  button.active {
    background-color: rgb(34, 179, 247);
    color: #fff;
  }

  .codeBlock {
    display: none;
  }

  .htmlCode, .cssCode {
    background-color: rgba(34, 179, 247, 0.5); 
    width: 100%;
    padding: 10px;
  }

  .divider {
    display: flex;
    flex-direction: row;
    flex-flow: row;
    width: 100%;
  }

  .divider.fixed {
    width: 400px;
  }

  .divider > label {
    align-self: baseline;
    flex-grow: 2;
    white-space: nowrap;
  }

  .divider > hr {
    margin-top: 10px;
    width: 100%;
    border: 0;
    height: 1px;
    background: #666;
  }

  .divider.left > label {
    order: 1;
    padding-right: 5px;
  }

  .divider.left > hr {
    order: 2
  }

  .divider.right > label {
    padding-left: 5px;
  }
  /* hr bars with centered text */
  /* first HR in a centered version */

  .divider.center >:first-child {
    margin-right: 5px;
  }
  /* second HR in a centered version */

  .divider.center >:last-child {
    margin-left: 5px;
  }
  /** HR style variations **/

  hr.gradient {
    background: transparent;
    background-image: linear-gradient(to right, #f00, #333, #f00);
  }

  hr.gradient2 {
    background: transparent;
    background-image: linear-gradient(to right, rgba(0, 0, 0, 0), rgba(255, 0, 0, 0.5), rgba(0, 0, 0, 0));
  }

  hr.dashed {
    background: transparent;
    border: 0;
    border-top: 1px dashed #666;
  }

  hr.dropshadow {
    background: transparent;
    height: 12px;
    border: 0;
    box-shadow: inset 0 12px 12px -12px rgba(0, 0, 0, 0.5);
  }

  hr.blur {
    background: transparent;
    border: 0;
    height: 0;
    /* Firefox... */
    box-shadow: 0 0 10px 1px black;
  }

  hr.blur:after {
    background: transparent;
    /* Not really supposed to work, but does */
    content: "\00a0";
    /* Prevent margin collapse */
  }

  hr.inset {
    background: transparent;
    border: 0;
    height: 0;
    border-top: 1px solid rgba(0, 0, 0, 0.1);
    border-bottom: 1px solid rgba(255, 255, 255, 0.3);
  }

  hr.flared {
    background: transparent;
    overflow: visible;
    /* For IE */
    height: 30px;
    border-style: solid;
    border-color: black;
    border-width: 1px 0 0 0;
    border-radius: 20px;
  }

  hr.flared:before {
    background: transparent;
    display: block;
    content: "";
    height: 30px;
    margin-top: -31px;
    border-style: solid;
    border-color: black;
    border-width: 0 0 1px 0;
    border-radius: 20px;
  }

  hr.double {
    background: transparent;
    overflow: visible;
    /* For IE */
    padding: 0;
    border: none;
    border-top: medium double #333;
    color: #333;
    text-align: center;
  }

  hr.double:after {
    background: transparent;
    content: "§";
    display: inline-block;
    position: relative;
    top: -0.7em;
    font-size: 1.5em;
    padding: 0 0.25em;
  }

HTML

<div class="divider left">
  <hr />
  <label>Welcome!</label>
</div>
<p>&nbsp;</p>
<div class="divider right">
  <hr />
  <label>Welcome!</label>
</div>
<p>&nbsp;</p>
<div class="divider center">
  <hr />
  <label>Welcome!</label>
  <hr />
</div>
<p>&nbsp;</p>
<div class="divider left fixed">
  <hr />
  <label>Welcome!</label>
</div>
<p>&nbsp;</p>
<div class="divider right fixed">
  <hr />
  <label>Welcome!</label>
</div>
<p>&nbsp;</p>
<div class="divider center fixed">
  <hr />
  <label>Welcome!</label>
  <hr />
</div>

O aquí hay un violín interactivo: http://jsfiddle.net/mpyszenj/439/


2

Puede intentar hacer una fieldsety alinear el elemento "leyenda" (el texto de la "siguiente sección") en la mitad del campo con solo border-topestablecer. No estoy seguro de cómo se coloca una leyenda de acuerdo con el elemento del conjunto de campos. Sin embargo, imagino que podría ser simple margin: 0px autohacer el truco.

ejemplo:

<fieldset>
      <legend>Title</legend>
</fieldset>

1

Puedes lograr esto sin <hr />. Semánticamente, el diseño debe hacerse con los medios de CSS, en este caso es bastante posible.

div.header
{
  position: relative;
  text-align: center;
  padding: 0 10px;
  background: #ffffff;
}

div.line
{
  position: absolute;
  top: 50%;
  border-top: 1px dashed;
  z-index: -1;
}

<div class="header">
  Next section
  <div class="line">&nbsp;</div>
</div>

1

Siempre existe el viejo FIELDSET

 fieldset
 {
border-left: none;
border-right: none;
border-bottom: none;
 }
 fieldset legend
 {
text-align: center;
padding-left: 10px;
padding-right: 10px;
 }

Los conjuntos de campos solo deben usarse con formularios.
tehlivi

1

html

<div style="display: grid; grid-template-columns: 1fr 1fr 1fr;" class="add-heading">
    <hr class="add-hr">
    <h2>Add Employer</h2>
    <hr class="add-hr">
</div>

css

.add-hr { 
    display: block; height: 1px;
    border: 0; border-top: 4px solid #000;
    margin: 1em 0; padding: 0; 
  }

.add-heading h2{
  text-align: center;
}

0

Puede crear un bloque de envoltura con alguna imagen de fondo adecuada (y también establecer un color de fondo para su bloque de texto centrado).


0

CSS

.Divider {
width: 100%; height: 30px;  text-align: center;display: flex;
}
.Side{
width: 46.665%;padding: 30px 0;
}
.Middle{
width: 6.67%;padding: 20px 0;
}

HTML

<div class="Divider">
    <div class="Side"><hr></div>
    <div class="Middle"><span>OR</span></div>
    <div class="Side"><hr></div>
</div>

Puede modificar el ancho en la clase "lado" y "medio" en función de la longitud de su texto en la etiqueta "span". Asegúrese de que el ancho del "medio" más 2 veces el ancho del "lado" sea igual al 100%.


0

Fondo transparente receptivo, altura y estilo de divisor variables, posición variable del texto, distancia ajustable entre el divisor y el texto. También se puede aplicar varias veces con diferentes selectores para múltiples estilos de divisor en el mismo proyecto.
SCSS a continuación.

Marcado (HTML):

<div class="divider" text-position="right">Divider</div>

CSS :

.divider {
  display: flex;
  align-items: center;
  padding: 0 1rem;
}

.divider:before,
.divider:after {
  content: '';
  flex: 0 1 100%;
  border-bottom: 5px dotted #ccc;
  margin: 0 1rem;
}

.divider:before {
  margin-left: 0;
}

.divider:after {
  margin-right: 0;
}

.divider[text-position="right"]:after,
.divider[text-position="left"]:before {
  content: none;
}

Sin text-positionque por defecto se centre.

Manifestación:

Y SCSS , para modificarlo rápidamente:

$divider-selector    : ".divider";
$divider-border-color: rgba(0,0,0,.21);
$divider-padding     : 1rem;
$divider-border-width: 1px;
$divider-border-style: solid;
$divider-max-width   : 100%;

#{$divider-selector} {
    display: flex;
    align-items: center;
    padding: 0 $divider-padding;
    max-width: $divider-max-width;
    margin-left: auto;
    margin-right: auto;

    &:before,
    &:after {
        content: '';
        flex: 0 1 100%;
        border-bottom: $divider-border-width $divider-border-style $divider-border-color;
        margin: 0 $divider-padding;
        transform: translateY(#{$divider-border-width} / 2)
    }

    &:before {
        margin-left: 0;
    }

    &:after {
        margin-right: 0;
    }

    &[text-position="right"]:after,
    &[text-position="left"]:before {
        content: none;
    }
}

violín aquí .


Hola, realmente aprecio tu fragmento de código. Si pongo un texto con un separador que no sea inglés (en mi caso, coreano), los textos rompen la línea en cada dos letras. ¿Podrías entender por qué?
cadenzah

0

.orSpan{
  position: absolute;
  margin-top: -1.3rem;
  margin-left:50%;
  padding:0 5px;
  background-color: white;
}
<div>
   <hr> <span class="orSpan">OR</span>
</div>

Es posible que deba ajustar la propiedad de margen

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.