Wie erstelle ich einen Schlagschatten nur auf einer Seite eines Elements?

230

Gibt es eine Möglichkeit, den Schatten nur auf den Boden fallen zu lassen? Ich habe ein Menü mit 2 Bildern nebeneinander. Ich möchte keinen richtigen Schatten, weil er das richtige Bild überlappt. Ich verwende dafür keine Bilder, daher gibt es eine Möglichkeit, sie nur unten abzulegen:

box-shadow-bottom: 10px #FFF; o.ä?

-moz-box-shadow: 0px 3px 3px #000;
-webkit-box-shadow: 0px 3px 3px #000;
box-shadow-bottom: 5px #000;
/* For IE 8 */
-ms-filter: "progid:DXImageTransform.Microsoft.Shadow(Strength=4, Direction=180, Color='#000000')";
/* For IE 5.5 - 7 */
filter: progid:DXImageTransform.Microsoft.Shadow(Strength=4, Direction=180, Color='#000000');
Damage000
quelle
8
Ihre akzeptierten Antwortreferenzen, box-shadow-bottomdie nicht vorhanden sind und von niemandem unterstützt werden. Informationen zu legitimen Box-Shadow-Techniken finden Sie unter nicolasgallagher.com/css-drop-shadows-without-images/demo .
Paul Irish
@ Paul ... Ich hatte einen Tippfehler, der behoben ist.
Hristo
1
Die Kommentare in Ihrem CSS-Beispiel sind irreführend - filterfunktionieren auch in IE8 und IE9. In -ms-filterdiesem Fall keine Notwendigkeit .
Mathias Bynens
Sie können diesen realistischen CSS-Schatten anpassen: stackoverflow.com/a/20596554/1491212
Armel Larcier

Antworten:

234

UPDATE 4

Wie Update 3, jedoch mit modernem CSS (= weniger Regeln), sodass keine spezielle Positionierung auf dem Pseudoelement erforderlich ist.

#box {
    background-color: #3D6AA2;
    width: 160px;
    height: 90px;
    position: absolute;
    top: calc(10% - 10px);
    left: calc(50% - 80px);
}

.box-shadow:after {
    content:"";
    position:absolute;
    width:100%;
    bottom:1px;
    z-index:-1;
    transform:scale(.9);
    box-shadow: 0px 0px 8px 2px #000000;
}
<div id="box" class="box-shadow"></div>

UPDATE 3

Alle meine vorherigen Antworten haben zusätzliches Markup verwendet, um diesen Effekt zu erzielen, der nicht unbedingt benötigt wird. Ich denke, dies ist eine viel sauberere Lösung ... der einzige Trick besteht darin, mit den Werten herumzuspielen, um die richtige Positionierung des Schattens sowie die richtige Stärke / Opazität des Schattens zu erhalten. Hier ist eine neue Geige, die Pseudoelemente verwendet :

http://jsfiddle.net/UnsungHero97/ARRRZ/2/

HTML

<div id="box" class="box-shadow"></div>

CSS

#box {
    background-color: #3D6AA2;
    width: 160px;
    height: 90px;
    margin-top: -45px;
    margin-left: -80px;
    position: absolute;
    top: 50%;
    left: 50%;
}

.box-shadow:after {
    content: "";
    width: 150px;
    height: 1px;
    margin-top: 88px;
    margin-left: -75px;
    display: block;
    position: absolute;
    left: 50%;
    z-index: -1;
    -webkit-box-shadow: 0px 0px 8px 2px #000000;
       -moz-box-shadow: 0px 0px 8px 2px #000000;
            box-shadow: 0px 0px 8px 2px #000000;
}

UPDATE 2

Anscheinend können Sie dies mit nur einem zusätzlichen Parameter für das Box-Shadow-CSS tun, wie alle anderen gerade betont haben. Hier ist die Demo:

http://jsfiddle.net/K88H9/821/

CSS

-webkit-box-shadow: 0 4px 4px -2px #000000;
   -moz-box-shadow: 0 4px 4px -2px #000000;
        box-shadow: 0 4px 4px -2px #000000;

