Adicione texto centralizado no meio de uma linha semelhante a <hr />


217

Eu estou querendo saber quais opções um tem no xhtml 1.0 estrito para criar uma linha em ambos os lados do texto da seguinte forma:

Seção Um
----------------------- Próxima seção -----------------------
Seção dois

Eu pensei em fazer algumas coisas extravagantes como esta:

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

Ou, alternativamente, porque o problema acima tem problemas de alinhamento (vertical e 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>

Isso também tem problemas de alinhamento, que eu resolvo com essa bagunça:

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

Além dos problemas de alinhamento, ambas as opções parecem "imprecisas", e eu ficaria muito grato se você já tivesse visto isso antes e tivesse uma solução elegante.


3
Aqui está outro tópico com um desafio sem tags extras - e uma solução! stackoverflow.com/questions/12648513/…
willoller

1
stackoverflow.com/questions/5214127/… ainda é a melhor solução.

Uma resposta útil aqui empregaria CSS Grid.
Brian M. Hunt

Foi adicionada uma resposta (SCSS) que transforma quase qualquer elemento em um divisor sem definir o plano de fundo e permite a configuração: estilo de cor e traçado (sólido, pontilhado, tracejado) do divisor, posição do texto (esquerda, direita, centro) e também a classe que aplica isso (por padrão .divider).
tao

Dado o suporte atual ao flexbox , acho que minha resposta pode ganhar alguma visibilidade.
MatTheCat 31/10/19

Respostas:


63

Não sei se isso foi resolvido, mas o flexbox oferece uma solução:

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

Veja http://jsfiddle.net/MatTheCat/Laut6zyc/ para obter uma demonstração.

Hoje, a compatibilidade não é tão ruim (você pode adicionar todas as sintaxes antigas do flexbox) e é degradada normalmente.


Melhor resposta considerando o suporte ao flexbox atualmente
akivajgordon

esta é uma boa solução
Smaillns

217

E se:

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

Confira este JSFiddle .

Você pode usar vwou %torná-lo responsivo .


2
Obter o valor máximo exato é um pouco difícil. Não é exatamente -0,5em;
Mitar

perfeito. "Responsive" too
JimXC 24/11/13

4
Veja minha resposta para uma solução que não exige que você especifique a cor ou a largura do plano de fundo.
MartinF

Veja minha resposta para respostas responsivas e transparentes, estilo variável e altura do divisor, posição variável do texto. Também pode ser aplicado mais de uma vez a diferentes seletores, por ter mais de um estilo de divisor no mesmo projeto, usando o SCSS. Funciona com qualquer font-size.
tao

193

A maneira de resolver isso sem saber a largura e a cor do plano de fundo é a seguinte:

Estrutura

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

Exemplo: http://jsfiddle.net/z8Hnz/

Linha dupla

Para criar uma linha dupla, use uma das seguintes opções:

1) Espaço fixo entre linhas

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

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

2) Espaço personalizado entre linhas

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

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


Versão SASS (SCSS)

Com base nesta solução, adicionei o SCSS "com propriedade de cor" se isso pudesse ajudar alguém ...

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

exemplo de uso:

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

Esta versão funciona melhor se você estiver usando uma imagem para a linha - ou pelo menos é mais fácil editar e continuar respondendo
tehlivi

Muito bom trabalho! Você pode usar sua magia para criar uma linha dupla? (Caso contrário, vou recorrer ao uso de uma imagem de fundo de repetição pequena.)
wloescher

3
Ótimo trecho! Obrigado :)
plong0

2
Esta é a melhor resposta, pois funcionará sem definir o plano de fundo e quando você precisar definir o plano de fundo transparente
Dinesh Dabhi -

1
O primeiro exemplo é simplesmente incrível! Parabéns! Deve ser a resposta correta!
Luiz Eduardo

87

Você pode fazer isso com :: before e :: after sem saber a largura da cor do contêiner ou do plano de fundo e obter um estilo maior das quebras de linha. Por exemplo, isso pode ser modificado para criar linhas duplas, linhas pontilhadas, etc.

JSFiddle

Uso de CSS e 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>

Versão 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
Solução elegante, embora tenha uma ressalva: se não houver texto, você ainda terá um espaço entre as linhas.
Farside

13
Para ser honesto, esta é a solução mais limpa neste segmento. O problema sem texto pode ser esquecido, pois você sempre desejaria o divisor com texto.
Robert

51

Tente o seguinte:

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

Visualização ao vivo no jsFiddle .


4
Funciona perfeitamente e usa <hr />, então o que poderia estar errado com esta resposta? Não digo nada.
Kirby

