CSS-Hintergrund dehnen und skalieren

653

Gibt es eine Möglichkeit, einen Hintergrund in CSS zu dehnen oder zu skalieren, um seinen Container zu füllen?

Lawrence Dol
quelle

Antworten:

267

Für moderne Browser können Sie dies erreichen, indem Sie Folgendes verwenden background-size:

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

cover bedeutet, dass das Bild entweder vertikal oder horizontal gestreckt wird, damit es niemals gekachelt / wiederholt wird.

Dies funktioniert für Safari 3 (oder höher), Chrome, Opera 10+, Firefox 3.6+ und Internet Explorer 9 (oder höher).

Probieren Sie dieses CSS aus, damit es mit niedrigeren Versionen von Internet Explorer funktioniert:

filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='.myBackground.jpg', sizingMethod='scale');
-ms-filter: "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='myBackground.jpg', sizingMethod='scale')";
Clement
quelle
2
Zu Clement: Was Sie für Filter für frühere IE vorschlagen, funktioniert nur teilweise. Es skaliert die Bildbreite in Ordnung, aber die Höhenskalierung geht schief, indem es nicht auf irgendetwas beschränkt wird. Je höher die Seite, desto größer das Hintergrundbild. = (Ich habe dies auf IE8 versucht. Und könnte es auch möglich sein, diese 'Cover'-Befehle zu verwenden und dies irgendwie mit Handys wie iPhone kompatibel zu machen? Ich weiß, dass es das Ansichtsfenster gibt Problem, aber könnte es möglich sein, das Ansichtsfenster auf den gesamten Bildschirm so zu skalieren, dass der Hintergrund hier skaliert wird? Vielen Dank für die Antworten!
3
Die IE-spezifischen Filter sind keine idealen Lösungen. Sie können sie also mit CSS-Alternativen für den IE konditionieren. Ich persönlich verwende das CSS3 "Cover" auf meiner eigenen Website und es funktioniert einwandfrei auf iOS-Geräten. Achten Sie nur darauf, die Gerätebreite zu definieren.
Clement
9
Die Abdeckung streckt den BG nicht. 100% 100% ja.
Neoswf
Diese Lösung funktionierte am besten für mich, wenn ich das Bild weder horizontal noch vertikal mehr als die tatsächliche Auflösung strecken wollte. Vielen Dank..!!
Mr. Noddy
1
NB: Ab Chrom 78.0.3904.97 ist es nicht möglich, SVG-Bilder unabhängig voneinander entlang jeder Achse zu skalieren. Möglicherweise müssen Sie es vergrößern und in ein Rasterbild konvertieren.
Mike
567

Verwenden Sie die CSS 3- Eigenschaft background-size:

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

Dies ist seit 2012 für moderne Browser verfügbar.

vinyll
quelle
93
Um das Seitenverhältnis des Bildes beizubehalten, sollten Sie "Hintergrundgröße: Cover" verwenden. oder "Hintergrundgröße: enthalten;". Ich habe eine Polyfüllung erstellt, die diese Werte in IE8 implementiert: github.com/louisremi/background-size-polyfill
Louis-Rémi
6
Ich weiß, dass dies ein Jahr alt ist, aber ich muss (lachen und) dem Teil "anständige Browser" zustimmen. Überprüfen Sie alle Ihre Browser, aber ich hatte mehr Probleme mit dem Internet Explorer als mit jedem anderen.
ErocM
36
Ich musste mich einstellen background-size: 100% 100%;, um den gewünschten Effekt zu erzielen, wenn das jemand anderem hilft.
Guanome
1
Erklärung von coverund contain auf MDN
Mohas
2
das funktioniert eigentlich nicht. Die Frage ist, den Behälter zu füllen , was bedeutet, dass er sich dehnen soll, damit er sich nicht wiederholt. Diese Antwort wird dagegen in Höhenrichtung wiederholt, wenn die Höhe den Bereich nicht abdeckt. "Dehnen, um zu füllen" bedeutet Dehnen, aber Sie müssen, damit es nicht wiederholt wird. Die richtige Antwort lautet "Deckung" von unten. Das behandelt tatsächlich den Fall, dass dies nicht der Fall ist.
Gman
171

Das Skalieren eines Bildes mit CSS ist nicht ganz möglich, ein ähnlicher Effekt kann jedoch auf folgende Weise erzielt werden.

Verwenden Sie dieses Markup:

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

mit folgendem CSS:

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

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

und du solltest fertig sein!

Um das Bild so zu skalieren, dass es "voll beschnitten" ist und das Seitenverhältnis beibehalten wird, können Sie stattdessen Folgendes tun:

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

Es klappt ganz gut! Wenn eine Dimension jedoch zugeschnitten wird, wird sie nur auf einer Seite des Bildes zugeschnitten, anstatt auf beiden Seiten gleichmäßig (und zentriert) zu beschneiden. Ich habe es in Firefox, Webkit und Internet Explorer 8 getestet .

SolidSmile
quelle
2
Das funktioniert gut ... aber ich suchte nach etwas Robusterem (wahrscheinlich mit Javascript), das es auch zentrierte und anpasste, je nachdem, ob das Bild Quer- oder Hochformat war. Wenn jemand eine Lösung in diesem Sinne hat, würde er einen Link lieben ... danke!
Brian Armstrong
4
Falls jemand anderes interessiert ist, schien dies gut zu funktionieren: buildinternet.com/project/supersized
Brian Armstrong
1
Die horizontale Zentrierung kann mit margin: 0 autoon erfolgen .stretch. Wenn Sie nur das widthoder einstellen height, bleibt das Seitenverhältnis gleich. Versuchen Sie, den Zoomfaktor zu verwenden max-widthund max-heightzu begrenzen ...
Ronald
1
Dies funktioniert bei mir in ie8 / ie9 nicht, aber in ie6 / ie7 (und natürlich in allen anderen Browsern). In ie8 / ie9 wird das Bild nur für etwa 3/4 des Div angezeigt. Hat jemand das gleiche Problem?
3
Ein Fehler bei SO: Es gibt keine Möglichkeit, Antworten zu markieren, die nicht mehr korrekt sind, was dazu führt, dass Leute wie @Ullas in die Irre geführt werden. Es ist einfach, Hintergründe in allen modernen Browsern zu skalieren. developer.mozilla.org/en/CSS/background-size
Glenn Maynard
161

Verwenden Sie das Hintergrundgrößenattribut in CSS3:

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

BEARBEITEN: Modernizr unterstützt die Erkennung von Hintergrundgrößen . Sie können eine JavaScript-Problemumgehung verwenden, die für die Arbeit geschrieben wurde, wie Sie sie benötigen, und sie dynamisch laden, wenn keine Unterstützung vorhanden ist. Dadurch bleibt der Code wartbar, ohne dass bestimmte Browser auf aufdringliche CSS-Hacks zurückgreifen müssen.

Persönlich benutze ich ein Skript, um mit jQuery, einer Adaption von imgsizer, damit umzugehen . Da die meisten Designs, die ich jetzt verwende, die Breite% für Fluid-Layouts zwischen Geräten verwenden, gibt es eine geringfügige Anpassung an eine der Schleifen (wobei Größen berücksichtigt werden, die nicht immer 100% sind):

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

BEARBEITEN: Möglicherweise interessieren Sie sich auch für jQuery CSS3 Finaliz [s] e .

Metallhai
quelle
3
Modernizr aktiviert NICHT die Unterstützung der Hintergrundgröße in Browsern, die diese nicht nativ unterstützen. Es hat nur einen praktischen Cross-Browser-Test dafür. Es liegt an Ihnen, es zu fälschen, wenn der Test falsch ist.
Chris Moschini
34

Probieren Sie die Hintergrundgröße des Artikels aus . Wenn Sie alle folgenden Funktionen verwenden, funktioniert dies in den meisten Browsern mit Ausnahme von 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
quelle
1
Vielen Dank! Dies unterscheidet sich von "Hintergrundgröße: Cover"
Pavel Vlasov
1
Das hat sich für mich auf dem iPad ausgedehnt, aber nicht skaliert. Danke fürs posten.
Don Cote
1
Dies ist ideal, um den Hintergrund zu verkleinern. Vielen Dank!
Beingalex
1
Wenn das Hintergrundbild eine SVG ist, muss es auch preserveAspectRatio="none"innerhalb der SVG angegeben werden. Mehr Infos dazu hier . Demo hier .
Mentalist
Sie können Hintergrundgröße verwenden: Abdeckung; Hintergrund-Anhang: behoben; Sie können es skalieren
Siraj Ahmed
15

Derzeit nicht. Es wird in CSS 3 verfügbar sein , aber es wird einige Zeit dauern, bis es in den meisten Browsern implementiert ist.

Eran Galperin
quelle
2
Großartiger Artikel bei A List Apart erhältlich: Übergroße Hintergründe, bitte!
Jensgramm
3
-1 Ich glaube nicht , diese Antwort sehr relevant ist ... und es bietet keine Lösung von jeglicher Art.
Potherca
1
@Potherca diese Antwort war zu der Zeit richtig (vor fast 3 Jahren).
Eran Galperin
4
Es gibt einen Grund, warum das Datum angezeigt wird. Es sollte für historische Referenzen aufbewahrt werden. Gehen Sie alle alten Antworten auf der Website durch und stimmen Sie sie ab? Die Antwort ist immer noch korrekt, auch wenn seitdem weitere Informationen hinzugefügt wurden. Beachten Sie auch, dass andere Antworten hier im Grunde dasselbe aussagen (und einige sind in der Tat falsch - sie sagen, dass es unmöglich ist). Ich habe das Gefühl, dass Sie sich für dieses entschieden haben, da es einige Stimmen hat.
Eran Galperin
3
Nein, ich habe mich für dieses entschieden, da es nur "Computer sagt nein" sagt, obwohl es bereits 2008 mehrere Lösungen für dieses Problem gibt
;-)
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;
}

