Come posso aggiungere un box-shadow su un lato di un elemento?


445

Ho bisogno di creare un box-shadow su qualche blockelemento, ma solo (ad esempio) sul lato destro. Il modo in cui lo faccio è avvolgere l'elemento interno con box-shadowuno esterno con padding-righteoverflow:hidden; quindi gli altri tre lati dell'ombra non sono visibili.

C'è un modo migliore per raggiungere questo obiettivo? Come box-shadow-right?

EDIT : Le mie intenzioni sono di creare solo la parte verticale dell'ombra. Esattamente come quello che farebbe repeat-yla regola background:url(shadow.png) 100% 0% repeat-y.


3
considerando gli strumenti limitati del CSS in termini di ombreggiatura, penso che il tuo approccio sia già abbastanza buono. Non è troppo ingombrante e ha un impatto abbastanza piccolo in termini di semantica: solo un div insignificante.
Bazzz,

Risposte:


567

Sì, puoi usare la proprietà di diffusione dell'ombra della regola box-shadow:

.myDiv
{
  border: 1px solid #333;
  width: 100px;
  height: 100px;
  box-shadow: 10px 0 5px -2px #888;
}
<div class="myDiv"></div>

La quarta proprietà lì -2px è la diffusione dell'ombra, puoi usarla per cambiare la diffusione dell'ombra, facendo sembrare che l'ombra sia solo su un lato.

Questo utilizza anche le regole di posizionamento dell'ombra che lo 10pxinvia a destra (offset orizzontale) e lo 0pxmantiene sotto l'elemento (offset verticale).

5px è il raggio di sfocatura :)

Esempio per te qui .


12
Grazie per aver sottolineato qualcosa che non sapevo, ma le mie intenzioni erano di creare solo la parte verticale dell'ombra. Esattamente lo stesso che sfondo: url (shadow.png) farebbe 100% 0% repeat-y.
tillda,

4
@Tillda dovresti contrassegnare questo come la risposta in modo che appaia in alto per gli altri alla ricerca di una soluzione. Ho quasi respinto questo metodo di styling leggendo i commenti e ho accettato la risposta.
Devin G Rhode,

6
Funziona alla grande se non si intende che l'ombra si attenui agli angoli. Anch'io ho trovato questa soluzione, ma nella maggior parte dei casi (per un'ombra su un lato) è sbagliato avere l'ombra più piccola dell'elemento, spezzando così l'illusione (se fosse così intesa) che detto elemento è " sollevato "o" 3D ".
Steven Lu,

1
@ Mr.Alien Grazie per questo, ho appena rimosso il prefisso poiché le box-shadowregole sono state standardizzate.
Kyle

5
ma questa ombra non ha sfocatura, e compresa la sfocatura fanno uscire da altre parti. E se lo spieghi riducendo lo spread, termina prematuramente dalla parte in cui lo desideri. UGHHHHH
Muhammad Umer,

37

La mia soluzione self made facile da modificare:

HTML:

<div id="anti-shadow-div">
    <div id="shadow-div"></div>
</div>

css:

#shadow-div{
    margin-right:20px; /* Set to 0 if you don't want shadow at the right side */
    margin-left:0px; /* Set to 20px if you want shadow at the left side */
    margin-top:0px; /* Set to 20px if you want shadow at the top side */
    margin-bottom:0px; /* Set to 20px if you want shadow at the bottom side */
    box-shadow: 0px 0px 20px black; 
    height:100px;
    width:100px;
    background: red;
}

#anti-shadow-div{
    margin:20px;
    display:table;
    overflow:hidden;
}​

Demo:
http://jsfiddle.net/jDyQt/103


1
Sembra in qualche modo il più diretto - solo il div contenitore mi sta rendendo infelice in qualche modo;)
BananaAcido

1
Questa è l'unica vera soluzione. La risposta accettata ha ancora sfocatura nella parte superiore e inferiore dell'ombra, proprio in una posizione diversa.
Jelle Blaauw,

Questo non ha funzionato per me in Microsoft Edge o Internet Explorer 11. C'era ancora un po 'di ombra sugli altri lati, a seconda del livello di zoom. Altri browser andavano bene però.
Sam,

La risposta su stackoverflow.com/a/24220224/238753 ha funzionato allo stesso modo ma senza i problemi di compatibilità del browser che ha questa risposta
Sam

24

Per ottenere l'effetto troncato su un massimo di due lati è possibile utilizzare pseudo elementi con sfumature di sfondo.

