TL;博士:
如果您对仅支持WebKit Chrome感到满意,请使用CSS 过滤器。
如果您对填充的 CSS Canvas Context 和 Canvas 感到满意,您可以支持 Mozilla 和 WebKit 浏览器,不过,Chrome 不会因为它的影子而模糊。
如果您可以在 SVG 中重新创建图像,并且您的目标浏览器确实支持它,那么这也是一个可行的选择。实际上,如果您可以在 SVG 中获取背景,这似乎是最佳选择。大多数主要浏览器显示相同的结果,但 Safari 似乎放弃了过滤器。
您可以在下面阅读有关选项如何演变的过程。
原答案:
我怀疑你所期待的是可能的。
首先,body
占据页面 100% 的高度和 100% 的宽度,它的“外部”阴影将永远隐藏。
如果按如下方式设置属性:
box-shadow: inset 0 0 5px 2px #282a2d; /* mark the inset */
您应该看到阴影,但是,我怀疑那是您所寻求的。
您可以通过将图像包装在一个新元素中来解决这个问题,该元素是 的子元素,body
并且小于 100%body
的尺寸。
此外,您可以使body
' 的尺寸小于 100%,但我不鼓励这样做 - 它可能会在某些浏览器等中中断。
我的第二个猜测是,您使用的是png
透明图像,因此您希望shadow
图像周围的图像填充像素边缘,而保持透明不变。虽然这听起来像是一个很酷的想法,但这不是 CSS 所做的。
该属性不仅被调用,因此它已经声明它是不可能的box-shadow
。shadow
我不知道这是否可能,但你可以尝试使用SVG
它的过滤器来这样做。我不是 SVG 方面的专家 - 无法立即提供示例(不过会调查)。
另一种可能性是canvas
用作元素的背景,并以编程方式应用阴影(遍历像素并添加额外的像素)。
更新:不知道 Canvas 足够聪明,可以通过透明图像进行阴影处理,不需要编程部分。
请记住,最后 2 个变体肯定会受到浏览器的不良支持。
更新:
CSS 过滤器:
好的,还有另一种可能性 - CSS 过滤器,尽管在撰写本文时,它们仅受 WebKit 支持。实际上不确定它们是否适用于所有 WebKit 浏览器(Safari、Opera、Chrome),但它们适用于 Chrome。
检查适用于 Windows、Opera 和 Chrome 的最新 Safari,证明该属性仅适用于 Chrome。
有一个“但是”,body 也不支持它(jsfiddle.net),我认为所有很酷的东西都被抛在了body
后面。
如果是子节点,它可以工作(jsfiddle.net)!
PS 最终,我们可能会看到每个浏览器都实现了 CSS 过滤器。这使其成为此类功能的最佳选择。
帆布:
更新:
我用画布做了一些实验。一般来说,它是成功的,甚至适用于:http body
: //jsfiddle.net/psyketom/3VBMJ/4/。
但是,我无法使shadowBlur
财产正常工作。可能它不适用于 CSS Canvas 上下文。
并且,Firefox 本身不支持 cssCanvasContext,因此-moz-background
(实际上是-moz-element
,但由于没有 cssCanvasContext,它仍然失败)属性被忽略。我认为这可能会被屏幕外的 canvas破解。
更新 2:
该shadowBlur
属性适用于 Safari,不适用于 Chrome。
更新 3:
http://jsfiddle.net/psyketom/3VBMJ/6/我用离屏画布做了一个测试,但不能一起破解。我现在给它更多的时间。
更新 4:
屏幕外画布在 Firefox 中确实有效 - http://jsfiddle.net/psyketom/3VBMJ/12/,但在 Webkit 中无效。
动态生成的画布也可以做到这一点,但是,它必须被附加,然后隐藏。
更新 5(值得检查):
我做了一个肮脏的 polyfill,现在,画布背景在 Webkit 和 Mozilla 浏览器中都得到了支持。
更新 6:
我做了一个快速的兼容性测试——Chrome(27.0.1453.116 m)有效,Firefox(22.0)有效,Safari(Windows,5.1.7 7534.57.2)有效。
至于... IE (10.0.9200.16618) 不起作用,Opera (12.14 1738) 不起作用。
SVG:
首先,SVG 要求您以矢量形式创建图像。
更新:
哦,男孩,哦,男孩... SVG... http://jsfiddle.net/psyketom/3VBMJ/18/。这不是真正的背景图像,它只是在 HTML 中注入的 SVG,并且它的容器元素已pointer-events: none
应用于它,以禁用任何鼠标输入。
适用于 Firefox 和 Chrome,可能还有其他,因为它依赖于比 CSS3/HTML5 更受支持的 SVG。但请记住,SVG 的某些部分不受支持,过滤器可能就是其中之一。
更新 2:
通过将我们之前作为内联 html 的所有内容倒入它自己的文件中,我们可以将SVG 用作background-image
. 签入 Chrome 和 Fox - 两者都适用。
更新 3:
我做了一个快速的兼容性测试——Chrome (27.0.1453.116 m) 有效,Firefox (22.0) 有效,IE (10.0.9200.16618) 有效,Opera (12.14 1738) 有效。
至于 Safari(对于 Windows,5.1.7 7534.57.2) - 它可以工作,但根本不显示阴影。
这就是我对子元素的意思:
http://jsfiddle.net/psyketom/3VBMJ/21/
附加信息:
http://jsfiddle.net/psyketom/3VBMJ/17/看来,shadowBlur
Chrome 中的一般支持(红色框),但它缺乏对 PNG 的支持(笑脸)。
我现在很困惑,是因为最近切换到 Blink 还是 Chrome 从未支持它?