Étirer et mettre à l'échelle le fond CSS

653

Existe-t-il un moyen d'obtenir un arrière-plan en CSS pour l'étirer ou le redimensionner pour remplir son conteneur?

Lawrence Dol
la source

Réponses:

267

Pour les navigateurs modernes, vous pouvez accomplir cela en utilisant background-size:

body {
    background-image: url(bg.jpg);
    background-size: cover;
}

cover signifie étirer l'image verticalement ou horizontalement pour qu'elle ne se répète jamais.

Cela fonctionnerait pour Safari 3 (ou version ultérieure), Chrome, Opera 10+, Firefox 3.6+ et Internet Explorer 9 (ou version ultérieure).

Pour que cela fonctionne avec les versions inférieures d'Internet Explorer, essayez ces CSS:

filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='.myBackground.jpg', sizingMethod='scale');
-ms-filter: "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='myBackground.jpg', sizingMethod='scale')";
Clément
la source
2
À Clément: Ce que vous proposez pour les filtres des IE précédents: ne fonctionne que partiellement. Il met à l'échelle la largeur de l'image ok mais l'échelle de hauteur va mal en ne la restreignant à rien. Plus la page est haute, plus l'image d'arrière-plan est grande. problème mais pourrait-il être possible de redimensionner la fenêtre d'affichage sur tout l'écran de manière à ce que l'arrière-plan soit mis à l'échelle ici? Merci pour les réponses!
3
Les filtres spécifiques à IE ne sont pas des solutions idéales, alors n'hésitez pas à conditionner IE avec des alternatives CSS. J'utilise personnellement la «couverture» CSS3 sur mon propre site et cela fonctionne très bien sur les appareils iOS, assurez-vous simplement de définir la largeur de l'appareil.
Clement
9
La couverture n'étire pas le bg. 100% 100% oui.
neoswf
Cette solution a fonctionné le mieux pour moi où je ne voulais pas étirer l'image horizontalement ou verticalement plus que sa résolution réelle. Merci..!!
M. Noddy
1
NB: à partir de Chromium 78.0.3904.97, il n'est pas possible de mettre à l'échelle des images svg indépendamment le long de chaque axe. Vous devrez peut-être le mettre à l'échelle et le convertir en image raster.
Mike
567

Utilisez la propriété CSS 3background-size :

#my_container {
    background-size: 100% auto; /* width and height, can be %, px or whatever. */
}

Il est disponible pour les navigateurs modernes depuis 2012.

vinyll
la source
93
Pour conserver le rapport hauteur / largeur de l'image, vous devez utiliser "background-size: cover;" ou "background-size: contain;". J'ai construit un polyfill qui implémente ces valeurs dans IE8: github.com/louisremi/background-size-polyfill
Louis-Rémi
6
Je sais que cela fait un an mais je dois (rire et) être d'accord avec la partie «navigateurs décents». Vérifiez tous vos navigateurs, mais j'ai eu plus de problèmes avec IE que n'importe lequel d'entre eux.
ErocM
36
Je devais me mettre background-size: 100% 100%;pour obtenir l'effet souhaité, si cela aide quelqu'un d'autre.
guanome
1
explication de coveret contain sur MDN
mohas
2
cela ne fonctionne pas vraiment. La question est de remplir le conteneur, ce qui signifie que nous voulons qu'il s'étire afin qu'il ne se répète pas. En revanche, cette réponse se répétera dans le sens de la hauteur si la hauteur ne couvre pas la zone. "Étirer pour remplir" signifie étirer comme vous le souhaitez afin qu'il ne se répète pas. La bonne réponse est "couvrir" d'en bas. Cela gère en fait le cas où cela ne fonctionne pas.
gman
171

La mise à l'échelle d'une image avec CSS n'est pas tout à fait possible, mais un effet similaire peut être obtenu de la manière suivante, cependant.

Utilisez ce balisage:

<div id="background">
    <img src="img.jpg" class="stretch" alt="" />
</div>

avec le CSS suivant:

#background {
    width: 100%; 
    height: 100%; 
    position: absolute; 
    left: 0px; 
    top: 0px; 
    z-index: 0;
}

