542 votes

Comment appliquer un filtre CSS à une image d'arrière-plan ?

J'ai un fichier JPEG que j'utilise comme image d'arrière-plan pour une page de recherche, et j'utilise une feuille de style en cascade pour le définir, car je travaille dans le cadre d'un système de gestion des ressources humaines. Backbone.js contextes :

background-image: url("whatever.jpg");

Je veux appliquer un filtre flou CSS 3. uniquement à l'arrière-plan, mais je ne sais pas comment donner un style à ce seul élément. Si j'essaie :

-webkit-filter: blur(5px);
-moz-filter: blur(5px);
-o-filter: blur(5px);
-ms-filter: blur(5px);
filter: blur(5px);

juste en dessous background-image dans mon CSS, cela donne un style à toute la page, et pas seulement à l'arrière-plan. Existe-t-il un moyen de sélectionner uniquement l'image et d'y appliquer le filtre ? Ou bien, existe-t-il un moyen de désactiver le flou pour tous les autres éléments de la page ?

4 votes

Ne flouter qu'une partie d'une image : codepen.io/vsync/pen/gjMEWm

588voto

Aniket Points 2350

Regarde ça stylo .

Vous devrez utiliser deux conteneurs différents, l'un pour l'image d'arrière-plan et l'autre pour votre contenu.

Dans l'exemple, j'ai créé deux conteneurs, .background-image et .content .

Les deux sont placés avec position: fixed et left: 0; right: 0; . La différence d'affichage provient de la z-index qui ont été fixées différemment pour les éléments.

.background-image {
  position: fixed;
  left: 0;
  right: 0;
  z-index: 1;
  display: block;
  background-image: url('https://i.imgur.com/lL6tQfy.png');
  width: 1200px;
  height: 800px;
  -webkit-filter: blur(5px);
  -moz-filter: blur(5px);
  -o-filter: blur(5px);
  -ms-filter: blur(5px);
  filter: blur(5px);
}

.content {
  position: fixed;
  left: 0;
  right: 0;
  z-index: 9999;
  margin-left: 20px;
  margin-right: 20px;
}

<div class="background-image"></div>
<div class="content">
  <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis aliquam erat in ante malesuada, facilisis semper nulla semper. Phasellus sapien neque, faucibus in malesuada quis, lacinia et libero. Sed sed turpis tellus. Etiam ac aliquam tortor, eleifend
    rhoncus metus. Ut turpis massa, sollicitudin sit amet molestie a, posuere sit amet nisl. Mauris tincidunt cursus posuere. Nam commodo libero quis lacus sodales, nec feugiat ante posuere. Donec pulvinar auctor commodo. Donec egestas diam ut mi adipiscing,
    quis lacinia mauris condimentum. Quisque quis odio venenatis, venenatis nisi a, vehicula ipsum. Etiam at nisl eu felis vulputate porta.</p>
  <p>Fusce ut placerat eros. Aliquam consequat in augue sed convallis. Donec orci urna, tincidunt vel dui at, elementum semper dolor. Donec tincidunt risus sed magna dictum, quis luctus metus volutpat. Donec accumsan et nunc vulputate accumsan. Vestibulum
    tempor, erat in mattis fringilla, elit urna ornare nunc, vel pretium elit sem quis orci. Vivamus condimentum dictum tempor. Nam at est ante. Sed lobortis et lorem in sagittis. In suscipit in est et vehicula.</p>
</div>

Excuses pour le Lorem Ipsum texte.

Mise à jour

Merci à Matthew Wilcoxson pour une meilleure mise en œuvre en utilisant .content::before https://codepen.io/akademy/pen/FlkzB

100 votes

Une meilleure façon de procéder est d'utiliser .content:before au lieu de la balise supplémentaire "background-image". J'ai mis à jour le stylo ici : codepen.io/akademy/pen/FlkzB

6 votes

Fwiw, seul Webkit a implémenté cette fonctionnalité, et là seulement avec le préfixe du fournisseur, donc les préfixes ms-, o-, moz- sont inutiles.

2 votes

Il est pris en charge par défaut dans Firefox 35.0 et les versions ultérieures : caniuse.com/#feat=css-filters

106voto

Necrone Points 1017

stylo

La suppression d'un élément supplémentaire et l'intégration du contenu dans le flux de documents au lieu d'être fixe/absolu comme d'autres solutions.

Réalisé en utilisant

.content {
  /* this is needed or the background will be offset by a few pixels at the top */
  overflow: auto;
  position: relative;
}

.content::before {
  content: "";
  position: fixed;
  left: 0;
  right: 0;
  z-index: -1;

  display: block;
  background-image: url('https://i.imgur.com/lL6tQfy.png');
  background-size:cover;
  width: 100%;
  height: 100%;

  -webkit-filter: blur(5px);
  -moz-filter: blur(5px);
  -o-filter: blur(5px);
  -ms-filter: blur(5px);
  filter: blur(5px);
}

