Ich habe einige Fortschrittsbalken erstellt. Sie sehen so aus

Sie verwenden keine Bilder, nur CSS3-Spielereien. Wie ein guter kleiner Designer es immer tut, fallen sie auf ein absolut akzeptables Erlebnis zurück. Hier sehen sie in Opera 11 aus, der einige der hier verwendeten CSS3-Funktionen unterstützt, aber nicht alle.

Wie Sie sich vorstellen können, sehen sie in Browsern, die überhaupt keine CSS3 unterstützen, ähnlich wie oben aus, nur noch weiter vereinfacht.
UPDATE: Es ist eine Weile her. Dieser Artikel wurde ursprünglich 2011 verfasst und 2015, und jetzt wieder 2021 aktualisiert. Diesmal erstelle ich nur das Demo und den Pen und entferne viel von dem Vendor-Prefix-Kram, der nicht mehr benötigt wird. Semantisch gesehen sind Sie wahrscheinlich besser dran, sich die Elemente <progress> und <meter> anzusehen.
HTML-Basis
Der Balken selbst wird ein <div> mit der Klasse meter sein. Darin befindet sich ein <span>, der als „gefüllter“ Bereich des Fortschrittsbalkens fungiert. Dies wird mit einem Inline-Stil gesetzt. Es ist das Markup, das weiß, wie weit ein Fortschrittsbalken gefüllt werden soll, daher ist dies ein Fall, in dem Inline-Stile perfekt Sinn ergeben. Die CSS-Alternative wäre, Klassen wie „fill-10-percent“, „fill-one-third“ oder ähnliches zu erstellen, was aufwendiger und weniger flexibel ist.
Das Grundlegende
<div class="meter">
<span style="width: 25%"></span>
</div>
Beginn von CSS
Der Div-Wrapper ist die Spur des Fortschrittsbalkens. Wir setzen keine Breite, sodass er sich als Blockelement so breit wie sein Elternteil dehnt. Das könnten Sie aber tun. Die Höhe ist ebenfalls beliebig. Sie ist hier auf 20px eingestellt, könnte aber auch alles andere sein. Wir runden die Ecken in so vielen Browsern wie möglich ab und setzen einen Innenabstandsschattierung, um ihm einen Hauch von Tiefe zu verleihen.
.meter {
height: 20px; <em>/* Can be anything */</em>
position: relative;
background: #555;
border-radius: 25px;
padding: 10px;
box-shadow: inset 0 -1px 1px rgba(255, 255, 255, 0.3);
}
Der Span darin wird der Füllteil des Fortschrittsbalkens sein. Wir lassen ihn als Block mit 100% Höhe anzeigen, sodass er sich anpasst, egal wie viel Platz er hat. Wir verwenden dann eine Menge CSS3, um ihm einen Gradienten-Look zu verleihen und seine Ecken abzurunden.
.meter > span {
display: block;
height: 100%;
border-top-right-radius: 8px;
border-bottom-right-radius: 8px;
border-top-left-radius: 20px;
border-bottom-left-radius: 20px;
background-color: rgb(43,194,83);
background-image: linear-gradient(
center bottom,
rgb(43,194,83) 37%,
rgb(84,240,84) 69%
);
box-shadow:
inset 0 2px 9px rgba(255,255,255,0.3),
inset 0 -2px 6px rgba(0,0,0,0.4);
position: relative;
overflow: hidden;
}
Das ist das Grundlegende.
Andere Farben
Wir machen es so einfach wie möglich, die Farbe zu ändern. Fügen Sie einfach einen Klassennamen wie „orange“ oder „red“ zum Div-Wrapper hinzu und die Farbe wird überschrieben.
.orange > span {
background-color: #f1a165;
background-image: linear-gradient(to bottom, #f1a165, #f36d0a);
}
.red > span {
background-color: #f0a3a3;
background-image: linear-gradient(to bottom, #f0a3a3, #f42323);
}
Kandystriping
Wir können einen coolen gestreiften Effekt erzielen, indem wir ein weiteres Element über diesen Span legen und einen wiederholten CSS3-Gradienten darüber legen. Semantisch lässt sich dies am besten mit einem Pseudoelement erreichen, also machen wir es auf diese Weise. Wir positionieren es absolut über den exakten Bereich des Spans (der bereits relativ positioniert ist) und runden die Ecken gleichmäßig, damit die Streifen nicht seltsam hervorstehen.
.meter > span:after {
content: "";
position: absolute;
top: 0; left: 0; bottom: 0; right: 0;
background-image: linear-gradient(
-45deg,
rgba(255, 255, 255, .2) 25%,
transparent 25%,
transparent 50%,
rgba(255, 255, 255, .2) 50%,
rgba(255, 255, 255, .2) 75%,
transparent 75%,
transparent
);
z-index: 1;
background-size: 50px 50px;
animation: move 2s linear infinite;
border-top-right-radius: 8px;
border-bottom-right-radius: 8px;
border-top-left-radius: 20px;
border-bottom-left-radius: 20px;
overflow: hidden;
}
Diese Idee habe ich zuerst bei Lea Verou gesehen und übernommen.
Animierte Kandystripes
Nur Firefox 4 kann Pseudoelemente animieren, und nur WebKit kann Keyframe-Animationen durchführen. Wir stecken also leider in der Klemme, was die Animation dieser Streifen angeht. Wenn wir uns dafür entscheiden, fügen wir einen zusätzlichen Span hinzu und animieren dann diesen mit WebKit.
<div class="meter animate">
<span style="width: 50%"><span></span></span>
</div>
Der Span wird exakt derselbe sein wie das Pseudoelement, also verwenden wir einfach die gleichen Werte…
.meter > span:after, .animate > span > span {
… und vermeiden doppelte Angaben
.animate > span::after {
display: none;
}
Wir bewegen die Hintergrundposition um die Größe davon
@keyframes move {
0% {
background-position: 0 0;
}
100% {
background-position: 50px 50px;
}
}
Und das nennen wir Animation
.meter > span::after, .animate > span > span {
animation: move 2s linear infinite;
}
Wir können die Animation auch an das Pseudoelement binden, sodass sie funktioniert, sobald WebKit dies unterstützt.
Animation der gefüllten Breite
Leider kann man nicht auf eine automatische oder natürliche Breite animieren, was uns vielleicht erlauben würde, von einem erzwungenen Nullpunkt zum Inline-Stil zu animieren.
@keyframes expandWidth {
0% { width: 0; }
100% { width: auto; }
}
Update 25.01.2012: Es stellt sich heraus, dass man kann zu einem Inline-Stil animieren. Lassen Sie einfach den „to“- oder „100%“-Endwert in den @keyframes weg.
Ich habe es an die Bug-Tracker der großen Browser gesendet, um es ein wenig voranzutreiben, aber vorerst ist es nicht unterstützt. Stattdessen machen wir es mit jQuery. Messen Sie die ursprüngliche Breite, zwingen Sie sie auf Null und animieren Sie dann wieder nach oben.
$(".meter > span").each(function() {
$(this)
.data("origWidth", $(this).width())
.width(0)
.animate({
width: $(this).data("origWidth") // or + "%" if fluid
}, 1200);
});
Andere Ansätze
- Galen Gidmans ähnlicher Ansatz
- David Turners zwei Ideen
- Eine lustige reale Implementierung von Siebird
HEY?! Was ist mit HTML5?
Alter Kumpel. HTML5 hat spezielle Funktionen dafür. <progress> und <meter>! Ja, das stimmt, aber hier ist der Haken. Diese Elemente haben bereits ein sehr spezifisches Aussehen. Standardmäßig sehen sie wie Fortschrittsbalken aus, die anderswo auf der Plattform, auf der Sie sich befinden, verwendet werden. Zum Beispiel hier auf Mac

Sie können diese Standardformatierung so deaktivieren
progress {
-webkit-appearance: none;
}
Damit können Sie das glänzende Aussehen der Standardformatierung entfernen, aber Sie können immer noch nur begrenzt viel tun. Sie können den Fortschrittsbalken im Inneren so ändern
progress::-webkit-progress-bar-value {
-webkit-appearance: none;
background: orangered;
}
... und auch damit sind die Möglichkeiten danach recht begrenzt. Um es noch schlimmer zu machen, sind die Dinge in den verschiedenen Browsern sehr unterschiedlich, sogar zwischen verschiedenen WebKit-Browsern. Pseudoelemente funktionieren ebenfalls inkonsistent. Ich hasse es, die Dinge so hängen zu lassen, aber das ist wirklich ein Thema für eine andere Zeit. Sagen wir einfach, für diese speziellen Fortschrittsbalken ist die Div/Span-Lösung vorerst die beste.
Wow, die sind super!
Die abgerundeten Ecken für die Container scheinen in Chrome/XP fehlerhaft zu sein.
Chrome hat einen Fehler, wenn Sie einen „inset“-Box-Schatten zusammen mit einem Border-Radius verwenden. Siehe http://code.google.com/p/chromium/issues/detail?id=128
Weiß jemand eine Umgehungslösung dafür?
Danke, das wird nützlich sein, cool
Ich wollte nur einen Kommentar hinterlassen, um Ihnen für die Erwähnung meiner eigenen Versuche, Fortschrittsbalken zu erstellen, zu danken.
Ich habe festgestellt, dass jQuery derzeit der einzige Weg ist, Dinge in Bezug auf den Fortschritt zu animieren, aber CSS3 wäre wirklich ein viel schönerer Weg, dies zu tun, sobald die Browserunterstützung dies zulässt.
Hallo David,
Ich habe heute Morgen ein kleines Mockup mit CSS3 für dieses Fortschrittsbalken-Beispiel erstellt.
Schauen Sie es sich hier an: http://www.albybarber.com/css3
** Funktioniert nur in -webkit- Browsern.
Hallo, ich habe eine Website http://www.jkrt.org
möchte eine Linkfreundschaft mit Ihrer Website eingehen
Sie haben meine Fortschrittsbalken vorgestellt! Wie cool!
Lustiges CSS3-Tutorial, aber ich weiß nicht, wo ich es zeigen kann.
Schön, schön, schön!! Ich weiß nicht viel darüber, also ist das cool!! Ein gut konstruierter Fortschrittsbalken macht mich an.
Sehr schöne Ergebnisse
aw aw aw... so glatt... gute Farbe
Coole Farben. Danke fürs Teilen.
Hallo Chris,
Danke, dass Sie meine Implementierung gepostet und den Retweet von neulich! Ich schätze all Ihre harte Arbeit, ich habe in den letzten Jahren viel von Ihnen gelernt. Prost!
Sehr cool. Danke!
Das ist der Hammer! Gute Arbeit Chris!
Ich wollte nur sagen, dass direkt unter dem Absatz nach der Überschrift „HTML-Basis“ ein hervorgehobener
spanstehen sollte, der nicht erscheint (zumindest unter Chrome, Win XP).Danke, behoben.
Die border-radius-Eigenschaften können zu Kurzschrift zusammengefasst werden. Nur Safari <5 und iOS <3 (vor WebKit 532.5) haben Probleme mit einzigartigen Eckradien.
Das kann also werden
und wenn Sie iOS 3.1 und Saf4-Unterstützung wünschen
Sie können das oben hinzufügen.
Es ist auch kein border-radius auf dem Pseudoelement / verschachtelten Span nötig, da overflow auf hidden auf dem „Eltern“-Element gesetzt ist.
Das stimmt leider nicht ganz, Nicolas. Wenn Sie hidden overflow beibehalten, aber border radiusii ausschalten, bekommen Sie Überstände. Siehe: http://cl.ly/4rTw Ich würde das als Fehler bezeichnen.
Ich denke, es wäre besser, wenn der Fortschrittsbalken 100% erreicht, dass sich sein rechtes Ende abrunden kann (genau wie das linke Ende) anstatt eines Quadrats mit abgerundeten Ecken.
Wunderbar!!
Danke!
Wow Chris, pures Genie, ich mag es wirklich!
Gibt es eine Möglichkeit, die Animation zu verlangsamen?
vergessen Sie es! War ein Narr und habe den Wert in JS reduziert, anstatt ihn zu erhöhen.
Hey Bro, wie hast du das gemacht? Bitte lass es mich wissen :) Ich kann das nicht :p
(Ich scheine auf der mobilen Website keine Antworten auf andere geben zu können)
@Paul, hat sich die Border-Radius-Spezifikation geändert? Es war schon immer so, dass mehrere Werte elliptische Ecken erzeugten (obwohl ich persönlich nie verstanden habe, warum sie es auf diese Weise taten).
Warum ist in diesem Beispiel die Notwendigkeit für verschiedene Eckradien gegeben? Sollten nicht alle 4 Ecken gleich sein?
großartig
Kann der border-radius zunehmen, während sich der Balken dem Ende nähert?
Der HTML-Teil dieses Quellcodes ist nicht W3C-konform (XHTML - HTML5). Sie können das style-Attribut nicht auf einem Element angeben, es muss im Stylesheet stehen.
Gute Verwendung von CSS, in jedem Fall sieht das Endergebnis fantastisch und vollständig skalierbar aus.
Nico
Ich habe mit Fortschrittsbalken herumgespielt und eine lustige Sache erfunden, um den Fortschrittsbalken zu markieren, der 100% erreicht hat.
Wenn Sie Prozente zur Angabe der Breite verwenden
.meter > span[style*="100"] { background: gray}
oder wenn Sie die Breite mit Pixeln angeben
.meter > span[style*="470"] { background: gray}
natürlich ist dieser Selektor anfällig für Zahlen, die in anderen Inline-Stilen vorkommen, also verwenden Sie ihn mit Vorsicht.
Das ist wirklich cool! Ich dachte immer, dass das Laden von Bildern oder Sequenzen eine Art Programmierung ist. Es war wie eine Wissenschaft, die ich nicht verstanden habe oder so.
Es ist schön, wenn es für Dummköpfe erklärt wird! Danke
OMG,
Das ist großartig, Chris.
Ich dachte, ich wüsste ein bisschen über CSS, aber ich schätze, ich weiß gar nichts darüber :P
Ich wünsche Ihnen bessere Jobs ^_^
Das sind gute Nachrichten für mein WordPress (Stil)
Während all dieser Kram super cool ist, werden sie nicht verwendet, bis CSS3 und HTML5 ein Standard geworden sind. Ich wünschte, wir könnten ein paar Jahre in Bezug auf HTML-Standards vorspringen... es gibt immer noch zu viele Leute, die IE7/IE8 verwenden. AGGGHH
Sehr cool, aber du musst die Animation andersherum laufen lassen, Mann! So sieht der Fortschrittsbalken aus, als ob er mehr Fortschritt macht, als er tatsächlich macht! So sieht er langsamer aus.
Hervorragende Arbeit geleistet. Kann leicht verwendet werden
Ich habe den Code etwas angepasst. Ich habe einen Span zum Markup hinzugefügt, der die Prozentzahl enthält.
<div class="meter-wrapper">
<div class="meter"><span style="width:35%"></span></div>
<span class="progress">35%</span>
</div>
Der Fortschrittsspan wird beim Laden der Seite ausgeblendet und dann eingeblendet, wenn die Balkenanimation beendet ist.
Ich musste auch, dass der Fortschrittsbalken mit dem Container mitgrößert, wenn das Browserfenster vergrößert wird. jQuery's width() gibt nur px zurück, also brauchte ich eine kleine Umgehung.
jQuery('.meter-wrapper .progress').hide();
jQuery(".meter > span").each(function() {
var w = ( 100 * parseFloat(jQuery(this).css('width')) / parseFloat(jQuery(this).parent().css('width')) ) + '%';
jQuery(this).width('0%').animate({width: w}, 1200, function() { jQuery('.meter-wrapper .progress').fadeIn(); } );
});
Wirklich tolle Arbeit! Und danke fürs Teilen...
Sieht in Firefox 3 jedoch schlecht aus.
Mir gefällt sehr gut, wie das aussieht und funktioniert! Danke.
Ich wollte nur ein kurzes Dankeschön sagen – das ist ausgezeichneter funktionierender Code und hat ein großes Problem von mir einfach gelöst! Ich bin so zufrieden und glücklich über die Open-Source-Informationen.
jenn.e.
Hallo Chris…. Ich versuche, diese Balken in meinem Admin-Panel-CMS zu verwenden. Jedenfalls will ich sie verstecken (display:none;) & sie mit jQuery fadeIn anzeigen. Wenn ich es versuche, bemerke ich, dass die Breite der Balken nicht genau übernommen wird. Bitte helfen Sie mir. Hier ist mein Code.
CSS =>
Jquery =>
Html =>
Ich habe eine gültige browserübergreifende Lösung für das Meter-Element (würde auch für Progress funktionieren).
Nehmen Sie eine Bildschirmaufnahme eines 100% Meter (oder Fortschrittsbalken) in FireFox auf. Schneiden Sie es in Photoshop zu, um meter.png zu erstellen.
Dann
$meterValue = 90;
$meterOffset = $meterValue – 100;
<meter style="border:solid 1px #000;display:inline-block;width:84px;height:17px;background:url("img/meter.png") no-repeat scroll transparent -'.$meterOffset.'px 0px;" title="liked '.$meterValue.'% by users" value="'.$meterValue.'" min="0" max="100">'.$meterValue.'%</meter>Tada!
Entschuldigung…. es ist wichtig, Ihr Meter auf 100px zu setzen, damit es richtig verschoben wird. Schade, dass man keine negativen Prozente verwenden kann, sonst wäre es egal.
Äh, weil das CSS inline ist, entweder die doppelten Anführungszeichen um das Hintergrundbild weglassen oder einfache Anführungszeichen verwenden.
Hallo, erstaunlicher Trick! Danke, dass Sie ihn teilen. Das ist fast das, wonach ich gesucht habe.
Ich versuche, noch zwei Dinge zu tun, weiß aber nicht, ob das mit diesem Ansatz möglich ist.
1) Ich möchte ein Bild mit Transparenz über den Hintergrund legen. Aber ohne Erfolg. Stellen Sie sich ein leeres Bierglas im PNG-Format vor, registriert mit Transparenz aus Illustrator, sodass der Inhalt des Glases leer ist. Ich träume davon, das Glas zum Beispiel zu 30% mit dem animierten Hintergrund zu füllen. Dazu sollte das Bild oben liegen und die Hintergrundfarbe dahinter, um das Glas zu füllen. Ist das möglich?
2) Ist es auch möglich, den Hintergrund von unten nach oben im Div wachsen zu lassen, anstatt von links nach rechts, wie in Ihrem Beispiel?
Vielen Dank (und entschuldigen Sie meine schlechte englische Sprache...) ;-)
Coole Farben. Danke fürs Teilen.