คุณสามารถตั้งค่าความทึบของเส้นขอบใน CSS ได้หรือไม่?


409

มีวิธี CSS ตรงไปตรงมาที่จะทำให้เส้นขอบขององค์ประกอบกึ่งโปร่งใสด้วยอะไรเช่นนี้?

border-opacity: 0.7;

ถ้าไม่มีใครมีความคิดว่าฉันสามารถทำได้โดยไม่ต้องใช้ภาพหรือไม่?

คำตอบ:


626

น่าเสียดายที่opacityองค์ประกอบทำให้องค์ประกอบทั้งหมด (รวมถึงข้อความใด ๆ ) กึ่งโปร่งใส วิธีที่ดีที่สุดในการทำให้เส้นขอบกึ่งโปร่งแสงคือรูปแบบสี rgba ตัวอย่างเช่นนี่จะให้เส้นขอบสีแดงที่มีความทึบ 50%:

div {
    border: 1px solid rgba(255, 0, 0, .5);
    -webkit-background-clip: padding-box; /* for Safari */
    background-clip: padding-box; /* for IE9+, Firefox 4+, Opera, Chrome */
}

ปัญหาของวิธีการนี้คือเบราว์เซอร์บางตัวไม่เข้าใจrgbaรูปแบบและจะไม่แสดงเส้นขอบใด ๆ เลยหากเป็นการประกาศทั้งหมด วิธีแก้ปัญหาคือให้การประกาศสองเส้นขอบ ครั้งแรกที่มีความทึบปลอมและครั้งที่สองที่มีจริง หากเบราว์เซอร์สามารถใช้งานได้จะใช้เบราว์เซอร์ที่สองหากไม่ใช้จะใช้เบราว์เซอร์แรก

div {
    border: 1px solid rgb(127, 0, 0);
    border: 1px solid rgba(255, 0, 0, .5);
    -webkit-background-clip: padding-box; /* for Safari */
    background-clip: padding-box; /* for IE9+, Firefox 4+, Opera, Chrome */
}

การประกาศเส้นขอบแรกจะเป็นสีที่เทียบเท่ากับเส้นขอบสีแดงทึบแสง 50% บนพื้นหลังสีขาว (แม้ว่ากราฟิกใด ๆ ที่อยู่ใต้เส้นขอบจะไม่ทำให้เลือดออก)

UPDATE:ฉันได้เพิ่ม "background-clip: padding-box;" คำตอบนี้ (ตามคำแนะนำของ SooDesuNe ในความคิดเห็น) เพื่อให้แน่ใจว่าเส้นขอบจะยังคงโปร่งใสแม้ว่าจะใช้สีพื้นหลังที่เป็นของแข็ง


ใช่แล้วเรากลับไปที่ปัญหาที่เขามีเป็นครั้งแรก ^^ "ฉันคิดถึงการใช้ rgba สำหรับสีเส้นขอบ แต่มันทำงานได้ไม่ดีนักในเบราว์เซอร์สมัยใหม่" ในขณะที่โซลูชันของฉันทำงานในเบราว์เซอร์ทั้งหมดสวยมาก
Breezer

23
ที่จริงแล้ว rgba ทำงานได้อย่างยอดเยี่ยมในเบราว์เซอร์สมัยใหม่ (เว้นแต่คุณจะคิดว่า IE6-8 นั้น "ทันสมัย")
kingjeffrey

4
พวกมันควรจะเป็น: P และเมื่อคุณได้รับ 50% ขึ้นไปคุณควรเห็นว่ามันใช้งานได้เช่นกันเช่น imo อย่างน้อยสำหรับ ie7 +
Breezer

42
และนั่นคือสาเหตุที่ "ความทึบของปลอม" ถอยกลับ ชีวิตของฉันในฐานะนักออกแบบเว็บไซต์กลายเป็นเรื่องง่ายขึ้นมากเมื่อฉันยอมรับว่าไม่ใช่ทุกเบราว์เซอร์ที่ต้องแสดงผลเหมือนกัน หากพวกเขาสนับสนุนborder-radiusพวกเขาจะได้มุมมน ถ้าไม่พวกเขาทำไม่ได้ เนื้อหายังคงเข้าถึงได้ แต่ก็ยังดูดีอยู่มันดูดีขึ้นหากใช้เบราว์เซอร์ที่มีคุณสมบัติ ฉันไม่เคยมีลูกค้ารายหนึ่งบ่นเกี่ยวกับเรื่องนี้ในช่วง 1.5 ปีที่ผ่านมาของการดำเนินงานด้วยวิธีนี้ในทุกโครงการ
kingjeffrey

