Предотвращение «двойных» границ в CSS

87

Скажем, у меня есть два блока div рядом друг с другом (возьмите https://chrome.google.com/webstore/category/home в качестве ссылки) с рамкой.

Есть ли способ (желательно трюк с CSS), чтобы мои div не выглядели как двойные границы? Взгляните на это изображение, чтобы лучше понять, что я имею в виду:

«Двойная» граница

Вы можете видеть, что там, где встречаются два div, кажется, что у них есть двойная граница.

Джон Смит
источник
нет, я использую это с изотопом, поэтому не могу использовать таблицу. div имеют разные размеры
Джон Смит
Это проблема только для вас, слева-направо, или вам тоже нужно беспокоиться об этом сверху-снизу?
VictorKilo 02
Я бы хотел, чтобы в CSS для этого не было лучшего решения. :-(
richardstelmach

Ответы:

19

#divNumberOne { border-right: 0; }

Энди
источник
11
Это единственный реальный способ сделать это, чтобы ничего не испортить. Если вам нужно сделать несколько элементов, черт возьми, скажем, 100 div, вы могли бы сделать, div { border-right: none; } div:last-child { border-right: 1px solid black; }что дало бы желаемый эффект
Энди
да, это всегда можно сделать таким образом, но мне было интересно, есть ли способ сделать это на чистом CSS, без необходимости использовать более одного класса (у меня будет больше строк и столбцов)
Джон Смит
3
Это чистый css, я использовал псевдокласс (последний дочерний элемент), поэтому я никоим образом не модифицировал html, существует много псевдоклассов, и я бы сказал, идите по этому пути, поскольку я не думаю, что есть альтернатива
Энди
Посмотрите в Nth Child, вы можете сделать это таким образом, используя нечетное и четное, или, в зависимости от вашего макета, вы можете рассчитать его так, как хотите.
MaxwellLynn
1
Почему это было принято как правильный ответ? Я действительно не думаю, что это то, что он искал. Это определенно не масштабируемое решение.
Кевин Бехан,
78

Если мы говорим об элементах, появление которых не может быть гарантировано в каком-либо определенном порядке (может быть, 3 элемента в одной строке, за которой следует строка с 2 элементами и т. Д.), Вам нужно что-то, что можно разместить на каждом элементе в коллекции. . Это решение должно охватывать следующее:

.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;
}

Обратите внимание, что схема не работает в старых браузерах. (IE7 и ранее).

В качестве альтернативы вы можете придерживаться границ и использовать отрицательные поля:

.collection .child {
    margin-top: -1px;
    margin-left: -1px;
}
Cimmanon
источник
1
Спасибо за то, что поделился этим. Я буквально часами работал над этим, идя по краю (а не по контуру). Это прекрасно сработало!
Джесси Хоул
Это действительно умная техника. Ура!
da5id
2
Очень полезно. Я также добавляю position: relative;left: 1px;, чтобы вернуть отрицательную маржу.
Бартош Валицки
1
Это действительно умно !. Я думаю, это должен быть ответ.
Rejoy
Это лучше, чем ответ
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;
}

Демо

Включите ie9.js для поддержки IE8 (это очень полезно для всех селекторов / псевдоэлементов CSS).

Джиона
источник
если у вас более одной строки, первый div во второй строке не имеет левой границы, и с этим трюком выравнивание divs идет влево на 1 пиксель
Афшин
Не было ли более сложной версии? А как насчет элементов с большим right-margin?
Feela 02
@afshin, если я не вижу его макета, как я могу дать конкретный ответ?
Giona
@feeela, я думаю, это довольно просто. В любом случае, right-marginне влияет left-margin: jsfiddle.net/gionaf/D6tHK/1
Giona
1
Это решает боковые двойные границы, но не вертикальные; границы внизу / вверху по-прежнему удваиваются. Есть какие-нибудь подсказки для них?
delphirules
15

Еще одно решение, которое можно было бы рассмотреть, - это использовать селектор соседних элементов CSS .

CSS

div {
    border: 1px solid black;
}

div + div {
    border-left: 0;
}

jsFiddle

Стефан
источник
Хороший трюк, спасибо! Я обнаружил, что получил лучшие результаты, border-left: none;иначе у меня будет небольшой промежуток в верхнем левом углу div !? (Fire Fox).
IanB
Вы можете захотеть использоватьdiv + div { border-left: 0; }
Сергей Стадник
6

