Posso aggiungere il colore di sfondo solo per il riempimento?


88

Ho una casella di intestazione che include il bordo e il riempimento e il colore di sfondo per quella casella, posso cambiare il colore di sfondo solo per la regione imbottita dopo il bordo e quindi lo stesso colore di sfondo per il resto della larghezza (cioè grigio nel codice dato) ?

Solo un pizzico di codice dove voglio il colore di sfondo imbottito:

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

3
Io non la penso così, ma mi piacerebbe piace a male dimostrata. (Immagino che dovresti annidare un elemento.)
David dice di reintegrare Monica il

No, hai ragione David.
Eli Gassert

2
@DavidThomas vorrei lo stesso! vediamo ..
Pavan Nadig

EliGassert umm .. allora cosa posso fare per avere una scatola con diversi colori al suo interno?
Pavan Nadig

1
controlla la mia risposta PU ESSERE FATTO.
Muhammad Umer

Risposte:


40

Un'altra opzione con CSS puro sarebbe qualcosa del genere:

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 qui


il tuo elemento di pseudo-classe va oltre la sua casella genitore sul lato destro a causa diwidth: 100%;
Simon

Ora la spaziatura sul lato destro è troppo grande, impostare solo la larghezza al 95% non è troppo affidabile, specialmente se il riempimento cambia. ;)
Simon

@ Simon puoi spiegare perché hai inserito il codice position:relative;posso vedere se non è posizionato allora non appare sullo schermo! .. ma come funziona?
Pavan Nadig

2
@Pavan Nadig La posizione relativa è in modo che il valore z-index possa essere aggiunto e abbia effetto. Z-index funziona solo su elementi posizionati.
gotohales

Penso che sia meglio spiegato qui
Simon

80

Mi dispiace a tutti che questa sia la soluzione quella vera in cui non è necessario impostare effettivamente il padding.

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

Cosa ho fatto...

  • Sono state applicate due sfumature sullo sfondo con entrambe un colore iniziale e finale. Invece di usare il colore solido. Il motivo è che non puoi avere due colori solidi per uno sfondo.
  • Quindi ha applicato diverse proprietà di clip di sfondo a ciascuna.
  • facendo così estendere un colore alla scatola del contenuto e un altro al bordo, rivelando l'imbottitura.

Intelligente se lo dico a me stesso.

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
Molto intelligente. Ho ripulito leggermente il violino: jsfiddle.net/ilancopelyn/n1ax4qvt
Ilan

in questo momento è su jsfiddle.net/TyXRY/123 (123) ma cosa stanno facendo o chi sta facendo non mi è chiaro.
Muhammad Umer

Mi piace questo. Peccato che la parte centrale (es. Scatola del contenuto) non possa essere trasparente e forare il colore sottostante (es. Corpo). Vedo solo il gradiente esterno in Chrome quando l'ho provato.
MSC

1
Genious! C'è un modo per allegare una transizione ad esso? Ho provato ma non ci sono riuscito.
Garavani

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

44

Usa le proprietà background-clipe box-shadow.

1) Imposta background-clip: content-box: limita lo sfondo solo al contenuto stesso (invece di coprire sia il riempimento che il bordo)

2) Aggiungi un interno box-shadowcon il raggio di diffusione impostato sullo stesso valore del riempimento.

Quindi supponiamo che il riempimento sia 10px - impostato box-shadow: inset 0 0 0 10px lightGreen- che renderà solo l'area di riempimento verde chiaro.

Codepen demo

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>

Per un tutorial approfondito su questa tecnica, vedere questo fantastico post sui trucchi CSS


Cosa 0 0 0significa?
Nakilon

1
@Nakilon box-shadowha quattro proprietà. Gli 0 0 0insiemi il h-shadow v-shadowe blurdi 0, come l'ombra orizzontale, verticale ombra, e la distanza di sfocatura sono necessari in questa implementazione. È solo un'ombra solida che va verso l'interno ( inset) per 10px.
Trlkly

Semplice ma efficace!
timgeb

9

Puoi usare sfumature di sfondo per quell'effetto. Per il tuo esempio, aggiungi le seguenti righe (è così tanto codice perché devi usare i prefissi del fornitore):

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

Non c'è bisogno di markup non necessario.

Se vuoi solo avere un doppio bordo puoi usare contorno e bordo invece di bordo e riempimento.

Mentre potresti anche usare pseudo-elementi per ottenere l'effetto desiderato, ti sconsiglio. Gli pseudo-elementi sono uno strumento molto potente fornito dai CSS, se li "sprechi" in cose come questa, probabilmente ti mancheranno da qualche altra parte.

Uso gli pseudo-elementi solo se non c'è altro modo. Non perché siano cattivi, al contrario, perché non voglio sprecare il mio Joker.


1
Se puoi ignorare IE9, puoi farlo con i gradienti, ma le pseudo-classi sono almeno supportate fino a IE8.
Simon

Questo è vero. Ma se ci sono molti casi in cui potrebbe valere la pena usare css3pie.com
dave

1
Cosa sono i rifiuti? Gli pseudo elementi possono essere utilizzati solo per un tempo limitato?
Anwar,

Sì, sono limitati. Ne hai 2 per ogni elemento (1x :: prima, 1x :: dopo).
dave

6

le risposte dicevano tutte le possibili soluzioni

Ne ho un altro con BOX-SHADOW

eccolo JSFIDDLE

e il codice

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

supporta anche in IE9, quindi è meglio della soluzione gradiente, aggiungi i prefissi appropriati per maggiore supporto

IE8 non lo supporta, che peccato!



2

Questa sarebbe una soluzione CSS adeguata che funziona anche per IE8 / 9 (IE8 con 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

Non esiste una funzionalità esatta per farlo.

Senza avvolgere un altro elemento all'interno, potresti sostituire il bordo con un'ombra a scatola e l'imbottitura con il bordo. Ma ricorda che l'ombra della scatola non si aggiunge alle dimensioni dell'elemento.

jsfiddle è molto lento, altrimenti aggiungerei un esempio.


0

Avvolgerei semplicemente l'intestazione con un altro div e giocherei con i bordi.

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

è fantastico .. a proposito, dato che ho usato l'intera scatola come <nav>, come posso aggiungere classi a quella?
Pavan Nadig

Credo che <nav>possa avere lezioni. Dai un'occhiata alla risposta di @mookamafoob. In realtà non lo farò così perché sono preoccupato per il supporto del browser. Ma se preferisci HTML5 / CSS3, questo è il modo per farlo.
rlatief

0

Puoi fare un div sul padding come segue:

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

la larghezza, la lunghezza, il colore di sfondo, i margini e lo z-index possono variare ovviamente, ma per coprire il riempimento, lo z-index deve essere maggiore di 0 in modo che si sovrapponga al riempimento. Puoi giocherellare con il posizionamento e simili per cambiarne l'orientamento. Spero possa aiutare!

PS i div sono html e #paddingOne e #paddingTwo sono css (nel caso qualcuno non lo avesse capito :)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.