如何在div框中应用从插入到外框阴影的Web转换?

时间:2013-02-25 10:34:25

标签: css html web css3

我正在尝试进行一个Web转换,它以插入框阴影开始,结束于外框阴影。下面的jsfiddle显示了这个例子。问题是正常插入无框阴影网络转换工作但插入外部不起作用。

http://jsfiddle.net/xq4qc/

HTML

<div class="greyrow"> 
    good transition
    </div>
<br/>
<br/>
<div class="whiterow"> 
    no transition
    </div>

CSS

.greyrow{
height:100px;
width:250px;
padding:10px;
border:1px solid #CCCCCC;
margin-bottom: 10px;
-moz-box-shadow: inset 0 0 10px #aaa;
-webkit-box-shadow: inset 0 0 10px #aaa;
box-shadow: inner 0 0 10px #aaa;
}

.greyrow:hover{
-moz-box-shadow: none;
-webkit-box-shadow: none;
box-shadow: none;
-webkit-transition: -webkit-box-shadow 1s;
    -moz-transition: -moz-box-shadow 1s;
    -o-transition: -o-box-shadow 1s;
    transition: box-shadow 1s;


}

.whiterow{
height:100px;
width:250px;
padding:10px;
border:1px solid #CCCCCC;
margin-bottom: 10px;
-moz-box-shadow: inset 0 0 10px #aaa;
-webkit-box-shadow: inset 0 0 10px #aaa;
box-shadow: inner 0 0 10px #aaa;
}

.whiterow:hover{

-moz-box-shadow: 0 0 10px #aaa;
-webkit-box-shadow: 0 0 10px #aaa;
box-shadow: 0 0 10px #aaa;
-webkit-transition: -webkit-box-shadow 2s;
    -moz-transition: -moz-box-shadow 2s;
    -o-transition: -o-box-shadow 2s;
    transition: box-shadow 2s;


}

3 个答案:

答案 0 :(得分:12)

你可以通过过渡来完成。

诀窍是转换必须是数字值,而不是关键字。

因此,您需要将正常状态指定为2个阴影,1个插入而另一个外部,其中一个设置为0(因此它不可见):

.keyframe {
    box-shadow: inset 0 0 60px red, 0 0 0px blue;
    transition: box-shadow 5s;
}

我已经为大小和时间设置了巨大的值,因此它更加明显。然后悬停状态是:

.keyframe:hover {
    box-shadow: inset 0 0 0px red, 0 0 60px blue;
}

请注意,阴影之间存在对应关系,因此浏览器只需要转换数值(可能是所有数据;但是'inset'关键字)。

fiddle

.keyframe {
    box-shadow: inset 0 0 10px #aaa;
    height:100px;
    width:250px;
    padding:10px;
    margin-bottom: 10px;
    left: 40px;
    top: 40px;
    position: absolute;
    border:1px solid #CCCCCC;
    box-shadow: inset 0 0 60px red, 0 0 0px blue;
    transition: box-shadow 3s;
}
.keyframe:hover {
    box-shadow: inset 0 0 0px red, 0 0 60px blue;
}
<div class="keyframe"> 
    dual shadow transition (hover me)
</div>

答案 1 :(得分:8)

如果您在插入和开始阴影之间切换之前首先设置为无动画,则可以与关键帧非常接近。 (你不能直接为它设置动画,因为它们是关键词,而不是数字值 - 即没有“almostInset”阴影)。

考虑以下css:

.box {
    box-shadow: inset 0 0 10px #aaa;
    /*add prefixes*/animation: shadowFadeOut 1s;
}
.box:hover {
    box-shadow: 0 0 10px #aaa;
    /*add prefixes*/animation: shadowFadeIn 1s;
}

@/*add prefixes*/keyframes shadowFadeIn {
    0% { box-shadow: inset 0 0 10px #aaa; }
    50% { box-shadow: none; }
    100% { box-shadow: 0 0 10px #aaa; }
}

@/*add prefixes*/keyframes shadowFadeOut {
    0% { box-shadow: 0 0 10px #aaa; }
    50% { box-shadow: none; }
    100% { box-shadow: inset 0 0 10px #aaa; }
}

Webkit演示:http://jsfiddle.net/xq4qc/1/

我能想到的一个缺点是,它还会在第一页加载时为阴影设置动画。

答案 2 :(得分:2)

实现它的另一种方法是在两个元素上转换盒子阴影。因此,在外部元素上同时将内部元素的阴影从10px转换为0,然后从0转换为10px。

.outer {
  display: inline-block;
  box-shadow: 0 0 0 #000;
}
.outer:hover {
  box-shadow: 0 0 30px #000;
}
.inner {
  width: 150px;
  height: 150px;
  background: #ee3b3b;
  box-shadow: inset 0 0 30px #000;
}
.inner:hover {
  box-shadow: inset 0 0 0 #000;
}

此处示例:http://codepen.io/Probocop/pen/yyrqNG