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.

Brian M. Hunt
fonte
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.

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

Fletcher Moore
fonte
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;
}
MartinF
fonte
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;
    }
}
Onisciência
fonte
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 .

Diodeus - James MacFarlane
fonte
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/

Robert Kajic
fonte
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

willoller
fonte
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>
Aleksejs Mjaliks
fonte
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.

Trey Hunner
fonte
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;
}
dasfdsa
fonte
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>

sidonaldson
fonte
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/

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

Dänu
fonte
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.

Lazar Vuckovic
fonte
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;
    }
Anit Garg
fonte
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>
Jacob Block
fonte
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.

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

user2673353
fonte
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).

Nicholas Petersen
fonte
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; }
vsync
fonte
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>
user3898371
fonte
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/

Jade
fonte
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>
dclowd9901
fonte
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>

fonte
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;
 }
Chet na C2IT
fonte
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;
}
Nikhil Bhardwaj
fonte
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).

assustador
fonte
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%.

Betty Lee
fonte
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 .

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

Srikrushna
fonte