CSS'de "çift" kenarlıkları önleme


89

Diyelim ki yan yana iki div'ım var ( referans olarak https://chrome.google.com/webstore/category/home ) kenarlıklı.

Div'lerimin çift kenarlıklı gibi görünmesini önlemenin bir yolu (tercihen bir CSS numarası) var mı? Ne demek istediğimi daha iyi anlamak için bu resme bir göz atın:

"Çift" kenarlık

İki div'in birleştiği yerde ikili kenarlıkları varmış gibi göründüğünü görebilirsiniz.


hayır, bunu izotop ile kullanıyorum, bu yüzden masa kullanamam. divs farklı boyutlara sahip
john smith

Bu sadece sol-sağ sizin için bir sorun mu yoksa yukarıdan aşağıya da endişelenmeniz mi gerekiyor?
VictorKilo

Bunun için CSS'de daha güzel bir çözüm olmasını dilerdim. :-(
richardstelmach

Yanıtlar:


19

#divNumberOne { border-right: 0; }


11
Diğer şeyleri karıştırmadan yapmanın tek gerçek yolu budur. Birden fazla öğe yapmanız gerekiyorsa, cehennem, örneğin 100 div, bunu yapabilirsiniz ki div { border-right: none; } div:last-child { border-right: 1px solid black; }bu size amaçlanan etkiyi verir
Andy

evet, her zaman bu şekilde yapılabilir, ancak birden fazla sınıf kullanmak zorunda kalmadan bunu yapmanın saf bir css yolu olup olmadığını merak ediyordum (daha fazla satır ve sütunum olacak)
john smith

3
Bu saf css, sözde bir sınıf kullandım (son çocuk) bu yüzden html'yi zaten değiştirmedim, birçok sözde sınıf var ve bir alternatif olduğunu düşünmediğim için bu yoldan gidin derim
Andy

Nth Child'a bakın, bunu tek ve çift kullanarak bu şekilde yapabilirsiniz veya düzeninize bağlı olarak istediğiniz şekilde hesaplayabilirsiniz.
MaxwellLynn

1
Bu neden doğru cevap olarak kabul edildi? Gerçekten aradığı şeyin bu olduğunu sanmıyorum. Bu da kesinlikle ölçeklenebilir bir çözüm değil.
Kevin Behan

80

Belirli bir sırada görünmesi garanti edilemeyen öğelerden bahsediyorsak (belki bir satırda 3 öğe, ardından 2 öğeli bir satır vb.), Koleksiyondaki her öğeye yerleştirilebilecek bir şey istersiniz. . Bu çözüm şunları kapsamalıdır:

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

Anahattın eski tarayıcılarda (IE7 ve öncesi) çalışmadığını unutmayın .

Alternatif olarak, sınırlara bağlı kalabilir ve negatif kenar boşlukları kullanabilirsiniz:

.collection .child {
    margin-top: -1px;
    margin-left: -1px;
}

1
Bunu paylaştığın için teşekkürler Kelimenin tam anlamıyla saatlerce bunun üzerinde çalışıyordum, sınırdan aşağıya (anahat yerine) yoldan gidiyordum. Bu çok güzel çalıştı!
Jessy Houle

Bu gerçekten akıllıca bir tekniktir. Şerefe!
da5id

2
Çok kullanışlı. position: relative;left: 1px;Negatif marjı geri döndürmek için de ekliyorum .
Bartosz Walicki

1
Bu gerçekten zekice !. Bence cevap bu olmalı.
Rejoy

Bu cevaptan çok daha iyi
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

Dahil etmek IE8 desteği için ie9.js'yi (tüm CSS seçicileri / sözde öğeleri için çok kullanışlıdır).


ikinci satırda birden fazla satırınız varsa, sol kenarlığınız yoksa ve bu numara divs hizalamasıyla 1px için sola gidin
Afshin

Daha karmaşık bir versiyon yok muydu? Daha büyük olan öğeler ne olacak right-margin?
Feeela

@afshin düzenini görmezsem nasıl spesifik bir cevap verebilirim?
Giona

@feeela bence oldukça basit. Neyse, right-marginetkilemez left-margin: jsfiddle.net/gionaf/D6tHK/1
Giona

1
Bu, yanal çift sınırları çözer, ancak dikey olanı çözmez; Alt / üstteki sınırlar hala iki katına çıkar. Bunlar için herhangi bir ipucu var mı?
delphirules

15

Göz önünde bulundurulabilecek başka bir çözüm de CSS Bitişik kardeş seçiciyi kullanmaktır .

CSS

div {
    border: 1px solid black;
}

div + div {
    border-left: 0;
}

jsFiddle