Arbeitet in:

  • Safari 3+
  • Chrome Was auch immer +
  • IE 9+
  • Opera 10+ (Opera 9.5 unterstützt die Hintergrundgröße, jedoch nicht die Schlüsselwörter)
  • Firefox 3.6+ (Firefox 4 unterstützt nicht vom Hersteller vorangestellte Versionen)

Darüber hinaus können Sie dies für eine dh Lösung versuchen

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

Dank an diesen Artikel von Chris Coyier http://css-tricks.com/perfect-full-page-background-image/

Blowsie
quelle
Wie ist das besser oder anders als nur "Hintergrundgröße: Cover"?
PKHunter
@PKHunter, ich bin mir nicht sicher, worauf Sie sich beziehen. Dies wird verwendet, background-size: coveraußer mit Browser-
Präfixen
8

Mit einem Wort: nein. Die einzige Möglichkeit, ein Bild zu dehnen, ist mit dem<img> Tag. Du musst kreativ sein.

Dies war 2008 der Fall, als die Antwort geschrieben wurde. Heutzutage unterstützen moderne Browser, background-sizedie dieses Problem lösen. Beachten Sie, dass IE8 dies nicht unterstützt.

Vilx-
quelle
6
@Blowsie - Süß. Überprüfen Sie das Antwortdatum. Die Browser-Landschaft hat sich in den letzten 5 Jahren etwas verändert.
Vilx
5

