2010-08-04 19 views
18

Ich versuche, diesen Effekt mit css3 zu erreichen:CSS3 box-shadow für überlappende artig divs

header/main

Der HTML-Code ist sauber etwas wie

... 
<header> 
    ... 
</header> 

<div id="wrapper"> 
    ... 
</div> 
... 

und die CSS ist , im Moment, etwas wie

header { 
    display: block; 
    width: 900px; 
    height: 230px; 
    margin: 0 auto; 
    border: 1px solid #211C18; 
    ... 
    box-shadow: 2px 4px 20px #005377; 
    -moz-box-shadow: 2px 4px 20px #005377; 
    -webkit-box-shadow: 2px 4px 20px #005377; 
} 

#wrapper { 
    width: 820px;  
    margin: 0 auto; 
    ... 
    border-right: 1px solid #211C18; 
    border-bottom: 1px solid #211C18; 
    border-left: 1px solid #211C18; 
    ... 
    box-shadow: 2px 4px 20px #005377; 
    -moz-box-shadow: 2px 4px 20px #005377; 
    -webkit-box-shadow: 2px 4px 20px #005377; 
} 

Um das gewünschte Ergebnis zu erhalten, ich müssen:

  1. die oberen Schatten des Haupt div (kein Problem damit) ausblenden
  2. Header des unteren Schatten vor dem Haupt div bringen, und nicht hinter, wie es jetzt ist.

Ich habe viel über Box-Schatten gelesen, und ich habe keine Lösung gefunden, die mir wirklich gefällt ... Irgendeine Idee?

Antwort

15

Diese jsfiddle macht was Sie wollen.

Die Art, wie es funktioniert, ist mit einem Hauptelement #wrap, das den Inhalt zentriert und eine Koordinatenkarte für das absolut positionierte Element #main erstellt. Dies geschieht aufgrund seiner Position: relative CSS-Regel. Sie enden mit den folgenden Auszeichnungs up:

<div id="wrap"> 
    <header></header> 
    <div id="main"></div> 
</div> 

The header dann innerhalb dieser und gegebene Position angeordnet ist: relativ und ein z-Index es eingerichtet über den #main Behälter zu stapeln.

Schließlich ist #main absolut unter der header positioniert. Das CSS sieht so aus:

/* centre content and create coordinate map for absolutely positioned #main */ 
#wrap { 
    width: 300px; 
    margin: 20px auto; 
    position: relative; 
} 

header, #main { 
    background: #fff; 

    /* rounded corners */ 
    border: 1px solid #211C18; 
    border-radius: 5px; 
    -moz-border-radius: 5px; 
    -webkit-border-radius: 5px;  

    /* dropshadows */ 
    box-shadow: 2px 4px 20px #005377; 
    -moz-box-shadow: 2px 4px 20px #005377; 
    -webkit-box-shadow: 2px 4px 20px #005377; 
} 

header { 
    display: block; 
    width: 300px; 
    height: 50px; 

    /* stack above the #main container */ 
    position: relative; 
    z-index: 2; 
} 

#main { 
    width: 200px; 
    height: 70px; 

    /* stack below the header and underlap it...if that's even a word */ 
    position: absolute; 
    z-index: 1; 
    top: 40px; 
    left: 50px; 
} 
+0

Vielen Dank, Ihre Antwort war sehr detailliert und nützlich ... Aber ... was ist, wenn ich eine Fußzeile habe und #main Höhe nicht behoben ist (es kann A LOT je nach Inhalt der Seite ändern)? Hinzufügen von absoluten Positionen zum Layout wird es nach oben verschieben ... – dolma33

+0

Wenn Ihre 'header' feste Höhe ist, dann können Sie einfach die CSS herum und machen Sie die Header-Position absolut und haben sie die Position relativ' # main' überlappen. – Pat

+0

Oh ... sieht aus, dass das Problem ist, dass der Wrap zusammenbricht, so dass es nicht für alle enthaltenen divs Höhe überspannt, wie in diesem jsfiddle http://jsfiddle.net/pbx4L/1/ [Vielen Dank Pat, um mich dazu zu bringen, mich kennenzulernen] Ich habe mich immer mit kollabierenden Eltern beschäftigt, während ich Floats benutzt habe, aber in diesem Fall weiß ich nicht, wie ich das Problem lösen soll ... – dolma33

3

Ich hatte nur etwas Glück mit relativer Positionierung.

Zum Beispiel.

1. div hat einen Box-Schatten und einen unteren Rand. 2. div schiebt sich unter den Schatten.

#firstdiv {width: 960px; box-shadow: 5px 5px 5px #ccc; margin-bottom: 10px;} 
#seconddiv {width: 960px; position: relative; top: -10px;} 

Es ist nicht die beste Lösung, aber es funktioniert für mich.

2

Einstellung Position auf "relativ" wird bereits das Problem lösen!