4
+1 Não há necessidade de mexer com a cor de fundo ou usar tags de maneira não intencional. Uma desvantagem é que a .divider hrlargura depende de quanto tempo o texto é. Sugestão: .dividere as .divider hrlarguras devem ser especificadas em emunidades. Para obter hrlargura, use ( .dividerlargura menos o número de caracteres) / 2.
Kelvin

12
Não é a melhor solução. E se você não tiver certeza sobre a largura do texto. Tudo ficará arruinado quando o texto for mais longo.
Iwona Trąbka

Este é o melhor e mais simples resposta
ha9u63ar

1
40% está errado aqui. Se o texto for mais longo, seria desalinhado
TomSawyer

21

Acabei de encontrar o mesmo problema, aqui está uma maneira de resolvê-lo:

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

Ele funciona sem definir um plano de fundo no elemento de texto, ou seja, ficará bem, independentemente do plano de fundo por trás dele.

Você pode experimentá-lo aqui: http://jsfiddle.net/88vgS/


Não resolve o problema do OP. Isso cria duas linhas com texto entre elas. Ele quer uma linha que esteja quebrada no meio do caminho e tenha texto na seção quebrada, e a linha continua.
Dracorat

2
Na verdade, faz o que o OP está pedindo. Você pode vê-lo em jsfiddle.net/88vgS
Robert Kajic

Além disso, o que é uma linha quebrada parcialmente, com texto na seção quebrada, se não duas linhas com texto entre elas?
Robert Kajic

Você deve colocar tags TR apropriadas lá. Eu acho que foi isso que me deixou confusa por um momento. Originalmente, pensei que, por algum motivo, fosse em três linhas, não em três colunas. A marcação correta provavelmente não teria me levado a vê-la dessa maneira. Independentemente disso, é definitivamente uma solução viável.
Dracorat

1
Mas isso usa tabelas, isso NÃO é PERMITIDO! Brincadeirinha. GRIDS têm seu lugar, quase todas as outras estruturas XML da GUI reconhecem isso e as usam em qualquer lugar (por exemplo, WPF / XAML). Obrigado pela solução companheiro! Isso merece mais de 3 votos positivos. Suspeito que a aversão das pessoas às mesas odiadas seja um obstáculo.
Nicholas Petersen

10

ATUALIZAR: isso não funcionará usando HTML5

Em vez disso, consulte esta pergunta para obter mais técnicas: desafio de CSS, posso fazer isso sem introduzir mais HTML?


Eu costumava line-height:0criar o efeito no cabeçalho do meu site 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;
}

Outro bom método está em http://robots.thoughtbot.com/

Ele usa uma imagem de fundo e flutua para obter um efeito legal


1
Gosto disso, fica ótimo no seu site, mas não consegui fazê-lo funcionar (suspeito de interferência do jQuery css). :( Mas é muito legal.
Brian M. Caça

Eu acho que o seu h1 está diminuindo o tempo.
imns 17/05/12

1
Este é um "hack" que emprega o comportamento de renderização diferente para DOCTYPE XTHML 1.0 Transitional. Se você usar o DOCTYPE html (para HTML5), ele NÃO 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

Se você pode usar CSS e deseja usar o alignatributo obsoleto , um conjunto de campos / legenda com estilo 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>

O objetivo de um conjunto de campos é agrupar logicamente os campos do formulário. Como willoler apontou, um text-align: centerestilo para não funcionará para legendelementos. align="center"é HTML reprovado, mas deve centralizar o texto corretamente em todos os navegadores.


Uma explicação mais detalhada do que eu estava procurando.
dclowd9901

Tenho certeza que <legend>assume as características de um visor blockou inline-blockelemento, como pode ser acolchoada e marginada, o que significa text-align:centernão deve trabalhar ...
dclowd9901

Sim, as lendas são ótimas para a semântica - eu as uso para
agrupar

Corrigi minha resposta. Infelizmente, devido à teimosia de certos navegadores em estilizar o legendelemento, align="center"é a única solução que eu pude encontrar que centraliza de forma confiável a legend.
Trey Hunner

6

Grade de inicialização:

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
A vertical-centerclasse não existe mais no bootstrap (4.3.1). Você poderia atualizar sua resposta para dizer align-items-center?
Cameron Hudson

5

Você pode apenas usar a posição relativa e definir uma altura no pai

.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 uma solução simples com apenas css, sem truques de fundo ...

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

exemplo violino: https://jsfiddle.net/0Lkj6wd3/


Solução excelente e reutilizável, como uma classe de utilidade.
Vignesh

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

Corte do mal ...


1
Eu não chamaria isso de hack, mas testaria se ele funciona em todos os navegadores que você pretende oferecer suporte.
Nick Larsen

O conjunto de campos não quer ser usado como esse, foi invadido no lugar ;-)
Danu

3

