Est-il une meilleure façon d'atteindre cet objectif avec un minimum de performances et
maximale de généralisation?
La réponse à cette question est non.
La raison en est que, pour faire ce que vous voulez, vous auriez besoin d'un accès direct à l'image utilisé pour la fenêtre du navigateur pour extraire ou de manipuler les pixels dans la zone que vous souhaitez flou (je le souhaite, "aero" dans un navigateur pourrait look très soigné..) ou un filtre qui fonctionne sur les éléments derrière celui de l'appliquer à un (ou peut avoir une limitation de la région définie à elle).
Comme il n'y a pas de support natif pour ce faire (en plus de la toile et l'extension de l'API, ou une bibliothèque qui génèrent des canevas de l'image de l'html> relativement lent), cela devra être fait avec la ruse (images, de la scission de la vrd, etc.) dans les deux cas.
Si vous avez fait tout en votre page sur une toile, vous pourriez faire beaucoup de choses intéressantes, mais vous aussi, vous avez besoin pour effectuer la mise en page, mise à jour, filtrage, etc. vous-mêmes et à cet effet, vous seriez de retour pas non optimisé que le Javascript est plus lent que le natif (pour ne pas mentionner qu'il serait susceptible d'erreurs).
Jusqu'à ce que des navigateurs vous permettent de saisir une partie de la fenêtre comme une toile (jamais? en tant que nécessiterait tout sur la page pour en être de même origine ou ont contenu spéciaux accepter les en-têtes set) il n'y a pas moyen de contourner, mais pour faire des tours.
Mise à jour
Comme une démonstration que vous pouvez le faire en utilisant html2canvas etc, mais d'avoir à utiliser des compromis (-> ralentissement des performances) - la démo est rude, expérimentaux et les besoins des astuces pour bien fonctionner - mais pour l'amour de seulement en démo:
http://jsfiddle.net/AbdiasSoftware/RCaLR/
Résultat:
Fonction généralisée à saisir une partie de l'arrière-plan:
getBlurredBG(x, y, width, height, id);
Obtenez le cadre de la fenêtre à l'aide de html2canvas:
function getBlurredBG(x, y, w, h, id) {
html2canvas(document.body, {
onrendered: function (canvas) {
process(canvas, x, y, w, h, id);
},
width: (x + w),
height: (y + h)
});
}
Le contenu:
function process(canvas, x, y, w, h, id) {
//create new canvas to enable clipping
//As html2canvas returns a canvas from 0,0 to width and height
//we need to clip it.
var ocanvas = document.createElement('canvas');
ocanvas.width = w;
ocanvas.height = h;
ocanvas.style.left = x + 'px';
ocanvas.style.top = y + 'px';
ocanvas.style.position = 'absolute';
ocanvas.id = id;
var ctx = ocanvas.getContext('2d');
ctx.drawImage(canvas, x, y, w, h,
0, 0, w, h);
stackBlurCanvasRGB(ocanvas, x, y, w, h, 28)
lighten(ocanvas);
ctx.fillStyle = 'rgba(255,255,255,0.5)';
ctx.fillRect(x, y, w, h);
ctx.fillStyle = '#999';
ctx.font = '32px arial';
ctx.fillText("Partial overlay content", 10, 60);
document.body.appendChild(ocanvas);
}