【问题标题】:Preventing "double" borders in CSS防止 CSS 中的“双”边框
【发布时间】:2012-10-02 14:19:01
【问题描述】:

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

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

你可以看到两个 div 相交的地方,看起来像是有一个双边框。

【问题讨论】:

  • 不,我将它与同位素一起使用,所以不能使用表格。 div 有不同的大小
  • 这只是你左右的问题,还是你也需要自上而下担心?
  • 我希望在 CSS 中有更好的解决方案。 :-(

标签: css


【解决方案1】:

如果我们谈论的元素不能保证以任何特定顺序出现(可能是一行中的 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;
}

请注意,大纲不起作用in older browsers(IE7 和更早版本)。

或者,您可以坚持使用边框并使用负边距:

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

【讨论】:

  • 感谢您分享此内容。我确实为此工作了几个小时,沿着边界(而不是轮廓)路径前进。这效果很好!
  • 这是一个非常聪明的技术。干杯!
  • 非常有用。我还添加了position: relative;left: 1px;,以恢复负边距。
  • 这真是太聪明了!我认为这应该是答案。
  • 这比答案好得多
【解决方案2】:

#divNumberOne { border-right: 0; }

【讨论】:

  • 这是唯一不会弄乱其他东西的真正方法。如果你需要做多个元素,地狱,比如说 100 个 div,你可以做 div { border-right: none; } div:last-child { border-right: 1px solid black; } 这会给你预期的效果
  • 是的,它总是可以这样做,但我想知道是否有一种纯 css 的方法,而不必使用多个类(我将有更多的行和列)
  • 这是纯 css,我使用了一个伪类(最后一个孩子),所以无论如何我都没有修改过 html,有很多伪类,我会说走这条路,因为我不这样做'不认为有其他选择
  • 查看第 N 个孩子,您可以使用奇数和偶数或根据您的布局以您想要的方式计算它。
  • 为什么这被接受为正确答案?我真的不认为这是他要找的。这当然也不是一个可扩展的解决方案。
【解决方案3】:

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

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

【讨论】:

  • 如果你有不止一行,第二行中的第一个 div 没有左边框,并且使用这个技巧 div 对齐到左边 1px
  • 没有更复杂的版本吗? right-margin 较大的元素呢?
  • @afshin 如果我没有看到他的布局,我该如何给出具体答案?
  • @feeela 我认为这是非常基本的。反正right-margin不影响left-marginjsfiddle.net/gionaf/D6tHK/1
  • 这解决了横向双边框,但不是垂直;底部/顶部的边框仍然加倍。有什么提示吗?
【解决方案4】:

另一个可以考虑的解决方案是使用 CSS Adjacent sibling selector

CSS

div {
    border: 1px solid black;
}

div + div {
    border-left: 0;
}

jsFiddle

【讨论】:

  • 不错的技巧,谢谢!我发现我使用border-left: none; 得到了更好的结果,否则我在 div 的左上角有一个小间隙!? (火狐)。
  • 你可能想使用div + div { border-left: 0; }
【解决方案5】:

我迟到了,但尝试使用大纲属性,如下所示:

.item {
  outline: 1px solid black;
}

CSS 中的轮廓不占用物理空间,因此会重叠以防止出现双边框。

【讨论】:

  • 也可以,当一行在较小的屏幕上分成更多行时 - 当您的 div 可以分成新行时,所有其他答案都不起作用。然后,您至少有一个 div 的一侧没有边框。谢谢分享 - 赞成
  • 拥有解决方案比破解好得多。谢谢。
【解决方案6】:

您可以使用 odd 选择器来实现这一点

.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;} 不是更好吗?这样可能会有奇数列...
【解决方案7】:

如果 div 都具有相同的类名:

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

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

这里有一个JSFiddle demo