Combinando um post de 2 anos, mas aqui está como eu abordo essas situações usando apenas um elemento e 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;
}

E aqui está um violino para conferir: http://jsfiddle.net/sRhBc/ (imagem aleatória do Google tirada para a fronteira).

A única desvantagem dessa abordagem é que ela não suporta o IE7.


3

Apenas use

    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 meu primeiro post, mesmo que este seja um ano de idade. Para evitar os problemas de coloração de segundo plano nos wrappers, você pode usar o bloco embutido com hr (ninguém disse isso explicitamente). O alinhamento de texto deve centralizar corretamente, pois são elementos embutidos.

<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

Eu uso um h1com um vão no meio.

Exemplo HTML:

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

Exemplo de CSS:

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

Simples assim.


Bem-vindo ao StackOverflow, Youri. Em vez de a span, você pode considerar usar a div. Ele serve ao mesmo propósito, exceto que é naturalmente um elemento de bloco. :)
Nix

@ Bloco Nix dentro do elemento inline? Não, obrigado, extensão é uma boa escolha
Jonathan Azulay

1
@MrAzulay h1é um elemento inline. spané bom para o material de embrulho, mas a razão de eu preferir um divneste caso, é porque o uso Youri CSS para definir o spanque display:block;. Não vejo o objetivo de transformar um elemento embutido em um elemento de bloco, quando há elementos de bloco adequados ( div) prontamente disponíveis.
Nix

@ Nix Isso não é uma coisa muito comum de se fazer? Embora colocar blocos dentro da linha seja uma má prática, imo. Este é um bom post sobre isso skypoetsworld.blogspot.se/2008/10/…
Jonathan Azulay

Opa, eu digitei errado no meu último comentário. Concordo que você não deve colocar um bloco dentro de um elemento embutido, mas h1na verdade é um elemento BLOCK. Desculpe pela confusão. Ainda assim, não vejo o objetivo de transformar um spanelemento em bloco, mas é justo o suficiente.
Nix

2

Olhando para cima, modifiquei para:

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


2

Tomando a solução do @ kajic e colocando o estilo em CSS:

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

Então CSS (mas depende do CSS3 no uso do enésimo seletor):

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

Felicidades.

(PS No tbody e tr, o Chrome, o IE e o Firefox inserem pelo menos automaticamente um tbody e tr, e é por isso que minha amostra, como a @ kajic's, não as incluiu para manter as coisas mais curtas na marcação html necessária. foi testado com as versões mais recentes do IE, Chrome e Firefox, a partir de 2013).


2

PÁGINA DE 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

Isso funcionou para mim e não requer a cor de fundo atrás do texto para ocultar uma linha de borda; em vez disso, usa a tag hr real. Você pode brincar com as larguras para obter diferentes tamanhos de linhas de hora.

<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

Eu fiz um violino que usa o FlexBox e também fornece estilos diferentes de RH (linha dupla, símbolos no centro da linha, sombra projetada, inserção, tracejado, 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>

Ou aqui está um violino interativo: http://jsfiddle.net/mpyszenj/439/


2

Você pode tentar fazer um fieldsetalinhamento do elemento "legend" (o texto da "próxima seção") ao meio do campo apenas com o border-topconjunto. Não tenho certeza de como uma legenda é posicionada de acordo com o elemento fieldset. Eu imagino que pode ser apenas um simplesmargin: 0px auto de fazer o truque, no entanto.

exemplo:

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

1

Você pode conseguir isso sem <hr />. Semanticamente, o design deve ser feito com os meios de CSS; nesse caso, é bem possível.

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

Sempre há o bom e velho FIELDSET

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

Os conjuntos de campos devem ser usados ​​apenas com formulários.
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

Você pode criar um bloco de invólucro com alguma imagem de plano de fundo apropriada (e também definir alguma cor de plano de fundo para o bloco de texto centralizado).


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>

Você pode modificar a largura na classe "side" e "middle" com base no comprimento do seu texto na tag "span". Certifique-se de que a largura do "meio" mais 2 vezes a largura do "lado" seja igual a 100%.


0

Fundo transparente e responsivo, altura e estilo variáveis ​​do divisor, posição variável do texto, distância ajustável entre o divisor e o texto. Também pode ser aplicado várias vezes com seletores diferentes para vários estilos de divisor no mesmo projeto.
SCSS abaixo.

Marcação (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;
}

Sem text-position ele, o padrão é centralizar.

Demo:

E o SCSS , para modificá-lo rapidamente:

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

mexer aqui .


Olá, eu realmente aprecio o seu snippet de código. Se eu colocar um texto com divisor diferente do inglês (no meu caso, coreano), os textos quebram a linha a cada duas letras. Você poderia descobrir o porquê?
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>

Pode ser necessário ajustar a propriedade da margem

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.