Anleitung: Größenveränderbares Hintergrund Bild

Avatar of Chris Coyier
Chris Coyier am

DigitalOcean bietet Cloud-Produkte für jede Phase Ihrer Reise. Starten Sie mit 200 $ kostenlosem Guthaben!

Wenn Sie nach einer Möglichkeit suchen, ein VOLLSTÄNDIGES HINTERGRUNDBILD zu erstellen, gehen Sie hierhin.

Mein Freund Richard kam kürzlich mit einer einfachen CSS-Frage zu mir

Gibt es eine Möglichkeit, ein Hintergrundbild größenveränderbar zu machen? Das heißt, den Hintergrund einer Webseite randlos mit einem Bild auszufüllen, unabhängig von der Größe des Browserfensters. Außerdem soll es sich beim Ändern des Browserfensters größer oder kleiner skalieren. Außerdem soll es sein Seitenverhältnis beibehalten (sich nicht seltsam strecken). Außerdem sollen keine Scrollbalken entstehen, sondern vertikal abgeschnitten werden, wenn nötig. Außerdem soll es als Inline- <img>-Tag auf der Seite erscheinen.

Wow, das ist eine hohe Anforderung. Mein erster Gedanke war... äh, nein. Aber natürlich ist das genau die Art von Herausforderung, die ich genieße, also machte ich mich ans Nachdenken. Letztendlich fand ich eine ziemlich gute Lösung und wir machten daraus ein ziemlich nettes kleines Projekt. Schauen Sie sich zuerst das fertige Projekt an, dann zeige ich Ihnen, wie es gemacht wurde.

Fertiges Projekt: Wie ist das Wetter? Offline

resizeablebackgroundimage

Probieren Sie es aus und ändern Sie die Größe Ihres Browserfensters und bemerken Sie, wie sich das Bild anpasst. Es geschieht nicht "on the fly", aber es funktioniert. Es erfüllt auch alle anderen Anforderungen: keine Scrollbalken und beibehält das Pixelverhältnis.

Erster Versuch

Nun, mein erster Gedanke war, dass dies wirklich ein CSS-Hintergrundbild sein muss. Dies füllt den Bildschirm randlos aus, wenn das Bild groß genug ist. Es kann auch zentriert werden, daher dachte ich, dies wäre gut genug. Große Browserfenster zeigen mehr vom Bild und kleinere weniger. Wenn es auf das Body-Tag angewendet wird, füllt dies den Bildschirm gut aus, ohne Scrollbalken. Ziemlich gute Lösung, dachte ich, auch wenn es technisch nicht größenveränderbar ist, da man die Größe eines CSS-Hintergrundbilds nicht festlegen kann. Hier ist, wie ich bei diesem ersten Ansatz vorgegangen bin.

<head>
	....
	<script type="text/javascript" src="js/jquery.js"></script>
	<script type="text/javascript">
	$(document).ready(function() { 
		$("img.source-image").hide();
		var $source = $("img.source-image").attr("src");
		$('#page-body').css({
			'backgroundImage': 'url(' + $source +')',
			'backgroundRepeat': 'no-repeat',
			'backgroundPosition': 'top center'
		});
	}); 
	</script>
</head>
<body id="page-body">
	<img class="source-image" src="images/image.jpg" alt="" />
</body>

Sie haben es erraten, jQuery. Der obige Code blendet das Bild auf der Seite aus, schnappt sich aber sein "src"-Attribut und wendet es als Hintergrund auf das Body-Element an (über seine eindeutige ID "page-body"). Schauen Sie sich ein Beispiel dafür in Aktion an.

 

Zweiter Versuch (besser)

