防止CSS中出现“双边框”


87

假设我有两个相邻的div(以https://chrome.google.com/webstore/category/home为参考)并带有边框。

有没有办法(最好是CSS技巧)来防止我的div看起来像是带有双边框?看看这张图可以更好地理解我的意思:

“双”边框

您可以看到两个div相遇的地方,看起来好像有一个双边框。


不,我将其与同位素一起使用,因此无法使用表格。div的大小各不相同
约翰·史密斯

它只是对您来说是一个问题,还是您还需要担心这个问题?
VictorKilo 2012年

我希望在CSS中有更好的解决方案。:-(
richardstelmach

Answers:


19

#divNumberOne { border-right: 0; }


11
这是唯一不会混淆其他内容的真正方法。如果您需要做多个元素,地狱,比如说100 divs,那么您可以做得到div { border-right: none; } div:last-child { border-right: 1px solid black; }预期的效果
Andy

是的,总可以那样做,但是我想知道是否有一种纯CSS的方法,而不必使用一个以上的类(我将有更多的行和列)
约翰·史密斯2012年

3
这是纯CSS,我使用了伪类(最后一个孩子),所以我无论如何都没有修改html,有很多伪类,我会说走这条路,因为我认为没有其他选择
Andy

查看Nth Child,您可以使用奇数和偶数来进行此操作,也可以根据您的布局以所需的方式进行计算。
MaxwellLynn 2014年

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
感谢您分享这个。我实际上已经花了几个小时,沿着边界(而不是轮廓线)走了。这做得很漂亮!
Jessy Houle

这是一种非常聪明的技术。干杯!
da5id 2013年

2
非常有用。我还添加position: relative;left: 1px;,以还原负边距。
Bartosz Walicki 2015年

1
这真的很聪明!我认为这应该是答案。
2015年

这比答案要好得多
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;
}

演示版

包括支持IE8的ie9.js(对于所有CSS选择器/伪元素非常有用)。


如果您的一行div多于第二行,则第二行没有左边框,并且使用此技巧div对齐时,请向左移动1px
Afshin 2012年

没有更复杂的版本了吗?较大的元素right-margin呢?
Feeela 2012年

@afshin如果我看不到他的布局,我该如何给出具体答案?
Giona 2012年

@feeela我认为这很基本。无论如何,right-margin都不会影响left-marginjsfiddle.net/gionaf/D6tHK/1
Giona,2012年

1
这解决了横向双重边界,但没有解决纵向双重边界;底部/顶部的边框仍会加倍。有什么暗示吗?
delphirules

15

人们可能会考虑的另一种解决方案是使用CSS Adjacent兄弟选择器

CSS

div {
    border: 1px solid black;
}

div + div {
    border-left: 0;
}

jsFiddle


好招,谢谢!我发现使用border-left: none;div可以获得更好的效果,否则在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>

在此处输入图片说明


做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演示


+1 IE 7 + 8可以识别的少数伪类之一……
Feeela 2012年

这不是一件好事,如果你的DIV是2行:你有2行之间的双边框..
Didier68

@ Didier68这不是问题。
冷冻豌豆罗迪(Roddy of the Frozen Peas)

问题是“防止出现双重边界”……但未指定横向还是纵向……例如,您的解决方案适用于<TD>,但不适用于DIV。我对斯蒂芬·贝娄也说同样的话!
Didier68 '16

我不知道你在说什么。问题是关于div的,答案是关于div的,小提琴使用div的。你从哪儿来的td?
冷冻豌豆罗迪(Roddy of the Frozen Peas)

5

我来晚了,但是尝试使用outline属性,如下所示:

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

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

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

等等,完美的餐桌。现在,很明显,这将导致您的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;
}

之所以可行,是因为在由边框和阴影组成的元素周围会看到2px的边框。但是,在元素相遇的地方,阴影重叠,使阴影保持2px宽;


-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 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.