Alguma maneira de limitar o comprimento da borda?

216

Existe alguma maneira de limitar o comprimento de uma borda. Eu tenho um <div>que tem uma borda inferior, mas quero adicionar uma borda à esquerda da <div>que se estenda apenas na metade do caminho.

Existe alguma maneira de fazer isso sem adicionar elementos extras na página?

mcbeav
fonte

Respostas:

175

Espero que isto ajude:

#mainDiv {
  height: 100px;
  width: 80px;
  position: relative;
  border-bottom: 2px solid #f51c40;
  background: #3beadc;
}

#borderLeft {
  border-left: 2px solid #f51c40;
  position: absolute;
  top: 50%;
  bottom: 0;
}
<div id="mainDiv">
  <div id="borderLeft"></div>
</div>

sObr
fonte
5
Ainda parece a melhor maneira de fazê-lo. É compatível com vários navegadores e fácil de manutenção.
precisa saber é o seguinte
1
existe uma maneira de fazer isso em um círculo?
www139 13/03/2015
1
aplique sombra de caixa para o círculo.
Piyush Dholariya
3
Isso pode ter benefícios marginais de compatibilidade entre navegadores em relação aos navegadores antigos e é mais fácil de controlar via JS ... mas nenhum deles é preocupação da pergunta original. No entanto, isso adiciona um elemento adicional à marcação que a pergunta original pede especificamente para evitar. Portanto, não entendo por que essa é a resposta aceita para esta pergunta.
Spencer O'Reilly
Fazer isso com: after não exigirá nenhuma marcação adicional
Marque
257

O conteúdo gerado por CSS pode resolver isso para você:

div {
  position: relative;
}


/* Main div for border to extend to 50% from bottom left corner */

div:after {
  content: "";
  background: black;
  position: absolute;
  bottom: 0;
  left: 0;
  height: 50%;
  width: 1px;
}
<div>Lorem Ipsum</div>

(nota - a content: "";declaração é necessária para que o pseudoelemento seja renderizado)

TrevC
fonte
21
Eu acho que esta é semanticamente uma opção muito melhor, pois não introduz divs adicionais.
Louis Otto
21
Essa deve ser a resposta aceita, pois favorece o CSS como único meio de estilizar a marcação.
Lukas
4
Perfeito. E funciona como esperado com preenchimento e margem também.
Nolonar 18/03
4
Lembre-se: você não pode gerenciar propriedades de pseudo-elementos a partir do JS (na verdade você pode, mas será muito hacky). Portanto, se você planeja fazer uma espécie de barra de progresso com esta solução - esqueça. Escolha a resposta já aceita. Em todos os outros casos, essa resposta é melhor, é verdade.
Sergei Panfilov
2
Esse navegador e / ou JS é compatível? Prefiro a resposta aceita, por causa do comentário de @ SergeyPanfilov.
matthaeus
36

The :afterrocks :)

Se você tocar um pouco, poderá definir o elemento de borda redimensionada para aparecer centralizado ou para aparecer apenas se houver outro elemento próximo a ele (como nos menus). Aqui está um exemplo com um menu:

#menu > ul > li {
    position: relative;
    float: left;
    padding: 0 10px;
}

#menu > ul > li + li:after {
    content:"";
    background: #ccc;
    position: absolute;
    bottom: 25%;
    left: 0;
    height: 50%;
    width: 1px;
}

user2397120
fonte
1
Você pode adicionar uma amostra de HTML? Como você pensa em usá-lo com células de tabela, alguma pista?
Peter Krauss
21

Com propriedades CSS, podemos controlar apenas a espessura da borda; não comprimento.

No entanto, podemos imitar o efeito de borda e controlar seu widthe heightcomo queremos de outras maneiras.

Com CSS (gradiente linear):

Podemos usar linear-gradient()para criar uma imagem de fundo e controlar seu tamanho e posição com CSS para que pareça uma borda. Como podemos aplicar várias imagens de plano de fundo a um elemento, podemos usar esse recurso para criar várias bordas como imagens e aplicar em diferentes lados do elemento. Também podemos cobrir a área restante disponível com algumas cores sólidas, gradientes ou imagens de fundo.