header::before, main::before, footer::before, header::after, main::after, footer::after {
    display:    block;
    content:    '';
    position:   absolute;
    width:      8px;
    height:     100%;
    top:        0px;
}

header::before, main::before, footer::before {
    left:       -8px;
    background: linear-gradient(to left, rgba(0, 0, 0, 0.6), rgba(0, 0, 0, 0));
}

header::after, main::after, footer::after {
    right:      -8px;
    background: linear-gradient(to right, rgba(0, 0, 0, 0.6), rgba(0, 0, 0, 0));
}

aggiungerà un piacevole effetto simile all'ombra a sinistra e a destra degli elementi che normalmente compongono un documento.


soluzione perfetta, in quanto aggiunge un effetto ombra a un lato di un elemento solo senza ingombrare il markup.
Liquinaut il

1
Rispetto al metodo di diffusione negativa, questo ha il vantaggio di non restringersi agli angoli.
Kevin Christopher Henry,

3
@BananaAcid Ho creato una demo per chiunque ne abbia bisogno: jsfiddle.net/jDyQt/1198
zeckdude

Bene, questo ha funzionato perfettamente su Chrome, Safari, Firefox, IE11 e Edge senza effetti collaterali per me
Sam

15

Basta usare lo pseudo elemento :: after o :: before per aggiungere l'ombra. Fallo 1px e posizionalo su qualsiasi lato tu voglia. Di seguito è riportato un esempio di top.

footer {
   margin-top: 50px;
   color: #fff;
   background-color: #009eff;
   text-align: center;
   line-height: 90px;
   position: relative;
}

footer::after {
    content: '';
    position: absolute;
    width: 100%;
    height: 1px;
    top: 0;
    left: 0;
    z-index: -1;
    box-shadow: 0px 0px 10px 1px rgba(0, 0, 0, 0.75);
}
<footer>top only box shadow</footer>


Questo supera ancora il limite, ma potrebbe essere quello che alcune persone vogliono
Sam

5

Ecco il mio esempio:

.box{
        
        width: 400px; 
        height: 80px; 
        background-color: #C9C; 
        text-align: center; 
        font: 20px normal Arial, Helvetica, sans-serif; 
        color: #fff; 
        padding: 100px 0 0 0;
        -webkit-box-shadow: 0 8px 6px -6px black;
           -moz-box-shadow: 0 8px 6px -6px black;
                box-shadow: 0 8px 6px -6px black;
    }
<div class="box">
</div>


4

Ecco un piccolo trucco che ho fatto.

<div id="element"><!--element that I want an one-sided inset shadow from the bottom--></div> 
<div class="one_side_shadow"></div>

1. Crea una <div class="one_side_shadow"></div>destra sotto l'elemento per cui voglio creare l'ombra del riquadro a un lato (in questo caso voglio un'ombra dell'inserto unilaterale per id="element"provenire dal basso)

2. Quindi ho creato un normale box-shadowutilizzando un offset verticale negativo per spingere l'ombra verso l'alto su un lato.

`box-shadow: 0 -8px 20px 2px #DEDEE3;`

2

Questo potrebbe essere un modo semplice

border-right : 1px solid #ddd;
height:85px;    
box-shadow : 10px 0px 5px 1px #eaeaea;

Assegnalo a qualsiasi div


1

Ecco un codepen da dimostrare per ogni lato o uno snippet funzionante:

.boxes {
  display: flex;
  flex-wrap: wrap;
}

.box {
  margin: 20px;
  border: 1px solid #ccc;
  font-family: Helvetica Neue, Arial, sans-serif;
  font-weight: 100;
  letter-spacing: 2px;
  color: #999;
  display: flex;
  align-items: center;
  justify-content: center;
  text-align: center;
  flex: 1;
  padding: 40px;
  line-height: 1.4em;
}

.top {
  box-shadow: 0 -5px 5px -5px #333;
}

.right {
  box-shadow: 5px 0 5px -5px #333;
}

.bottom {
  box-shadow: 0 5px 5px -5px #333;
}

.left {
  box-shadow: -5px 0 5px -5px #333;
}
<div class="boxes">
  <div class="box top">Top Only</div>
  <div class="box right">Right Only</div>
  <div class="box bottom">Bottom Only</div>
  <div class="box left">Left Only</div>
</div>


1