Dies wäre eine bessere Lösung. Der zusätzliche Parameter, der hinzugefügt wird, wird wie folgt beschrieben:

Die vierte Länge ist eine Ausbreitungsstrecke. Positive Werte bewirken, dass sich die Schattenform um den angegebenen Radius in alle Richtungen ausdehnt. Negative Werte bewirken, dass sich die Schattenform zusammenzieht.

AKTUALISIEREN

Schauen Sie sich die Demo unter jsFiddle an: http://jsfiddle.net/K88H9/4/

Ich habe ein "Schattenelement" erstellt, das sich hinter dem eigentlichen Element verbirgt, für das Sie einen Schatten haben möchten. Ich habe die Breite des "Schattenelements" um das Zweifache des von Ihnen angegebenen Schattens genau so breit gemacht wie das eigentliche Element. dann habe ich es richtig ausgerichtet.

HTML

<div id="wrapper">
    <div id="element"></div>
    <div id="shadow"></div>
</div>

CSS

#wrapper {
    width: 84px;
    position: relative;
}
#element {
    background-color: #3D668F;
    height: 54px;
    width: 100%;
    position: relative;
    z-index: 10;
}
#shadow {
    background-color: #3D668F;
    height: 8px;
    width: 80px;
    margin-left: -40px;
    position: absolute;
    bottom: 0px;
    left: 50%;
    z-index: 5;
    -webkit-box-shadow: 0px 2px 4px #000000;
       -moz-box-shadow: 0px 2px 4px #000000;
            box-shadow: 0px 2px 4px #000000;
}

Ursprüngliche Antwort

Ja, Sie können dies mit derselben Syntax tun, die Sie angegeben haben. Der erste Wert steuert die horizontale Positionierung und der zweite Wert steuert die vertikale Positionierung. Stellen Sie also einfach den ersten Wert 0pxund den zweiten auf den gewünschten Versatz wie folgt ein:

-webkit-box-shadow: 0px 5px #000000;
   -moz-box-shadow: 0px 5px #000000;
        box-shadow: 0px 5px #000000;

Weitere Informationen zu Boxschatten finden Sie in den folgenden Abschnitten:

Ich hoffe das hilft.

Hristo
quelle
2
Sie müssen nicht unbedingt ein leeres Div hinzufügen, um einen unscharfen Schatten zu erzielen. Dieser dritte Wert in der Deklaration: box-shadow: 0 2px 4px #000000ist ein Unschärfewert. Siehe hier http://jsfiddle.net/K88H9/7/ . Sie werden jedoch feststellen, dass links und rechts vom Element ein wenig Unschärfe auftritt, wo dies in Hristos Lösung nicht der Fall ist.
9
Es gibt keine Box-Shadow-Bottom-Eigenschaft und dieser Effekt benötigt definitiv kein zusätzliches Element. Yuck.
Lea Verou
7
box-shadow-bottom, obwohl kreativ, existiert nicht wirklich.
Miketaylr
3
chill guys ... es war ein verdammter Tippfehler
Hristo
1
@gryzzly ... Ich habe meine Antwort bearbeitet, ich habe meinen Tippfehler erst gesehen, als alle darauf hingewiesen haben. Das tut mir leid.
Hristo
71

Verwenden Sie einfach den Spread-Parameter, um den Schatten kleiner zu machen:

.shadow {
  -webkit-box-shadow: 0 6px 4px -4px black;
  -moz-box-shadow: 0 6px 4px -4px black;
  box-shadow: 0 6px 4px -4px black;
}
<div class="shadow">Some content</div>

Live-Demo: http://dabblet.com/gist/a8f8ba527f5cff607327

Um keinen Schatten an den Seiten zu sehen, muss der (absolute Wert des) Ausbreitungsradius (4. Parameter) mit dem Unschärferadius (3. Parameter) übereinstimmen.