Güzel numara, teşekkürler! Kullanarak daha iyi sonuçlar aldığımı fark ettim, border-left: none;aksi takdirde div'in sol üst köşesinde küçük bir boşluğum var !? (Firefox).
IanB

Kullanmak isteyebilirsinizdiv + div { border-left: 0; }
Sergey Stadnik

6

Bunu başarmak için tek seçiciyi kullanabilirsiniz

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

görüntü açıklamasını buraya girin


nth-child (çift) {border-left: none;} yapmak daha iyi olmaz mıydı? Bu şekilde tek sayıda sütun olabilir ...
pixelearth

6

Gösteriye geç kaldım ancak anahat özelliğini kullanmayı deneyin, örneğin:

.item {
  outline: 1px solid black;
}

CSS'deki ana hatlar fiziksel alanı kaplamaz ve bu nedenle ikili bir sınırı önlemek için üst üste biner.


daha küçük ekranlarda bir satır daha fazla satıra bölündüğünde de işe yarar - div'leriniz yeni satırlara bölünebildiğinde diğer tüm yanıtlar çalışmaz. o zaman kenarı olmayan en az bir div'iniz olur. paylaşım için teşekkürler - upvoted
DigitalJedi

Çözüme sahip olmak bilgisayar korsanlığından çok daha iyi. Teşekkür ederim.
forrest

5

Div'lerin tümü aynı sınıf adına sahipse:

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

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

Burada bir JSFiddle demosu var.


+1 IE 7 + 8 tarafından tanınan birkaç sözde sınıftan biri…
Feeela


@ Didier68 Yine de soru bu değildi.
Roddy of the Frozen Peas

Soru, "çift sınırları önlemek" dir ... ancak yanlamasına mı yoksa dikey mi olduğunu belirtmeden ... Çözümünüz örneğin <TD> için iyidir, ancak DIV'ler için değildir. Ben de feryat Stephan'a aynısını söylüyorum!
Didier68

Neden bahsettiğin hakkında hiçbir fikrim yok. Soru div'lerle ilgili, cevap div'lerle ilgili, keman div'leri kullanıyor. TD'leri nereden alıyorsun?
Roddy of the Frozen Peas

2

Flexbox'ı kullanarak, ana hatların birbiriyle örtüşmesi için ikinci bir alt kap eklemek gerekiyordu ...

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

1

Aşağıdaki CSS'yi sağdaki div'e ekleyin:

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

Ya da sınırlardan birini kaldırın.


1

Sadece kullanıyorum

border-collapse: collapse;

ana öğede


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

Kullanım durumum, son öğenin ne olacağını bildiğim tek sıradaki kutular içindi.

.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

Bunun geç bir tepki olduğunu biliyorum, ama 2 sentimi düşürmek istedim, çünkü bunu yapma şeklim burada değil.

Görüyorsunuz, marjlarla oynamayı gerçekten sevmiyorum, özellikle negatif marjlar . Her tarayıcı bunları biraz farklı işliyor gibi görünüyor ve marjlar birçok durumdan kolayca etkileniyor .

Div'lerle güzel bir tablonun olduğundan emin olma yolum, önce iyi bir html yapısı oluşturmak , sonra css'i uygulamak.

Nasıl yaptığıma dair örnek:

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

Şimdi, css için, sınırların yalnızca olması gereken yerde olduğundan ve kenar boşluğuna neden olmadığından emin olmak için satır yapısını kullanıyorum;

.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, mükemmel bir masa. Şimdi, açıkçası bu, DIV'lerinizin genişliklerinde 1px farklılığa neden olur (özellikle ilki), ancak benim için bu hiçbir zaman herhangi bir sorun yaratmadı. Sizin durumunuzda olursa, o zaman marjlara daha bağımlı olursunuz.


0

Bunu şu kodu kullanarak başardım:

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

0

Çok eski bir soruydu, ancak bu ilk google sonucuydu, dolayısıyla bununla karşılaşan ve mobil cihazlarda öğenin sağına / soluna sınırı yeniden eklemek için medya sorguları istemeyen herkes için.

Kullandığım çözüm:

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

Bu işe yarar çünkü kenarlık ve gölgeden oluşan öğenin etrafında 2 piksellik bir kenarlık göreceksiniz. Ancak, öğelerin buluştuğu yerde, gölge onu 2 piksel genişliğinde tutan üst üste biner;


-1

margin:1px;Div'inizin etrafında bir şeyler vermeye ne dersiniz ?

<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


-3

Arkalarında başka bir div kullanmayı ve tüm kenarlıkları silmeyi tercih ediyorum. Yalnızca arka plan div'in boyutunu ve ön plan div öğelerinin konumunu hesaplamanız gerekir.


Eleştirmenlere rağmen çözümümün en iyisi olduğunu düşünüyorum. 1 piksellik bir tablo çizmekle aynı
prensip
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.