Blur et masques en SVG

16 Septembre 2014 à 00:00 Graphisme

Je ne publierai plus rien sur ce blog. Un nouveau blog existe maintenant. Il se nomme Hardly Smart.

Vous pourrez y retrouver des astuces plus larges sur l'informatique ainsi que mes anciens billets de blog.

Je vous souhaite une bonne lecture sur Hardly Smart.


Il existe de plus en plus de site avec le fond de leur site qui est flouté ou d'autres qui utilisent des formes complexes pour rendre un peu plus joli leur site. Je me suis donc penché sur sur ces techniques et voici quelques petites astuces pour faire du flou (ou blur en anglais) et pour faire aussi des masques en SVG.

Tout d'abord, je tiens à vous dire que si vous ne visualisez pas correctement la demo, c'est sans doute car votre navigateur gère mal le SVG. J'ai fais des tests et je n'ai pu voir les résultats des techniques utilisant du SVG que sur certains navigateurs.

Flou ou Blur

Pour ce qui est du système de floutage je vais vous montrer 2 systèmes, l'un utilisant un plugin jQuery, et l'autre utilisant du SVG.

blur.js

blur.js est un plugin jQuery écrite par Jacob Kelley permettant de créer du flou sur le fond d'un div en se basant sur l'arrière plan d'un autre div. Sur son site vous pouvez voir qu'il floute les div d'exemples en se basant sur l'image du fond du site.

$('.target').blurjs({
    source: 'body',             //Background to blur
    radius: 5,                  //Blur Radius
    overlay: '',                //Overlay Color, follow CSS3's rgba() syntax
    offset: {                   //Pixel offset of background-position
        x: 0,
        y: 0
    },
    optClass: '',               //Class to add to all affected elements
    cache: false,               //If set to true, blurred image will be cached and used in the future. If image is in cache already, it will be used.
    cacheKeyPrefix: 'blurjs-',  //Prefix to the keyname in the localStorage object
    draggable: false            //Only used if jQuery UI is present. Will change background-position to fixed
});

Ainsi si vous souhaitez flouter l'image du fond du site car celui ci est dynamique et que votre client ne sait pas comment flouter une image, placez l'image à flouter en fond du site (sur le body par exemple) et mettez rempalcez la classe target par body.

SVG

La méthode du SVG fonctionne très bien mais elle n'est pas compatible partout.

HTML

<svg width="300" height="300" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <defs>
        <filter id="gaussian_blur">
            <feGaussianBlur in="SourceGraphic" stdDeviation="5"/>
        </filter>
    </defs>
    <image id="image" width="300" height="300" y="0" x="0" xlink:href="IMAGE_A_FLOUTER" />
</svg>

CSS

svg {
    filter: url('#gaussian_blur');
}

Votre image est maintenant flouté.

Masque en SVG

Et pour ce qui est du masque, je vais utiliser uniquement du SVG.

<svg width="300" height="300" baseProfile="full" version="1.2">
    <defs>
        <mask id="mask" maskUnits="userSpaceOnUse" maskContentUnits="userSpaceOnUse" transform="scale(1)">
            <image width="300" height="300" xlink:href="MASQUE" />
        </mask>
    </defs>
    <image id="image" mask="url(#mask)" width="300" height="300" y="0" x="0" xlink:href="IMAGE_A_MASQUER" />
</svg>

Et biensûr vous pouvez coupler les 2 méthodes.

Demo

Blur

Masque

Source

Blur

<svg class="blur_no_mask" width="300" height="300" baseProfile="full" version="1.2">
    <defs>
        <filter id="gaussian_blur">
            <feGaussianBlur in="SourceGraphic" stdDeviation="5"/>
        </filter>
    </defs>
    <image id="image" width="300" height="300" y="0" x="0" xlink:href="https://www.babeuloula.fr/images/image.jpg" />
</svg>

<style>
    svg.blur_no_mask {
        filter: url('#gaussian_blur');
    }
</style>

Masque

<svg width="300" height="300" baseProfile="full" version="1.2">
    <defs>
        <mask id="mask" maskUnits="userSpaceOnUse" maskContentUnits="userSpaceOnUse" transform="scale(1)">
            <image width="300" height="300" xlink:href="https://www.babeuloula.fr/images/mask.png" />
        </mask>
    </defs>
    <image id="image" mask="url(#mask)" width="300" height="300" y="0" x="0" xlink:href="https://www.babeuloula.fr/images/image.jpg" />
</svg>

Articles liés

Les commentaires ont été désactivés.

2 commentaires

@Julianoe 16 Septembre 2014 à 00:00

G&eacute;nial ! Je me garde ce tuto sous le coude pour le jour o&ugrave; j'en aurai besoin. L'utilisation de SVG et de ce type pratique a un bon avenir je pense :) (enfin jusqu'&agrave; ce que jQuery soit finalement 'obsol&eacute;tis&eacute;' par CSS :P

BaBeuloula 16 Septembre 2014 à 00:00

C'est s&ucirc;r que &ccedil;a a un bon avenir mais le syst&egrave;me reste encore un peu lourd et il comporte beaucoup trop de limite comparait au CSS pure.
Par exemple pour un de mes projets il faut que j'utilise un masque et du blur, mais aussi faire une animation au hover. Le probl&egrave;me est que c'est long &agrave; charger et comme d'habitude, non compatible partout. Lors de mes tests, Firefox n&rsquo;acceptait pas du tout ces m&eacute;thodes. A savoir pourquoi