我可以只为填充添加背景色吗?


86

我有一个标题框,其中包含边框和填充以及该框的背景色,我可以仅更改边框后的填充区域的背景色,然后更改其余宽度的背景色(即给定代码中的灰色) ?

只是我想要填充背景颜色的少量代码:

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

2
我不这么认为,但我喜欢到证明是错误的。(我想您需要嵌套一个元素。)
大卫说恢复莫妮卡(Monica)

不,你是正确的大卫。
Eli Gassert 2013年

2
@DavidThomas我也希望如此!让我们看看..
帕Nadig

EliGassert嗯..那我可以把里面的不同颜色的盒子装满吗?
Pavan Nadig

1
看看我的答案可以完成。
穆罕默德·乌默

Answers:


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 2013年

2
@Pavan Nadig相对位置是,因此可以添加z-index值并生效。Z索引仅适用于定位的元素。
gotohales

我认为这是最好的解释这里
西蒙

79

抱歉,每个人都是真正不需要真正设置填充的解决方案。

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

我做了什么...

  • 在背景上应用两个渐变,每个渐变具有一种开始和结束颜色。而不是使用纯色。原因是您不能在一个背景上使用两种纯色。
  • 然后对每个应用不同的background-clip属性。
  • 从而使一种颜色扩展到内容框,另一种颜色扩展到边框,从而露出填充。

如果我对自己说的那么聪明。

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 2015年

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

40

使用background-clipbox-shadow属性。

1)设置background-clip: content-box-将背景仅限制于内容本身(而不是覆盖边框和边框)

2)添加一个内部box-shadow,其展开半径设置为与填充相同的值。

因此,假设填充为10px-设置box-shadow: inset 0 0 0 10px lightGreen-只会使填充区域变为绿色。

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技巧文章


什么0 0 0意思
Nakilon

1
@Nakilonbox-shadow具有四个属性。的0 0 0设定h-shadow v-shadowblur为0,作为水平阴影,阴影垂直,和模糊距离是不需要在此实现。这只是一个向内(inset)进入的实心阴影10px
2014年

简单而有效!
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
什么是浪费?是否将伪元素限制在有限的时间内使用?
Anwar

是的,它们是有限的。每个元素都有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不支持,真可惜!



2

这将是一个适用于IE8 / 9的正确CSS解决方案(当然是带有html5shiv的IE8):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 2013年

我相信<nav>可以上课。看看@mookamafoob的答案。由于担心浏览器的支持,我实际上不会那样做。但是,如果您更喜欢HTML5 / CSS3,则可以这样做。
rlatief

0

您可以如下对div进行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-index当然可以有所不同,但是为了覆盖填充,z-index必须大于0,这样才能覆盖在padding上。您可以摆弄定位,以改变其方向。希望有帮助!

PS的div是html,而#paddingOne和#paddingTwo是css(以防万一没有得到:)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.