contorno em apenas uma borda

86

Como aplicar uma borda inserida em um elemento HTML, mas apenas em um lado dele. Até agora, tenho usado uma imagem para fazer isso (GIF / PNG) que usaria como plano de fundo e esticaria (repeat-x) e posicionaria um pouco fora do topo do meu bloco. Recentemente, descobri a propriedade CSS do contorno , o que é ótimo! Mas parece circundar todo o bloco ... É possível usar esta propriedade de contorno para fazê-lo em apenas uma borda? Além disso, se não, você tem algum truque de CSS que possa substituir a imagem de fundo? (para que posteriormente eu pudesse personalizar as cores do contorno usando CSS, etc). Desde já, obrigado!

Aqui está uma imagem do que estou tentando alcançar: http://exiledesigns.com/stack.jpg

Corinne
fonte
7
Seu link está morto. Você pode simplesmente colar a imagem diretamente na pergunta usando a ferramenta de imagem.
Toddmo 01 de

Respostas:

46

O esboço de fato se aplica a todo o elemento .

Agora que vi sua imagem, veja como fazer isso.

.element {
  padding: 5px 0;
  background: #CCC;
}
.element:before {
  content: "\a0";
  display: block;
  padding: 2px 0;
  line-height: 1px;
  border-top: 1px dashed #000; 
}
.element p {
  padding: 0 10px;
}
<div class="element">
  <p>Some content comes here...</p>
</div>

(Ou veja uma demonstração externa. )

Todos os tamanhos e cores são apenas marcadores de posição, você pode alterá-los para corresponder ao resultado desejado exato.

Nota importante : .element deve ter display:block;(padrão para um div) para que isso funcione. Se não for o caso, forneça seu código completo, para que eu possa elaborar uma resposta específica.

Giona
fonte
Olá Giona, Acabei de adicionar uma imagem à minha pergunta para deixar mais claro: preciso de um espaço entre os limites do meu bloco e minha fronteira.
Corinne
Obrigado @GionaF, mas parece que a borda ainda está 'acima' do bloco e não 'dentro'. (o que é \ a0? apenas conteúdo aleatório para criar o bloco?) exiledesigns.com/stack2.jpg (Eu tentei com 5px de preenchimento, mas nada mudou)
Corinne
1
@DominicTobias eu realmente não consigo me lembrar ;-)
Giona
1
Para referência, \a0é um espaço ininterrupto.
1
Para meu caso de uso, peguei isso e modifiquei um pouco. Necessário adicionar a posição absoluta ao topo e uma largura de 100% no elemento com a pseudo classe: before, e posição relativa ao elemento, caso alguém mais tenha o mesmo problema.
josh1978
130

Você pode usar box-shadowpara criar um contorno de um lado. Gosta outline, box-shadownão muda o tamanho do modelo da caixa.

Isso coloca uma linha no topo:

box-shadow: 0 -1px 0 #000;

Eu fiz um jsFiddle onde você pode verificá-lo em ação.


INSERIR

Para uma borda inserida , use a palavra-chave inserida . Isso coloca uma linha inserida no topo:

box-shadow: 0 1px 0 #000 inset;

Várias linhas podem ser adicionadas usando instruções separadas por vírgula. Isso coloca uma linha inserida no topo e à esquerda:

box-shadow: 0 1px 0 #000 inset,
            1px 0 0 #000 inset;

Para mais detalhes sobre como box-shadowfunciona, confira a página MDN .

chowey
fonte
1
Eu gosto dessa abordagem criativa, obrigado por compartilhar!
NPC
Você não criou uma borda de inserção e não explica a sintaxe para a sombra da caixa. Obrigado.
toddmo 01 de
Este tem limitações, caso seja necessária uma borda de estilo personalizado!
Andris
9

Experimente com sombra (como borda) + borda

border-bottom: 5px solid #fff;
box-shadow: 0 5px 0 #ffbf0e;
Thilanka De Silva
fonte
1

Eu sei que isso é antigo. Mas sim. Eu prefiro uma solução muito mais curta do que a resposta de Giona

[contenteditable] {
    border-bottom: 1px solid transparent;
    &:focus {outline: none; border-bottom: 1px dashed #000;}
}
Andris
fonte
0

Gosto de delimitar meu campo de entrada, remover o contorno do foco e "delinear" a borda:

input {
  border: 1px solid grey;

  &:focus {
    outline: none;
    border-left: 1px solid violet;
  }
 }

Você também pode fazer isso com uma borda transparente:

input {
  border: 1px solid transparent;

  &:focus {
    outline: none;
    border-left: 1px solid violet;
  }
 }
Robin Wieruch
fonte
-1

A melhor coisa sobre HTML / CSS é que geralmente há mais de uma maneira de obter o mesmo efeito. Aqui está outra solução que faz o que você deseja:

<nav id="menu1">
    <ul>
        <li><a href="#">Menu Link 1</a></li>
        <li><a href="#">Menu Link 2</a></li>
    </ul>
</nav>

nav {
    background:#666;
    margin:1em;
    padding:.5em 0;
}
nav ul {
    border-top:1px dashed #fff;
    list-style:none;
    padding:.5em;
}
nav ul li {
    display:inline-block;
}
nav ul li a {
    color:#fff;
}

http://jsfiddle.net/10basetom/uCX3G/1/

thdoan
fonte
-2

apenas um lado outlinenão funciona, você pode usar oborder-left/right/top/bottom

se eu obtiver corretamente seu comentário

insira a descrição da imagem aqui

Database_Query
fonte
2
Como fazer a inserção borda esquerda / direita / etc? Como, por exemplo, 3 pixels de distância da borda do bloco, mas dentro ?
Corinne
@CorinneStoppelli você poderia explicar?
Database_Query
@Database_Query, acho que você perdeu a parte de usar a propriedade de contorno (ou similar), o que significa que ele não quer adicionar mais peso / altura ao div. A propriedade border realmente adiciona, mas contorno não. A alternativa box-shadow parece ser a melhor opção, mesmo que você precise brincar um pouco com suas opções.
xarlymg89