23
หากคุณพยายามที่จะทำให้เนื้อหาอยู่เบื้องหลังเนื้อหาที่มีเป้นของคุณส่องประกาย (และไม่ใช่สีพื้นหลังขององค์ประกอบที่ล้อมรอบเอง) คุณจะต้องตั้งค่าbackground-clip:padding-box;ด้วย
SooDesuNe

134

ง่ายมากให้ใช้เงาทึบกับ 0 ออฟเซ็ต:

#foo {
  border-radius: 1px;
  box-shadow: 0px 0px 0px 8px rgba(0,0,0,0.3);       
}

นอกจากนี้หากคุณกำหนดรัศมีเส้นขอบให้กับองค์ประกอบมันจะช่วยให้คุณมีขอบที่โค้งมน

การสาธิต jsFiddle

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


สิ่งนี้จะได้ผลเสมอ ขอบคุณสำหรับตัวอย่าง :) สำหรับทุกคนที่ต้องการเพียงแค่มีเส้นขอบไปยังหนึ่งหรือมากกว่าเว็บไซต์ที่คุณต้องเปลี่ยนสองพารามิเตอร์แรกเช่นกล่องเงา: -1px -1px 0px 0px rgba (0,0,0,0.1 ) เพื่อให้บรรลุเช่นขอบบน
Thomas Richter

อันนี้ควรใช้ด้วยความระมัดระวัง! box-shadowไม่มีขนาดและสามารถแบ่งเลย์เอาต์ของคุณทำให้ระยะขอบไม่เท่ากัน! jsfiddle.net/bj81hew7/2
William

14

ตามที่คนอื่นพูดถึง: CSS-3 บอกว่าคุณสามารถใช้rgba(...)ไวยากรณ์เพื่อระบุสีเส้นขอบด้วยค่าความทึบ (อัลฟา)

นี่เป็นตัวอย่างรวดเร็วหากคุณต้องการตรวจสอบ

  • ใช้งานได้ใน Safari และ Chrome (อาจใช้ได้กับเบราว์เซอร์ webkit ทั้งหมด)

  • มันทำงานได้ใน Firefox

  • ฉันสงสัยว่ามันใช้งานได้ใน IE แต่ฉันสงสัยว่ามีตัวกรองหรือพฤติกรรมบางอย่างที่จะทำให้ทำงานได้

นอกจากนี้ยังมีโพสต์สแต็คโอเวอร์โฟลว์นี้ซึ่งแนะนำปัญหาอื่น ๆ - กล่าวคือเส้นขอบจะแสดงสีพื้นหลังด้านบน (หรือภาพพื้นหลัง) ที่คุณระบุ ดังนั้นการ จำกัด ประโยชน์ของอัลฟาชายแดนในหลายกรณี


4
ปัญหาชายแดนสามารถรักษาให้หายขาดได้background-clip: padding-box;(และจนกว่าจะได้รับการสนับสนุนคุณสามารถใช้ส่วนขยายผู้จัดจำหน่าย -webkit และ -moz)
kingjeffrey

ฉันได้เพิ่มคำตอบนี้ไปยังคำถามที่คุณเชื่อมโยงแล้ว
kingjeffrey

6

หากคุณตรวจสอบการเข้ารหัส CSS ด้วยเครื่องมือตรวจสอบความถูกต้อง W3C คุณจะเห็นว่ารหัส CSS ของคุณเป็นที่ยอมรับแม้ว่าจะทำงานในเบราว์เซอร์หลักหรือไม่ก็ตาม

การสร้างเส้นขอบโปร่งใสผ่าน CSS ตามที่เขียนไว้ด้านบน

border: 1px solid rgba(255, 0, 0, .5);

ไม่ได้รับการยอมรับตามมาตรฐาน W3C ไม่ใช่แม้แต่สำหรับ CSS3 ฉันใช้ตัวตรวจสอบอินพุตโดยตรงกับโค้ด CSS ต่อไปนี้

.test { border: 1px solid rgba(255, 0, 0, .5); }

ผลการวิจัยพบว่า

ข้อผิดพลาดของค่า: ชายแดนไม่รู้จักค่าหรือค่ามากเกินไป: 1px solid rgba (255,0,0,0.5)