Während der erste Versuch gute Arbeit geleistet hat, hat er auf grundlegendster Ebene versagt: Er war nicht "größenveränderbar". Also Zeit für eine weitere Runde. Um die Größe eines auf dem Bildschirm angezeigten Bildes zu steuern, ohne die Datei selbst zu verändern, muss es mit dem <img>-Tag inline angezeigt werden. Mit dem img-Tag können wir "width"- und "height"-Attribute festlegen, um die Bildgröße zu steuern. Wenn wir die genaue Pixelbreite des Browserfensters erhalten können, können wir diese Zahl im width-Attribut des Bildes verwenden und seine Größe steuern, während das Verhältnis beibehalten wird.

Wir können erneut jQuery und das dimensions plugin verwenden, um die Breite unseres Browserfensters zu ermitteln. Dann verwenden wir diese Zahl, um das width-Attribut des Bildes festzulegen, dem wir einen eindeutigen Klassennamen "source-image" geben. Wir müssen dies tun, sobald der DOM bereit ist, damit es geschieht, bevor das Bild überhaupt zu laden beginnt. Wir können dies auch (FTW) jederzeit tun, wenn das Fenster resized wird. Hier ist, wie es funktioniert.

<script type="text/javascript" src="/js/jquery.js"></script>
<script type="text/javascript" src="/js/jquery.dimensions.js"></script>
<script type="text/javascript">
	$(document).ready(function() { 
		var $winwidth = $(window).width();
		$("img.source-image").attr({
			width: $winwidth
		});
		$(window).bind("resize", function(){ 
			var $winwidth = $(window).width();
			$("img.source-image").attr({
				width: $winwidth
			});
		 });
	}); 
</script>

Damit dieses Inline-Bild sich mehr wie ein Hintergrundbild verhält, können wir diese eindeutige Klasse, die wir angewendet haben, verwenden, um eine absolute Positionierung vorzunehmen.

img.source-image {
	position: absolute;
	top: 0;
	left: 0;
}

Aufgrund dieser absoluten Positionierung muss alles, was Sie darüber legen möchten, ebenfalls eine Positionierung und einen höheren z-index-Wert haben. Wenn Ihr Quellbild besonders hoch ist oder Ihr Browserfenster besonders breit ist, kann das Bild leicht höher als Ihr Browserfenster werden und einen vertikalen Scrollbalken erzwingen. Um dies zu verhindern, setzen Sie einfach den overflow-Wert auf Ihrem body auf hidden.

body {
  overflow: hidden;
}

Dritter Versuch (am besten)

Vergessen Sie diese JavaScript-Sache! Dank Anders' Kommentar, der auf Stu Nicholls Version hinwies, hier ist ein noch besserer Weg, dies ohne jegliches JavaScript zu handhaben!

Da wir bereits eine eindeutige Klasse auf dem Bild haben, das Bild absolut positioniert ist und das Scrollbalkenproblem bereits gelöst ist, lassen Sie uns einfach die Breite mit einem Prozentsatz direkt in CSS festlegen.

#img.source-image {
  width: 100%;
  position: absolute;
  top: 0;
  left: 0;
}

Sehen Sie eine Demo davon in Aktion. Dies ist die bisher beste Lösung, da die Größenänderung "on the fly" für ein schönes flüssiges Gefühl erfolgt und keinerlei JavaScript erfordert.

Mehr über WhatsTheWeather.net

Ich habe nur das einfache Design für Wie ist das Wetter gemacht (Update Nov 2013: jetzt offline), aber Richard hat die ganze coole Programmierung gemacht, damit es funktioniert. Soweit ich weiß, ist es eine Kette von 3 verschiedenen APIs. Zuerst holt es Ihre IP-Adresse und wandelt sie über eine API in eine Stadt und einen Bundesstaat um. Dann verwendet es eine Wetter-API, um das aktuelle Wetter zu ermitteln. Dann verwendet es die Flickr-API, um ein zufälliges Bild mit Tags zu finden, die dem Wetter entsprechen. Wenn es Ihre Postleitzahl nicht abrufen kann, wird es Sie danach fragen, wie auf dem iPhone (was es auch automatisch erkennt und etwas anders handhabt). Alles gemacht mit Ruby on Rails. Ziemlich schicke Tanzerei!