【讨论】:

  • +1 为数不多的伪类之一,被 IE 7+8 识别...
  • 如果你的 DIV 在 2 行上,那就不好了:你在 2 行之间有一个双边框..
  • @Didier68 不过,这不是问题。
  • 问题是“防止双边框”...但没有指定是横向还是纵向...您的解决方案适用于 例如,但不适用于 DIV。我在下面给斯蒂芬同样的评价!
  • 我不知道你在说什么。问题是关于 div 的,答案是关于 div 的,小提琴使用 div 的。你从哪里得到 td 的?
【解决方案8】:

在右侧的 div 中添加如下 CSS:

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

或者只是删除其中一个边框。

【讨论】:

    【解决方案9】:

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

    【讨论】:

      【解决方案10】:

      如果您还需要在交互时更改边框颜色(例如,表单中的样本选择器),我发现了一个很好的技巧,使用负边距、填充调整和变换转换的组合。看看吧:

      .parent{
        display: flex;
        width: 100%;
        max-width: 375px;
        margin-left:1px;
      }
      
      .child {
        margin-left: -1px;/* hide double borders behind their siblings */ 
        flex: 1 0 auto;
      }
      
      .child input {
        display:none
      }
      
      .child label {
        display:block;
        border: 1px solid #eaeaea;
        min-height: 45px;
        line-height: 45px;
        cursor: pointer;
        padding: 0 10px; /* will be changed when input is checked */
        font-size: 15px;
        text-align: center;
      }
      
      .child input:checked+label {
        border: 1px solid red;
        transform: translateX(-1px);
        padding-left: 11px;
        padding-right: 9px;
        background-color: #fafafa;
      }
      <div class="parent">
        <div class="child">
          <input id="swatch-1" type="radio" value="1" name="option" checked="true">
          <label for="swatch-1">Element 1</label>
         </div>
         <div class="child">
          <input id="swatch-2" type="radio" value="2" name="option">
          <label for="swatch-2">Element 2</label>
         </div>
         <div class="child">
          <input id="swatch-3" type="radio" value="3" name="option">
          <label for="swatch-3">Element 3</label>
         </div>
       </div>

      【讨论】:

        【解决方案11】:
          <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

        【讨论】:

          【解决方案12】:

          我只是用

          border-collapse: collapse;
          

          在父元素中

          【讨论】:

            【解决方案13】:

            我的用例是单行中的盒子,我知道最后一个元素是什么。

            .boxes {
              border: solid 1px black  // this could be whatever border you need
              border-right: none;
            }
            
            .furthest-right-box {
              border-right: solid 1px black !important;
            }
            

            【讨论】:

              【解决方案14】:

              我知道这是迟到的反应,但我只是想放弃我的 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,我只是使用 rows 结构来确保边框只在它们需要的位置,不会产生边距;

              .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 的差异(特别是第一个),但对我来说,这从未造成任何类型的问题。如果在你的情况下确实如此,我想你会更依赖利润。

              【讨论】:

                【解决方案15】:

                我能够使用以下代码实现它:

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

                【讨论】:

                  【解决方案16】:

                  一个非常古老的问题,但它是第一个谷歌结果,所以对于遇到这个并且不想让媒体查询重新添加移动设备上元素的右/左边框等的任何人。

                  我使用的解决方案是:

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

                  这是可行的,因为您会在由边框和阴影组成的元素周围看到一个 2px 的边框。然而,在元素相遇的地方,阴影重叠,使其保持 2px 宽;

                  【讨论】:

                    【解决方案17】:

                    要补充一个 9 年前的问题,另一种干净且响应迅速的方法是:

                    • 向父级添加border-leftborder-top
                    • 为每个孩子添加border-rightborder-bottom

                    【讨论】:

                      【解决方案18】:

                      在你的 div 周围加上 margin:1px; 怎么样?

                      <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

                      【讨论】:

                        【解决方案19】:

                        我更喜欢在它们后面使用另一个 div 作为背景并删除所有边框。您只需要计算背景 div 的大小和前景 div 的位置。

                        【讨论】:

                        • 我确实认为我的解决方案是最好的,尽管有批评者。这与绘制 1px 表格的原理相同:
                        猜你喜欢
                        相关资源
                        最近更新 更多
                        热门标签