ฉันสามารถเพิ่มสีพื้นหลังสำหรับช่องว่างภายในได้หรือไม่?


88

ฉันมีกล่องส่วนหัวซึ่งรวมถึงเส้นขอบและช่องว่างภายในและสีพื้นหลังสำหรับกล่องนั้นฉันสามารถเปลี่ยนสีพื้นหลังเฉพาะบริเวณเบาะหลังเส้นขอบแล้วใช้สีพื้นหลังเดียวกันกับส่วนที่เหลือของความกว้าง (เช่นสีเทาในรหัสที่กำหนด) เหรอ?

เพียงแค่บีบรหัสที่ฉันต้องการสีพื้นหลังเบาะ:

nav {
    margin:0px auto;
    width:100%;
    height:50px;
    background-color:grey;
    float:left;
    padding:10px;
    border:2px solid red;
}

3
ฉันไม่คิดอย่างนั้น แต่ฉันชอบที่จะพิสูจน์ว่าผิด (ฉันคิดว่าคุณต้องซ้อนองค์ประกอบ)
เดวิดบอกว่าคืนสถานะโมนิกา

ไม่คุณถูกต้องดาวิด
Eli Gassert

2
@DavidThomas ฉันขอให้เหมือนกัน! มาดูกัน ..
Pavan Nadig

EliGassert อืม .. แล้ววัดจะมีกล่องที่มีสีต่างกันข้างในได้ไหม?
Pavan Nadig

1
ตรวจสอบคำตอบของฉันมันสามารถทำได้
Muhammad Umer

คำตอบ:


40

ตัวเลือกอื่นที่มี CSS บริสุทธิ์จะเป็นดังนี้:

nav {
    margin: 0px auto;
    width: 100%;
    height: 50px;
    background-color: white;
    float: left;
    padding: 10px;
    border: 2px solid red;
    position: relative;
    z-index: 10;
}

nav:after {
    background-color: grey;
    content: '';
    display: block;
    position: absolute;
    top: 10px;
    left: 10px;
    right: 10px;
    bottom: 10px;
    z-index: -1;
}

สาธิตที่นี่


องค์ประกอบระดับหลอกของคุณไปไกลกว่ากล่องหลักทางด้านขวาเนื่องจากwidth: 100%;
Simon

ตอนนี้ระยะห่างทางด้านขวามีขนาดใหญ่เกินไปการตั้งค่าความกว้าง 95% ก็ไม่น่าเชื่อถือเกินไปโดยเฉพาะอย่างยิ่งหากช่องว่างภายในเปลี่ยนไป ;)
Simon

@ คุณ Simon ช่วยอธิบายได้ไหมว่าทำไมคุณถึงวางโค้ดposition:relative;ฉันสามารถดูว่ามันไม่ได้วางไว้แล้วมันจะไม่ปรากฏในหน้าจอ! .. แต่มันทำงานอย่างไร?
Pavan Nadig

2
@Pavan Nadig ตำแหน่งที่สัมพันธ์กันจึงสามารถเพิ่มค่าดัชนี z และมีผลได้ ดัชนี Z ใช้งานได้กับองค์ประกอบที่อยู่ในตำแหน่งเท่านั้น
gotohales

ฉันคิดว่าอธิบายได้ดีที่สุดที่นี่
Simon

80

ฉันขอโทษทุกคนที่นี่เป็นวิธีแก้ปัญหาที่แท้จริงโดยที่คุณไม่ต้องตั้งค่าช่องว่างภายใน

http://jsfiddle.net/techsin/TyXRY/1/

ฉันทำอะไรลงไป ...

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

ฉลาดถ้าฉันพูดกับตัวเอง

div {
    padding: 35px;
    background-image:
      linear-gradient(to bottom,
        rgba(240, 255, 40, 1) 0%,
        rgba(240, 255, 40, 1) 100%),
      linear-gradient(to bottom,
        rgba(240, 40, 40, 1) 0%,
        rgba(240, 40, 40, 1) 100%);
    background-clip: content-box, padding-box;
}

6
ฉลาดมาก. ฉันทำความสะอาดซอเล็กน้อย: jsfiddle.net/ilancopelyn/n1ax4qvt
Ilan

ตอนนี้มันอยู่บนjsfiddle.net/TyXRY/123 (123) แต่สิ่งที่พวกเขากำลังทำหรือใครกำลังทำนั้นไม่ชัดเจนสำหรับฉัน
Muhammad Umer