โชคไม่ดีที่ค่าอัลฟา (ตัวอักษร "a" ท้าย "rgb") ไม่ได้รับการยอมรับจาก W3C ซึ่งเป็นส่วนหนึ่งของค่าสีเส้นขอบในขณะนี้ ฉันสงสัยว่าทำไมมันไม่ได้มาตรฐานเพราะทำงานในเบราว์เซอร์ทั้งหมด ข้อผูกมัดเพียงอย่างเดียวคือคุณต้องการยึดติดกับมาตรฐาน W3C หรือไม่ก็สร้างมันใน CSS

หากต้องการใช้W3C CSS ออนไลน์ตรวจสอบ Input

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


11
ผิดนี่เป็นที่ยอมรับอย่างสมบูรณ์แบบโดยมาตรฐาน W3C และเป็นข้อผิดพลาดในเครื่องมือตรวจสอบ ดูคำตอบนี้ เป็นความคิดที่ดีที่จะใช้ตัวตรวจสอบความถูกต้องใช่ แต่อย่าเชื่อใจในทุกสิ่ง
BoltClock

5

* ไม่เท่าที่ฉันรู้ว่าไม่มีสิ่งที่ฉันทำตามปกติในสถานการณ์แบบนี้คือการสร้างบล็อกที่มีขนาดใหญ่กว่า ((เส้นขอบ * 2) + ต้นฉบับ) และทำให้มันโปร่งใสโดยใช้

filter:alpha(opacity=50);
-moz-opacity:0.5;
-khtml-opacity: 0.5;
opacity: 0.5;

นี่คือตัวอย่าง

#main{
    width:400px;
    overflow:hidden;
    position:relative;
}
.border{
    width:100%;
    position:absolute;
    height:100%;
    background-color:#F00;
    filter:alpha(opacity=50);
    -moz-opacity:0.5;
    -khtml-opacity: 0.5;
    opacity: 0.5;
}
.content{
    margin:15px;/*size of border*/
    background-color:black;
}
<div id="main">
    <div class="border">
    </div>
    <div class="content">
        testing
    </div>
</div>

ปรับปรุง:

คำตอบนี้ล้าสมัยเนื่องจากคำถามนี้มีอายุมากกว่า 8 ปี ทุกวันนี้เบราว์เซอร์ที่ทันสมัยรองรับ rgba, box shadow และอื่น ๆ แต่นี่เป็นตัวอย่างที่ดีว่าเมื่อ 8 ปีที่แล้วเป็นอย่างไร


ใช่นั่นคือสิ่งที่ฉันทำลงเอยจริง ๆ แล้วมันแย่มากกับการวางตำแหน่งขององค์ประกอบ
mcbeav

เพิ่มตัวอย่างเพื่อให้คุณสามารถมองเห็นได้ชัดเจนว่าฉันคิด :)
Breezer

ก็สามารถทำได้ - แต่ไม่ได้มีการสนับสนุนเบราว์เซอร์ในวงกว้าง อย่างไรก็ตามโอกาสที่ดีที่เบราว์เซอร์ใด ๆ ที่สนับสนุนความทึบของสีพื้นหลังจะสนับสนุนrgba(...)สีขอบ คุณสามารถลองออกจากที่นี่
ลี

@Lee, IE รองรับความทึบ "filter" แต่ไม่รองรับ rgba (จนถึง IE9) รูปแบบใด ๆ
kingjeffrey

2

ในฐานะที่เป็นวิธีการแก้ปัญหาอื่นที่อาจทำงานในบางกรณีเปลี่ยนไปborder-styledotted

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


0

คำตอบอื่น ๆ จะจัดการกับประเด็นทางเทคนิคของปัญหาความทึบชายแดนในขณะที่ฉันต้องการนำเสนอการแฮ็ก (CSS และ pure HTML เท่านั้น) โดยพื้นฐานแล้วสร้าง div container ที่มี div div แล้ว div content

<div class="container">
  <div class="border-box"></div>
  <div class="content-box"></div>
</div>

จากนั้น CSS: (ตั้งค่าเส้นขอบเนื้อหาเป็นไม่มีดูแลการวางตำแหน่งเพื่อให้ความหนาของเส้นขอบถูกนำมาพิจารณา)

