Como dar borda a qualquer elemento usando css sem adicionar a largura da borda a toda a largura do elemento?


101

Como dar borda a qualquer elemento usando css sem adicionar a largura da borda a toda a largura do elemento?

Como no Photoshop, podemos dar traços- dentro, centro e fora

Acho que as propriedades de borda css padrão estão no centro como no centro no photoshop, estou certo?

Quero dar borda dentro da caixa não fora. e não deseja incluir a largura da borda na largura da caixa.

Respostas:


221
outline:1px solid white;

Isso não adicionará largura e altura extras.


10
Nota: o contorno não define os lados, então isso funciona apenas se todos os lados forem estilizados.
Screenack

1
Eu adicionei uma resposta que permite delimitar apenas um lado.
mikevoermans

1
Apenas uma nota que não seguirá as curvas de qualquer raio de borda que você possa ter no elemento, então você acabará com uma borda quadrada.
limitlessloop

2
Mas não suporta radious.
Céu

29

Verifique o tamanho da caixa CSS ...

A propriedade CSS3 de tamanho de caixa pode fazer isso. O valor da caixa da borda (em oposição ao padrão da caixa de conteúdo) torna a caixa renderizada final a largura declarada e qualquer borda e preenchimento cortado dentro da caixa. Agora você pode declarar com segurança que seu elemento tem 100% de largura, incluindo preenchimento e borda baseados em pixels, e realizar seu objetivo perfeitamente.

  • -webkit-box-sizing: border-box; / * Safari / Chrome, outro WebKit * /
  • -moz-box-sizing: border-box; / * Firefox, outro Gecko * /
  • dimensionamento da caixa: caixa de borda; / * Opera / IE 8+ * /

Eu sugiro criar um mixin para lidar com isso para você. Você pode encontrar mais informações sobre dimensionamento de caixa em W3c http://www.w3schools.com/cssref/css3_pr_box-sizing.asp


1
Esta é a melhor resposta, embora eu não ache que você realmente precise de todos os prefixos. caniuse.com/#feat=css3-boxsizing
Justin

2
^ Justin está correto, você não precisa mais dos prefixos. box-sizingserá suficiente.
Chade de

25

Dependendo do suporte do navegador pretendido, você pode usar a box-shadowpropriedade.

Você pode definir o valor de desfoque para 0 e a propagação para qualquer espessura que você deseja. A grande vantagem da sombra da caixa é que você pode controlar se ela é desenhada para fora (por padrão) ou para dentro (usando a insetpropriedade).

Exemplo:

box-shadow: 0 0 0 1px black; // Outside black border 1px

ou

box-shadow: 0 0 0 1px white inset; // Inside white border 1px

Uma grande vantagem de usar box shadow é que você pode ser criativo usando múltiplas box shadow:

box-shadow: 0 0 0 3px black, 0 0 0 1px white inset;

A única coisa que não posso dizer é que diferença isso fará no desempenho da renderização. Eu presumiria que isso poderia se tornar um problema se você tivesse centenas de elementos usando essa técnica na tela ao mesmo tempo.


16

Eu tive o mesmo problema.

.right-border {
    position: relative;
}

.right-border:after {
    content: '';
    display: block;
    position: absolute;
        top: 0; right: 0;
    width: 1px;
    height: 100%;
    background: #e0e0e0;
}

Esta resposta permite que você especifique um único lado. E funcionaria no IE8 + - ao contrário do uso de box-shadow.

É claro que altere as propriedades dos seus pseudoelementos, pois você precisa selecionar um lado específico.

* Novo e melhorado *

&:before {
content: '';
display: block;
position: absolute;
    top: 0; right: 0; bottom: 0; left: 0;
border: 1px solid #b7b7b7;
}

Isso permite a capacidade de usar a borda e atingir vários lados de uma caixa.


8

Use box-sizing: border-boxpara criar uma borda DENTRO de um div sem modificar a largura do div.

Use outlinepara criar uma borda FORA de um div sem modificar a largura do div.

Aqui está um exemplo: https://jsfiddle.net/4000cae9/1/

Observações: border-boxatualmente não é compatível com o IE

Apoio, suporte:

http://caniuse.com/#feat=outline

http://caniuse.com/#search=border-box

#test, #test2 {
    width: 100px;
    height:100px;
    background-color:yellow;
}
#test {
    -webkit-box-sizing: border-box;
    -moz-box-sizing: border-box;
    box-sizing: border-box;
    border: 10px dashed blue;
}
#test2 {
    outline: 10px dashed red;
}


<p>Use box-sizing: border-box to create a border INSIDE a div without modifying div width.</p>
<div id="test">border-box</div>
<p>Use outline to create a border OUTSIDE a div without modifying div width.</p>
<div id="test2">outline</div>

6

Como disse Abenson, você pode usar um contorno, mas uma pegadinha é que o Opera pode desenhar uma "forma não retangular". Outra opção que parece funcionar é usar margens negativas, como este css:

div {
  float:left;
  width: 50%;
  border:1px solid black;
  margin: -1px;

}

Com este html:

<body>
  <div>A block</div>
  <div>Another block</div>
</body>

Uma outra opção menos limpa é adicionar marcação extra ao html. Por exemplo, você define a largura de um elemento externo e adiciona a borda ao interno. O CSS:

.outer { width: 50%; float: left;}
.inner { border: 1px solid black; }

E o html:

<body>
  <div class="outer">
    <div class="inner">A block</div>
  </div>
  <div class="outer">
    <div class="inner">Another block</div>
  <div>
</body>

3

Use preenchimento quando não houver borda. Remova o preenchimento quando houver uma borda.

.myDiv {
    width: 100px;
    height: 100px;
    padding-left: 2px;
    padding-right: 2px;
}

.myDiv:hover {
    padding-left: 0;
    padding-right: 0;
    border-left: 2px solid red;
    border-right: 2px solid red;
}

Basicamente, basta substituir o preenchimento de 2 px por bordas de 2 px. O tamanho da div permanece o mesmo.


2

No seu caso, você pode distorcer subtraindo metade da borda do enchimento? (-2,5 do preenchimento se sua borda tiver 5px de largura, você não pode ter preenchimento negativo, portanto, para diminuir, reduza a largura geral da caixa). Você pode adicionar 2,5 px extras à margem para manter a caixa geral do mesmo tamanho.

Eu realmente não gosto dessa sugestão, mas não acho que haja uma maneira de lidar com isso de forma limpa.



0

Outra opção, se a cor de fundo for sólida:

body { background-color: #FFF; }

.myDiv {
    width: 100px;
    height: 100px;
    border: 3px solid #FFF;  // Border is essentially invisible since background is also #FFF;
}

.myDiv:hover {
    border-color: blue;  // Just change the border color
}

Você pode substituir #FFFtransparente e então não precisa se lembrar de alterar dois valores. Sua sugestão tem o benefício de que, se você precisar de uma borda tracejada, isso funcionará quando houver box-shadowfalta nesse aspecto.
limitlessloop

0

contorno: 3px totalmente preto || borda: 3px totalmente preto

div{
height:50px;
width:150px;
text-align:center;

}

div{    /*this is what you need ! */
outline:1px solid black
}
<div>
hello world
</div>

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.