Come creare un'ombra a riquadro solo su un lato?


109

È possibile in qualche modo avere solo l'ombra della casella inserita su un lato di un div? Si noti che qui sto parlando di un'ombra di scatola inserita , non della normale ombra di scatola esterna.

Ad esempio, nel seguente JSFiddle, vedrai che l'ombra inserita appare su tutti e 4 i lati, in vari gradi.

Come faccio a visualizzarlo SOLO in alto? O al massimo SOLO in alto e in basso?

JSFiddle: http://jsfiddle.net/ahmadka/KFrun/

.box {
  -webkit-box-shadow: inset 0px 5px 10px 1px #000000;
  box-shadow: inset 0px 5px 10px 1px #000000;
}

.text {
  padding: 20px;
}
<div class="box">
  <div class="text">
    Lorem ipsum ....
  </div>
</div>


3
Un modo alternativo (e completamente personalizzabile) sarebbe un gradiente di sfondo ...
vals

Risposte:


237

Questo e ciò che stai cercando. Ha esempi per ogni lato che desideri con un'ombra.

.top-box
{
    box-shadow: inset 0 7px 9px -7px rgba(0,0,0,0.4);
}
.left-box
{
    box-shadow: inset 7px 0 9px -7px rgba(0,0,0,0.4);
}
.right-box
{
    box-shadow: inset -7px 0 9px -7px rgba(0,0,0,0.4);
}
.bottom-box
{
    box-shadow: inset 0 -7px 9px -7px rgba(0,0,0,0.4);
}

Vedi lo snippet per altri esempi:


13

Il trucco è un secondo .box-innerinterno, che è più largo dell'originale .box, e box-shadowviene applicato a quello.

Quindi, ha aggiunto più imbottitura .textper compensare la larghezza aggiunta.

Ecco come appare la logica:

logica box

Ed ecco come si fa in CSS:

Usa la larghezza massima per .inner-boxnon far sì .boxche si allarghi e overflowper assicurarti che il resto sia tagliato:

.box {
    max-width: 100% !important;
    overflow: hidden;
}

Il 110% è più largo del genitore che è del 100% nel contesto di un bambino (dovrebbe essere lo stesso quando il genitore .boxha una larghezza fissa, ad esempio). I margini negativi compensano la larghezza e fanno sì che l'elemento sia centrato (invece di nascondere solo la parte destra):

.box-inner {
    width: 110%;
    margin-left:-5%;
    margin-right: -5%;
    -webkit-box-shadow: inset 0px 5px 10px 1px #000000;
    box-shadow: inset 0px 5px 10px 1px #000000;
}

E aggiungi un po 'di imbottitura sull'asse X per compensare la larghezza .inner-box:

.text {
    padding: 20px 40px;
}

Ecco un violino funzionante.

Se ispezioni il violino, vedrai:

.scatola .box-inner .testo


Come puoi semplicemente pubblicare il link per fiddle senza il codice? : O
Mohammad Areeb Siddiqui

Uomo! È un SO hack! Cool: P
Mohammad Areeb Siddiqui

Nel mio Firefox non riesco a vedere il testo sul bordo destro e sinistro. Il testo è semplicemente tagliato. (Ecco la schermata goo.gl/aO8ZX ) L'ho provato io stesso e ho usato qualche extra divper nascondere l'ombra ... jsfiddle.net/KFrun/19
Fabian N.

Sì, utilizzo jsfiddle.net/KFrun/6/ È forse un problema con la versione di Firefox? Uso Firefox 21.0 per Ubuntu ...
Fabian N.

Ma c'è ancora un'ombra sotto
Cody Guldner


7

Questo è un po 'vicino.

.box
{
    -webkit-box-shadow: inset -1px 10px 5px -3px #000000;
    box-shadow: inset -1px 10px 5px -3px #000000;
}

È quello che ho provato! Ma lui non lo voleva, quindi non l'ha pubblicato come risposta! :(
Mohammad Areeb Siddiqui

Grande come. Grazie ❤️
mghhgm

Può esserci una risposta più semplice di questa (almeno per il momento). Grazie
Gendrith

1

provalo, forse utile ...

box-shadow: 0 0 0 3px rgb(255,255,255), 0 7px 3px #cbc9c9;
                    -webkit-box-shadow: 0 0 0 3px rgb(255,255,255), 0 7px 5px #cbc9c9;
                    -o-box-shadow: 0 0 0 3px rgb(255,255,255), 0 7px 5px #cbc9c9;
                    -moz-box-shadow: 0 0 0 3px rgb(255,255,255), 0 7px 5px #cbc9c9;  

sopra CSSperché hai un'ombra a scatola in basso.
puoi rosso di più qui


1

Questa potrebbe non essere la cosa esatta che stai cercando, ma puoi creare un effetto molto simile usando rgbain combinazione con linear-gradient:

  background: linear-gradient(rgba(0,0,0,.5) 0%, rgba(0,0,0,0) 30%);

Questo crea un gradiente lineare dal nero con il 50% di opacità ( rgba(0,0,0,.5)) al trasparente ( rgba(0,0,0,0)) che inizia ad essere trasparente al 30% dall'alto. Puoi giocare con questi valori per creare l'effetto desiderato. Puoi averlo su un lato diverso aggiungendo un valore deg ( linear-gradient(90deg, rgba(0,0,0,.5) 0%, rgba(0,0,0,0) 30%)) o cambiando i colori. Se vuoi ombre davvero complesse come angoli diversi su lati diversi, potresti persino iniziare a stratificare linear-gradient.

Ecco uno snippet per vederlo in azione:

.box {
  background: linear-gradient(rgba(0,0,0,.5) 0%, rgba(0,0,0,0) 30%);
}

.text {
  padding: 20px;
}
<div class="box">
  <div class="text">
    Lorem ipsum ....
  </div>
</div>


0

Inset Box Shadow solo sul lato superiore?

#box {
            background: #CCC;
            -webkit-box-shadow: inset 0 20px 20px -20px rgba(0,0,0,0.8);
            -moz-box-shadow: inset 0 20px 20px -20px rgba(0,0,0,0.8);
            box-shadow: inset 0 20px 20px -20px rgba(0,0,0,0.8);
            font: bold 18px/1.2em sans-serif;
            height: auto;
            margin: 15px auto;
            padding: 75px 15px 25px;
            text-align: center;
            width: 80%;
        }
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.