Allunga e ridimensiona lo sfondo CSS


653

C'è un modo per ottenere uno sfondo in CSS da allungare o ridimensionare per riempire il suo contenitore?

Risposte:


267

Per i browser moderni, puoi farlo utilizzando background-size:

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

cover significa allungare l'immagine in verticale o in orizzontale in modo da non affiancare / ripetere mai.

Funzionerebbe con Safari 3 (o successivi), Chrome, Opera 10+, Firefox 3.6+ e Internet Explorer 9 (o successivi).

Affinché funzioni con le versioni inferiori di Internet Explorer, prova questi CSS:

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

2
A Clemente: cosa suggerisci per i filtri per IE precedenti: funziona solo in parte. Ridimensiona la larghezza dell'immagine in modo corretto, ma il ridimensionamento in altezza va storto non limitandolo a nulla. Più è alta la pagina, così come l'immagine di sfondo .. = (Ho provato questo su IE8. Inoltre, potrebbe essere in ogni modo possibile usare questi comandi 'cover' e in qualche modo renderlo compatibile con cellulari come iPhone? So che c'è il viewport problema, ma potrebbe essere possibile ridimensionare la finestra su tutto lo schermo in modo che lo sfondo venga ridimensionato qui ?? Grazie per le risposte!

3
I filtri specifici di IE non sono soluzioni ideali, quindi sentiti libero di condizionare IE con alternative CSS. Personalmente uso la "cover" CSS3 sul mio sito e funziona bene sui dispositivi iOS, assicurati solo di definire la larghezza del dispositivo.
Clemente,

9
La copertina non allunga il bg. 100% 100% sì.
Neoswf,

Questa soluzione ha funzionato meglio per me dove non volevo allungare l'immagine né in orizzontale né in verticale più della sua risoluzione effettiva. Grazie..!!
Mr. Noddy,

1
NB: A partire da Chromium 78.0.3904.97, non è possibile ridimensionare le immagini svg in modo indipendente lungo ciascun asse. Potrebbe essere necessario ridimensionarlo e convertirlo in un'immagine raster.
Mike,

567

Usa la proprietà CSS 3background-size :

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

Questo è disponibile per i browser moderni, dal 2012.


93
Per preservare le proporzioni dell'immagine dovresti usare "background-size: cover;" o "background-size: contengono;". Ho creato un polyfill che implementa questi valori in IE8: github.com/louisremi/background-size-polyfill
Louis-Rémi il

6
So che ha un anno, ma devo (ridere e) essere d'accordo con la parte dei "browser decenti". Controlla tutti i tuoi browser, ma ho avuto più problemi con IE rispetto a nessuno di essi.
ErocM,

36
Ho dovuto impostare background-size: 100% 100%;per ottenere l'effetto desiderato che stavo cercando, se questo aiuta qualcun altro.
guanome,

1
spiegazione di covere contain su MDN
mohas

2
questo in realtà non funziona. La domanda è riempire il contenitore, il che significa che vogliamo che si allunghi in modo che non si ripeta. Questa risposta, d'altra parte, si ripeterà nella direzione dell'altezza se l'altezza non copre l'area. "Allunga per riempire" significa allungare come devi, quindi non si ripete. La risposta corretta è "copertina" dal basso. Questo in realtà gestisce il caso che non lo fa.
Gman,

171

Il ridimensionamento di un'immagine con CSS non è del tutto possibile, ma un effetto simile può essere ottenuto nel modo seguente, tuttavia.

Usa questo markup:

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

con il seguente CSS:

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

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

e dovresti aver finito!

Per ridimensionare l'immagine in modo che sia "al vivo" e mantenere le proporzioni, è possibile farlo invece:

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

Funziona abbastanza bene! Se una dimensione viene ritagliata, tuttavia, verrà ritagliata su un solo lato dell'immagine, anziché essere uniformemente ritagliata su entrambi i lati (e centrata). L'ho provato su Firefox, Webkit e Internet Explorer 8.


2
Funziona bene ... ma cercava qualcosa di un po 'più robusto (probabilmente con JavaScript) che lo centrasse e si regolasse in base al fatto se l'immagine fosse orizzontale o verticale. Se qualcuno ha una soluzione in tal senso, piacerebbe un collegamento ... grazie!
Brian Armstrong,

4
Nel caso in cui qualcuno fosse interessato, questo sembra funzionare bene: buildinternet.com/project/supersized
Brian Armstrong

1
La centratura orizzontale può essere eseguita con margin: 0 autoon .stretch. Impostando solo widtho height, le proporzioni rimangono invariate. Prova a usare max-widthe max-heighta limitare il fattore di zoom ...
Ronald

1
Questo non funziona per me in ie8 / ie9, ma funziona in ie6 / ie7 (e ovviamente in tutti gli altri browser). In ie8 / ie9, l'immagine appare solo per circa 3/4 del div. Qualcuno ha lo stesso problema?

3
Un difetto con SO: non c'è modo di contrassegnare le risposte che non sono più corrette, portando a persone come @Ullas ad essere fuorviate. È facile ridimensionare gli sfondi in tutti i browser moderni. developer.mozilla.org/en/CSS/background-size
Glenn Maynard

161

Usa l' attributo size-background in CSS3:

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

EDIT: Modernizr supporta il rilevamento del supporto di dimensioni di sfondo . Puoi usare una soluzione alternativa JavaScript scritta per funzionare, ma ne hai bisogno e caricarla in modo dinamico quando non c'è supporto. Ciò manterrà il codice mantenibile senza ricorrere a intrusioni CSS intrusive per alcuni browser.

Personalmente uso uno script per gestirlo usando jQuery, è un adattamento di imgsizer . Dato che la maggior parte dei progetti che uso ora utilizzano la larghezza% per layout fluidi su tutti i dispositivi, c'è un leggero adattamento a uno dei loop (tenendo conto delle dimensioni che non sono sempre al 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: Potresti anche essere interessato a jQuery CSS3 Finaliz [s] e .


3
Solo per sottolineare, Modernizr NON abilita il supporto per le dimensioni dello sfondo nei browser che non lo supportano in modo nativo. Ha solo un comodo test cross-browser per questo. Sta a te falsificarlo quando il test restituisce falso.
Chris Moschini,

34

Prova l'articolo di dimensioni dello sfondo . Se usi tutti i seguenti, funzionerà nella maggior parte dei browser tranne 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%;
} 