ฉันชอบสิ่งนี้. เสียดายที่ตรงกลาง (เช่นกล่องเนื้อหา) ไม่สามารถโปร่งใสและเจาะรูทะลุไปยังสีพื้น (เช่นตัวถัง) ได้ ฉันเพิ่งเห็นการไล่ระดับสีภายนอกใน Chrome เมื่อฉันลองสิ่งนี้
MSC

1
ใจดี! มีวิธีแนบการเปลี่ยนแปลงหรือไม่ ฉันพยายามแล้วแต่ไม่สำเร็จ
Garavani

transition: all 0.3s 0.6s cubic-bezier(0.175, 0.885, 0.32, 1.275);
Benny K

44

ใช้background-clipและbox-shadowคุณสมบัติ

1 ชุด background-clip: content-box - สิ่งนี้ จำกัด พื้นหลังเฉพาะเนื้อหาเท่านั้น (แทนที่จะครอบคลุมทั้งช่องว่างภายในและเส้นขอบ)

2) เพิ่มด้านใน box-shadowโดยกำหนดรัศมีการแพร่กระจายเป็นค่าเดียวกับช่องว่างภายใน

ดังนั้นให้บอกว่า padding คือ 10px - set box-shadow: inset 0 0 0 10px lightGreen- ซึ่งจะทำให้เฉพาะพื้นที่ padding เป็นสีเขียวอ่อน

การสาธิต Codepen

nav {
  width: 80%;
  height: 50px;
  background-color: gray;
  float: left;
  padding: 10px; /* 10px padding */
  border: 2px solid red;
  background-clip: content-box; /* <---- */
  box-shadow: inset 0 0 0 10px lightGreen; /* <-- 10px spread radius */
}
ul {
  list-style: none;
}
li {
  display: inline-block;
}
<h2>The light green background color shows the padding of the element</h2>
<nav>
  <ul>
    <li><a href="index.html">Home</a>
    </li>
    <li><a href="/about/">About</a>
    </li>
    <li><a href="/blog/">Blog</a>
    </li>
  </ul>
</nav>

สำหรับคำแนะนำอย่างละเอียดเกี่ยวกับเทคนิคนี้โปรดดูโพสต์ css-tips ที่ยอดเยี่ยมนี้


อะไร0 0 0หมายถึง?
Nakilon

1
@ นาคีลอนbox-shadowมีสรรพคุณ 4 ประการ การ0 0 0ตั้งค่าh-shadow v-shadowและblurเป็น 0 เนื่องจากเงาแนวนอนเงาแนวตั้งและระยะเบลอไม่จำเป็นในการใช้งานนี้ มันเป็นเพียงแค่เงาที่มั่นคงที่จะไปเข้าด้านใน ( inset) 10pxสำหรับ
trlkly

เรียบง่าย แต่ได้ผล!
timgeb

9

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

