¿Puedo agregar color de fondo solo para el relleno?

86

Tengo un cuadro de encabezado que incluye borde y relleno y color de fondo para ese cuadro, ¿puedo cambiar el color de fondo solo para la región acolchada después del borde y luego el mismo color de fondo para el resto del ancho (es decir, gris en el código dado) ?

Solo una pizca del código donde quiero el color de fondo acolchado:

nav {
    margin:0px auto;
    width:100%;
    height:50px;
    background-color:grey;
    float:left;
    padding:10px;
    border:2px solid red;
}
Pavan Nadig
fuente
2
No lo creo, pero me encantaría demostrar que estoy equivocado. (Imagino que necesitarías anidar un elemento)
David dice reinstalar a Monica
No, tienes razón David.
Eli Gassert
2
@DavidThomas ¡deseo lo mismo! veamos ...
Pavan Nadig
EliGassert umm ... entonces, ¿qué puedo hacer para tener una caja con diferentes colores dentro?
Pavan Nadig
1
mira mi respuesta SE PUEDE HACER.
Muhammad Umer

Respuestas:

40

Otra opción con CSS puro sería algo como esto:

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 aquí

gotohales
fuente
su elemento de pseudo-clase va más allá de su cuadro principal en el lado derecho debido awidth: 100%;
Simon
Ahora el espacio en el lado derecho es demasiado grande, solo establecer el ancho del 95% no es demasiado confiable, especialmente si cambia el relleno. ;)
Simon
@Simon, ¿puedes explicar por qué colocaste el código? position:relative;Puedo ver que si no está colocado, entonces no aparece en la pantalla.
Pavan Nadig
2
@Pavan Nadig La posición relativa es para que el valor del índice z se pueda agregar y surta efecto. Z-index solo funciona en elementos posicionados.
gotohales
Creo que eso se explica mejor aquí
Simon
79

Lamento a todos que esta sea la solución, la verdadera en la que no es necesario configurar el relleno.

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

Que he hecho...

  • Se aplicaron dos degradados en el fondo, ambos con un color inicial y final. En lugar de usar un color sólido. La razón es que no puede tener dos colores sólidos para un fondo.
  • Luego aplicó una propiedad de clip de fondo diferente a cada uno.
  • haciendo que un color se extienda al cuadro de contenido y otro al borde, revelando el relleno.

Inteligente si me lo digo a mí mismo.

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;
}
Muhammad Umer
fuente
6
Muy inteligente. Limpié un poco el violín: jsfiddle.net/ilancopelyn/n1ax4qvt
Ilan
en este momento está en jsfiddle.net/TyXRY/123 (123) pero no tengo claro qué están haciendo o quién está haciendo.
Muhammad Umer
Me gusta esto. Lástima que el medio (es decir, el cuadro de contenido) no puede ser transparente y perforar el color subyacente (por ejemplo, el cuerpo). Solo veo el degradado exterior en Chrome cuando probé esto.
MSC
1
Genial! ¿Hay alguna forma de adjuntarle una transición? Lo intenté pero no tuve éxito.
Garavani
transition: all 0.3s 0.6s cubic-bezier(0.175, 0.885, 0.32, 1.275);
Benny K
40

Utilice las propiedades background-clipy box-shadow.

1) Establecer background-clip: content-box: esto restringe el fondo solo al contenido en sí (en lugar de cubrir tanto el relleno como el borde)

2) Agregue un interior box-shadowcon el radio de extensión establecido en el mismo valor que el relleno.

Entonces, digamos que el relleno es de 10 píxeles, establecido box-shadow: inset 0 0 0 10px lightGreen, lo que hará que solo el área de relleno se ilumine en verde.

Demostración de 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>

Para ver un tutorial completo que cubre esta técnica, vea esta gran publicación de trucos de CSS

Danield
fuente
¿Qué 0 0 0significa?
Nakilon
1
@Nakilon box-shadowtiene cuatro propiedades. Los 0 0 0conjuntos de la h-shadow v-shadowy bluren 0, como la sombra horizontal, sombra vertical y la distancia borroso no son utilizadas en esta aplicación. Es solo una sombra sólida que va hacia adentro ( inset) para 10px.
Trlkly
¡Simple pero efectivo!
timgeb
9

Puede usar degradados de fondo para ese efecto. Para su ejemplo, simplemente agregue las siguientes líneas (es mucho código porque tiene que usar prefijos de proveedor):

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

No es necesario un marcado innecesario.

Si solo desea tener un borde doble, puede usar un contorno y un borde en lugar de un borde y un relleno.

Si bien también podría usar pseudoelementos para lograr el efecto deseado, no lo desaconsejaría. Los pseudoelementos son una herramienta muy poderosa que proporciona CSS, si los "desperdicia" en cosas como esta, probablemente los perderá en otro lugar.

Solo uso pseudo-elementos si no hay otra forma. No porque sean malos, todo lo contrario, porque no quiero desperdiciar a mi Joker.

Dave
fuente
1
Si puede ignorar IE9, puede hacerlo con gradientes, pero las pseudoclases son al menos compatibles con IE8.
Simon
Eso es verdad. Pero si hay muchos de esos casos, podría valer la pena usar css3pie.com
dave
1
¿Qué es desperdicio? ¿Los pseudo elementos están restringidos para ser utilizados por un tiempo limitado?
Anwar
Sí, son limitados. Tienes 2 para cada elemento (1x :: antes, 1x :: después).
dave
6

las respuestas dijeron todas las posibles soluciones

Tengo otro con BOX-SHADOW

aquí está JSFIDDLE

y el codigo

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

también es compatible con IE9, por lo que es mejor que la solución de gradiente, agregue los prefijos adecuados para obtener más soporte

IE8 no lo admite, ¡qué lástima!

iKamy
fuente
2

Esta sería una solución CSS adecuada que también funciona para IE8 / 9 (IE8 con html5shiv por supuesto): 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;
}
Simón
fuente
1

No hay una funcionalidad exacta para hacer esto.

Sin envolver otro elemento en el interior, puede reemplazar el borde por una sombra de caja y el relleno por el borde. Pero recuerde que el cuadro de sombra no se suma a las dimensiones del elemento.

jsfiddle está siendo muy lento, de lo contrario agregaría un ejemplo.

Levemente serio
fuente
0

Simplemente envolvería el encabezado con otro div y jugaría con los bordes.

<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; }
rlatief
fuente
eso es genial ... por cierto, como he usado toda la caja <nav>, ¿cómo puedo agregar clases a eso?
Pavan Nadig
Creo que <nav>puedo tener clases. Eche un vistazo a la respuesta de @mookamafoob. De hecho, no lo haré así porque me preocupa la compatibilidad con el navegador. Pero si prefiere HTML5 / CSS3, esa es la forma de hacerlo.
rlatief
0

Puede hacer un div sobre el relleno de la siguiente manera:

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

el ancho, la longitud, el color de fondo, los márgenes y el índice Z pueden variar, por supuesto, pero para cubrir el relleno, el índice Z debe ser superior a 0 para que quede sobre el relleno. Puede jugar con el posicionamiento y demás para cambiar su orientación. ¡Espero que ayude!

PD: los divs son html y #paddingOne y #paddingTwo son css (en caso de que alguien no lo haya entendido :)

Magnawarp el grande
fuente