Definieren Sie "Stretch and Scale" ...

Wenn Sie ein Bitmap-Format haben, ist es im Allgemeinen nicht gut (grafisch gesehen), es zu dehnen und herumzuziehen. Sie können wiederholbare Muster verwenden, um die Illusion des gleichen Effekts zu erzeugen. Wenn Sie beispielsweise einen Farbverlauf haben, der am unteren Rand der Seite heller wird, verwenden Sie eine Grafik mit einer Breite von einem Pixel und der gleichen Höhe wie Ihr Container (oder vorzugsweise größer, um die Skalierung zu berücksichtigen) und kacheln Sie sie dann über den Seite. Wenn der Verlauf über die Seite verläuft, ist er ebenfalls ein Pixel hoch und breiter als Ihr Container und wird auf der Seite wiederholt.

Normalerweise machen Sie das Bild größer als den Behälter, um die Illusion zu erzeugen, dass es sich ausdehnt, um den Behälter zu füllen, wenn der Behälter wächst oder schrumpft. Überlappungen werden nicht außerhalb der Grenzen des Containers angezeigt.

Wenn Sie einen Effekt erzielen möchten, der auf einer Box mit gekrümmten Kanten beruht, kleben Sie die linke Seite Ihrer Box auf die linke Seite Ihres Containers mit einer ausreichenden Überlappung, die (innerhalb eines angemessenen Rahmens) unabhängig von der Größe des Containers niemals auftritt Wenn der Hintergrund ausgeht, überlagern Sie ein Bild der rechten Seite des Felds mit gekrümmten Kanten und positionieren es rechts vom Container. Wenn der Behälter schrumpft oder wächst, scheint der Effekt der gekrümmten Box mit ihm zu schrumpfen oder zu wachsen - tatsächlich nicht, aber es gibt die Illusion, dass genau das passiert.

