Tôi có thể thêm màu nền chỉ cho phần đệm không?


86

Tôi có một hộp tiêu đề bao gồm đường viền và phần đệm và màu nền cho hộp đó, tôi có thể thay đổi màu nền chỉ cho vùng đệm sau đường viền và sau đó là màu nền tương tự cho phần còn lại của chiều rộng (nghĩa là màu xám trong mã đã cho) ?

Chỉ cần một nhúm mã mà tôi muốn có màu nền được đệm:

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

2
Tôi không nghĩ như vậy, nhưng tôi muốn yêu để chứng minh sai. (Tôi tưởng tượng bạn cần phải tổ một phần tử.)
David nói Khôi phục Monica

Không, bạn đúng đấy David.
Eli Gassert,

2
@DavidThomas Tôi cũng muốn như vậy! cho phép nhìn thấy ..
Pavan Nadig

EliGassert umm .. vậy tôi có thể làm gì để có hộp với các màu khác nhau bên trong nó không?
Pavan Nadig,

1
kiểm tra câu trả lời của tôi CÓ THỂ LÀM ĐƯỢC.
Muhammad Umer

Câu trả lời:


40

Một tùy chọn khác với CSS thuần túy sẽ giống như sau:

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

Demo tại đây


yếu tố pseudo-class của bạn vượt xa hộp mẹ nó về phía bên phải vìwidth: 100%;
Simon

Bây giờ khoảng cách ở phía bên phải quá lớn, chỉ đặt chiều rộng 95% là không quá đáng tin cậy, đặc biệt nếu phần đệm thay đổi. ;)
Simon

@Simon bạn có thể vui lòng giải thích tại sao bạn đã đặt mã mà position:relative;tôi có thể thấy nếu nó không được đặt thì nó không xuất hiện trên màn hình! .. nhưng nó hoạt động như thế nào?
Pavan Nadig,

2
@Pavan Nadig Vị trí tương đối nên giá trị z-index có thể được thêm vào và có hiệu lực. Z-index chỉ hoạt động trên các phần tử được định vị.
gotohales

Tôi nghĩ điều đó được giải thích tốt nhất ở đây
Simon

79

Tôi xin lỗi tất cả mọi người rằng đây là giải pháp đúng đắn mà bạn không cần phải thực sự đặt đệm.

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

Những gì tôi đã làm xong...

  • Áp dụng hai gradient trên nền với cả hai màu bắt đầu và màu kết thúc. Thay vì sử dụng màu đặc. Lý do là bạn không thể có hai màu đồng nhất cho một nền.
  • Sau đó, áp dụng thuộc tính background-clip khác nhau cho mỗi.
  • do đó làm cho một màu mở rộng đến hộp nội dung và màu khác đến đường viền, để lộ phần đệm.

Thông minh nếu tôi nói như vậy với chính mình.

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
Rất thông minh. Tôi đã dọn dẹp fiddle một chút: jsfiddle.net/ilancopelyn/n1ax4qvt
Ilan

ngay bây giờ nó có trên jsfiddle.net/TyXRY/123 (123) nhưng họ đang làm gì hoặc ai đang làm gì thì tôi không rõ.
Muhammad Umer

Tôi thích điều này. Quá tệ là phần giữa (ví dụ: hộp nội dung) không thể trong suốt và đục một lỗ xuyên qua màu bên dưới (ví dụ: phần thân). Tôi chỉ thấy gradient bên ngoài trong Chrome khi tôi thử điều này.
MSC

1
Tuyệt vời! Có cách nào để đính kèm quá trình chuyển đổi vào nó không? Tôi đã thử nhưng không thành công.
Garavani

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

40

Sử dụng các thuộc tính background-clipbox-shadow.

1) Đặt background-clip: content-box- điều này chỉ giới hạn nền trong chính nội dung (thay vì che cả phần đệm và đường viền)

2) Thêm một phần bên trong box-shadowvới bán kính trải rộng được đặt cùng giá trị với phần đệm.

Vì vậy, giả sử padding là 10px - set box-shadow: inset 0 0 0 10px lightGreen- sẽ chỉ làm cho vùng đệm có màu xanh lục nhạt.

Bản demo 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>

Để có hướng dẫn kỹ lưỡng về kỹ thuật này, hãy xem bài đăng thủ thuật css tuyệt vời này