<div class="content">
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
</div>

EDIT Si vous souhaitez supprimer les bordures blanches sur les bords, utilisez une largeur et une hauteur de 110% et une gauche et un haut de -5% . Cela agrandira un peu vos arrière-plans, mais il ne devrait pas y avoir de couleur unie débordant sur les bords. Merci à Chad Fawcett pour cette suggestion.

.content {
  /* this is needed or the background will be offset by a few pixels at the top */
  overflow: auto;
  position: relative;
}

.content::before {
  content: "";
  position: fixed;
  top: -5%;
  left: -5%;
  right: -5%;
  z-index: -1;

  display: block;
  background-image: url('https://i.imgur.com/lL6tQfy.png');
  background-size:cover;
  width: 110%;
  height: 110%;

  -webkit-filter: blur(5px);
  -moz-filter: blur(5px);
  -o-filter: blur(5px);
  -ms-filter: blur(5px);
  filter: blur(5px);
}

<div class="content">
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
</div>

90voto

hitautodestruct Points 3220

Comme indiqué dans d'autres réponses, ceci peut être réalisé avec :

  • Une copie de l'image floue comme arrière-plan.
  • Un pseudo élément qui peut être filtré puis positionné derrière le contenu.

Vous pouvez également utiliser backdrop-filter

Il existe une propriété prise en charge appelée backdrop-filter et il est actuellement supporté dans Chrome 76, Bordure Safari, et iOS Safari (cf. caniuse.com pour les statistiques).

De Mozilla devdocs :

La propriété backdrop-filter permet d'obtenir des effets tels que le flou ou le changement de couleur de la zone située derrière un élément, qui peut ensuite être vue à travers cet élément en ajustant la transparence/opacité de l'élément.

Voir caniuse.com pour les statistiques d'utilisation.

Vous pouvez l'utiliser comme suit. Si vous ne voulez pas que le contenu à l'intérieur soit flouté, utilisez la classe utilitaire .u-non-blurred

.background-filter::after {
  -webkit-backdrop-filter: blur(5px); /* Use for Safari 9+, Edge 17+ (not a mistake) and iOS Safari 9.2+ */
  backdrop-filter: blur(5px); /* Supported in Chrome 76 */

  content: "";
  display: block;
  position: absolute;
  width: 100%; height: 100%;
  top: 0;
}

.background-filter {
  position: relative;
}

.background {
  background-image: url('https://upload.wikimedia.org/wikipedia/en/6/62/Kermit_the_Frog.jpg');
  width: 200px;
  height: 200px;
}

/* Use for content that should not be blurred */
.u-non-blurred {
  position: relative;
  z-index: 1;
}

<div class="background background-filter"></div>
<div class="background background-filter">
  <h1 class="u-non-blurred">Kermit D. Frog</h1>
</div>

Mise à jour (12/06/2019) : Chromium sera livré avec backdrop-filter activé par défaut dans la version 76 qui doit sortir le 30/07/2019 .

Mise à jour (01/06/2019) : L'équipe de Mozzilla Firefox a annoncé il commencera à travailler sur la mise en œuvre de cette mesure prochainement.

Mise à jour (21/05/2019) : Chrome vient d'annoncer backdrop-filter est disponible dans chrome canary sans activer le drapeau "Enable Experimental Web Platform Features". Cela signifie que backdrop-filter est sur le point d'être mis en œuvre sur toutes les plateformes chromées.

27voto

posit labs Points 1179

Pour ce faire, vous devez restructurer votre HTML. Vous devez rendre l'élément entier flou afin de rendre l'arrière-plan flou. Ainsi, si vous souhaitez ne brouiller que l'arrière-plan, celui-ci doit être un élément à part entière.

10voto

a99 Points 141

Voici une solution simple pour les navigateurs modernes, en pure CSS avec un pseudo-élément "before", comme la solution de Matthew Wilcoxson.

Pour éviter d'avoir à accéder au pseudo-élément pour modifier l'image et d'autres attributs en JavaScript, il suffit d'utiliser la méthode suivante inherit comme valeur et y accéder via l'élément parent (ici body ).

body::before {
    content: ""; /* Important */
    z-index: -1; /* Important */
    position: inherit;
    left: inherit;
    top: inherit;
    width: inherit;
    height: inherit;
    background-image: inherit;
    background-size: cover;
    filter: blur(8px);
}

body {
  background-image: url("xyz.jpg");
  background-size: 0 0;  /* Image should not be drawn here */
  width: 100%;
  height: 100%;
  position: fixed; /* Or absolute for scrollable backgrounds */
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X