Lea Verou
quelle
1
das funktioniert eigentlich nicht. Auf den ersten Blick sieht es so aus, als ob sich der Schatten nur auf dem Boden befindet, aber tatsächlich breitet er sich immer noch über die Seiten aus. Alle Beispiele sind mit einer ziemlich dunkelblauen Box ... machen Sie die Box weiß und Sie werden den ganzen Schatten sehen.
Chris L
@Chris M: Erhöhen Sie einfach den Spread-Parameter: Versuchen Sie 4 Beispiel mit box-shadow:0 8px 4px -6pxund Sie sehen nur den unteren Schatten!
T30
1
Machen Sie die Box noch einmal WEISS wie in dieser Geige, und Sie werden immer noch Schatten an den Seiten sehen, und auch jetzt ist es nicht ganz ganz unten. Wie weit sind Sie bereit, den Spread-Parameter zu verwenden, um die Seiten loszuwerden? Außerdem ist es wahrscheinlich am besten, wenn jemand mit 151 Wiederholungen die Antwort von jemandem mit 7.000 Wiederholungen nicht bearbeitet. Hinterlasse es in einem Kommentar.
Chris L
1
@ T30 Natürlich können Sie die Seiten eventuell entfernen, indem Sie den Spread-Parameter noch weiter reduzieren. Aber jetzt ist Ihr Schatten nicht annähernd so breit wie Ihre Box. Sie haben eine 84px-Box mit einem 72px-Schatten.
Chris L
1
Antwort aktualisiert. Aber im Grunde genommen kann man nicht viel tun, ohne den Spreizradius zu verringern und den Y-Versatz anzupassen. Vielleicht einen Farbverlauf anstelle eines Schattens verwenden? Es macht mir auch nichts aus, wenn Leute meine Beiträge bearbeiten, aber ich schätze es nicht, wenn Leute meine Beiträge bearbeiten, um Sätze hinzuzufügen, die in einer Engrish-ähnlichen Sprache geschrieben sind. Ich bin auch kein englischer Muttersprachler und verstehe die Herausforderungen, aber wenn ich den Beitrag eines anderen bearbeiten würde, würde ich mich genug verantwortlich fühlen, um zumindest zu überprüfen, ob das, was ich hinzugefügt habe, Sinn macht und die Grammatik nicht peinlich falsch.
Lea Verou
30

Wenn Sie eine feste Farbe auf dem Hintergrund haben, können Sie den Seitenschatteneffekt mit zwei Maskierungsschatten ausblenden , die dieselbe Hintergrundfarbe und Unschärfe = 0 haben. Beispiel:

box-shadow: 
    -6px 0 white,         /*Left masking shadow*/
    6px 0 white,          /*Right masking shadow*/
    0 7px 4px -3px black; /*The real (slim) shadow*/

Beachten Sie, dass der schwarze Schatten der letzte sein muss und eine negative Streuung (-3px) aufweist, um zu verhindern, dass er sich über die Ecken hinaus erstreckt.

Hier die Geige (ändern Sie die Farbe der Maskierungsschatten, um zu sehen, wie es wirklich funktioniert).

div{
    width: 100px;
    height: 100px;
    border: 1px solid pink;
    box-shadow: -6px 0 white, 6px 0 white, 0 7px 5px -2px black;
}
<div></div>

Geben Sie hier die Bildbeschreibung ein

T30
quelle
1
Wäre es viel besser, die transparentFarbe für die Maskierungsschatten zu verwenden, nein?
Angel Joseph Piscola
@AngelJosephPiscola: Cleverer Hinweis .. In der Antwort implementiert, danke!
T30
@ T30 genial, aber beachten Sie, dass Sie mit einer transparenten Maske keinen festen
Farbhintergrund
Ich habe es besser getestet und transparenter Schatten funktioniert nicht , also habe ich die letzten Änderungen rückgängig gemacht
T30
6

Ich denke, das ist es, wonach du suchst?

.shadow {
  -webkit-box-shadow: 0 0 0 4px white, 0 6px 4px black;
  -moz-box-shadow: 0 0 0 4px white, 0 6px 4px black;
  box-shadow: 0 0 0 4px white, 0 6px 4px black;
}
<div class="shadow">wefwefwef</div>