Nghĩa 0 0 0là gì?
Nakilon 24/09/2016

1
@Nakilon box-shadowcó bốn thuộc tính. Các 0 0 0thiết lập h-shadow v-shadowblurthành 0, vì bóng ngang, bóng dọc và khoảng cách mờ là không cần thiết trong triển khai này. Nó chỉ là một cái bóng rắn hướng vào trong ( inset) cho 10px.
trlkly

Đơn giản mà hiệu quả!
timgeb

9

Bạn có thể sử dụng màu nền cho hiệu ứng đó. Đối với ví dụ của bạn, chỉ cần thêm các dòng sau (nó chỉ là quá nhiều mã vì bạn phải sử dụng tiền tố nhà cung cấp):

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

Không cần đánh dấu liên tục.

Nếu bạn chỉ muốn có đường viền kép, bạn có thể sử dụng đường viền và đường viền thay vì đường viền và phần đệm.

Mặc dù bạn cũng có thể sử dụng các yếu tố giả để đạt được hiệu quả mong muốn, nhưng tôi khuyên bạn không nên sử dụng nó. Phần tử giả là một công cụ rất mạnh mà CSS cung cấp, nếu bạn "lãng phí" chúng vào những thứ như thế này, bạn có thể sẽ bỏ lỡ chúng ở một nơi khác.

Tôi chỉ sử dụng phần tử giả nếu không còn cách nào khác. Không phải vì họ xấu, hoàn toàn ngược lại, vì tôi không muốn lãng phí Joker của mình.


1
Nếu bạn có thể bỏ qua IE9- bạn có thể làm điều này với gradient, nhưng lớp giả ít nhất được hỗ trợ xuống IE8.
Simon,

Điều đó đúng. Nhưng nếu có nhiều trường hợp thoses trong có thể là giá trị sử dụng css3pie.com
dave

1
Chất thải là gì? Các phần tử giả có bị hạn chế sử dụng trong một khoảng thời gian giới hạn không?
Anwar

Có, chúng có giới hạn. Bạn có 2 cho mỗi phần tử (1x :: trước, 1x :: sau).
dave

6

câu trả lời cho biết tất cả các giải pháp khả thi

Tôi có một cái khác với BOX-SHADOW

đây là JSFIDDLE

và mã

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

nó cũng hỗ trợ trong IE9, vì vậy tốt hơn là giải pháp gradient, hãy thêm tiền tố thích hợp để được hỗ trợ nhiều hơn

IE8 không hỗ trợ nó, thật đáng tiếc!



2

Đây sẽ là một giải pháp CSS thích hợp cũng hoạt động cho IE8 / 9 (IE8 với html5shiv dĩ nhiên): 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

Không có chức năng chính xác để làm điều này.

Không cần bao bọc phần tử khác bên trong, bạn có thể thay thế đường viền bằng bóng hộp và phần đệm bằng đường viền. Nhưng hãy nhớ box-shadow không thêm vào kích thước của phần tử.

jsfiddle đang thực sự chậm, nếu không tôi sẽ thêm một ví dụ.


0

Tôi chỉ bọc tiêu đề bằng một div khác và chơi với các đường viền.

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

Thật tuyệt .. nhân tiện, vì tôi đã sử dụng toàn bộ hộp <nav>, làm thế nào tôi có thể thêm các lớp vào đó?
Pavan Nadig,

Tôi tin rằng <nav>có thể có các lớp học. Hãy xem câu trả lời của @mookamafoob. Tôi thực sự sẽ không làm như vậy vì tôi lo lắng về sự hỗ trợ của trình duyệt. Nhưng nếu bạn thích HTML5 / CSS3, đó là cách để làm điều đó.
rlatief

0

Bạn có thể thực hiện một div trên padding như sau:

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

tất nhiên chiều rộng, chiều dài, màu nền, lề và chỉ số z có thể thay đổi, nhưng để bao phủ phần đệm, chỉ số z phải cao hơn 0 để nó nằm trên phần đệm. Bạn có thể thử định vị và thay đổi hướng của nó. Hy vọng rằng sẽ giúp!

PS các div là html và #paddingOne và #paddingTwo là css (trong trường hợp bất kỳ ai không hiểu :)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.