.container {
  width: 20vw;
  height: 20vw;
  position: relative;
}
.border-box {
  width: 100%;
  height: 100%;
  border: 5px solid black;
  position: absolute;
  opacity: 0.5;
}
.content-box {
  width: 100%;
  height: 100%;
  border: none;
  background: green;
  top: 5px;
  left: 5px;
  position: absolute;
}

0

ไม่มีทางที่จะไม่เพียงตั้งค่าความทึบของเส้นขอบด้วย CSS ที่

ตัวอย่างเช่นหากคุณไม่ทราบสีไม่มีวิธีใดที่จะเปลี่ยนความทึบของเส้นขอบโดยการใช้เพียงอย่างrgba()เดียว


-1

ลองนี้:

<h2>Snippet for making borders transparent</h2>
<div>
  <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio. Praesent libero. Sed cursus ante dapibus diam. Sed nisi. Nulla quis sem at nibh elementum imperdiet. Duis sagittis ipsum. Praesent mauris. Fusce nec tellus sed augue semper porta.
    Mauris massa. Vestibulum lacinia arcu eget nulla. <b>Lorem ipsum dolor sit amet, consectetur adipiscing elit</b>. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Curabitur sodales ligula in libero. Sed dignissim
    lacinia nunc. <i>Lorem ipsum dolor sit amet, consectetur adipiscing elit</i>. Curabitur tortor. Pellentesque nibh. Aenean quam. In scelerisque sem at dolor. Maecenas mattis. Sed convallis tristique sem. Proin ut ligula vel nunc egestas porttitor.
    <i>Lorem ipsum dolor sit amet, consectetur adipiscing elit</i>. Morbi lectus risus, iaculis vel, suscipit quis, luctus non, massa. Fusce ac turpis quis ligula lacinia aliquet. Mauris ipsum. Nulla metus metus, ullamcorper vel, tincidunt sed, euismod
    in, nibh. Quisque volutpat condimentum velit. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Nam nec ante. Sed lacinia, urna non tincidunt mattis, tortor neque adipiscing diam, a cursus ipsum ante quis
    turpis. Nulla facilisi. Ut fringilla. Suspendisse potenti. Nunc feugiat mi a tellus consequat imperdiet. Vestibulum sapien. Proin quam. Etiam ultrices. <b>Nam nec ante</b>. Suspendisse in justo eu magna luctus suscipit. Sed lectus. <i>Sed convallis tristique sem</i>.
    Integer euismod lacus luctus magna. <b>Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos</b>. Quisque cursus, metus vitae pharetra auctor, sem massa mattis sem, at interdum magna augue eget diam. Vestibulum
    ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Morbi lacinia molestie dui. Praesent blandit dolor. Sed non quam. In vel mi sit amet augue congue elementum. Morbi in ipsum sit amet pede facilisis laoreet. Donec lacus nunc,
    viverra nec, blandit vel, egestas et, augue. Vestibulum tincidunt malesuada tellus. Ut ultrices ultrices enim. <b>Suspendisse in justo eu magna luctus suscipit</b>. Curabitur sit amet mauris. Morbi in dui quis est pulvinar ullamcorper. </p>
</div>
<div id="transparentBorder">
  This &lt;div&gt; has transparent borders.
</div>

และนี่คือ CSS มหัศจรรย์ของเรา

* {
  padding: 10pt;
  font: 13px/1.5 Helvetica Neue, Arial, Helvetica, 'Liberation Sans', FreeSans, sans-serif;
}

b {
  font-weight: bold;
}

i {
  font-style: oblique;
}

H2 {
  font-size: 2em;
}

div[id='transparentBorder'] {
  height: 100px;
  width: 200px;
  padding: 10px;
  position: absolute;
  top: 40%;
  left: 30%;
  text-align: center;
  background: Black;
  border-radius: 4px;
  border: 10pt solid rgba(0, 0, 0, 0.5);
  -moz-background-clip: border;
  /* Firefox 3.6 */
  -webkit-background-clip: border;
  /* Safari 4? Chrome 6? */
  background-clip: border-box;
  /* Firefox 4, Safari 5, Opera 10, IE 9 */
  -moz-background-clip: padding;
  /* Firefox 3.6 */
  -webkit-background-clip: padding;
  /* Safari 4? Chrome 6? */
  background-clip: padding-box;
  /* Firefox 4, Safari 5, Opera 10, IE 9 */
  text-align: center;
  margin: 0;
  color: #fff;
  cursor: pointer;
}

ตรวจสอบการสาธิตที่นี่

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