CSS에서 "이중"테두리 방지


87

테두리 가있는 두 개의 div가 나란히 있다고 가정합니다 ( https://chrome.google.com/webstore/category/home 참조).

내 div가 이중 테두리처럼 나타나지 않도록 방지하는 방법 (가급적 CSS 트릭)이 있습니까? 내가 의미하는 바를 더 잘 이해하려면이 이미지를보십시오.

"이중"테두리

두 div가 만나는 곳에서 이중 테두리가있는 것처럼 보입니다.


아니요, 동위 원소와 함께 사용하고 있으므로 테이블을 사용할 수 없습니다. div의 크기가 다른이
존 스미스

그것은 당신에게 좌우되는 문제일까요, 아니면 위에서 아래로도 걱정할 필요가 있습니까?
VictorKilo

CSS에 더 좋은 해결책이 있었으면합니다. :-(
richardstelmach

답변:


19

#divNumberOne { border-right: 0; }


11
이것은 다른 것들을 엉망으로 만들지 않는 유일한 방법입니다. 여러 요소 (예 : 100div)를 수행해야하는 경우 div { border-right: none; } div:last-child { border-right: 1px solid black; }원하는 효과를 얻을 수 있습니다.
Andy

예, 항상 그렇게 할 수 있지만, 하나 이상의 클래스를 사용하지 않고도 순수한 css 방식이 있는지 궁금합니다 (행과 열이 더
많음

3
이것은 순수한 CSS이고, 나는 의사 클래스 (마지막 자식)를 사용했기 때문에 어쨌든 html을 수정하지 않았고, 많은 의사 클래스가 있으며 대안이 없다고 생각하므로이 경로를 따라 가라고 말할 것입니다
Andy

Nth Child를 살펴보면 홀수와 짝수를 사용하거나 레이아웃에 따라 원하는 방식으로 계산할 수 있습니다.
MaxwellLynn 2014

1
이것이 정답으로 받아 들여진 이유는 무엇입니까? 나는 이것이 그가 찾고 있던 것이라고 생각하지 않는다. 이것은 확실히 확장 가능한 솔루션이 아닙니다.
케빈 Behan

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

이것은 정말 영리한 기술입니다. 건배!
da5id

2
매우 유용합니다. position: relative;left: 1px;마이너스 마진을 되돌리려면을 추가 합니다.
Bartosz Walicki 2015 년

1
이것은 정말 똑똑합니다!. 이것이 답이되어야한다고 생각합니다.
Rejoy

이것은 답변보다 훨씬 낫습니다
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에는 왼쪽 테두리
Afshin

더 이상 복잡한 버전이 없었나요? 더 큰 요소는 right-margin어떻습니까?
feeela

@afshin 그의 레이아웃이 보이지 않으면 어떻게 구체적인 답변을 줄 수 있습니까?
Giona

@feeela 나는 그것이 꽤 기본이라고 생각합니다. 어쨌든, right-margin영향을주지 않습니다 left-margin: jsfiddle.net/gionaf/D6tHK/1
Giona

1
이것은 측면 이중 경계를 해결하지만 수직은 해결하지 않습니다. 아래쪽 / 위쪽의 테두리는 여전히 두 배입니다. 그에 대한 힌트가 있습니까?
delphirules

15

고려할 수있는 또 다른 해결책은 CSS Adjacent 형제 선택기를 사용하는 것 입니다.

CSS

div {
    border: 1px solid black;
}

div + div {
    border-left: 0;
}

jsFiddle


좋은 속임수, 감사합니다! 내가 사용하여 더 나은 결과를 얻었다 발견 border-left: none;내가 사업부의 왼쪽 상단에 작은 틈이 그렇지!? (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 2018-11-18

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

그것은 당신 DIV 2 행에있는 경우 좋지 않다 : 당신은 2 행 사이에 이중 테두리가 ..
Didier68

@ Didier68 그래도 질문이 아니 었습니다.
냉동 완두콩의 Roddy

질문은 "이중 테두리 방지"입니다 ...하지만 가로 또는 세로인지 여부를 지정하지 않고 ... 예를 들어 솔루션은 <TD>에 적합하지만 DIV에는 적합하지 않습니다. 나는 스테판 벨로우에게 같은 말을한다!
Didier68

무슨 말을하는지 모르겠어요. 질문은 div에 관한 것이고, 대답은 div에 관한 것이고, 바이올린은 div를 사용합니다. 어디서 td를 받고 있습니까?
냉동 완두콩의 Roddy

5

나는 쇼에 늦었지만 다음과 같이 outline 속성을 사용해보십시오.

.item {
  outline: 1px solid black;
}

CSS의 외곽선은 물리적 공간을 차지하지 않으므로 이중 테두리를 방지하기 위해 겹칩니다.


행이 작은 화면에서 더 많은 행으로 나눌 때도 작동합니다. div가 새 행으로 나눌 수 있으면 다른 모든 답변이 작동하지 않습니다. 그런 다음 테두리가없는 측면이있는 div가 하나 이상 있습니다. 공유를위한 thx-upvoted
DigitalJedi

해킹보다 해결책을 갖는 것이 훨씬 낫습니다. 감사합니다.
포레스트

1

오른쪽의 div에 다음 CSS를 추가합니다.

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

Et voila, 완벽한 테이블. 자, 분명히 이것은 당신의 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.