我想利用我正在处理的网站的新CSS3框阴影功能。 问题是如果内部有img(边框隐藏在图像区域周围),Chrome 9.0.5和Opera 10无法正确渲染插入边框。
我知道box-shadow仍在进行中,但我希望浏览器完全支持它或完全忽略它。
<!doctype html>
<html>
<head>
<style>
div {
border: 1px solid black;
width: 300px;
height: 200px;
overflow: hidden;
// CSS3 inset shade
-moz-box-shadow: inset 0 0 20px red;
-webkit-box-shadow: inset 0 0 20px red;
box-shadow: inset 0 0 20px red;
}
</style>
</head>
<body>
<div>
<img src="http://www.google.com/images/logos/ps_logo2.png" width="364" height="126" alt="" />
</div>
</body>
</html>
是否有人知道一些解决方法来正确渲染红色阴影?
谢谢!
编辑:我对答案很满意,但只是想添加一个实时链接来帮助其他人。 Here it is
答案 0 :(得分:19)
使用插入时,框阴影位于堆叠顺序的背景上方。因此,div中的任何图像都将覆盖阴影。
在堆叠上下文和 绘画顺序,外部阴影 下面是一个元素 该元素的背景,和 元素的内部阴影是 紧接在背景上方绘制 该元素(在边界和边界之下) 边框图像,如果有的话。)
换句话说,Chrome和Opera正确地做到了(FTR,FF 3.6.13和Opera一样)。
如果您希望阴影与图像重叠,您可以根据需要选择一些不同的选项:
background
属性。 答案 1 :(得分:11)
有一个更好的解决方案 - 只需在你的img上设置这个CSS。
img {
z-index: -1;
position: relative
}
答案 2 :(得分:3)
使用伪元素在图像上应用阴影。这样可以避免在标记中添加额外的,非语义的兄弟,无论其他元素的背景如何(与设置z-index: -1
不同),并且不需要JavaScript。
简单实例:http://jsfiddle.net/4qvzqajq/
OP的例子:http://jsfiddle.net/AWaVC/138/
假设这个标记:
<div class="container">
<img src="http://stackoverflow.com/content/stackoverflow/img/apple-touch-icon.png" />
</div>
此CSS将对div
的内容(包括图片)应用插入阴影:
.container {
position: relative;
}
.container:after {
position: absolute;
top: 0;
left: 0;
height: 100%;
width: 100%;
content: '';
-moz-box-shadow: inset 0 0 5px #000000;
-webkit-box-shadow: inset 0 0 5px #000000;
box-shadow: inset 0 0 5px #000000;
}
答案 3 :(得分:1)
昨天我有一个单DIV和background-image属性的解决方案。如果我们正在讨论图像尺寸未知或不太清晰的动态网站,我们可能会使用JavaScript Image类。真的,这不是“猴子扳手”,也不是关于设置正确宽度和高度的火箭科学。
使用JQuery加载来看看这个:
<style type="text/css">
#ribbon div {
display: inline-block; /* no hacks about left-floating images */
border: none;
border-radius: 8px; /* just for test inset shadow with rounded borders */
-webkit-border-radius: 8px;
-moz-border-radius: 8px;
// CSS3 inset shade
-moz-box-shadow: inset 0 0 20px red;
-webkit-box-shadow: inset 0 0 20px red;
box-shadow: inset 0 0 20px red;
}
</style>
<script type="text/javascript">
$(function(){
// Here's our images. We can load a list with AJAX.
var sources = ['1.jpg','2.jpg','3.jpg'];
var imgs = [];
var ribbon = $('#ribbon'); // Image list container
// Add images to the ribbon
for (var i=0, len=sources.length; src=sources[i], i<len; i++) {
var div = $('<div>'); // Create an empty DIV
div.attr('id','thumbimg'+i); // Name our DIV for async access
div.css('display','none'); // Make it hidden while loading the image
div.appendTo(ribbon); // Add to container
imgs[i] = new Image(); // Empty Image object
imgs[i].id = 'img'+i; // Name it for DIV match
// We can get the dimensions only after the image is loaded
imgs[i].onload = function() {
var myDiv = $('#thumb'+this.id); // Matching 'thumbimgX'
myDiv.css({
'display': '', // Clear display property = show hidden DIV
'width': this.width + 'px', // Set DIV.width = Image.width
'height': this.height + 'px', // Same for height
'background-image': 'url('+this.src+')', // draw our image in background
// Note the image already loaded and the div is inserted before
// so picture just appears without lags
});
}
// Load image
imgs[i].src = src;
}
}
</script>
<body>
...
<div id="ribbon"></div>
...
</body>
因此我们可以显示具有各种嵌入阴影效果的图像列表: 渐晕(
inset 0 0 60px rgba(0,0,0,0.8)
),按钮/冰箱磁铁(
inset -4px -4px 8px rgba(0,0,0,0.2), inset 4px 4px 8px rgba(255,255,255,0.8)
)以及你想要的任何东西。没有IMG标签,因此右键单击不会显示“保存图像”或“复制图像地址”选项。
P.S。哎呀,固定图像负载
答案 4 :(得分:1)
否定z-index
解决方案的问题在于,如果图像后面有一个背景元素,则图像会重叠。因此,此解决方案仅适用于白色站点。我的解决方案是将阴影置于div
img
的兄弟姐妹身上。这是div
得到position: absolute;
并且正好位于图片上方:
HTML:
<div class="teaserimage">
<img src="http://placehold.it/300x200">
<div class="shadow"></div>
</div>
SCSS:
.teaserimage {
position: relative;
float: left;
img {
vertical-align: middle; // to remove standard margin-bottom: 3px; of the image
}
.shadow {
-webkit-box-shadow: inset 10px 10px 10px 0px rgba(0, 0, 0, 0.5);
-moz-box-shadow: inset 10px 10px 10px 0px rgba(0, 0, 0, 0.5);
box-shadow: inset 10px 10px 10px 0px rgba(0, 0, 0, 0.5);
position: absolute;
top: 0px;
width: 100%;
height: 100%;
}
}