.stretch {
    width:100%;
    height:100%;
}

et vous devriez avoir terminé!

Afin de redimensionner l'image pour qu'elle soit "à fond perdu" et de maintenir le rapport d'aspect, vous pouvez le faire à la place:

.stretch { min-width:100%; min-height:100%; width:auto; height:auto; }

Cela fonctionne très bien! Si une dimension est rognée, cependant, elle sera rognée sur un seul côté de l'image, plutôt que d'être rognée uniformément des deux côtés (et centrée). Je l'ai testé dans Firefox, Webkit et Internet Explorer 8.

SolidSmile
la source
2
Cela fonctionne bien ... mais recherchait quelque chose d'un peu plus robuste (probablement avec javascript) qui le centrait également et ajusté en fonction du paysage ou du portrait. Si quelqu'un a une solution dans ce sens, il aimerait un lien ... merci!
Brian Armstrong
4
Si
Brian Armstrong
1
Le centrage horizontal peut être effectué avec margin: 0 autoON .stretch. En réglant uniquement le widthou height, le rapport d'aspect reste le même. Essayez d'utiliser max-widthet max-heightde limiter le facteur de zoom ...
Ronald
1
Cela ne fonctionne pas pour moi dans ie8 / ie9, mais fonctionne dans ie6 / ie7 (et bien sûr tous les autres navigateurs). Dans ie8 / ie9, l'image n'apparaît que pour environ 3/4 des div. Quelqu'un a le même problème?
3
Un défaut avec SO: il n'y a aucun moyen de marquer les réponses qui ne sont plus correctes, ce qui conduit à des gens comme @Ullas égarés. Il est facile de mettre à l'échelle les arrière-plans dans tous les navigateurs modernes. developer.mozilla.org/en/CSS/background-size
Glenn Maynard
161

Utilisez l' attribut background-size dans CSS3:

.class {
     background-image: url(bg.gif);
     background-size: 100%;
}

EDIT: Modernizr prend en charge la détection de la prise en charge de la taille d'arrière-plan . Vous pouvez utiliser une solution de contournement JavaScript écrite pour fonctionner comme vous en avez besoin et la charger dynamiquement en l'absence de prise en charge. Cela permettra de maintenir le code maintenable sans recourir à des hacks CSS intrusifs pour certains navigateurs.

Personnellement, j'utilise un script pour y faire face en utilisant jQuery, c'est une adaptation de imgsizer . Comme la plupart des conceptions que j'utilise maintenant la largeur% pour les dispositions fluides sur les appareils, il y a une légère adaptation à l'une des boucles (tenant compte des tailles qui ne sont pas toujours à 100%):

for (var i = 0; i < images.length; i++) {
    var image = images[i],
        width = String(image.currentStyle.width);

    if (width.indexOf('%') == -1) {
        continue;
    }

    image.origWidth = image.offsetWidth;
    image.origHeight = image.offsetHeight;

    imgCache.push(image);
    c.ieAlpha(image);
    image.style.width = width;
}

EDIT: Vous pouvez également être intéressé par jQuery CSS3 Finaliz [s] e .

Metalshark
la source
3
Juste pour souligner, Modernizr n'active pas la prise en charge de la taille d'arrière-plan dans les navigateurs qui ne la prennent pas en charge de manière native. Il a juste un test cross-browser pratique pour cela. C'est à vous de le simuler lorsque le test est faux.
Chris Moschini
34

Essayez la taille d'arrière-plan de l'article . Si vous utilisez tous les éléments suivants, cela fonctionnera dans la plupart des navigateurs, à l'exception d'Internet Explorer.

.foo {
    background-image: url(bg-image.png);
    -moz-background-size: 100% 100%;
    -o-background-size: 100% 100%;
    -webkit-background-size: 100% 100%; 
    background-size: 100% 100%;
} 
alekwisnia
la source
1
Je vous remercie! Cela diffère de "background-size: cover"
Pavel Vlasov
1
cela s'est étiré pour moi sur l'ipad, mais n'a pas évolué. merci pour la publication.
Don Cote
1
C'est idéal pour faire rétrécir l'arrière-plan aussi. Merci!
beingalex
1
Si l'image d'arrière-plan est un SVG, il est également nécessaire de spécifier preserveAspectRatio="none"dans le SVG. Plus d'informations à ce sujet ici . Démo ici .
Mentalist
vous pouvez utiliser la taille d'arrière-plan: couverture; attachement de fond: fixe; vous pouvez l'échelle
Siraj Ahmed
15

