17.032014

Ladegrafik mit CSS

Problem

Vor kurzem bin ich in die Situation gekommen das ich eine Ladegrafik (Throbber) auf einem dunklen Hintergrund anzeigen musste. Da es sich ein animiertes Bild handelt, liegt nahe dafür ein Gif zu verwenden, das Problem hierbei ist aber der fehlende Alpha-Kanal für halb-Transparenz. Egal wie gut man die Grafik ausarbeitet, es bleiben immer "ausgefranzte", weiße Ränder:

load

 

Lösung

Diesem Problem kann man mit modernen Webtechniken, in diesem Fall CSS3 begegnen. Wir verwenden eine PNG-Grafik, welche den Alpha-Kanal unterstützt und erzeugen die Bewegung mit CSS3-Animations. Für ältere Browser (Internet Explorer) gibt es als Fallback-Lösung, es wird  einfach das etwas hässlichere Gif angezeigt.

Umsetzung

Wir verwenden ein div, welches als Standardwert erstmal das Gif als Hintergrundgrafik bekommt:

 HTML

<div class="loader"></div>

CSS

 div.loader {
	height: 100px;
	width: 100px;
	background: url(http://www.joocom.de/wp-content/uploads/icon_loader_round_big_grew.gif) no-repeat 0 0 transparent;
}

Ergebnis

icon_loader_round_big_grew

 

Den CSS überschreiben wir jetzt mit einer Regel die von allen modernen Browsern, die auch CSS-Animation beherrschen, interpretiert wird. Die Animation habe ich "rotate" getauft und sie läuft unendlich (infinite). Sie muss leider noch mit Browser-Prefixen erstellt und definiert werden. Dies kann aber auch durch ein less oder sass Mixin verschönert werden:

Grafik

icon_loader_round_big_grew

CSS

div.loader:not(:required) {
	background-image: url(http://www.joocom.de/wp-content/uploads/icon_loader_round_big_grew.png);
	-webkit-animation: rotate .5s infinite linear;
	-moz-animation: rotate .5s infinite linear;
	-ms-animation: rotate .5s infinite linear;
	-o-animation: rotate .5s infinite linear;
	animation: rotate .5s infinite linear;
}

@-webkit-keyframes rotate {
	from {
		-webkit-transform: rotate(0deg);
	}
	to {
		-webkit-transform: rotate(360deg);
	}
}

@-moz-keyframes rotate {
	from {
		-moz-transform: rotate(0deg);
	}
	to {
		-moz-transform: rotate(360deg);
	}
}

@-ms-keyframes rotate {
	from {
		-ms-transform: rotate(0deg);
	}
	to {
		-ms-transform: rotate(360deg);
	}
}

@-o-keyframes rotate {
	from {
		-o-transform: rotate(0deg);
	}
	to {
		-o-transform: rotate(360deg);
	}
}

@keyframes rotate {
	from {
		transform: rotate(0deg);
	}
	to {
		transform: rotate(360deg);
	}
}

Das Endergebnis

Den ganzen Code findet ihr auch bei jsfiddle.