web-dev-qa-db-fra.com

filtre: flou (1px); ne fonctionne pas dans Firefox, Internet Explorer et Opera

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?

29
Thomas Lai

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>
43
Arpad Bajzath
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'); 
14
rostber

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>

Démo: http://codepen.io/rkogan/pen/jPdGoM/

8
Rob Kogan

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:

  1. 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);
    
  2. Détectez si Internet Explorer/Microsoft Edge était utilisé à l'aide de ce JavaScript (merci Mario).

  3. 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";
    
  4. 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);
    }
    
  5. 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 + ')');
    
  6. 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>
6
SharpC

Cela semble juste, et il est actuellement pris en charge dans:

  • Chrome 18+
  • Chrome pour Android 25+
  • Safari 6+
  • iOS Safari 6+
  • Navigateur BlackBerry 10+

Référence

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.

3
Daniel Imms

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.

1
Boris Zbarsky