HTML necessário:

Tudo o que precisamos é de apenas um elemento (possivelmente tendo alguma classe).

<div class="box"></div>

Passos:

  1. Crie imagem (s) de fundo com linear-gradient().
  2. Use background-sizepara ajustar as width/ heightdas imagens criadas acima para que pareçam uma borda.
  3. Uso background-positionpara ajustar a posição (como left, right, left bottometc.) dos acima fronteira criado (s).

CSS necessário:

.box {
  background-image: linear-gradient(purple, purple),
                    // Above css will create background image that looks like a border.
                    linear-gradient(steelblue, steelblue);
                    // This will create background image for the container.

  background-repeat: no-repeat;

  /* First sizing pair (4px 50%) will define the size of the border i.e border
     will be of having 4px width and 50% height. */
  /* 2nd pair will define the size of stretched background image. */
  background-size: 4px 50%, calc(100% - 4px) 100%;

  /* Similar to size, first pair will define the position of the border
     and 2nd one for the container background */
  background-position: left bottom, 4px 0;
}

Exemplos:

Com linear-gradient()isso, podemos criar bordas de cores sólidas e também ter gradientes. Abaixo estão alguns exemplos de bordas criadas com este método.

Exemplo com borda aplicada apenas em um lado:

Exemplo com borda aplicada nos dois lados:

Exemplo com borda aplicada em todos os lados:

Captura de tela:

Imagem de saída mostrando bordas com metade do comprimento

Mohammad Usman
fonte
14

para linhas horizontais, você pode usar a tag hr:

hr { width: 90%; }

mas não é possível limitar a altura da borda. apenas altura do elemento.

Edmhs
fonte
Sim, aqui "width" é o "comprimento da linha HR". Para algo como uma largura de borda, use o tamanho do atributo HR, ou CSS height. Para substituir a borda da célula em uma tag TD, use <td>your content<hr/></td>.
Peter Krauss
8

As bordas são definidas apenas por lado, não em frações de um lado. Então, não, você não pode fazer isso.

Além disso, um novo elemento também não seria uma fronteira, simularia apenas o comportamento que você deseja - mas ainda assim seria um elemento.

Ben
fonte
7

Outra maneira de fazer isso é usar imagem de borda em combinação com um gradiente linear.

div {
  width: 100px;
  height: 75px;
  background-color: green;
  background-clip: content-box; /* so that the background color is not below the border */
  
  border-left: 5px solid black;
  border-image: linear-gradient(to top, #000 50%, rgba(0,0,0,0) 50%); /* to top - at 50% transparent */
  border-image-slice: 1;
}
<div></div>

jsfiddle: https://jsfiddle.net/u7zq0amc/1/


Suporte para Navegador: IE: 11+

Chrome: todos

Firefox: 15+

Para um melhor suporte, adicione também prefixos de fornecedores.

caniuse border-image

Daniel Z.
fonte
5

Este é um truque de CSS, não uma solução formal. Deixo o código com o período em preto porque me ajuda a posicionar o elemento. Posteriormente, pinte seu conteúdo (cor: branco) e (margem superior: -5px ou mais) para torná-lo como se o período não estivesse lá.

div.yourdivname:after {
content: ".";
  border-bottom:1px solid grey;
  width:60%;
  display:block;
  margin:0 auto;
}
Justin Munce
fonte
2

Outra solução é usar uma imagem de plano de fundo para imitar a aparência de uma borda esquerda

  1. Crie o estilo da borda esquerda que você precisa como gráfico
  2. Posicione-o à esquerda de sua div (deixe o tempo suficiente para lidar com aproximadamente dois aumentos de tamanho de texto em navegadores antigos)
  3. Defina a posição vertical 50% da parte superior da sua div.

Você pode precisar ajustar o IE (como de costume), mas vale a pena tentar se esse é o design que você deseja.

  • Geralmente sou contra o uso de imagens para algo que o CSS fornece inerentemente, mas às vezes se o design precisar, não há outra maneira de contorná-lo.
Kevin
fonte
1

Você pode definir apenas uma borda por lado. Você teria que adicionar um elemento extra para isso!

Simon
fonte