การป้องกันเส้นขอบ "สอง" ใน CSS


89

สมมติว่าฉันมีสอง div ติดกัน (ใช้https://chrome.google.com/webstore/category/homeเป็นข้อมูลอ้างอิง) โดยมีเส้นขอบ

มีวิธี (โดยเฉพาะอย่างยิ่งเคล็ดลับ CSS) เพื่อป้องกันไม่ให้ div ของฉันปรากฏเหมือนมีเส้นขอบสองชั้นหรือไม่? ดูภาพนี้เพื่อทำความเข้าใจว่าฉันหมายถึงอะไร:

เส้นขอบ "สองเท่า"

คุณจะเห็นว่าจุดที่ทั้งสองมาบรรจบกันดูเหมือนว่ามีเส้นขอบสองชั้น


ไม่ฉันใช้สิ่งนี้กับไอโซโทปจึงไม่สามารถใช้ตารางได้ div มีขนาดแตกต่างกัน
john smith

มันเป็นปัญหาสำหรับคุณซ้าย - ขวาเท่านั้นหรือคุณต้องกังวลเกี่ยวกับเรื่องนี้บน - ล่าง?
VictorKilo

ฉันหวังว่าจะมีทางออกที่ดีกว่านี้ใน CSS :-(
richardstelmach

คำตอบ:


19

#divNumberOne { border-right: 0; }


11
นี่เป็นวิธีเดียวที่แท้จริงในการทำที่ไม่ทำให้สิ่งอื่น ๆ ยุ่งเหยิง หากคุณต้องการทำหลายองค์ประกอบนรกพูดว่า 100 div คุณสามารถทำได้div { border-right: none; } div:last-child { border-right: 1px solid black; }ซึ่งจะให้เอฟเฟกต์ที่คุณตั้งใจไว้
Andy

ใช่มันสามารถทำได้ตลอดเวลา แต่ฉันสงสัยว่ามีวิธี css บริสุทธิ์หรือไม่โดยไม่ต้องใช้มากกว่าหนึ่งคลาส (ฉันจะมีแถวและคอลัมน์มากขึ้น)
john smith

3
นี่คือ css ล้วนๆฉันใช้คลาสหลอก (ลูกคนสุดท้าย) ดังนั้นฉันจึงไม่ได้แก้ไข html เลยมีคลาสหลอกมากมายและฉันจะบอกว่าไปตามเส้นทางนี้เพราะฉันไม่คิดว่าจะมีทางเลือกอื่น
Andy

ดู Nth Child คุณสามารถทำได้ด้วยวิธีนี้โดยใช้เลขคี่และคู่หรือขึ้นอยู่กับเลย์เอาต์ของคุณคุณสามารถคำนวณได้ตามที่คุณต้องการ
MaxwellLynn

1
เหตุใดจึงยอมรับสิ่งนี้ว่าเป็นคำตอบที่ถูกต้อง ฉันไม่คิดว่านี่คือสิ่งที่เขากำลังมองหา นี่ไม่ใช่โซลูชันที่ปรับขนาดได้อย่างแน่นอน
Kevin Behan

80

หากเรากำลังพูดถึงองค์ประกอบที่ไม่สามารถรับประกันได้ว่าจะปรากฏในลำดับใด ๆ โดยเฉพาะ (อาจเป็น 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

2
มีประโยชน์มาก ฉันเพิ่มด้วยposition: relative;left: 1px;เพื่อเปลี่ยนกลับมาร์จิ้นติดลบ
Bartosz Walicki

1
นี่มันฉลาดจริงๆ!. ผมคิดว่านี่น่าจะเป็นคำตอบ
เพลิดเพลินกับ

วิธีนี้ดีกว่าคำตอบ
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;
}

การสาธิต

รวมie9.jsสำหรับการสนับสนุน IE8 (มีประโยชน์มากสำหรับตัวเลือก CSS / องค์ประกอบหลอกทั้งหมด)


หากคุณมี div แถวแรกมากกว่าหนึ่งแถวในแถวที่สองจะไม่มีเส้นขอบด้านซ้ายและด้วยเคล็ดลับการจัดแนว div นี้ให้ไปทางซ้ายเป็นเวลา 1px
Afshin

ไม่มีรุ่นที่ซับซ้อนกว่านี้หรือ? แล้วองค์ประกอบที่มีขนาดใหญ่กว่าright-marginล่ะ?
feeela

@afshin ถ้าฉันไม่เห็นเค้าโครงของเขาฉันจะให้คำตอบเฉพาะได้อย่างไร?
Giona

@feeela ฉันคิดว่ามันค่อนข้างธรรมดา อย่างไรก็ตามright-marginไม่ส่งผลกระทบต่อleft-margin: jsfiddle.net/gionaf/D6tHK/1
Giona

1
สิ่งนี้แก้เส้นขอบสองด้าน แต่ไม่ใช่แนวตั้ง เส้นขอบด้านล่าง / ด้านบนยังคงเพิ่มเป็นสองเท่า คำแนะนำสำหรับสิ่งเหล่านี้หรือไม่?
delphirules

15

วิธีการแก้ปัญหาหนึ่งอาจจะต้องพิจารณาก็คือการใช้ CSS ที่อยู่ติดกันเลือกพี่น้อง

CSS

div {
    border: 1px solid black;
}

div + div {
    border-left: 0;
}

jsFiddle


เคล็ดลับที่ดีขอบคุณ! ฉันพบว่าฉันได้ผลลัพธ์ที่ดีกว่าเมื่อใช้border-left: none;อย่างอื่นฉันมีช่องว่างเล็ก ๆ ที่ด้านซ้ายบนของ div!? (Firefox)
IanB

คุณอาจต้องการใช้div + div { border-left: 0; }
Sergey Stadnik

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>

ป้อนคำอธิบายภาพที่นี่


จะดีกว่าไหมถ้าทำลูกที่ n (คู่) {border-left: none;} ด้วยวิธีนี้อาจมีคอลัมน์จำนวนคี่ ...
pixelearth

6

ฉันมาสาย แต่ลองใช้คุณสมบัติเค้าร่างดังนี้:

.item {
  outline: 1px solid black;
}

โครงร่างใน CSS ไม่ใช้พื้นที่ทางกายภาพดังนั้นจะทับซ้อนกันเพื่อป้องกันไม่ให้เกิดเส้นขอบสองชั้น


ยังใช้งานได้เมื่อแถวแบ่งเป็นแถวมากขึ้นบนหน้าจอขนาดเล็กคำตอบอื่น ๆ ทั้งหมดจะไม่ได้ผลเมื่อ div ของคุณสามารถแบ่งเป็นแถวใหม่ได้ จากนั้นคุณมีอย่างน้อยหนึ่ง div โดยมีด้านที่ไม่มีขอบ ขอบคุณสำหรับการแบ่งปัน - โหวตเพิ่ม
DigitalJedi

ดีกว่ามากที่จะมีวิธีแก้ปัญหามากกว่าการแฮ็ก ขอขอบคุณ.
forrest

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 of the Frozen Peas

คำถามคือ "การป้องกันเส้นขอบสองชั้น" ... แต่ไม่ได้ระบุว่าเป็นแนวขวางหรือแนวตั้ง ... วิธีแก้ปัญหาของคุณดีสำหรับ <TD> แต่ไม่ใช่สำหรับ DIV ฉันให้คำพูดเดียวกันกับสเตฟานร้อง!
Didier68

ฉันไม่รู้ว่าคุณกำลังพูดถึงอะไร คำถามเกี่ยวกับ div คำตอบคือเกี่ยวกับ div ของ fiddle ใช้ div คุณได้รับ td จากที่ไหน?
Roddy of the Frozen Peas

2

การใช้ Flexbox จำเป็นต้องเพิ่มคอนเทนเนอร์ลูกที่สองเพื่อให้โครงร่างทับซ้อนกันอย่างถูกต้อง ...

<div class="grid__container">
    <div class="grid__item">
        <div class="grid__item-outline">
              <!-- content -->
        </div>
    </div>
</div>

วทส

.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

เพิ่ม CSS ต่อไปนี้ใน div ทางด้านขวา:

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

หรือแค่ลบเส้นขอบเส้นใดเส้นหนึ่งออก



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 เซนต์เนื่องจากวิธีการทำของฉันไม่ได้อยู่ที่นี่

คุณเห็นฉันทำมันไม่ชอบเล่นกับอัตรากำไรขั้นต้นอัตรากำไรเชิงลบโดยเฉพาะอย่างยิ่ง เบราว์เซอร์ทุกคนดูเหมือนว่าจะจัดการเหล่านี้แตกต่างกันเพียงว่าบิตตาดและอัตรากำไรที่ได้รับอิทธิพลอย่างง่ายดายโดยจำนวนมากของสถานการณ์

วิธีของฉันในการทำให้แน่ใจว่าฉันมีตารางที่ดีพร้อม divs คือการสร้างโครงสร้าง 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

คำถามเก่ามาก แต่เป็นผลการค้นหาแรกของ 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.