CSS3盒子阴影用于重叠式div

18

我正在尝试使用CSS3实现这种效果:

header/main

HTML代码大致如下:

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

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

目前的CSS大致是这样的

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;
}
为了得到所需的结果,我需要:
  1. 隐藏主div的顶部阴影(没有问题)
  2. 将标题底部的阴影放在主div的前面,而不是像现在这样在后面。
我已经阅读了很多有关盒子阴影的内容,但我还没有找到真正满意的解决方案... 有什么想法吗?
3个回答

16

这个jsfiddle可以实现你想要的效果。

它的工作原理是通过一个主要的#wrap元素来居中内容并创建一个坐标映射用于绝对定位的#main元素。这是因为#wrap元素有position: relative的CSS规则。最终你会得到以下的标记:

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

在此基础上,将 header 放置在其中,并赋予相对定位和 z-index 属性,使其叠放在 #main 容器之上。

最后,将 #main 绝对定位于 header 之下。CSS 如下:

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

非常感谢,您的答案非常详细和有用。 但是...如果我有页脚,而#main的高度并不固定(它可以根据页面内容大大改变)怎么办?将绝对位置添加到布局中会将其向上移动... - dolma33
如果您的“header”高度固定,则可以交换CSS并使标题位置绝对,并使其重叠相对位置为“#main”。 - Pat
哦...看起来问题在于外层包裹坍塌了,导致其不会扩展到包含的所有 div 元素的高度,就像在这个 jsfiddle 中一样 http://jsfiddle.net/pbx4L/1/ [非常感谢帕特让我知道了 jsfiddle] 我在使用浮动时经常处理坍塌的父元素,但在这种情况下我不知道如何解决这个问题... - dolma33
这是一个简化版本,不使用绝对定位或包装元素(你真正需要改变的唯一事情就是给headermain更高的z-index:http://jsfiddle.net/DVWF8/199/ - powerbuoy

3

我刚刚运用了相对定位的方法,取得了一些好的效果。

例如:

第一个div有一个盒阴影和底部外边距,第二个div可以滑动到阴影下面。

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

这不是最好的解决方案,但对我而言可行。


2
将位置设置为“relative”就可以解决这个问题!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接