Вы можете использовать нечетный селектор для достижения этого

.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>

введите описание изображения здесь

Codegeek
источник
не лучше ли сделать nth-child (even) {border-left: none;}? Так могло получиться нечетное количество столбцов ...
pixelearth
5

Если все div имеют одинаковое имя класса:

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

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

Здесь есть демонстрация JSFiddle .

Родди из Frozen Peas
источник
+1 Один из немногих псевдоклассов, которые распознаются IE 7 + 8…
Feela 02
Нехорошо,
@ Didier68 Но вопрос был не в этом.
Родди из Frozen Peas
Вопрос в том, чтобы «предотвратить двойные границы» ... но без указания, горизонтально или вертикально ... Ваше решение подходит, например, для <TD>, но не для DIV. Я делаю то же самое замечание Стефану Реву!
Didier68
Понятия не имею, о чем вы говорите. Вопрос о div, ответ о div, скрипка использует div. Откуда у тебя ТД?
Родди из Frozen Peas
5

Я опаздываю на шоу, но попробуйте использовать свойство контура, например:

.item {
  outline: 1px solid black;
}

Контуры в CSS не занимают физического пространства и поэтому будут перекрываться, чтобы предотвратить двойную границу.

Майкл Джованни Пумо
источник
также работает, когда строка разбивается на несколько строк на меньших экранах - все остальные ответы не работают, когда ваши div могут разбиваться на новые строки. тогда у вас будет хотя бы один div со стороной без рамки. спасибо за обмен - проголосовали за
DigitalJedi
Намного лучше найти решение, чем взломать. Спасибо.
Форрест
1

Добавьте следующий CSS в div справа:

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

Или просто удалите одну из границ.

bfavaretto
источник
1

Я просто использую

border-collapse: collapse;

в родительском элементе

Джейси
источник
1

При использовании Flexbox необходимо было добавить второй дочерний контейнер, чтобы контуры должным образом перекрывали друг друга ...

<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
источник
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

Афшин
источник
0

Мой вариант использования был для ящиков в одной строке, где я знал, каким будет последний элемент.

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

.furthest-right-box {
  border-right: solid 1px black !important;
}
Сэм Хендерсон
источник
0

Я знаю, что это запоздалая реакция, но я просто хотел сбросить свои 2 цента, так как моего способа сделать это здесь нет.

Понимаете, мне очень не нравится играть с полями, особенно с отрицательными полями . Кажется, что каждый браузер обрабатывает это только немного по-разному, а поля легко зависят от множества ситуаций.

Мой способ убедиться, что у меня хорошая таблица с div, - сначала создать хорошую структуру html , а затем применить css.

Пример того, как я это делаю:

 <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>

Теперь для css я просто использую структуру строк, чтобы убедиться, что границы находятся только там, где они должны быть, без полей;

.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, идеальный стол. Теперь очевидно, что это приведет к тому, что ваши DIV будут иметь различия в ширине в 1 пиксель (в частности, первый), но для меня это никогда не создавало никаких проблем. Если это так в вашей ситуации, я думаю, тогда вы будете больше зависеть от маржи.

NoobishPro
источник
0

Я смог добиться этого с помощью этого кода:

td.highlight {
    outline: 1px solid yellow !important;
    box-shadow: inset 0px 0px 0px 3px yellow;
    border-bottom: 1px solid transparent !important;
}
бестинамир
источник
0

Очень старый вопрос, но это был первый результат Google, поэтому для всех, кто сталкивается с этим и не хочет, чтобы медиа-запросы повторно добавляли границу справа / слева от элемента на мобильном телефоне и т. Д.

Я использую следующее решение:

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

Это работает, потому что вы увидите рамку в 2 пикселя вокруг элемента, состоящего из границы и тени. Однако там, где элементы встречаются, тень накладывается, и ширина остается 2 пикселя;

Abnoas
источник
-1

А как насчет того, чтобы margin:1px;окружить ваш 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>

ДЕМО

defau1t
источник
-3

Я предпочитаю использовать другой div позади них в качестве фона и удалять все границы. Вам нужно просто рассчитать размер фонового div и положение div переднего плана.

колодец7м
источник
Я считаю, что мое решение лучшее, хотя и критики. Это тот же принцип, что и рисование таблицы размером 1px:
well7m 03