L'immagine di sfondo CSS per adattarsi alla larghezza, l'altezza dovrebbe ridimensionarsi automaticamente in proporzione


365

io ho

body {
    background: url(images/background.svg);
}

L'effetto desiderato è che questa immagine di sfondo abbia una larghezza uguale a quella della pagina, l'altezza cambia per mantenere la proporzione. ad esempio, se l'immagine originale risulta essere 100 * 200 (qualsiasi unità) e il corpo è largo 600 px, l'immagine di sfondo dovrebbe finire per essere alta 1200 px. L'altezza dovrebbe cambiare automaticamente se la finestra viene ridimensionata. È possibile?

Al momento, sembra che Firefox stia adattando l'altezza e quindi regolando la larghezza. È forse perché l'altezza è la dimensione più lunga e sta cercando di evitare il ritaglio? Io voglio ritagliare in verticale, quindi scorrere: nessuna ripetizione orizzontale.

Inoltre, Chrome sta posizionando l'immagine al centro, nessuna ripetizione, anche quando background-repeat:repeatviene data esplicitamente, che è comunque l'impostazione predefinita.


2
Does html, body { height: 100%; }aiuto? Inoltre, tosse .
tredici,

non funziona su Chrome Google
simon il

Risposte:


810

Esiste una proprietà CSS3 per questo, vale a dire background-size( controllo di compatibilità ). Mentre uno può impostare i valori di lunghezza, di solito viene utilizzato con i valori speciali containe cover. Nel tuo caso specifico, dovresti usare cover:

body {
    background-image:    url(images/background.svg);
    background-size:     cover;                      /* <------ */
    background-repeat:   no-repeat;
    background-position: center center;              /* optional, center the image */
}

Eggsplanation per containecover

Ci scusiamo per il brutto gioco di parole , ma userò l' immagine del giorno di Biswarup Ganguly per dimostrazione. Diciamo che questo è il tuo schermo e che l'area grigia è fuori dallo schermo visibile. Per dimostrazione, assumerò un rapporto 16x9.

schermo

Vogliamo usare l'immagine del giorno di cui sopra come sfondo. Tuttavia, abbiamo ritagliato l'immagine su 4x3 per qualche motivo. Potremmo impostare la background-sizeproprietà su una lunghezza fissa, ma ci concentreremo su containe cover. Si noti che presumo anche che non abbiamo alterato la larghezza e / o l'altezza di body.

contain

contain

Ridimensiona l'immagine, mantenendo le proporzioni intrinseche (se presenti), alla dimensione massima in modo che sia la sua larghezza che la sua altezza possano adattarsi all'interno dell'area di posizionamento dello sfondo.

Questo si assicura che l'immagine di sfondo sia sempre completamente contenuta nell'area di posizionamento dello sfondo, tuttavia, background-colorin questo caso potrebbe esserci dello spazio vuoto riempito con il tuo :

contenere

cover

cover

Ridimensiona l'immagine, preservando le proporzioni intrinseche (se presenti), alla dimensione più piccola in modo tale che sia la sua larghezza che la sua altezza possano coprire completamente l'area di posizionamento dello sfondo.

Questo si assicura che l'immagine di sfondo copra tutto. Non sarà visibile background-color, tuttavia, a seconda del rapporto dello schermo, gran parte dell'immagine potrebbe essere tagliata:

copertina

Dimostrazione con codice attuale

