มีวิธีใดในการประกาศขนาด / เส้นขอบบางส่วนให้กับกล่องหรือไม่?


105

มีวิธีใดในการประกาศขนาด / เส้นขอบบางส่วนให้กับกล่องใน CSS? ยกตัวอย่างเช่นกล่องกับว่ามีเพียงแสดงให้เห็นถึงขอบล่างในที่หนึ่งของมัน350px 60pxผมคิดว่าอาจมีประโยชน์มาก

ตัวอย่าง:

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

คำตอบ:


155

ไม่จริง. แต่มันง่ายมากที่จะบรรลุเอฟเฟกต์ด้วยวิธีที่ลดระดับลงอย่างสง่างามและไม่ต้องใช้มาร์กอัปที่ไม่จำเป็น:

div {
  width: 350px;
  height: 100px;
  background: lightgray;
  position: relative;
  margin: 20px;
}

div:after {
  content: '';
  width: 60px;
  height: 4px;
  background: gray;
  position: absolute;
  bottom: -4px;
}
<div></div>


3
ไม่มีอะไรเหมือนกับการถูกทำเครื่องหมายว่าเป็นคำตอบที่ถูกต้องหากไม่มี +1 แต่ฉัน +1 คุณแล้ว! นี่เป็นทางออกที่สมบูรณ์แบบสำหรับปัญหาของฉัน ขอบคุณ! แก้ไขฉันเดาว่าคุณอาจ +1 เป็น OP และ -1 โดยคนอื่น โอ้ดี. ฉันขอขอบคุณสำหรับคำตอบของคุณและนั่นคือทั้งหมดที่สำคัญใช่ไหม ;-)
CWSpear

7
คุณจะทำให้สิ่งนี้อยู่ตรงกลางได้อย่างไรเช่นในตัวอย่างที่สองของเขา?
Cameron Martin

ฉันควรเพิ่มเมื่อองค์ประกอบหลักเป็นองค์ประกอบบล็อกอินไลน์ความกว้างของของเหลว เห็นได้ชัดว่าเมื่อมีความกว้างคงที่ก็ทำได้ง่าย
Cameron Martin

4
ไม่เป็นไรผมได้รับผลกระทบที่ฉันต้องการ - dabblet.com/gist/e5a78f2d4bf50b6be4d3 เป็นเรื่องน่าเสียดายที่ยังไม่มีองค์ประกอบหลอก::outsideและ::insideฉันเกลียดการใส่มาร์กอัปเพื่อจัดแต่งทรงผมเท่านั้น แต่ฉันไม่คิดว่าจะมีวิธีอื่น
Cameron Martin

ได้ผล! หากต้องการใช้กับ React คุณไม่สามารถใช้contentใน:afterรูปแบบอินไลน์หรือ JSS ได้ แต่ใช้งานได้ดีเมื่อใช้ส่วนประกอบที่มีสไตล์
Raphael Pinel

26

ฉันรู้ว่านี่ได้รับการแก้ไขแล้วและมีการร้องขอพิกเซล อย่างไรก็ตามฉันแค่อยากจะแบ่งปันบางสิ่ง ...

องค์ประกอบข้อความที่ขีดเส้นใต้บางส่วนสามารถทำได้อย่างง่ายดายโดยใช้display:tableหรือdisplay:inline-block

(ฉันไม่ได้ใช้display:inline-blockเพราะใช่คุณก็รู้ว่า4px-gap ที่น่าอึดอัดใจ)

องค์ประกอบข้อความ

h1 {
  border-bottom: 1px solid #f00;
  display: table;
}
<h1>Foo is not equal to bar</h1>

ตรงกลาง , ทำให้มันเป็นไปไม่ได้ที่ศูนย์องค์ประกอบด้วยdisplay:table มาแก้ไขกันด้วย...text-align:center
margin:auto

h1 {
  border-bottom: 1px solid #f00;
  display: table;
  margin-left: auto;
  margin-right: auto;
}
<h1>Foo is not equal to bar</h1>