clip-pathè ora (2020) uno dei modi più semplici per ottenere ombre di box su lati specifici di elementi, specialmente quando l'effetto richiesto è un'ombra di "taglio netto" su bordi particolari (che credo fosse ciò che l'OP stava cercando originariamente), come Questo:

.shadow-element {
    border: 1px solid #333;
    width: 100px;
    height: 100px;
    box-shadow: 0 0 15px rgba(0,0,0,0.75);
    clip-path: inset(0px -15px 0px 0px);
}
<div class="shadow-element"></div>

... al contrario di un'ombra attenuata / ridotta / assottigliante come questa:

.shadow-element {
    border: 1px solid #333;
    width: 100px;
    height: 100px;
    box-shadow: 15px 0px 15px -10px rgba(0,0,0,0.75);
}
<div class="shadow-element"></div>

È sufficiente applicare il seguente CSS all'elemento in questione:

box-shadow: 0 0 Xpx [hex/rgba]; /* note 0 offset values */
clip-path: inset(Apx Bpx Cpx Dpx);

Dove:

  • Apx imposta la visibilità dell'ombra per il bordo superiore
  • Bpx destra
  • Cpx parte inferiore
  • Dpx sinistra

Immettere un valore 0 per tutti i bordi in cui l'ombra deve essere nascosta e un valore negativo (lo stesso del raggio di sfocatura dell'ombra della scatola - Xpx) per tutti i bordi in cui l'ombra deve essere visualizzata.


@tillda, tirando fuori una domanda vecchia di un decennio - mi chiedevo solo se interpretassi correttamente il tuo requisito di una volta (in particolare l'effetto ombra interrotto) - Stavo cercando di raggiungere esattamente questo e ho trovato la tua domanda nel processi.
Luca,

0

Questo sito mi ha aiutato: https://gist.github.com/ocean90/1268328 (Notare che su quel sito la sinistra e la destra sono invertite alla data di questo post ... ma funzionano come previsto). Sono corretti nel codice seguente.

<!DOCTYPE html>
<html>
    <head>
        <title>Box Shadow</title>

        <style>
            .box {
                height: 150px;
                width: 300px;
                margin: 20px;
                border: 1px solid #ccc;
            }

            .top {
                box-shadow: 0 -5px 5px -5px #333;
            }

            .right {
                box-shadow: 5px 0 5px -5px #333;
            }

            .bottom {
                box-shadow: 0 5px 5px -5px #333;
            }

            .left {
                box-shadow: -5px 0 5px -5px #333;
            }

            .all {
                box-shadow: 0 0 5px #333;
            }
        </style>
    </head>
    <body>
        <div class="box top"></div>
        <div class="box right"></div>
        <div class="box bottom"></div>
        <div class="box left"></div>
        <div class="box all"></div>
    </body>
</html>

0
div {
 border: 1px solid #666;
    width: 50px;
    height: 50px;
    -webkit-box-shadow: inset 10px 0px 5px -1px #888 ;
}

0

Quello che faccio è creare un blocco verticale per l'ombra e posizionarlo vicino a dove dovrebbe essere il mio elemento di blocco. I due blocchi vengono quindi inseriti in un altro blocco:

<div id="wrapper">
    <div id="shadow"></div>  
    <div id="content">CONTENT</div>  
</div>

<style>

div#wrapper {
  width:200px;
  height:258px;      
}

div#wrapper > div#shadow {
  display:inline-block;
  width:1px;
  height:100%;
  box-shadow: -3px 0px 5px 0px rgba(0,0,0,0.8)
}

div#wrapper > div#content {
  display:inline-block;
  height:100%;
  vertical-align:top;
}

</style>

Esempio jsFiddle qui .


0

Ok, ecco un altro tentativo. Usando pseudo elementi e applicando la porpora della scatola delle ombre su di loro.

html:

<div class="no-relevant-box">
  <div class="div-to-shadow-1"></div>
  <div class="div-to-shadow-2"></div>
</div>

sass:

.div-to-shadow-1, .div-to-shadow-2
  height: 150px
  width: 150px
  overflow: hidden
  transition: all 0.3s ease-in-out
  &::after
    display: block
    content: ''
    position: relative
    top: 0
    left: 100%
    height: 100%
    width: 10px
    border: 1px solid mediumeagreen
    box-shadow:  0px 7px 12px rgba(0,0,0,0.3)
  &:hover
    border: 1px solid dodgerblue
    overflow: visible

https://codepen.io/alex3o0/pen/PrMyNQ

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.