div > div {
  background-image: url(http://i.stack.imgur.com/r5CAq.jpg);
  background-repeat: no-repeat;
  background-position: center center;
  background-color: #ccc;
  border: 1px solid;
  width: 20em;
  height: 10em;
}
div.contain {
  background-size: contain;
}
div.cover {
  background-size: cover;
}
/********************************************
 Additional styles for the explanation boxes 
*********************************************/

div > div {
  margin: 0 1ex 1ex 0;
  float: left;
}
div + div {
  clear: both;
  border-top: 1px dashed silver;
  padding-top:1ex;
}
div > div::after {
  background-color: #000;
  color: #fefefe;
  margin: 1ex;
  padding: 1ex;
  opacity: 0.8;
  display: block;
  width: 10ex;
  font-size: 0.7em;
  content: attr(class);
}
<div>
  <div class="contain"></div>
  <p>Note the grey background. The image does not cover the whole region, but it's fully <em>contained</em>.
  </p>
</div>
<div>
  <div class="cover"></div>
  <p>Note the ducks/geese at the bottom of the image. Most of the water is cut, as well as a part of the sky. You don't see the complete image anymore, but neither do you see any background color; the image <em>covers</em> all of the <code>&lt;div&gt;</code>.</p>
</div>


Questo è esattamente quello che voglio, grazie. Non sembra funzionare in Chrome (o Chromium, almeno) - hai qualche idea brillante?
spruzzo

Secondo quirksmode.org/css/contents.html#t44 dovrebbe funzionare in Chrome senza alcun prefisso. Tuttavia, hai provato il -webkit-prefisso?
Zeta,

4
La risposta di Yauhen (in fondo a questa pagina) era proprio quello che stavo cercando:background-size: contain
Danny Beckett,

1
@DannyBeckett: Anche se questo è possibile, non è quello che l'OP stava cercando: "Voglio ritagliare verticalmente, quindi scorrere: nessuna ripetizione orizzontale".
Zeta,

3
containè come zoom fit. coverè come riempimento zoom. containregola le dimensioni dell'immagine in modo che corrispondano alla dimensione più grande tra larghezza e altezza. coverregola le dimensioni dell'immagine in modo che corrispondano alla dimensione più piccola tra larghezza e altezza.
ahnbizcad,

39

Sulla base dei suggerimenti di https://developer.mozilla.org/en-US/docs/CSS/background-size finisco con la seguente ricetta che ha funzionato per me

body {
        overflow-y: hidden ! important;
        overflow-x: hidden ! important;
        background-color: #f8f8f8;
        background-image: url('index.png');
        /*background-size: cover;*/
        background-size: contain;
        background-repeat: no-repeat;
        background-position: right;
}

3
Anche se ho usato background-position: center;, questo ha funzionato meglio per me che backgound-size: cover;.
Nate,

Posso sapere perché abbiamo bisogno della overflow-y: hiddenparte?
Nam G VU,

11

Non sono sicuro di cosa stai cercando esattamente, ma dovresti davvero dare un'occhiata a questi eccellenti post sul blog scritti da Chris Coyier da CSS-Tricks:

http://css-tricks.com/how-to-resizeable-background-image/

http://css-tricks.com/perfect-full-page-background-image/

Leggi le descrizioni per ciascuno degli articoli e vedi se sono quello che stai cercando.

Il primo risponde alla seguente domanda:

C'è un modo per rendere ridimensionabile un'immagine di sfondo? Come in, riempire lo sfondo di una pagina Web da bordo a bordo con un'immagine, indipendentemente dalle dimensioni della finestra del browser. Inoltre, ridimensionalo più o meno quando la finestra del browser cambia. Inoltre, assicurati che mantenga il suo rapporto (non si allunga in modo strano). Inoltre, non provoca barre di scorrimento, se necessario è sufficiente tagliare verticalmente. Inoltre, entra nella pagina come tag incorporato.

L'obiettivo del secondo post è quello di ottenere quanto segue, "un'immagine di sfondo su un sito Web che copra sempre l'intera finestra del browser".

Spero che sia di aiuto.


8

L'immagine di sfondo non è impostata come perfetta, quindi il suo CSS è un problema di creazione, quindi il suo file CSS cambia nel codice sottostante

html {  
  background-image: url("example.png");  
  background-repeat: no-repeat;  
  background-position: 0% 0%;
  background-size: 100% 100%;
}

%; dimensione dello sfondo: 100% 100%; "


7

Prova questo,

element.style {
    background: rgba(0, 0, 0, 0) url("img/shopping_bgImg.jpg") no-repeat scroll center center / cover;
}


3
body{
    background-image: url(../url/imageName.jpg);
    background-attachment: fixed;
    background-size: auto 100%;
    background-position: center;
}

12
descrivi esattamente qual è il problema e come lo risolvi, per favore non incollare un mucchio di codice qui senza spiegazioni.
Siavash,

2

Ho avuto lo stesso problema, impossibile ridimensionare l'immagine durante la regolazione delle dimensioni del browser.

Codice errato:

html {  
  background-color: white;  
  background-image: url("example.png");  
  background-repeat: no-repeat;  
  background-attachment: scroll;  
  background-position: 0% 0%;
}


Buon codice:

html {  
  background-color: white;  
  background-image: url("example.png");  
  background-repeat: no-repeat;  
  background-attachment: scroll;  
  background-position: 0% 0%;
  background-size: contain;
}

La chiave qui è l'aggiunta di questo elemento -> background-size: contengono;



-3

L'impostazione della dimensione dello sfondo non aiuta, la seguente soluzione ha funzionato per me:

.class {
    background-image: url(blablabla.jpg);
    /* Add this */
    height: auto;
}

Fondamentalmente ritaglia l'immagine e la rende adatta, background-size: contain/coverma non la adatta.

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.