Запобігання “подвійним” межам у CSS


87

Скажімо, у мене є два divs поруч один з одним (візьмемо https://chrome.google.com/webstore/category/home як посилання) з межею.

Чи є спосіб (бажано фокус CSS), щоб запобігти моєму div, щоб він мав подвійну межу? Погляньте на це зображення, щоб краще зрозуміти, що я маю на увазі:

«Подвійна» межа

Ви можете бачити, що там, де зустрічаються два div, здається, що вони мають подвійну межу.


ні, я використовую це з ізотопом, тому не можу використовувати таблицю. divs мають різні розміри
Джон Сміт,

Це проблема лише для вас ліворуч-праворуч, або вам також потрібно турбуватися про це зверху-внизу?
VictorKilo

Я хотів би, щоб було краще рішення для цього в CSS. :-(
richardstelmach

Відповіді:


19

#divNumberOne { border-right: 0; }


11
Це єдиний реальний спосіб зробити це, який не заплутує інші речі. Якщо вам потрібно зробити кілька елементів, біса, скажімо, 100 divs, ви можете зробити це, div { border-right: none; } div:last-child { border-right: 1px solid black; }що дасть вам передбачуваний ефект
Енді

так, це завжди можна зробити так, але мені було цікаво, чи був це чистий спосіб css, не використовуючи більше одного класу (у мене буде більше рядків і стовпців)
Джон Сміт,

3
Це чистий css, я використовував псевдо-клас (остання дитина), тому я все одно не модифікував html, є багато псевдо-класів, і я б сказав, що йдіть цим шляхом, оскільки я не думаю, що є альтернатива
Енді

Подивіться на Nth Child, ви можете зробити це таким чином, використовуючи непарні та парні, або, залежно від вашого макета, ви можете обчислити його так, як хочете.
MaxwellLynn 02

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

1
Дякуємо, що поділились цим. Я буквально працював над цим годинами, спускаючись по прикордонному (замість контурного) шляху. Це працювало чудово!
Джессі Хоул

Це справді розумна техніка. Ура!
da5id

2
Дуже корисно. Додаю також position: relative;left: 1px;, щоб повернути негативну маржу.
Bartosz Walicki

1
Це справді розумно !. Я думаю, це має бути відповіддю.
Насолоджуйтесь

Це набагато краще, ніж відповідь
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 піксель
Afshin

Чи не було більш складної версії? А як щодо елементів з більшим right-margin?
feeela

@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 !? (Firefox).
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>

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


чи не було б краще робити n-ту дитину (навіть) {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 .


+1 Один з небагатьох псевдокласів, які розпізнає IE 7 + 8 ...
feeela


@ Didier68 Однак не в цьому було питання.
Родді із замороженого гороху

Питання полягає в "запобіганні подвійним кордонам" ... але без уточнення, поперечно чи вертикально ... Ваше рішення підходить, наприклад, для <TD>, але не для DIV. Я даю те саме зауваження Стефану нижче!
Didier68

Я не уявляю, про що ви говорите. Питання про div, відповідь - про div, скрипка використовує div. Звідки ти береш тд?
Родді з замороженого гороху

5

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

.item {
  outline: 1px solid black;
}

Обриси в CSS не займають фізичного простору і, отже, будуть збігатися, щоб запобігти подвійній межі.


також працює, коли рядок розпадається на більше рядків на менших екранах - всі інші відповіді не працюють, коли ваші div можуть розбитися на нові рядки. тоді у вас є принаймні один div зі стороною без межі. thx для обміну - проголосовано
DigitalJedi

Набагато краще мати рішення, ніж хак. Дякую.
Форест

1

Додайте наступний CSS до div справа:

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

Або просто видаліть одну з меж.


1

Я просто використовую

border-collapse: collapse;

у батьківському елементі


1

Використовуючи Flexbox, потрібно було додати другий дочірній контейнер, щоб правильно отримати контури, що перекривають один одного ...

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

СКСС

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

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 центи, оскільки мій спосіб це зробити тут не тут.

Розумієте, мені дуже не подобається грати з полями, особливо негативними . Здається, кожен браузер справляється з цим, що трохи відрізняється, і на поля легко впливати багато ситуацій.

Мій спосіб переконатися, що у мене є хороша таблиця з divs, - це створити спочатку хорошу структуру 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-файли мають різницю в ширині 1px (зокрема, першу), але для мене це ніколи не створювало жодної проблеми. Якби це сталося у вашій ситуації, то, мабуть, тоді ви б більше залежали від полів.


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 пікселі;


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

ДЕМО


-3

Я вважаю за краще використовувати інший div за ними як фон і видаляти всі межі. Вам потрібно просто розрахувати розмір фонового div та розташування div-файлів переднього плану.


Я думаю, що моє рішення є найкращим, хоча критики. Це той самий принцип, що і малювання таблиці 1px:
well7m
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.