Pas actuellement. Il sera disponible en CSS 3 , mais il faudra du temps avant qu'il ne soit implémenté dans la plupart des navigateurs.

Eran Galperin
la source
2
Grand article disponible sur A List Apart: Surdimensionnez ce fond, s'il vous plaît!
jensgram
3
-1 Je ne pense pas que cette réponse soit très pertinente ... et elle n'offre aucune solution d' aucune sorte.
Potherca
1
@Potherca, cette réponse était correcte à l'époque (il y a presque 3 ans).
Eran Galperin
4
Il y a une raison pour laquelle la date est affichée. Il doit être conservé pour les références historiques. Allez-vous passer en revue toutes les anciennes réponses sur le site et les voter en aval? la réponse est toujours correcte même si plus d'informations ont été ajoutées depuis lors. Notez également que d'autres réponses ici énoncent essentiellement la même chose (et certaines sont en effet incorrectes - elles déclarent que c'est impossible). J'ai l'impression que vous avez choisi celui-ci car il a des votes.
Eran Galperin
3
Non, j'ai choisi celui-ci car il ne fait que dire "l'ordinateur dit non" même s'il existe plusieurs solutions à ce problème même en 2008 ;-)
Potherca
15
.style1 {
        background: url(images/bg.jpg) no-repeat center center fixed;
        -webkit-background-size: cover;
        -moz-background-size: cover;
        -o-background-size: cover;
        background-size: cover;
}

Travaille dans:

  • Safari 3+
  • Chrome peu importe +
  • IE 9+
  • Opera 10+ (Opera 9.5 prend en charge la taille d'arrière-plan mais pas les mots clés)
  • Firefox 3.6+ (Firefox 4 prend en charge la version préfixée non-fournisseur)

De plus, vous pouvez essayer ceci pour une solution ie

    filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='.myBackground.jpg', sizingMethod='scale');
    -ms-filter: "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='myBackground.jpg', sizingMethod='scale')";
    zoom:1;

Crédit à cet article de Chris Coyier http://css-tricks.com/perfect-full-page-background-image/

Blowsie
la source
En quoi est-ce meilleur ou différent que juste "background-size: cover"?
PKHunter
@PKHunter, je ne sais pas exactement à quoi vous vous référez. Ceci est utilisé background-size: coversauf avec des préfixes de navigateur et une solution IE
Blowsie
8

En un mot: non. La seule façon d'étirer une image est d' <img>utiliser la balise. Vous devrez être créatif.

Cela était vrai en 2008, lorsque la réponse a été écrite. Aujourd'hui, les navigateurs modernes prennent en charge background-sizece qui résout ce problème. Attention, IE8 ne le prend pas en charge.

Vilx-
la source
6
@Blowsie - Mignon. Vérifiez la date de réponse. Le paysage des navigateurs a un peu changé au cours des 5 dernières années.
Vilx
5

Définissez "étirer et mettre à l'échelle" ...

Si vous avez un format bitmap, ce n'est généralement pas génial (graphiquement parlant) de l'étirer et de le déplacer. Vous pouvez utiliser des motifs répétables pour donner l'illusion du même effet. Par exemple, si vous avez un dégradé qui s'éclaircit vers le bas de la page, vous utiliserez un graphique d'un seul pixel de large et de la même hauteur que votre conteneur (ou de préférence plus grand pour tenir compte de la mise à l'échelle), puis le tuiler à travers le page. De même, si le dégradé traversait la page, il serait d'un pixel de haut et plus large que votre conteneur et répété sur la page.

Normalement, pour donner l'illusion qu'il s'étire pour remplir le récipient lorsque le récipient grandit ou rétrécit, vous agrandissez l'image par rapport au récipient. Tout chevauchement ne sera pas affiché en dehors des limites du conteneur.