1
Grazie! Ciò differisce da "background-size: cover"
Pavel Vlasov,

1
questo ha allungato per me sull'iPad, ma non è stato ridimensionato. grazie per la pubblicazione.
Don Cote,

1
Questo è ottimo per rendere anche lo sfondo ridursi. Grazie!
beingalex,

1
Se l'immagine di sfondo è un file SVG, è necessario specificare anche preserveAspectRatio="none"all'interno del file SVG. Maggiori informazioni su questo qui . Demo qui .
Mentalista,

è possibile utilizzare la dimensione dello sfondo: copertina; allegato-sfondo: fisso; puoi ridimensionarlo
Siraj Ahmed il

15

Non al momento. Sarà disponibile in CSS 3 , ma ci vorrà del tempo prima che venga implementato nella maggior parte dei browser.


2
Grande articolo disponibile su A List Apart: sostituisci questo sfondo, per favore!
jensgram

3
-1 Non penso che questa risposta sia molto pertinente ... e non offre una soluzione di alcun tipo.
Potherca,

1
@Potherca questa risposta era corretta al momento (quasi 3 anni fa).
Eran Galperin,

4
C'è un motivo per cui viene mostrata la data. Dovrebbe essere conservato per riferimenti storici. Stai esaminando tutte le vecchie risposte sul sito e le hai ridimensionate? la risposta è ancora corretta anche se da allora sono state aggiunte ulteriori informazioni. Si noti inoltre che le altre risposte qui affermano sostanzialmente lo stesso (e alcune sono effettivamente errate - affermano che è impossibile). Ho la sensazione che tu abbia scelto questo visto che ha dei voti.
Eran Galperin,

3
No, ho scelto questo perché tutto ciò che fa è dire "Computer dire no" anche se ci sono diverse soluzioni a questo problema anche nel 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;
}

Funziona in:

  • Safari 3+
  • Chrome Qualunque sia +
  • IE 9+
  • Opera 10+ (Opera 9.5 ha supportato la dimensione dello sfondo ma non le parole chiave)
  • Firefox 3.6+ (Firefox 4 supporta la versione con prefisso non vendor)

Inoltre puoi provare questo per una soluzione ie

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

Ringraziamo questo articolo di Chris Coyier http://css-tricks.com/perfect-full-page-background-image/


In che modo è migliore o diverso rispetto alla semplice "dimensione dello sfondo: copertina"?
PKHunter il