background-image: 
    -moz-linear-gradient(top, #000 10px, transparent 10px),
    -moz-linear-gradient(bottom, #000 10px, transparent 10px),
    -moz-linear-gradient(left, #000 10px, transparent 10px),
    -moz-linear-gradient(right, #000 10px, transparent 10px);
background-image: 
    -o-linear-gradient(top, #000 10px, transparent 10px),
    -o-linear-gradient(bottom, #000 10px, transparent 10px),
    -o-linear-gradient(left, #000 10px, transparent 10px),
    -o-linear-gradient(right, #000 10px, transparent 10px);
background-image: 
    -webkit-linear-gradient(top, #000 10px, transparent 10px),
    -webkit-linear-gradient(bottom, #000 10px, transparent 10px),
    -webkit-linear-gradient(left, #000 10px, transparent 10px),
    -webkit-linear-gradient(right, #000 10px, transparent 10px);
background-image: 
    linear-gradient(top, #000 10px, transparent 10px),
    linear-gradient(bottom, #000 10px, transparent 10px),
    linear-gradient(left, #000 10px, transparent 10px),
    linear-gradient(right, #000 10px, transparent 10px);

ไม่จำเป็นต้องมีมาร์กอัปที่ไม่จำเป็น

หากคุณต้องการเพียงแค่มีเส้นขอบสองชั้นคุณสามารถใช้เส้นขอบและเส้นขอบแทนเส้นขอบและช่องว่างภายใน

ในขณะที่คุณสามารถใช้องค์ประกอบหลอกเพื่อให้ได้เอฟเฟกต์ที่ต้องการฉันขอแนะนำให้ต่อต้านมัน องค์ประกอบหลอกเป็นเครื่องมือที่มีประสิทธิภาพมากที่ CSS จัดเตรียมไว้ให้หากคุณ "เสีย" ไปกับสิ่งต่างๆเช่นนี้คุณอาจจะพลาดไปที่อื่น

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


1
หากคุณสามารถเพิกเฉยต่อ IE9 ได้คุณสามารถทำได้ด้วยการไล่ระดับสี แต่อย่างน้อยคลาสหลอกก็รองรับได้จนถึง IE8
Simon

ถูกแล้ว. แต่ถ้ามีหลายกรณีอาจจะคุ้มค่าที่จะใช้ css3pie.com
dave

1
ขยะคืออะไร? องค์ประกอบหลอกถูก จำกัด ให้ใช้ในช่วงเวลาที่ จำกัด หรือไม่?
อันวา

ใช่พวกเขามีจำนวน จำกัด คุณมี 2 สำหรับแต่ละองค์ประกอบ (1x :: before, 1x :: after)
dave

6

คำตอบกล่าวถึงวิธีแก้ปัญหาที่เป็นไปได้ทั้งหมด

ฉันมีอีกอันกับ BOX-SHADOW

นี่คือJSFIDDLE

และรหัส

nav {
    margin:0px auto;
    width:100%;
    height:50px;
    background-color:grey;
    float:left;
    padding:10px;
    border:2px solid red;
    box-shadow: 0 0 0 10px blue inset;
}

นอกจากนี้ยังรองรับใน IE9 ดังนั้นจึงดีกว่าโซลูชันการไล่ระดับสีเพิ่มคำนำหน้าที่เหมาะสมเพื่อการสนับสนุนเพิ่มเติม

IE8 ไม่รองรับมันน่าเสียดาย!


5

คุณไม่สามารถกำหนดสีของช่องว่างภายในได้

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

ดูตัวอย่างที่นี่: http://jsbin.com/abanek/1/edit



2

นี่จะเป็นโซลูชัน CSS ที่เหมาะสมซึ่งใช้ได้กับ IE8 / 9 เช่นกัน (IE8 พร้อม html5shiv ofcourse): codepen

nav {
  margin:0px auto;
  height:50px;
  background-color:gray;
  padding:10px;
  border:2px solid red;
  position: relative;
  color: white;
  z-index: 1;
}

nav:after {
  content: '';
  background: black;
  display: block;
  position: absolute;
  margin: 10px;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  z-index: -1;
}

1

ไม่มีฟังก์ชันการทำงานที่แน่นอนในการดำเนินการนี้

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

jsfiddle กำลังช้ามากไม่งั้นฉันจะเพิ่มตัวอย่าง


0

ฉันแค่ห่อส่วนหัวด้วย div อื่นแล้วเล่นกับเส้นขอบ

<div class="header-border"><div class="header-real">

    <p>Foo</p>

</div></div>

CSS:

.header-border { border: 2px solid #000000; }
.header-real { border: 10px solid #003399; background: #cccccc; padding: 10px; }

เจ๋งมาก .. <nav>ยังไงก็ตามที่ฉันใช้ทั้งกล่องฉันจะเพิ่มคลาสเข้าไปได้อย่างไร
Pavan Nadig

ฉันเชื่อว่า<nav>สามารถมีคลาสได้ ลองดูคำตอบของ @mookamafoob ฉันจะไม่ทำแบบนั้นเพราะฉันกังวลเกี่ยวกับการรองรับเบราว์เซอร์ แต่ถ้าคุณชอบ HTML5 / CSS3 นั่นคือวิธีที่จะทำ
rlatief

0

คุณสามารถสร้าง div บนช่องว่างภายในได้ดังนี้:

<div id= "paddingOne">
</div>
<div id= "paddingTwo">
</div>

#paddingOne {
width: 100;
length: 100;
background-color: #000000;
margin: 0;
z-index: 2;
}
#paddingTwo {
width: 200;
length: 200;
background-color: #ffffff;
margin: 0;
z-index: 3;

ความกว้างความยาวสีพื้นหลังระยะขอบและดัชนี z อาจแตกต่างกันไปแน่นอน แต่เพื่อให้ครอบคลุมช่องว่างภายในดัชนี z ต้องสูงกว่า 0 จึงจะวางทับช่องว่างภายในได้ คุณสามารถเล่นซอกับการวางตำแหน่งและอื่น ๆ เพื่อเปลี่ยนการวางแนว หวังว่าจะช่วยได้!

ป.ล. div เป็น html และ #paddingOne และ #paddingTwo เป็น css (ในกรณีที่ใครไม่เข้าใจ :)

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