Verhindern von "doppelten" Grenzen in CSS

87

Angenommen, ich habe zwei Divs nebeneinander (nehmen Sie https://chrome.google.com/webstore/category/home als Referenz) mit einem Rahmen.

Gibt es eine Möglichkeit (vorzugsweise einen CSS-Trick), um zu verhindern, dass meine Divs einen doppelten Rand haben? Schauen Sie sich dieses Bild an, um besser zu verstehen, was ich meine:

"Doppelte" Grenze

Sie können sehen, dass dort, wo sich die beiden Divs treffen, es so aussieht, als hätten sie einen doppelten Rand.

John Smith
quelle
Nein, ich benutze dies mit Isotop, kann also keine Tabelle verwenden. Divs haben verschiedene Größen
John Smith
Ist es nur ein Problem für Sie von links nach rechts oder müssen Sie sich auch von oben nach unten darum kümmern?
VictorKilo
Ich wünschte, es gäbe eine schönere Lösung dafür in CSS. :-(
richardstelmach

Antworten:

19

#divNumberOne { border-right: 0; }

Andy
quelle
11
Dies ist der einzige wirkliche Weg, der andere Dinge nicht durcheinander bringt. Wenn Sie mehrere Elemente ausführen müssen, zum Teufel, sagen wir 100 Divs, können Sie dies tun div { border-right: none; } div:last-child { border-right: 1px solid black; }, um den beabsichtigten Effekt zu erzielen
Andy
Ja, es kann immer so gemacht werden, aber ich habe mich gefragt, ob es eine reine CSS-Methode gibt, ohne mehr als eine Klasse verwenden zu müssen (ich werde mehr Zeilen und Spalten haben)
John Smith
3
Dies ist reines CSS. Ich habe eine Pseudoklasse (letztes Kind) verwendet, daher habe ich das HTML sowieso nicht geändert. Es gibt viele Pseudoklassen und ich würde sagen, gehen Sie diesen Weg, da ich glaube, dass es keine Alternative gibt
Andy
Schauen Sie in Nth Child, Sie können es auf diese Weise mit ungeraden und geraden tun oder abhängig von Ihrem Layout können Sie es nach Ihren Wünschen berechnen.
MaxwellLynn
1
Warum wurde dies als die richtige Antwort akzeptiert? Ich glaube wirklich nicht, dass er danach gesucht hat. Dies ist sicherlich auch keine skalierbare Lösung.
Kevin Behan
78

Wenn es sich um Elemente handelt, bei denen nicht garantiert werden kann, dass sie in einer bestimmten Reihenfolge angezeigt werden (möglicherweise 3 Elemente in einer Zeile, gefolgt von einer Zeile mit 2 Elementen usw.), möchten Sie etwas, das auf jedem Element in der Sammlung platziert werden kann . Diese Lösung sollte Folgendes abdecken:

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

Beachten Sie, dass Gliederung in älteren Browsern (IE7 und früher) nicht funktioniert .

Alternativ können Sie sich an die Ränder halten und negative Ränder verwenden:

.collection .child {
    margin-top: -1px;
    margin-left: -1px;
}
Cimmanon
quelle
1
Vielen Dank für das Teilen. Ich habe buchstäblich stundenlang daran gearbeitet und bin den Grenzweg (anstelle des Umrisspfades) entlanggegangen. Das hat wunderbar funktioniert!
Jessy Houle
Dies ist eine wirklich clevere Technik. Prost!
da5id
2
Sehr hilfreich. Ich füge auch hinzu position: relative;left: 1px;, um die negative Marge zurückzusetzen.
Bartosz Walicki
1
Das ist wirklich klug!. Ich denke, das sollte die Antwort sein.
Genießen Sie den
Dies ist viel besser als die Antwort
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

Fügen Sie ie9.js für IE8 - Unterstützung (es ist sehr nützlich für alle CSS - Selektoren / pseudo-Elemente).

Giona
quelle
Wenn Sie mehr als eine Reihe haben, haben die ersten Divs in der zweiten Reihe keinen linken Rand und mit diesem Trick gehen die Divs für 1px nach links
Afshin
Gab es nicht eine kompliziertere Version? Was ist mit Elementen mit einem größeren right-margin?
Feeela
@afshin Wenn ich sein Layout nicht sehe, wie kann ich eine bestimmte Antwort geben?
Giona
@feeela Ich denke, es ist ziemlich einfach. Wie auch immer, right-marginhat keinen Einfluss auf left-margin: jsfiddle.net/gionaf/D6tHK/1
Giona
1
Dies löst die seitlichen Doppelgrenzen, aber nicht die Vertikalen; Die Ränder unten / oben sind immer noch verdoppelt. Irgendwelche Hinweise für diese?
Delphirules
15

Eine andere Lösung, die in Betracht gezogen werden könnte, ist die Verwendung des CSS Adjacent-Geschwister-Selektors .

Das CSS

div {
    border: 1px solid black;
}

div + div {
    border-left: 0;
}

jsFiddle

Stephan
quelle
Schöner Trick, danke! Ich habe festgestellt, dass ich bessere Ergebnisse erzielt border-left: none;habe, wenn ich sonst eine kleine Lücke oben links im Div habe!? (Feuerfuchs).
IanB
Sie können verwendendiv + div { border-left: 0; }
Sergey Stadnik
6

Sie können einen ungeraden Selektor verwenden, um dies zu erreichen

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

Geben Sie hier die Bildbeschreibung ein

Codegeek
quelle
wäre es nicht besser, n-tes Kind (gerade) zu machen {border-left: none;}? Auf diese Weise könnte es eine ungerade Anzahl von Spalten geben ...
Pixelearth
5

Wenn die Divs alle den gleichen Klassennamen haben:

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

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

Hier gibt es eine JSFiddle-Demo .

Roddy der gefrorenen Erbsen
quelle
+1 Eine der wenigen
Pseudoklassen
Es ist nicht gut, wenn Ihr DIV in 2 Reihen ist: Sie haben eine doppelte Grenze zwischen den 2 Reihen.
Didier68
@ Didier68 Das war aber nicht die Frage.
Roddy der gefrorenen Erbsen
Die Frage lautet "Verhinderung von Doppelgrenzen" ... aber ohne Angabe, ob diese seitlich oder vertikal verläuft ... Ihre Lösung eignet sich beispielsweise für <TD>, nicht jedoch für DIVs. Ich gebe Stephan unten die gleiche Bemerkung!
Didier68
Ich habe keine Ahnung, wovon du sprichst. Die Frage ist über Divs, die Antwort ist über Divs, die Geige benutzt Divs. Woher bekommst du td's?
Roddy der gefrorenen Erbsen
5

Ich komme zu spät zur Show, versuche aber, die Gliederungseigenschaft wie folgt zu verwenden:

.item {
  outline: 1px solid black;
}

Umrisse in CSS belegen keinen physischen Raum und überlappen sich daher, um eine doppelte Grenze zu verhindern.

Michael Giovanni Pumo
quelle
funktioniert auch, wenn eine Zeile auf kleineren Bildschirmen in mehrere Zeilen unterteilt wird - alle anderen Antworten funktionieren nicht, wenn Ihre Divs in neue Zeilen unterteilt werden könnten. Sie haben dann mindestens eine Div mit einer Seite ohne Rand. Danke fürs Teilen - upvoted
DigitalJedi
Es ist viel besser, eine Lösung zu haben als einen Hack. Vielen Dank.
Wald
1

Fügen Sie dem Div auf der rechten Seite das folgende CSS hinzu:

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

Oder entfernen Sie einfach einen der Ränder.

bfavaretto
quelle
1

Ich benutze nur

border-collapse: collapse;

im übergeordneten Element

JayCee
quelle
1

Bei Verwendung von Flexbox musste ein zweiter untergeordneter Container hinzugefügt werden, damit sich die Umrisse ordnungsgemäß überlappen ...

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

Mein Anwendungsfall war für Boxen in einer einzelnen Reihe, in denen ich wusste, was das letzte Element sein würde.

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

Ich weiß, dass dies eine späte Reaktion ist, aber ich wollte nur meinen Wert von 2 Cent senken, da meine Art, dies zu tun, nicht hier ist.

Sie sehen, ich spiele wirklich nicht gerne mit Rändern, besonders nicht mit negativen Rändern . Jeder Browser scheint damit ein bisschen anders umzugehen, und die Ränder werden leicht von vielem beeinflusst Situationen beeinflusst.

Um sicherzustellen, dass ich eine schöne Tabelle mit divs habe, erstelle ich zuerst eine gute HTML-Struktur und wende dann das CSS an.

Beispiel, wie ich es mache:

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

Für das CSS verwende ich einfach die Zeilenstruktur, um sicherzustellen, dass die Ränder nur dort sind, wo sie sein müssen, und keine Ränder verursachen.

.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, ein perfekter Tisch. Dies würde natürlich dazu führen, dass Ihre DIVs 1px Unterschiede in der Breite aufweisen (insbesondere die erste), aber für mich hat dies nie zu irgendwelchen Problemen geführt. Wenn dies in Ihrer Situation der Fall ist, wären Sie wahrscheinlich stärker von Margen abhängig.

NoobishPro
quelle
0

Ich konnte es mit diesem Code erreichen:

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

Eine sehr alte Frage, aber es war das erste Google-Ergebnis. Für alle, die darauf stoßen und keine Medienabfragen haben möchten, um den Rand rechts / links vom Element auf Mobilgeräten usw. wieder hinzuzufügen.

Die Lösung, die ich benutze, ist:

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

Dies funktioniert, weil Sie einen 2px-Rand um das Element sehen, das aus dem Rand und dem Schatten besteht. Wenn sich die Elemente treffen, überlappt sich der Schatten, wodurch er 2 Pixel breit bleibt.

abnoas
quelle
-1

Was ist mit einem margin:1px;um deine 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
quelle
-3

Ich bevorzuge es, ein anderes Div dahinter als Hintergrund zu verwenden und alle Ränder zu löschen. Sie müssen nur die Größe des Hintergrund-Divs und die Position der Vordergrund-Divs berechnen.

well7m
quelle
Ich denke, meine Lösung ist die beste, obwohl die Kritiker. Es ist das gleiche Prinzip wie beim Zeichnen einer 1px-Tabelle:
well7m