@PKHunter, non sono sicuro esattamente di cosa stai parlando. Questo sta usando background-size: covertranne che con i prefissi del browser e una soluzione IE
Blowsie,

8

In una parola: no. L'unico modo per allungare un'immagine è con il <img>tag. Devi essere creativo.

Questo era vero nel 2008, quando è stata scritta la risposta. Oggi supportano i browser moderni background-sizeche risolvono questo problema. Attenzione che IE8 non lo supporta.


6
@Blowsie - Carino. Controlla la data di risposta. Il panorama del browser è leggermente cambiato negli ultimi 5 anni.
Vilx-

5

Definisci "allunga e ridimensiona" ...

Se hai un formato bitmap, generalmente non è fantastico (graficamente parlando) allungarlo e tirarlo su. Puoi usare schemi ripetibili per dare l'illusione dello stesso effetto. Ad esempio, se hai un gradiente che diventa più chiaro verso la parte inferiore della pagina, allora useresti un grafico largo un singolo pixel e della stessa altezza del tuo contenitore (o preferibilmente più grande per tenere conto del ridimensionamento) e quindi affiancalo attraverso il pagina. Allo stesso modo, se il gradiente attraversasse la pagina, sarebbe alto un pixel e più largo del contenitore e ripetuto lungo la pagina.

Normalmente per dare l'illusione che si estenda per riempire il contenitore quando il contenitore cresce o si restringe, si ingrandisce l'immagine rispetto al contenitore. Qualsiasi sovrapposizione non verrebbe visualizzata al di fuori dei limiti del contenitore.

Se vuoi un effetto che si basa su qualcosa di simile a una scatola con bordi curvi, allora attaccheresti il ​​lato sinistro della scatola al lato sinistro del contenitore con una sovrapposizione sufficiente che (entro limiti ragionevoli) non importa quanto sia grande il contenitore, mai si esaurisce lo sfondo e quindi si sovrappone un'immagine del lato destro della scatola con bordi curvi e la si posiziona sulla destra del contenitore. Così quando il contenitore si restringe o cresce, l'effetto della scatola curva sembra ridursi o crescere con esso - in realtà non lo fa, ma dà l'illusione di ciò che sta accadendo.

Per quanto riguarda davvero la riduzione dell'immagine e la crescita con il contenitore, è necessario utilizzare alcuni trucchi di stratificazione per far apparire l'immagine come sfondo e alcuni javascript per ridimensionarla con il contenitore. Non esiste un modo attuale per farlo con CSS ...

Se stai usando la grafica vettoriale, sei fuori dal mio regno di competenza, temo.


Allunga = Cambia le dimensioni xey modificando indipendentemente il rapporto di aspetto dell'immagine, Scala = cambia le dimensioni xey mantenendo proporzionalmente le proporzioni dell'immagine.
Lawrence Dol,

@SoftwareMonkey: come sfondo quindi no, non è possibile modificare l'estensione e la scala nel vero senso dei termini nel CSS diretto. Devi usare vari trucchi CSS per dare l'illusione che questo è ciò che sta accadendo come ho descritto.
BenAlabaster il

4

Questo è quello che ne ho fatto. Nella classe di stiramento, ho semplicemente cambiato l'altezza in auto. In questo modo l'immagine di sfondo ha sempre le stesse dimensioni della larghezza dello schermo e l'altezza avrà sempre le dimensioni giuste.

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

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

2

Aggiungi una background-attachmentlinea:

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

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

2

Vorrei sottolineare che questo equivale a fare:

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

2

Un'altra ottima soluzione per questo è Backstretch di Srobbin che può essere applicato al corpo o a qualsiasi elemento della pagina - http://srobbin.com/jquery-plugins/backstretch/


Nick, ti ​​chiediamo generalmente di fornire le parti salienti nella tua risposta e di fornire un link esterno solo per ulteriori dettagli - questo aiuta le risposte a rimanere utili in caso di link-rot.
Lawrence Dol,

1
Colpa mia. In generale, aggiungi backstretch alla <head> del tuo documento quindi inizializzi in questo modo: $ (". Your-element"). Backstretch ("path / to / image.jpg");
nickff

2

Prova questo

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;
}

1

Un ulteriore suggerimento per il trucco di SolidSmile è il ridimensionamento (ridimensionamento proporzionato) impostando una larghezza e usando auto per l'altezza.

Ex:

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

0

Usa la border-image : yourimageproprietà per impostare l'immagine e ridimensionarla sull'intero bordo dello schermo o della finestra.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.