Eu tenho um <div>
elemento e quero colocar uma borda nele. Eu sei que posso escrever style="border: 1px solid black"
, mas isso adiciona 2px a ambos os lados da div, o que não é o que eu quero.
Prefiro que essa borda seja -1px da borda da div. A div em si é 100px x 100px, e se eu adicionar uma borda, preciso fazer algumas matemáticas para que a borda apareça.
Existe alguma maneira de fazer a borda aparecer e garantir que a caixa ainda tenha 100px (incluindo a borda)?
Respostas:
Defina a
box-sizing
propriedade comoborder-box
:Funciona no IE8 e acima .
fonte
outline
.box-sizing
caniuse.com/#search=box-sizingVocê também pode usar sombra de caixa como esta:
Exemplo aqui: http://jsfiddle.net/nVyXS/ (passe o mouse para exibir a borda)
Isso funciona apenas em navegadores modernos. Por exemplo: Não há suporte para o IE 8. Consulte caniuse.com (recurso box-shadow) para obter mais informações.
fonte
Provavelmente é uma resposta tardia, mas quero compartilhar com minhas descobertas. Encontrei 2 novas abordagens para esse problema que não encontrei aqui nas respostas:
Borda interna através
box-shadow
propriedade cssSim, sombra de caixa é usada para adicionar sombras de caixa aos elementos. Mas você pode especificar a
inset
sombra, que pareceria uma borda interna e sim uma sombra. Você só precisa definir sombras horizontais e verticais para0px
, e aspread
propriedade " "box-shadow
da largura da borda que você deseja ter. Portanto, para a borda 'interna' de 10 px, você deve escrever o seguinte:Aqui está o exemplo do jsFiddle que ilustra a diferença entre a
box-shadow
borda e a borda 'normal'. Dessa forma, sua borda e a largura da caixa são de 100px, incluindo a borda.Mais sobre box-shadow: aqui
Borda através da propriedade CSS de estrutura de tópicos
Aqui está outra abordagem, mas dessa maneira a borda estaria fora da caixa. Aqui está um exemplo . Como segue do exemplo, você pode usar a
outline
propriedade css para definir a borda que não afeta a largura e a altura do elemento. Dessa forma, a largura da borda não é adicionada à largura de um elemento.Mais sobre o esboço: aqui
fonte
Yahoo! Isso é realmente possível. Eu encontrei.
Para borda inferior:
Para borda superior:
fonte
Use pseudo elemento :
Ao usar
::after
o estilo do último filho virtual do elemento selecionado.content
A propriedade cria um elemento substituído anônimo .Estamos contendo o pseudo elemento usando a posição absoluta em relação ao pai. Então você tem liberdade para ter qualquer plano de fundo personalizado e / ou borda no plano de fundo do seu elemento principal.
Essa abordagem não afeta a localização do conteúdo do elemento principal, que é diferente do uso de
box-sizing: border-box;
.Considere este exemplo:
Aqui a
.button
largura é restrita usando o elemento pai. A configuração deborder-left-width
ajusta o tamanho da caixa de conteúdo e, portanto, a posição do texto.O uso da abordagem de pseudoelementos não afeta o tamanho da caixa de conteúdo.
Dependendo do aplicativo, a abordagem usando um pseudoelemento pode ou não ser um comportamento desejável.
fonte
:Before
.Embora essa pergunta já tenha sido respondida adequadamente com soluções usando as propriedades
box-shadow
eoutline
, eu gostaria de expandir um pouco isso para todos aqueles que chegaram aqui (como eu) à procura de uma solução para uma borda interna com um deslocamentoEntão, digamos que você tenha um 100px x 100px preto
div
e precise inseri-lo com uma borda branca - que possui um deslocamento interno de 5px (por exemplo) - isso ainda pode ser feito com as propriedades acima.Sombra da caixa
O truque aqui é saber que várias sombras de caixa são permitidas, onde a primeira sombra está no topo e as sombras subsequentes têm ordem z mais baixa.
Com esse conhecimento, a declaração box-shadow será:
Mostrar snippet de código
Basicamente, o que essa declaração está dizendo é: renderize a última sombra (10px em branco) primeiro e depois renderize a sombra em preto anterior de 5px acima dela.
contorno com deslocamento de contorno
Para o mesmo efeito acima, as declarações gerais seriam:
Mostrar snippet de código
Nota:
outline-offset
não é suportado pelo IE se isso é importante para você.Codepen demo
fonte
Você pode usar as propriedades
outline
eoutline-offset
com um valor negativo, em vez de usar um regularborder
, funciona para mim:fonte
Sei que isso é um pouco mais antigo, mas como as palavras-chave "border inside" me chegaram diretamente aqui, gostaria de compartilhar algumas descobertas que podem ser mencionadas aqui. Quando eu estava adicionando uma borda no estado de foco, obtive os efeitos que o OP está falando. A borda exibe pixels na dimensão da caixa, o que a deixa agitada. Existem mais duas maneiras de lidar com isso que também funcionam para o IE7.
1) Tenha uma borda já anexada ao elemento e simplesmente altere a cor. Desta forma, a matemática já está incluída.
2) Compensar sua borda com uma margem negativa. Isso ainda adicionará pixels extras, mas o posicionamento do elemento não será irregular em
fonte
para renderização consistente entre navegadores novos e antigos, adicione um contêiner duplo, o externo com a largura e o interno com a borda.
obviamente, isso é apenas se sua largura precisa for mais importante do que ter uma marcação extra!
fonte
fonte
A melhor solução para vários navegadores (principalmente para suporte ao IE), como o @Steve disse, é fazer uma div 98px em largura e altura do que adicionar uma borda 1px em torno dela, ou você pode criar uma imagem de plano de fundo para div 100x100 px e desenhar uma borda nela.
fonte
Você pode olhar o contorno com deslocamento, mas isso precisa de algum preenchimento para existir em sua div. Ou você pode posicionar absolutamente uma div de borda dentro, algo como
Pode ser necessário mexer nas margens das divs das bordas falsas para ajustá-las como quiser.
fonte
Uma solução mais moderna pode ser usar css
variables
ecalc
.calc
é amplamente suportado, masvariables
ainda não está no IE11 (polyfills disponível).Embora isso use alguns cálculos, que as perguntas originais estavam procurando evitar. Eu acho que este é um bom momento para usar cálculos, pois eles são controlados pelo próprio css. Ele também não precisa de marcação adicional ou apropriação indébita de outras propriedades css que podem ser necessárias posteriormente.
Esta solução é realmente útil apenas se uma altura fixa não for necessária .
fonte
Uma solução que não vi mencionada acima é o caso em que você tem preenchimento de sua entrada, o que eu faço 99% do tempo. Você pode fazer algo como ...
O que eu gosto sobre isso é que tenho o menu completo de borda + preenchimento + propriedades de transição para cada lado.
fonte