Evitando bordas “duplas” em CSS

87

Digamos que eu tenha dois divs próximos um do outro ( https://chrome.google.com/webstore/category/home como referência) com uma borda.

Existe uma maneira (de preferência um truque de CSS) para evitar que meus divs pareçam ter uma borda dupla? Dê uma olhada nesta imagem para entender melhor o que quero dizer:

Borda "dupla"

Você pode ver que onde os dois divs se encontram, parece que eles têm uma borda dupla.

john smith
fonte
não, estou usando isso com isótopo, então não posso usar uma mesa. divs têm tamanhos diferentes
john smith
É um problema apenas para você da esquerda para a direita ou você também precisa se preocupar com isso de cima para baixo?
VictorKilo
gostaria que houvesse uma solução mais agradável para isso em CSS. :-(
richardstelmach

Respostas:

19

#divNumberOne { border-right: 0; }

Andy
fonte
11
Esta é a única maneira real de fazer isso que não bagunça outras coisas. Se você precisar fazer vários elementos, por exemplo, 100 divs, você poderia fazer o div { border-right: none; } div:last-child { border-right: 1px solid black; }que daria o efeito pretendido
Andy,
sim, sempre pode ser feito dessa forma, mas eu queria saber se havia uma maneira puro-css de fazer isso, sem ter que usar mais de uma classe (terei mais linhas e colunas)
john smith
3
Isso é puro css, usei uma pseudo classe (último filho), então não modifiquei o html de forma alguma, existem muitas pseudo classes e eu diria que siga esse caminho, pois não acho que haja uma alternativa
Andy
Olhe para o Nth Child, você pode fazer isso usando ímpar e par ou dependendo do seu layout, você pode calculá-lo da maneira que quiser.
MaxwellLynn
1
Por que isso foi aceito como a resposta correta? Eu realmente não acho que era isso que ele estava procurando. Certamente também não é uma solução escalonável.
Kevin Behan
78

Se estamos falando sobre elementos que não podem ser garantidos para aparecer em qualquer ordem particular (talvez 3 elementos em uma linha, seguidos por uma linha com 2 elementos, etc.), você quer algo que possa ser colocado em cada elemento da coleção . Esta solução deve abranger:

.collection {
    /* these styles are optional here, you might not need/want them */
    margin-top: -1px;
    margin-left: -1px;
}

.collection .child {
    outline: 1px solid; /* use instead of border */
    margin-top: 1px;
    margin-left: 1px;
}

Observe que a estrutura de tópicos não funciona em navegadores mais antigos (IE7 e anteriores).

Como alternativa, você pode manter as bordas e usar margens negativas:

.collection .child {
    margin-top: -1px;
    margin-left: -1px;
}
Cimmanon
fonte
1
Obrigado por compartilhar isso. Eu literalmente estava trabalhando nisso por horas, descendo o caminho da fronteira (em vez do contorno). Isso funcionou lindamente!
Jessy Houle,
Esta é uma técnica muito inteligente. Felicidades!
dia
2
Muito útil. Acrescento também position: relative;left: 1px;, para reverter margem negativa.
Bartosz Walicki
1
Isso é muito inteligente !. Acho que essa deve ser a resposta.
Rejoy
Isso é muito melhor do que a resposta
CH4B
20

HTML:

<div>1</div>
<div>2</div>
<div>3</div>
<div>4</div>

CSS:

div {
    border: 1px solid #000;
    float: left;
}

div:nth-child(n+2) {
    margin-left: -1px;
}

Demo

Inclui o ie9.js para suporte ao IE8 (é muito útil para todos os seletores / pseudo-elementos CSS).

Giona
fonte
se você tiver mais de uma linha, o primeiro div na segunda linha não terá borda esquerda e com esse truque o alinhamento dos divs vá para a esquerda por 1px
Afshin,
Não havia versão mais complicada? Que tal elementos com um maior right-margin?
feeela 02 de
@afshin se não vejo o layout dele, como posso dar uma resposta específica?
Giona,
@feeela acho que é bem básico. De qualquer forma, right-marginnão afeta left-margin: jsfiddle.net/gionaf/D6tHK/1
Giona
1
Isso resolve as bordas duplas laterais, mas não a vertical; as bordas inferior / superior ainda são duplicadas. Alguma dica para isso?
delphirules
15

Outra solução que pode ser considerada é usar o seletor CSS Adjacent Sibling .

O CSS

div {
    border: 1px solid black;
}

div + div {
    border-left: 0;
}

jsFiddle

Stephan
fonte
Belo truque, obrigado! Descobri que consegui melhores resultados usando, border-left: none;caso contrário, tenho uma pequena lacuna no canto superior esquerdo do div !? (Raposa de fogo).
IanB
Você pode querer usardiv + div { border-left: 0; }
Sergey Stadnik
6

Você pode usar o seletor ímpar para conseguir isso

.child{
   width:50%;
   float:left;
   box-sizing:border-box;
   text-align:center;
   padding:10px;
   border:1px solid black;
   border-bottom:none;
}
.child:nth-child(odd){
   border-right:none;
}
.child:nth-last-child(2),
.child:nth-last-child(2) ~ .child{
   border-bottom:1px solid black
}
<div>
    <div class="child" >1</div>
    <div class="child" >2</div>
    <div class="child" >3</div>
    <div class="child" >4</div>
    <div class="child" >5</div>
    <div class="child" >6</div>
    <div class="child" >7</div>
    <div class="child" >8</div>
</div>

insira a descrição da imagem aqui

codegeek
fonte
não seria melhor fazer enésimo filho (par) {border-left: none;}? Dessa forma, pode haver um número ímpar de colunas ...
pixelearth
5

Se todos os divs tiverem o mesmo nome de classe:

div.things {
    border: 1px solid black;
    border-left: none;
}

div.things:first-child {
    border-right: 1px solid black;
}

Há uma demonstração do JSFiddle aqui.

Roddy das Ervilhas Congeladas
fonte
+1 Uma das poucas pseudo classes, que são reconhecidas pelo IE 7 + 8…
feeela 02/1012
Não é bom se o seu DIV estiver em 2 linhas: você tem uma borda dupla entre as 2 linhas.
Didier68
@ Didier68 Essa não era a questão, no entanto.
Roddy of the Frozen Peas
A questão é "evitar bordas duplas" ... mas sem especificar se é lateral ou verticalmente ... Sua solução é boa para <TD> por exemplo, mas não para DIVs. Eu faço a mesma observação para Stephan abaixo!
Didier68
Não tenho ideia do que você está falando. A pergunta é sobre div's, a resposta é sobre div's, o violino usa div's. De onde você está conseguindo td's?
Roddy of the Frozen Peas
5

Estou atrasado para o show, mas tente usar a propriedade outline, assim:

.item {
  outline: 1px solid black;
}

Os contornos em CSS não ocupam espaço físico e, portanto, se sobrepõem para evitar uma borda dupla.

Michael Giovanni Pumo
fonte
também funciona, quando uma linha se divide em mais linhas em telas menores - todas as outras respostas não funcionam quando seus divs podem quebrar em novas linhas. você então tem pelo menos um div com um lado sem borda. thx for sharing - upvoted
DigitalJedi
Muito melhor ter uma solução do que um hack. Obrigado.
floresta
1

Adicione o seguinte CSS ao div à direita:

position: relative;
left: -1px; /* your border-width times -1 */

Ou apenas remova uma das bordas.

bfavaretto
fonte
1

Eu só uso

border-collapse: collapse;

no elemento pai

JayCee
fonte
1

Usando o Flexbox, foi necessário adicionar um segundo recipiente filho para fazer com que os contornos se sobreponham ...

<div class="grid__container">
    <div class="grid__item">
        <div class="grid__item-outline">
              <!-- content -->
        </div>
    </div>
</div>

SCSS

.grid__container {
    display: flex;
    flex-direction: row;
    flex-wrap: wrap;
    margin: 0 1px 0 0; // margin-right 1px to give the correct width to the container
}

.grid__item {
    flex: 0 1 25%; // grid of 4
    margin: 0 0 1px; // margin-bottom to prevent double lines
}

.grid__item-outline {
    margin: 0 0 0 1px; // margin-left to prevent double lines
    outline: 1px solid #dedede;
}
ness-EE
fonte
0
  <div class="one"></div>
  <div class="two"></div>
  <div class="two"></div>
  <div class="two"></div>
  <div class="two"></div>

CSS:

  .one{
    width:100px;
    height:100px;
    border:thin red solid;
    float:left;
  }
.two{
    width:100px;
    height:100px;
    border-style: solid solid solid none;

    border-color:red;
    border-width:1px;
    float:left;
}

jsFiddle

Afshin
fonte
0

Meu caso de uso era para caixas em uma única linha onde eu sabia qual seria o último elemento.

.boxes {
  border: solid 1px black  // this could be whatever border you need
  border-right: none;
}

.furthest-right-box {
  border-right: solid 1px black !important;
}
Sam Henderson
fonte
0

Eu sei que é uma reação tardia, mas eu só queria gastar meus 2 centavos, já que minha maneira de fazer isso não é aqui.

Você vê, eu realmente não gosto de brincar com margens, especialmente margens negativas . Cada navegador parece lidar com isso de forma um pouco diferente e as margens são facilmente influenciadas por muitas situações.

Minha maneira de ter certeza de que tenho uma boa tabela com divs, é criar uma boa estrutura html primeiro e depois aplicar o css.

Exemplo de como eu faço:

 <div class="tableWrap">
   <div class="tableRow tableHeaders">
     <div class="tableCell first">header1</div>
     <div class="tableCell">header2</div>
     <div class="tableCell">header3</div>
     <div class="tableCell last">header4</div>
   </div>
   <div class="tableRow">
     <div class="tableCell first">stuff</div>
     <div class="tableCell">stuff</div>
     <div class="tableCell">stuff</div>
     <div class="tableCell last">stuff</div>
   </div>
</div>

Agora, para o css, simplesmente uso a estrutura de linhas para garantir que as bordas estejam apenas onde precisam estar, sem causar margens;

.tableWrap {
  display: table;
  }

.tableRow {
  display: table-row;
  }

.tableWrap .tableRow:first-child .tableCell {
  border-top: 1px solid #777777;
  }

.tableCell {
  display: table-cell;
  border: 1px solid #777777;
  border-left: 0;
  border-top: 0;
  padding: 5px;
  }

.tableRow .tableCell:first-child {
  border-left: 1px solid #777777;
  }

Et voila, uma mesa perfeita. Obviamente, isso faria com que seus DIVs tivessem 1px de diferença nas larguras (especificamente o primeiro), mas para mim, isso nunca criou nenhum tipo de problema. Se isso acontecer na sua situação, acho que você dependeria mais das margens.

NoobishPro
fonte
0

Consegui consegui-lo usando este código:

td.highlight {
    outline: 1px solid yellow !important;
    box-shadow: inset 0px 0px 0px 3px yellow;
    border-bottom: 1px solid transparent !important;
}
bestinamir
fonte
0

Uma pergunta muito antiga, mas foi o primeiro resultado do Google, portanto, para qualquer pessoa que se deparar com isso e não quiser ter consultas de mídia, adicione novamente a borda à direita / esquerda do elemento no celular etc.

A solução que uso é:

.element {
    border: 1px solid black;
    box-shadow: 0 0 0 1px black;
}

Isso funciona porque você verá uma borda de 2px ao redor do elemento feito da borda e da sombra. No entanto, onde os elementos se encontram, a sombra se sobrepõe, o que a mantém com 2px de largura;

Abnoas
fonte
-1

Que tal dar um em margin:1px;torno de seu div.

<html>
<style>
.brd{width:100px;height:100px;background:#c0c0c0;border:1px solid red;float:left;margin:1px;}
</style>
<body>
    <div class="brd"></div>
    <div class="brd"></div>
    <div class="brd"></div>
</body>
</html>

DEMO

defau1t
fonte
-3

Eu prefiro usar outro div atrás deles como plano de fundo e excluir todas as bordas. Você precisa apenas calcular o tamanho da div de fundo e a posição das divs de primeiro plano.

well7m
fonte
Eu acho que minha solução é a melhor, embora os críticos. É o mesmo princípio de desenhar uma mesa de 1px:
well7m,