Um das Bild wirklich verkleinern und mit dem Container wachsen zu lassen, müssten Sie einige Überlagerungstricks verwenden, damit das Bild als Hintergrund und Javascript als Größenänderung für den Container erscheint. Derzeit gibt es keine Möglichkeit, dies mit CSS zu tun ...

Wenn Sie Vektorgrafiken verwenden, liegen Sie leider weit außerhalb meines Fachgebiets.

BenAlabaster
quelle
Dehnen = Ändern der x- und y-Dimensionen unabhängig vom Ändern des Seitenverhältnisses des Bildes. Skalieren = Ändern der x- und y-Dimensionen proportional zum Beibehalten des Seitenverhältnisses des Bildes.
Lawrence Dol
@SoftwareMonkey: Als Hintergrund können Sie die Dehnung und Skalierung nicht im wahrsten Sinne des Wortes in reinem CSS ändern. Sie müssen verschiedene CSS-Tricks verwenden, um die Illusion zu vermitteln, dass dies wie beschrieben geschieht.
BenAlabaster
4

Das habe ich daraus gemacht. In der Stretchklasse habe ich einfach die Höhe auf geändert auto. Auf diese Weise hat Ihr Hintergrundbild immer die gleiche Größe wie die Breite des Bildschirms und die Höhe hat immer die richtige Größe.

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

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

Fügen Sie eine background-attachmentZeile hinzu:

#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
quelle
2

Ich möchte darauf hinweisen, dass dies gleichbedeutend ist mit:

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

Eine weitere großartige Lösung hierfür ist Srobbins Backstretch, die auf den Körper oder ein beliebiges Element auf der Seite angewendet werden kann - http://srobbin.com/jquery-plugins/backstretch/

nickff
quelle
Nick, wir bitten Sie im Allgemeinen, die wichtigsten Teile Ihrer Antwort anzugeben und einen externen Link nur für weitere Details anzugeben. Dies hilft, dass die Antworten im Falle von Link-Rot nützlich bleiben.
Lawrence Dol
1
Mein Fehler. Im Allgemeinen fügen Sie dem <head> Ihres Dokuments Backstretch hinzu und initialisieren es dann wie folgt: $ (". Your-element"). Backstretch ("path / to / image.jpg");
Nickff
2

Versuche dies

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
quelle
1

Ein zusätzlicher Tipp für SolidSmiles Cheat ist das Skalieren (die proportionale Größenänderung) durch Festlegen einer Breite und Verwenden von Auto für die Höhe.

Ex:

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

quelle
0

Verwenden Sie die border-image : yourimageEigenschaft, um Ihr Bild festzulegen und bis zum gesamten Rand Ihres Bildschirms oder Fensters zu skalieren.

Natesh bhat
quelle