Si vous voulez un effet qui repose sur quelque chose comme une boîte avec des bords incurvés, alors vous colleriez le côté gauche de votre boîte au côté gauche de votre conteneur avec suffisamment de chevauchement qui (dans des limites raisonnables) quelle que soit la taille du conteneur, il ne manque d'arrière-plan, puis vous superposez une image du côté droit de la boîte avec des bords incurvés et la positionnez à droite du conteneur. Ainsi, à mesure que le récipient rétrécit ou se développe, l'effet de boîte incurvée semble rétrécir ou croître avec lui - ce n'est pas le cas, mais il donne l'illusion de ce qui se passe.

En ce qui concerne vraiment la réduction et la croissance de l'image avec le conteneur, vous devrez utiliser des astuces de superposition pour que l'image semble fonctionner comme arrière-plan et du javascript pour la redimensionner avec le conteneur. Il n'y a aucun moyen actuel de le faire avec CSS ...

Si vous utilisez des graphiques vectoriels, vous êtes bien en dehors de mon domaine d'expertise, je le crains.

BenAlabaster
la source
Étirer = Modifier les dimensions x et y en changeant indépendamment le rapport d'aspect de l'image, Échelle = changer les dimensions x et y en conservant proportionnellement le rapport d'aspect de l'image.
Lawrence Dol
@SoftwareMonkey: En tant qu'arrière-plan, non, vous ne pouvez pas modifier l'étirement et l'échelle dans le vrai sens des termes en CSS simple. Vous devez utiliser diverses astuces CSS pour donner l'illusion que c'est ce qui se passe comme je l'ai décrit.
BenAlabaster
4

C'est ce que j'en ai fait. Dans la classe d'étirement, j'ai simplement changé la hauteur en auto. De cette façon, votre image d'arrière-plan a toujours la même taille que la largeur de l'écran et la hauteur aura toujours la bonne taille.

#background {
    width: 100%;
    height: 100%;
    position: absolute;
    margin-left: 0px;
    margin-top: 0px;
    z-index: 0;
}

.stretch {
    width:100%;
    height:auto;
}
Edward
la source
2

Ajoutez une background-attachmentligne:

#background {
    background-attachment:fixed;
    width: 100%; 
    height: 100%; 
    position: absolute; 
    margin-left: 0px; 
    margin-top: 0px; 
    z-index: 0;
}

.stretch {
    width:100%;
    height:auto;
}
user340273
la source
2

Je voudrais souligner que cela équivaut à faire:

html { width: 100%; height: 100%; }
body { width: 100%; height: 100%; /* Add background image or gradient to stretch here. */}
Askani
la source
2

Une autre excellente solution est le Backstretch de Srobbin qui peut être appliqué au corps ou à n'importe quel élément de la page - http://srobbin.com/jquery-plugins/backstretch/

nickff
la source
Nick, nous vous demandons généralement de fournir les parties saillantes dans votre réponse, et de fournir un lien externe uniquement pour plus de détails - cela aide les réponses à rester utiles en cas de pourriture de lien.
Lawrence Dol
1
Ma faute. De manière générale, vous ajoutez backstretch à la <head> de votre document puis initialisez comme ceci: $ (". Your-element"). Backstretch ("path / to / image.jpg");
nickff
2

Essaye ça

http://jsfiddle.net/5LZ55/4/

body
{ 
    background: url(http://p1.pichost.me/i/40/1639647.jpg) no-repeat fixed; 
    background-size: cover;
    -webkit-background-size: cover;
    -moz-background-size: cover;
    -o-background-size: cover;
}
user3383708
la source
1

Une astuce supplémentaire pour la triche de SolidSmile est de mettre à l'échelle (le redimensionnement proportionnel) en définissant une largeur et en utilisant auto pour la hauteur.

Ex:

#background {
    width: 500px;
    height: auto;
    position: absolute; 
    left: 0px; 
    top: 0px; 
    z-index: 0;
}

la source
0

Utilisez la border-image : yourimagepropriété pour définir votre image et la mettre à l'échelle jusqu'à la bordure entière de votre écran ou fenêtre.

Natesh bhat
la source