ดีว่าเป็นสิ่งที่ดี แต่ก็ไม่ได้เป็นบางส่วน
ตามที่ตู้หนังสือได้แนะนำไปแล้วองค์ประกอบหลอกมีมูลค่าทอง

h1 {
  display: table;
  margin-left: auto;
  margin-right: auto;
}

h1:after {
  border-bottom: 1px solid #f00;
  content: '';
  display: block;
  width: 50%;
}
<h1>Foo is not equal to bar</h1>

ออฟเซ็ตขีดเส้นใต้ถูกจัดชิดซ้ายในขณะนี้ ในการจัดกึ่งกลางให้กดองค์ประกอบหลอกครึ่งหนึ่งของwidth( 50% / 2 = 25%) ไปทางขวา

h1 {
  display: table;
  margin-left: auto;
  margin-right: auto;
}

h1:after {
  border-bottom: 1px solid #f00;
  content: '';
  display: block;
  margin-left: 25%;
  width: 50%;
}
<h1>Foo is not equal to bar</h1>

... ตามที่davidmatasแสดงความคิดเห็นmargin:autoบางครั้งการใช้งานสามารถใช้งานได้จริงมากกว่าการคำนวณmargin-offset ด้วยมือ

ดังนั้นเราสามารถจัดแนวเส้นใต้ไปทางซ้ายขวาหรือกึ่งกลาง (โดยไม่ทราบกระแสwidth) โดยใช้หนึ่งในชุดค่าผสมเหล่านี้:

  • ซ้าย : margin-right: auto (หรือปล่อยไว้เฉยๆ)
  • กลาง :margin: auto
  • ขวา :margin-left: auto

ตัวอย่างเต็ม

.underline {
  display: table;
  margin-left: auto;
  margin-right: auto;
}

.underline:after {
  border-bottom: 1px solid #f00;
  content: '';
  display: block;
  width: 50%;
}

.underline--left:after {
  margin-right: auto; /* ...or just leave it off */
}

.underline--center:after {
  margin-left: auto;
  margin-right: auto;
}

.underline--right:after {
  margin-left: auto
}
<h1 class="underline underline--left">Foo is not equal to bar</h1>
<h1 class="underline underline--center">Foo is not equal to bar</h1>
<h1 class="underline underline--right">Foo is not equal to bar</h1>

องค์ประกอบระดับบล็อก

สิ่งนี้สามารถนำไปใช้ได้อย่างง่ายดายเพื่อให้เราสามารถใช้องค์ประกอบระดับบล็อกได้ เคล็ดลับคือตั้งค่าความสูงขององค์ประกอบหลอกให้มีความสูงเท่ากับองค์ประกอบจริง (ง่ายๆheight:100%):

div {
  background-color: #eee;
  display: table;
  height: 100px;
  width: 350px;
}
div:after {
  border-bottom: 3px solid #666;
  content: '';
  display: block;
  height: 100%;
  width: 60px;
}
<div></div>


2
คำตอบที่ดี สำหรับ:afterฉันชอบmargin: 0 autoวิธีการอื่น ๆแทนmargin-left: 25%เพราะมันจะทำงานกับความกว้างใด ๆ ที่คุณประกาศโดยไม่จำเป็นต้องคำนวณทางคณิตศาสตร์
davidmatas

1
@davidmatas จุดดี! ฉันเพิ่งใช้mathy-wayเพื่อชี้แจงวิธีวางตำแหน่งด้วยมือด้วยตนเอง ด้วยตัวอย่างนี้ทุกคนสามารถเข้าใจวิธีจัดแนวซ้าย / กลาง / ขวา อย่างไรก็ตามฉันจะเพิ่มauto- simplificator :)
yckart

17

นี่คืออีกวิธีการหนึ่งlinear-gradientที่คุณสามารถสร้างเส้นที่คุณต้องการได้อย่างง่ายดาย คุณยังสามารถมีหลายบรรทัด (ในแต่ละด้าน) โดยใช้พื้นหลังหลาย ๆ

