J'ai un problème avec CSS. Quand j'essaye de faire
-webkit-filter: blur(1px);
-moz-filter: blur(1px);
-ms-filter: blur(1px);
-o-filter: blur(1px);
filter: blur(1px);
il semble parfait dans Safari et Chrome, mais le flou n'apparaît pas du tout dans Firefox, Opera ou Internet Explorer. Ces navigateurs le prennent-ils en charge? Ou existe-t-il une autre méthode pour rendre la page entière floue?
Essayez avec le filtre SVG.
img {
filter: blur(3px);
-webkit-filter: blur(3px);
-moz-filter: blur(3px);
-o-filter: blur(3px);
-ms-filter: blur(3px);
filter: url(#blur);
filter: progid:DXImageTransform.Microsoft.Blur(PixelRadius='3');
}
<img src="https://i.stack.imgur.com/oURrw.png" />
<svg version="1.1" xmlns="http://www.w3.org/2000/svg">
<filter id="blur">
<feGaussianBlur stdDeviation="3" />
</filter>
</svg>
filter: blur(3px);
-webkit-filter: blur(3px);
-ms-filter: blur(3px);
filter: url("data:image/svg+xml;utf9,<svg%20version='1.1'%20xmlns='http://www.w3.org/2000/svg'><filter%20id='blur'><feGaussianBlur%20stdDeviation='3'%20/></filter></svg>#blur");
filter:progid:DXImageTransform.Microsoft.Blur(PixelRadius='3');
Voici une nouvelle technique de flou qui fonctionne sur tous les navigateurs (y compris Internet Explorer 10/11) et ne nécessite pas de filtres, de canevas ou de JavaScript.
La technique de base consiste à réduire la taille de l'image, puis à utiliser une matrice de mise à l'échelle 3D sur le parent pour effectuer un zoom arrière en taille réelle. Cela sous-échantillonne efficacement l'image et fait un effet de flou grossier.
body {
font-family: Verdana;
font-size: 14px;
font-weight: bold;
}
.container {
height: 500px;
width: 500px;
position: relative;
overflow: hidden;
}
#image {
background-image: url('http://i.imgur.com/HoWL6o3.jpg');
background-size: contain;
background-repeat: no-repeat;
height: 100%;
width: 100%;
position: absolute;
}
#image.blur {
transform: matrix3d(1, 0, 0, 0,
0, 1, 0, 0,
0, 0, 1, 0,
0, 0, 0, 0.05);
background-size: 0 0;
}
#image.blur:before {
transform: scale(0.05);
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
content: '';
background-image: inherit;
background-size: contain;
background-repeat: inherit;
}
<div class="container">
<div id="image" class="blur"></div>
</div>
J'ai essayé toutes les méthodes ci-dessus, mais comme d'habitude, Internet Explorer/Microsoft Edge voulait faire les choses différemment, donc je ne pouvais pas le rendre cohérent.
En fin de compte, j'ai dû sauter à travers une série de cerceaux pour le faire fonctionner comme je le voulais dans tous les navigateurs modernes:
Utilisez le CSS déjà mentionné pour qu'il fonctionne sur les navigateurs non IE sans la surcharge du correctif que je devais utiliser pour IE:
-webkit-filter: blur(1px);
-moz-filter: blur(1px);
-ms-filter: blur(1px);
-o-filter: blur(1px);
filter: blur(1px);
Détectez si Internet Explorer/Microsoft Edge était utilisé à l'aide de ce JavaScript (merci Mario).
Si Internet Explorer/Microsoft Edge a été détecté, chargez l'image dans un champ img
masqué sur la page. Vous devez le faire en utilisant la fonction onload
pour assurez-vous que l'image a été chargée avant de l'opérer, sinon l'étape suivante échoue (merci Josh Stodola):
var img = new Image();
img.onload = function() { blurTheImage(); }
img.src = "http://path/to/image.jpg";
Utilisez StackBlur JavaScript qui fonctionne sur IE et Edge (merci Mario Klingemann). L'image devrait être disponible par CORS.
HTML:
<div id="ie-image-area" style="display: none;">
<img id="ie-image"/>
<canvas id="ie-canvas"></canvas>
</div>
JavaScript:
function blurTheImage() {
$("#ie-image").attr("src", "http://path/to/image.jpg");
StackBlur.image('ie-image', 'ie-canvas', 1, false);
}
Comme il se trouve que je voulais le définir comme arrière-plan, j'ai donc dû convertir l'image avant de définir les données (merci ser381747 ):
imageLinkOrData = document.querySelector('#ie-canvas').toDataURL("image/png");
$('#background-image').css('background-image', 'url(' + imageLinkOrData + ')');
Une fois chargé et flou, je l'ai ensuite effacé en en utilisant CSS et une classe de transparence car jQuery fadeTo
n'était pas très beau (merci Rich Bradshaw):
$('#background-image').toggleClass('transparent');
Ouf, je pense que j'ai besoin d'une pause thé (ou peut-être quelque chose de beaucoup plus fort!).
Un échantillon de cela fonctionne (merci Alex78191):
function detectIE() {
return navigator.userAgent.search(/MSIE|Trident|Edge/) >= 0;
}
let image = document.querySelector('#img-for-blur');
image.src = image.getAttribute('data-src');
if (detectIE()) {
image.onload = function() {
StackBlur.image('img-for-blur', 'ie-canvas', 4, false);
};
} else {
image.style.display = 'block';
}
img {
filter: blur(4px);
display: none;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/stackblur-canvas/1.4.0/stackblur.js"></script>
<img id="img-for-blur" data-src="https://i.stack.imgur.com/oURrw.png">
<canvas id="ie-canvas"></canvas>
Cela semble juste, et il est actuellement pris en charge dans:
Voici un article de David Walsh (travaille chez Mozilla) sur des filtres spécifiques à Internet Explorer, par exemple t motion blur:
.blur { filter:blur(add = 0, direction = 300, strength = 10); }
Il semble que la prise en charge du flou normal soit inégale avec Internet Explorer et je ne suis pas surpris, en particulier avant la 9.
Vous pouvez faire un filtre de flou SVG dans les navigateurs basés sur Gecko. Mais ce que vous avez ci-dessus est uniquement WebKit et non standardisé, donc personne d'autre ne le prend en charge.