Я довольно много искал, и я совершенно уверен, что этого не существует, я в основном ищу, чтобы подтвердить это. Что я хотел бы сделать, так это иметь div, который делает все, что находится за ним, прозрачным - аналогично тому, что делает параметр композитинга на выходе холста.
Для немного больше контекста, вот ситуация. У меня есть рисунок окна OpenGL за наложением QtWebKit. Окно OpenGL имеет несколько «дочерних окон», которые могут перекрываться и оформляться с помощью наложения WebKit. Однако, когда они перекрываются, из-за этой двухслойной системы декорации для перекрывающихся окон не перекрываются.
Резервный вариант — просто использовать для этого полноэкранный холст (обрезки окон довольно просты), но было бы лучше этого не делать. Обратите внимание, что поскольку это встроенный экземпляр WebKit, он не обязательно должен быть кросс-браузерным, и что-то специфичное для WebKit (или QtWebKit) подойдет.
ИЗМЕНИТЬ
Я не могу ответить на свой вопрос в течение 24 часов, поэтому вот мое решение, спасибо @Kevin Peno
Ниже приведена упрощенная версия того, что я искал. Он создает два div "видимый" и "невидимый". «невидимый» маскирует «видимый», чтобы он отображал фоновое изображение позади него вместо «видимого» div.
Настоящие ключи: -webkit-mask-image (http://www.webkit.org/blog/181/css-masks/) и -webkit-canvas (http://www.webkit.org/blog/176/css-canvas-drawing/), поэтому это будет работать только с браузерами на основе webkit.
HTML:
<html>
<body>
<div id="visible"/>
<div id="invisible"/>
</body>
</html>
JavaScript:
function updateMask()
{
var w = $("#visible").width();
var h = $("#visible").height();
var context = document.getCSSCanvasContext("2d", "mask", w, h);
context.fillStyle = "rgba(255, 255, 255, 1.0)";
context.fillRect(0, 0, w, h);
var my_off = $("#visible").offset();
var inv_off = $("#invisible").offset();
var rel_left = inv_off.left - my_off.left;
var rel_top = inv_off.top - my_off.top;
context.clearRect(rel_left, rel_top, $("#invisible").width(), $("#invisible").height());
}
$(window).ready(function()
{
updateMask();
$("#invisible").draggable();
$("#invisible").bind("drag", function(e, ui)
{
console.log("drag");
updateMask();
e.preventDefault();
});
});
CSS:
body
{
background-image: url(http://www.google.com/images/logos/ps_logo2.png);
}
#visible
{
position: absolute;
background-color: red;
z-index: 0;
width: 1000px;
height: 1000px;
top: 0;
left: 0;
-webkit-mask-image: -webkit-canvas(mask);
}
#invisible
{
position: absolute;
z-index: 1;
width: 100px;
height: 100px;
top: 50px;
left: 50px;
cursor: move;
background-color: rgba(0, 255, 0, 0.5);
}