นี่คือไวยากรณ์อื่นเพื่อให้บรรลุเช่นเดียวกับด้านบน:

.box1 {
  width: 200px;
  padding: 20px;
  margin: 10px auto;
  text-align: center;
  background: 
   linear-gradient(#000, #000) top /40% 3px no-repeat, 
   #ccc
}

.box2 {
  width: 200px;
  padding: 20px;
  margin: 10px auto;
  text-align: center;
  background: 
    linear-gradient(red,red) bottom/ 60% 2px no-repeat, 
    #ccc;
}

.box3{
  width: 200px;
  padding: 20px;
  margin: 10px auto;
  text-align: center;
  background: 
   linear-gradient(red , red)bottom left/ 60% 2px,
   linear-gradient(blue, blue) 60% 0 / 40% 2px,
   linear-gradient(brown, brown) left/ 3px 30%,
   linear-gradient(orange, orange) right / 3px 40%,
   #ccc;
  background-repeat:no-repeat;
}
<div class="box1">
  Box1
</div>
<div class="box2">
  Box2
</div>
<div class="box3">
  Box3
</div>


1
ว้าว ... ฉันเล่นซอมาหลายชั่วโมงแล้วเพื่อหาวิธีที่จะมีเฉพาะมุมบนซ้ายและขวาบนของกล่อง "โดยนัย" ที่แสดง : before and: after ถูก จำกัด เกินไปมันทำให้การวางตำแหน่งของวัตถุยุ่งเหยิง นี่คือทางออกที่ยอดเยี่ยม!
Wouter

ข้อมูลพื้นฐานบางประการเกี่ยวกับสาเหตุและวิธีการทำงาน: webfx.com/blog/web-design/background-css-shorthand
Wouter

มันคลิปเส้นขอบมุมถ้าใช้กับborder-radius
Vandesh

2

ฉันใช้เส้นตารางเพื่อสร้างเส้นขอบบางส่วน

ดูที่นี่ .

รหัส:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Responsive partial borders</title>
    <style>
        /* ungrid without mobile */
        .row{width:100%;display:table;table-layout:fixed;}
        .col{display:table-cell;}

        /* things to change */
        .row{width: 70%; margin: auto;}
        .mid.row > .col{ height: 150px; }

        /* draw box and align text */
        .col{ text-align: center;}
        .top.left.col{
            border-top: 1px solid black;
            border-left: 1px solid black;
        }
        .top.right.col{
            border-top: 1px solid black;
            border-right: 1px solid black;
        }
        .bottom.left.col{
            border-bottom: 1px solid black;
            border-left: 1px solid black;
        }
        .bottom.right.col{
            border-bottom: 1px solid black;
            border-right: 1px solid black;
        }
        .mid.row > .col{
            border-left: 1px solid black;
            border-right: 1px solid black;
            vertical-align: middle;
        }
        .top.center.col{
            position: relative;
            top: -0.5em;
        }
        .bottom.center.col{
            position: relative;
            bottom: -0.5em;
        }
    </style>
</head>
<body>

    <div class="row">
        <div class="top left col"></div>
        <div class="top center col">Top</div>
        <div class="top right col"></div>
    </div>
    <div class="mid row">
        <div class="col">Mid</div>
    </div>
    <div class="row">
        <div class="bottom left col"></div>
        <div class="bottom center col">Bottom</div>
        <div class="bottom right col"></div>
    </div>  

</body>
</html>

@ SverriM.Olsen เนื่องจากมีผู้แก้ไขรหัสความคิดเห็นจึงล้าสมัย
Sagar V

0

CSS ไม่รองรับขอบบางส่วน คุณจะต้องใช้องค์ประกอบที่อยู่ติดกันเพื่อจำลองสิ่งนี้


หรือองค์ประกอบหลอกซึ่งคุณสามารถทำได้ด้วย CSS ทั้งหมดและไม่ต้องเพิ่มมาร์กอัปใด ๆ ดังภาพประกอบด้านบน
OG Sean
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.