Mencegah batas "ganda" di CSS

89

Katakanlah saya memiliki dua div di samping satu sama lain (gunakan https://chrome.google.com/webstore/category/home sebagai referensi) dengan pembatas.

Apakah ada cara (sebaiknya trik CSS) untuk mencegah div saya muncul seperti memiliki bingkai ganda? Lihat gambar ini untuk lebih memahami apa yang saya maksud:

Perbatasan "Ganda"

Anda dapat melihat bahwa di mana dua div bertemu, tampaknya mereka memiliki batas ganda.

John Smith
sumber
tidak, saya menggunakan ini dengan isotop jadi tidak bisa menggunakan tabel. div memiliki ukuran yang berbeda
john smith
Apakah ini hanya masalah bagi Anda kiri-kanan, atau apakah Anda juga perlu mengkhawatirkannya atas-bawah?
VictorKilo
saya berharap ada solusi yang lebih baik untuk ini di CSS. :-(
richardstelmach

Jawaban:

19

#divNumberOne { border-right: 0; }

Andy
sumber
11
Ini adalah satu-satunya cara nyata untuk melakukannya yang tidak mengacaukan hal-hal lain. Jika Anda perlu melakukan banyak elemen, katakanlah 100 div, Anda bisa melakukan div { border-right: none; } div:last-child { border-right: 1px solid black; }yang akan memberi Anda efek yang diinginkan
Andy
ya, itu selalu bisa dilakukan dengan cara itu, tetapi saya bertanya-tanya apakah ada cara murni-css untuk melakukannya, tanpa harus menggunakan lebih dari satu kelas (saya akan memiliki lebih banyak baris dan kolom)
john smith
3
Ini adalah css murni, saya menggunakan kelas pseudo (anak terakhir) jadi saya belum memodifikasi html, ada banyak kelas semu dan saya akan mengatakan ikuti rute ini karena saya rasa tidak ada alternatif
Andy
Lihatlah ke Nth Child Anda dapat melakukannya dengan cara ini menggunakan ganjil dan genap atau tergantung pada tata letak Anda, Anda dapat menghitungnya seperti yang Anda inginkan.
MaxwellLynn
1
Mengapa ini diterima sebagai jawaban yang benar? Saya benar-benar tidak berpikir ini yang dia cari. Ini tentu saja bukan solusi yang dapat diskalakan.
Kevin Behan
80

Jika kita berbicara tentang elemen yang tidak dapat dijamin untuk muncul dalam urutan tertentu (mungkin 3 elemen dalam satu baris, diikuti oleh baris dengan 2 elemen, dll.), Anda menginginkan sesuatu yang dapat ditempatkan pada setiap elemen dalam koleksi . Solusi ini harus mencakup itu:

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

Perhatikan bahwa garis besar tidak berfungsi di browser lama (IE7 dan sebelumnya).

Bergantian, Anda dapat tetap menggunakan perbatasan dan menggunakan margin negatif:

.collection .child {
    margin-top: -1px;
    margin-left: -1px;
}
cimmanon
sumber
1
Terima kasih telah membagikan ini. Saya benar-benar mengerjakan ini selama berjam-jam, menyusuri jalur perbatasan (bukan garis besar). Ini bekerja dengan baik!
Jessy Houle
Ini adalah teknik yang sangat pintar. Bersulang!
da5id
2
Sangat berguna. Saya menambahkan juga position: relative;left: 1px;, untuk mengembalikan margin negatif.
Bartosz Walicki
1
Ini sangat pintar !. Saya pikir ini harus menjadi jawabannya.
Nikmati
Ini jauh lebih baik daripada jawabannya
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

Sertakan ie9.js untuk dukungan IE8 (ini sangat berguna untuk semua pemilih CSS / pseudo-elemen).

Giona
sumber
jika Anda memiliki lebih dari satu baris div pertama di baris kedua tidak memiliki batas kiri dan dengan trik ini penyelarasan div pergi ke kiri untuk 1px
Afshin
Bukankah tidak ada versi yang lebih rumit? Bagaimana dengan elemen dengan ukuran yang lebih besar right-margin?
feeela
@afshin jika saya tidak melihat tata letaknya bagaimana saya bisa memberikan jawaban yang spesifik?
Giona
@eeela saya pikir itu cukup mendasar. Bagaimanapun, right-margintidak memengaruhi left-margin: jsfiddle.net/gionaf/D6tHK/1
Giona
1
Ini memecahkan batas ganda lateral, tetapi bukan vertikal; batas di bagian bawah / atas masih berlipat ganda. Ada petunjuk untuk itu?
delphirules
15

Solusi lain yang mungkin dipertimbangkan adalah menggunakan pemilih saudara yang Berdekatan CSS .

CSS

div {
    border: 1px solid black;
}

div + div {
    border-left: 0;
}

jsFiddle

Stephan
sumber
Trik yang bagus, terima kasih! Saya menemukan saya mendapatkan hasil yang lebih baik border-left: none;jika tidak, saya memiliki celah kecil di kiri atas div !? (Firefox).
IanB
Anda mungkin ingin menggunakandiv + div { border-left: 0; }
Sergey Stadnik
6

Anda dapat menggunakan pemilih ganjil untuk melakukannya

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

masukkan deskripsi gambar di sini

codegeek
sumber
bukankah lebih baik melakukan nth-child (even) {border-left: none;}? Dengan cara itu mungkin ada jumlah kolom ganjil ...
pixelearth
6

Saya terlambat ke pertunjukan tetapi coba gunakan properti garis besar, seperti:

.item {
  outline: 1px solid black;
}

Garis besar di CSS tidak menempati ruang fisik dan karena itu akan tumpang tindih untuk mencegah batas ganda.

Michael Giovanni Pumo
sumber
juga berfungsi, ketika sebuah baris terpecah menjadi lebih banyak baris pada layar yang lebih kecil - semua jawaban lainnya tidak berfungsi ketika div Anda bisa masuk ke baris baru. Anda kemudian memiliki setidaknya satu div dengan sisi tanpa batas. thx for sharing - upvoted
DigitalJedi
Jauh lebih baik memiliki solusi daripada meretas. Terima kasih.
Forrest
5

Jika semua div memiliki nama kelas yang sama:

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

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

Ada demo JSFiddle di sini.

Roddy dari Kacang Beku
sumber
+1 Salah satu dari sedikit kelas semu, yang dikenali oleh IE 7 + 8…
feeela
Tidak baik jika DIV Anda berada di 2 baris: Anda memiliki batas ganda antara 2 baris ..
Didier68
@ Didier68 Tapi bukan itu pertanyaannya.
Roddy dari Frozen Peas
Pertanyaannya adalah "mencegah batas ganda" ... tetapi tanpa menentukan apakah itu secara lateral atau vertikal ... Solusi Anda baik untuk <TD> misalnya, tetapi tidak untuk DIV. Saya memberikan komentar yang sama kepada Stephan di bawah ini!
Didier68
Saya tidak tahu apa yang Anda bicarakan. Pertanyaannya tentang div, jawabannya tentang div, biola menggunakan div. Dari mana Anda mendapatkan td's?
Roddy of the Frozen Peas
2

Menggunakan Flexbox, perlu untuk menambahkan wadah anak kedua agar garis besar saling tumpang tindih ...

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

Tambahkan CSS berikut ke div di sebelah kanan:

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

Atau hapus saja salah satu perbatasan.

bfavaretto.dll
sumber
1

Saya hanya menggunakan

border-collapse: collapse;

di elemen induk

JayCee
sumber
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
sumber
0

Kasus penggunaan saya adalah untuk kotak dalam satu baris di mana saya tahu apa elemen terakhirnya.

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

Saya tahu ini adalah reaksi yang terlambat, tetapi saya hanya ingin menurunkan nilai 2 sen saya, karena cara saya melakukannya tidak ada di sini.

Soalnya, saya sangat tidak suka bermain-main dengan margin, apalagi margin negatif . Setiap browser tampaknya menangani ini hanya sedikit berbeda dan margin mudah dipengaruhi oleh banyak situasi.

Cara saya untuk memastikan bahwa saya memiliki tabel yang bagus dengan div, adalah membuat struktur html yang baik terlebih dahulu , kemudian menerapkan css.

Contoh bagaimana saya melakukannya:

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

Sekarang, untuk css, saya hanya menggunakan struktur baris untuk memastikan perbatasan hanya di tempat yang mereka butuhkan, tidak menyebabkan margin;

.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, meja yang sempurna. Sekarang, jelas ini akan menyebabkan DIV Anda memiliki perbedaan lebar 1px (khususnya yang pertama), tetapi bagi saya, itu tidak pernah menimbulkan masalah apa pun. Jika itu terjadi dalam situasi Anda, saya kira Anda akan lebih bergantung pada margin.

NoobishPro
sumber
0

Saya bisa mencapainya menggunakan kode ini:

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

Pertanyaan yang sangat lama, tetapi ini adalah hasil Google pertama, jadi bagi siapa pun yang menemukan ini dan tidak ingin memiliki kueri media untuk menambahkan kembali batas ke kanan / kiri elemen di seluler, dll.

Solusi yang saya gunakan adalah:

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

Ini berfungsi karena Anda akan melihat perbatasan 2px di sekitar elemen yang terbuat dari perbatasan dan bayangan. Namun, saat elemen bertemu, bayangan tumpang tindih yang membuatnya tetap lebar 2px;

abnoas
sumber
-1

Bagaimana dengan memberikan margin:1px;sekitar div Anda.

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

Saya lebih suka menggunakan div lain di belakang mereka sebagai latar belakang dan menghapus semua perbatasan. Anda hanya perlu menghitung ukuran div latar belakang dan posisi div latar depan.

well7m
sumber
Saya pikir solusi saya adalah yang terbaik meskipun ada kritik. Ini prinsip yang sama seperti menggambar tabel 1px:
well7m