CSS3 box-shadow pour qui se chevauchent comme les divs

j'essaie d'obtenir cet effet avec css3:

header/main

le code HTML est clairement quelque chose comme

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

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

et le css est, pour le moment, quelque chose comme

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

pour obtenir le résultat souhaité, je dois:

  1. Cacher la partie supérieure de l'ombre de la div principale (pas de problème avec ça)
  2. apportez l'ombre inférieure de header devant la div principale, et non derrière comme elle est droit maintenant.

j'ai beaucoup lu à propos de box-shadow, et je n'ai pas trouvé de solution qui me plaise vraiment... Une idée?

18
demandé sur Community 2010-08-05 03:45:04

3 réponses

jsfiddle est-ce que vous voulez.

La façon dont il fonctionne, c'est avec un principal #wrap élément qui Centre le contenu et crée une table de coordonnées pour l'absolument positionné #main élément. Il le fait en raison de sa position: relative CSS rule. Vous vous retrouvez avec la balise suivante:

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

header est alors placé à l'intérieur de cette position et donné: relatif et un index z pour le placer empiler au-dessus du #main conteneur.

Enfin #main est absolument positionné au-dessous du header. Le CSS ressemble à ceci:

/* 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;
}
15
répondu Pat 2010-08-04 23:59:38

je viens d'avoir un peu de chance en utilisant le positionnement relatif.

Par exemple.

1ère div a une zone d'ombre, et une marge inférieure. La 2e division glisse sous l'ombre.

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

ce n'est pas la meilleure solution mais ça marche pour moi.

3
répondu andre b 2011-12-30 04:11:41

mettre la position "relative" résoudra déjà le problème!

2
répondu Gregor 2012-01-08 18:48:42