James T.
quelle
2
Ich liebe es, wenn die Leute einfach nicht verstehen. Ja, er spielt mit der Ausbreitung des ersten Schattens (weiß), der den Rand des echten Schattens (schwarz) bedeckt. Dies ist der einzig vernünftige Weg, um einen perfekten unidirektionalen Schatten zu erhalten. Besonders nützlich, wenn Sie in zwei Teilen eines Menüs denselben Schatten haben müssen.
Zeno Popovici
5

Es ist immer besser, die technischen Daten zu lesen . Es gibt keine box-shadow-bottomEigenschaft, und wie Lea betont, sollten Sie die Eigenschaft ohne Präfix immer unten nach den Präfixen platzieren.

So ist es:

.shadow {
  -webkit-box-shadow: 0px 2px 4px #000000;
  -moz-box-shadow: 0px 2px 4px #000000;
  box-shadow: 0px 2px 4px #000000;
}
<div class="shadow">Some content</div>

Mischa Reyzlin
quelle
1
Es gibt Schatten von den Seiten
Shinzou
2

Wie wäre es einfach mit einem enthaltenden Div, dessen Überlauf auf "Ausgeblendet" und etwas Polsterung unten eingestellt ist? Dies scheint die einfachste Lösung zu sein.

Es tut mir leid zu sagen, dass ich selbst nicht daran gedacht habe, sondern es woanders gesehen habe .

Verwenden eines Elements zum Umschließen des Elements mit dem Box-Schatten und einem Überlauf: Auf dem Wrapper können Sie den zusätzlichen Box-Schatten verschwinden lassen und dennoch einen verwendbaren Rand haben. Dies behebt auch das Problem, bei dem das Element aufgrund der Streuung kleiner ist, als es scheint.

So was:

#wrapper { padding-bottom: 10px; overflow: hidden; }
#elem { box-shadow: 0 0 10px black; }

Inhalt geht hier

Immer noch eine clevere Lösung, wenn es in reinem CSS gemacht werden muss!

Wie von Jorgen Evens gesagt .

Ben
quelle
+1 für die Lösung. Zusätzlich zu padding-bottom(sagen wir 5px) können Sie auch ein Negativ margin-bottom(von -5px) festlegen, um den hinzugefügten Speicherplatz zu kompensieren.
fabio.sang
2

Sie können auch clip-pathalle überlaufenden Kanten ausschneiden (ausblenden), außer die, die Sie anzeigen möchten:

.shadow {
  box-shadow: 0 4px 4px black;
  clip-path: polygon(0 0, 100% 0, 100% 200%, 0 200%);
}

Siehe Clip-Pfad (MDN) . Die Argumente dafür polygonsind der Punkt oben links , der Punkt oben rechts , der Punkt unten rechts und der Punkt unten links . Indem Sie die Unterkante auf 200%(oder eine beliebige Zahl größer als 100%) einstellen , beschränken Sie Ihren Überlauf nur auf die Unterkante.

theengineear
quelle
Also ... im Grunde genommen ist der Clip-Pfad der Überlauf: versteckte Eigenschaft bei Steroiden. Das ist sauber. ;)
Craig
1

Ich brauchte auch einen Schatten, aber nur unter einem Bild und setzte leicht links und rechts ein. Das hat bei mir funktioniert:

.box-shadow {
   -webkit-box-shadow: 5px 35px 30px -25px #888888;
      -moz-box-shadow: 5px 35px 30px -25px #888888;
           box-shadow: 5px 35px 30px -25px #888888;
}

Das Element, auf das dies angewendet wird, ist ein seitenweites Bild (980 x 300 Pixel).

Wenn es beim Herumspielen an den Einstellungen hilft, werden sie wie folgt ausgeführt:

horizontaler Schatten, vertikaler Schatten, Unschärfeabstand, Streuung (dh Schattengröße) und Farbe.

Chris9
quelle
1

Es ist besser, Schatten nachzuschlagen:

.header{
    -webkit-box-shadow: 0 -8px 73px 0 rgba(0,0,0,0.2);
    -moz-box-shadow: 0 -8px 73px 0 rgba(0,0,0,0.2);
    box-shadow: 0 -8px 73px 0 rgba(0,0,0,0.2);
}

Dieser Code wird derzeit im Stackoverflow-Web verwendet.

Kamlesh
quelle
1

Dieser Codestift (nicht von mir) zeigt eine supereinfache Möglichkeit, dies und die anderen Seiten für sich zu tun:

box-shadow: 0 5px 5px -5px #333;

https://codepen.io/zeckdude/pen/oxywmm

David Daudelin
quelle
0

Wenn Ihr Hintergrund fest ist (oder Sie ihn mit CSS reproduzieren können), können Sie den linearen Farbverlauf folgendermaßen verwenden:

div {
  background-image: linear-gradient(to top, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.3) 5px, #fff 5px, #fff 100%)
}
<div>
<p>Foobar</p>
<p>test</p>
</div>

Dadurch wird am unteren Rand des Elements ein Farbverlauf von 5 Pixel erzeugt, von Schwarz bei 30% Deckkraft bis vollständig transparent. Der Rest des Elements hat einen weißen Hintergrund. Wenn Sie die letzten beiden Farbstopps des linearen Verlaufs ändern, können Sie den Hintergrund natürlich vollständig transparent machen.

Tibo
quelle
0

Sie können auch einfach einen Farbverlauf auf der Unterseite erstellen - dies war hilfreich für mich, da sich der gewünschte Schatten auf einem Element befand, das bereits halbtransparent war, sodass ich mir keine Gedanken über Ausschnitte machen musste:

&:after {
      content:"";
      width:100%;
      height: 8px;
      position: absolute;
      bottom: -8px;
      left: 0;
      background: linear-gradient(to bottom, rgba(0,0,0,0.65) 0%,rgba(0,0,0,0) 100%);
    }

Passen Sie einfach die Eigenschaften "unten" und "Höhe" an und stellen Sie Ihre rgba-Werte so ein, wie Sie möchten, dass sie sich oben / unten im Schatten befinden

mheavers
quelle
0

Sie können das so machen:

Allgemeine Syntax:

selector {
   box-shadow: topBoxShadow, bottomBoxShadow, rightBoxShadow, leftBoxShadow
}

Beispiel: Wir wollen nur einen unteren Kastenschatten mit roter Farbe machen.

Um dies zu tun, müssen wir alle Seitenoptionen festlegen, wobei wir die Schattenoptionen des unteren Felds festlegen müssen, und alle anderen so leer wie folgt festlegen:

.box {
     -moz-box-shadow: 0 0 0 transparent ,0 0 10px red, 0 0 0 transparent, 0 0 0 transparent
     -o-box-shadow: 0 0 0 transparent ,0 0 10px red, 0 0 0 transparent, 0 0 0 transparent
     -webkit-box-shadow: 0 0 0 transparent ,0 0 10px red, 0 0 0 transparent, 0 0 0 transparent
     box-shadow: 0 0 0 transparent ,0 0 10px red, 0 0 0 transparent, 0 0 0 transparent
}
MUSTAPHA GHLISSI
quelle
-1

Aktualisieren Sie auf jemand anderem seine Antwort transparente Seiten anstelle von Weiß, damit es auch auf anderen Farbhintergründen funktioniert.

body {
  background: url(http://s1.picswalls.com/wallpapers/2016/03/29/beautiful-nature-backgrounds_042320876_304.jpg)
}

div {
  background: url(https://www.w3schools.com/w3css/img_avatar3.png) center center;
  background-size: contain;
  width: 100px;
  height: 100px;
  margin: 50px;
  border: 5px solid white;
  box-shadow: 0px 0 rgba(0, 0, 0, 0), 0px 0 rgba(0, 0, 0, 0), 0 7px 7px -5px black;
}
<div>
</div>

Jaron Koopmans
quelle
-3

inneren Schatten

 .shadow {
   -webkit-box-shadow: inset 0 0 9px #000;
   -moz-box-shadow: inset 0 0 9px #000;
   box-shadow: inset 0 0 9px #000;
 }
<div class="shadow">wefwefwef</div>

Raji
quelle