Movatterモバイル変換


[0]ホーム

URL:


  1. Web
  2. CSS
  3. Reference
  4. Values
  5. progress()

Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten.Erfahre mehr über dieses Experiment.

View in EnglishAlways switch to English

progress()

Limited availability

This feature is not Baseline because it does not work in some of the most widely-used browsers.

Experimentell:Dies ist eineexperimentelle Technologie
Überprüfen Sie dieBrowser-Kompatibilitätstabelle sorgfältig vor der Verwendung auf produktiven Webseiten.

Dieprogress()CSSFunktion gibt einen<number> Wert zurück, der die Position eines Werts (des Fortschrittswerts) relativ zu zwei anderen Werten (dem Fortschrittsstart- und Ende-Wert) darstellt.

Syntax

css
/* With fixed progress value */progress(300, 0, 1000)progress(50px, 0px, 100px)progress(50%, 30%, 80%)/* With custom property */progress(var(--container-width), 320, 1200)/* Inside math function */calc((progress(var(--container-width), 20%, 80%) / 2) + 0.5)/* Inside non-math function */rgb(  calc(255 * progress(var(--container-width), 320px, 1200px))  calc(255 * progress(var(--container-width), 320px, 1200px)) 255 / 0.5);/* Math function inside progress() */progress(calc(20 + 30), 0, 100)

Parameter

Dieprogress() Funktion nimmt drei durch Kommata getrennte<calc-sum> Ausdrücke als Parameter an:

progress(<calc-sum>, <calc-sum>, <calc-sum>)

Diese entsprechen:

Fortschritt

Der Wert, dessen Position relativ zu den anderen beiden Werten berechnet wird.

Fortschrittsstart

Die untere Grenze des Fortschritts.

Fortschrittsende

Die obere Grenze des Fortschritts.

Rückgabewert

Ein<number>, der die Position des Fortschrittswerts relativ zu den anderen beiden Werten darstellt. Dies wird wie folgt berechnet:

(progress - progress start) / (progress end - progress start)

Wenn der Fortschrittswert zwischen den Fortschrittsstart- und Ende-Werten liegt, liegt der Rückgabewert zwischen0 und1 und stellt einen Prozentsatz dar. Wenn der Fortschrittswert kleiner als der Fortschrittsstartwert oder größer als der Fortschrittsendwert ist, bleibt die Funktion gültig, aber der Rückgabewert wird auf0 oder1 begrenzt, jeweils.

Beschreibung

Die CSSprogress() Funktion bietet eine Möglichkeit, ein Fortschrittsverhältnis zu berechnen, was nützlich ist für Anwendungsfälle wie Fortschrittsbalkenanimationen oder Boxen, die einblenden, wenn sie breiter werden, um ihren Inhalt anzuzeigen.

Die einfachstmögliche Verwendung könnte so aussehen:

css
opacity: progress(5, 0, 10);

In diesem Fall wäre der berechnete Wert vonopacity0.5, da 5 genau mittig zwischen0 und10 liegt.

Erlaubte Einheitentypen

Die Parameter einerprogress() Funktion können mathematische Ausdrücke oder einfache Werte sein. Die Werte (oder Ergebnisse von Ausdrücken) können jeden<number>,<dimension> oder<percentage> Wert annehmen. Sie können unterschiedliche Einheiten haben, müssen aber alle vom selben Typ sein, sonst ist die Funktion ungültig.

Das zuvor gesehene Beispiel ist gültig — alle seine Parameter sind einheitenlose<number> Werte:

css
progress(5, 0, 10)

Das nächste Beispiel ist ebenfalls gültig — alle seine Parameter haben<length> Einheiten. Im Hintergrund werden die berechneten Werte für die Berechnung verwendet. Angenommen, diefont-size beträgt16px zum Zeitpunkt der Berechnung, dann wird3em zu48px aufgelöst, was48% des Weges zwischen0px und100px ist, sodass der Rückgabewert0.48 beträgt.

css
progress(3em, 0px, 100px)

Die letzten beiden Beispiele in diesem Abschnitt sind jedoch nicht gültig. Die Typen stimmen nicht überein, sodass die resultierenden Berechnungen keinen Sinn ergeben.

css
progress(3s, 0px, 100px)progress(3em, 0, 100)

Erstellen von einheitenlosen Werten

Dieprogress() Funktion gibt einheitenlose Werte zurück, daher kann sie verwendet werden, um Einheiten von Werten in derselben Weise zu entfernen wie dertan(atan2()) Hack. Beachten Sie jedoch, dass dies aufgrund der Aktualisierungen im Verhalten rund umCSS typed arithmetic auch durch einfache Division erreicht werden kann.

Kombination vonprogress() mit anderen Funktionen und benutzerdefinierten Eigenschaften

Daprogress() immer nur einen einheitenlosen Wert zwischen0 und1 zurückgibt, ist es üblich, es mit einer anderen mathematischen Funktion wiecalc() zu kombinieren, um den gewünschten Wert und die gewünschten Einheiten zu erhalten. Sie können auchCSS benutzerdefinierte Eigenschaften innerhalb vonprogress() Funktionen verwenden — dies macht Sinn, da Sie oft dieselben Werte an mehreren Stellen festlegen möchten und/oder sie auf benutzerdefinierte Eigenschaften basieren, die über JavaScript gesetzt werden.

Das folgende Beispiel berechnet, wie viel Prozent die Ansichtbreite zwischen einer minimalen Breite von320px und einer maximalen Breite von1200px beträgt. Diecalc() Funktion wird verwendet, um denprogress() Rückgabewert mit600px zu multiplizieren, um ihn in einen Pixelwert umzuwandeln, der die Hälfte des Fortschrittswerts der Ansichtbreite zwischen320px und1200px beträgt.

css
width: calc(progress(100vw, 320px, 1200px) * 600px);

Zum Beispiel, wenn die Ansichtbreite700px ist, wird der Fortschrittswert als((700 - 320) / (1200 - 320)) =0.431818 berechnet. Die Breite wird dann als0.431818 * 600px berechnet, was259.1px ergibt.

Das nächste Beispiel ist eine Aktualisierung des vorherigen, in dem wir benutzerdefinierte Eigenschaften für die Fortschritts-, Fortschrittsstart- und Fortschrittsendwerte verwendet haben.

css
width: calc(  progress(      var(--container-width),      var(--custom-min-width),      var(--custom-max-width)    ) *    var(--custom-max-width));

Es ist möglich,progress() Funktionen zu verwenden, um einzelne Werte innerhalb anderer Funktionen und Komponentenvorwerten innerhalb verkürzter Eigenschaftswerte zu berechnen, vorausgesetzt Ihre Funktionen geben gültige Typen für diese Werte zurück.

Dies kann zu einigen komplexen Ausdrücken führen. Zum Beispiel berechnen wir hier die ersten zwei Kanäle einerrgb() Farbe proportional zum gleichen Breitenverhältnis wie zuvor:

css
background-color: rgb(  calc(      255 *        progress(          var(--container-width),          var(--custom-min-width),          var(--custom-max-width)        )    )    calc(      255 *        progress(          var(--container-width),          var(--custom-min-width),          var(--custom-max-width)        )    )    255 / 0.5);

Formale Syntax

<progress()> =
progress(<calc-sum> ,<calc-sum> ,<calc-sum>)

<calc-sum> =
<calc-product>[[ '+'| '-']<calc-product>]*

<calc-product> =
<calc-value>[[ '*'| /]<calc-value>]*

<calc-value> =
<number>|
<dimension>|
<percentage>|
<calc-keyword>|
(<calc-sum>)

<calc-keyword> =
e|
pi|
infinity|
-infinity|
NaN

Beispiele

Grundlegende Verwendung vonprogress()

In diesem Beispiel zeigen wir die grundlegende Verwendung derprogress() Funktion, um diewidth eines Fortschrittsbalkens auf einen Prozentsatz zu setzen, der dem Fortschrittsverhältnis seiner Elternwidth zwischen seinermin-width undmax-width entspricht.

HTML

Unser HTML enthält ein<section> Element, das unseren Inhalt darstellt, und ein<div> Element, das den Fortschrittsbalken darstellt.

html
<section>  <div></div></section>

CSS

In unserem CSS setzen wir zuerst einige benutzerdefinierte Eigenschaften auf unserem<section> Element, um seinemin-width,max-width undwidth darzustellen. Dann setzen wir diese Eigenschaften auf die entsprechenden benutzerdefinierten Eigenschaftswerte, bevor wir unserem<section> einen solidenbackground-color geben, damit es sichtbar ist.

html {  height: 100%;  font-family: sans-serif;}body,section {  height: inherit;}
css
section {  --custom-min-width: 300px;  --custom-max-width: 700px;  --custom-width: 600px;  min-width: var(--custom-min-width);  max-width: var(--custom-max-width);  width: var(--custom-width);  background-color: cyan;}

Nun zu unserem<div> — Wir geben ihm zuerst eineheight und eine dunklebackground-color, damit es sich von unserem<section> Element abhebt. Dann berechnen wir seinewidth, indem wir eineprogress() Funktion verwenden, um das Fortschrittsverhältnis der Breite zwischen der minimalen und maximalen Breite zu berechnen und dann einecalc() Funktion verwenden, um denprogress() Rückgabewert mit100% zu multiplizieren, um einen Prozentsatz zurückzugeben.

css
.progress {  height: 4px;  background-color: red;  width: calc(    progress(        var(--custom-width),        var(--custom-min-width),        var(--custom-max-width)      ) *      100%  );}

Ergebnis

Dieses Demo wird wie folgt dargestellt:

Die Breite des<div> beträgt75% der<section> Breite, da diemin-width400px beträgt, diemax-width700px und diewidth600px, was75% des Abstands zwischen den vorherigen beiden Werten entspricht.

Größenänderungseffekte auf einem Container

Dieses Beispiel zeigt einige komplexere Verwendungen derprogress() Funktion, was zu interessanten Effekten führt, wenn die Größe des Browserfensters geändert wird.

Dieses Beispiel funktioniert viel besser, wenn es in voller Größe in einem Desktop-Browser-Tab gerendert wird. Daher haben wir es nicht als eingebettetes Live-Beispiel auf dieser Seite dargestellt. Stattdessen finden Sie es live unterCSSprogress() Funktionsdemo ausgeführt (siehe auch denQuellcode).

Öffnen Sie das Live-Beispiel in einem separaten Tab, und versuchen Sie, die Breite des Browserfensters zu vergrößern und zu verkleinern, um den Effekt zu sehen. Lassen Sie dies offen, damit Sie darauf zurückkommen können, während Sie die Erklärung unten lesen.

HTML

Unser HTML enthält ein<article> Element, das den Rest unseres Inhalts enthält, und zwei<section> Elemente — eines, um ein Hintergrundbild zu platzieren, und das andere, um unseren Inhalt zu enthalten. Der<section> enthält auch ein<div>, das einen Breitenfortschrittsbalken darstellt, genauso wie der in unserem vorherigen Demo. Wir haben den Rest des Inhalts der Kürze halber weggelassen.

html
<article>  <section></section>  <section>    <div></div>    <!-- Content here -->  </section></article>

JavaScript

In unserem Skript holen wir uns zuerst eine Referenz auf unser<article> Element. Dann definieren wir eine Funktion namenssetContainerWidth(), die die Client-Breite des<article> überElement.getBoundingClientRect() abruft und eine benutzerdefinierte Eigenschaft darauf einstellt, die--container-width genannt wird. Diese ist gleich der abgerundeten Client-Breite, zu derpx hinzugefügt wird.

Wir setzen dann einenresize Ereignis-Listener auf dasWindow Objekt, dassetContainerWidth() ausführt, wenn die Größe des Browserfensters geändert wird. Wir führen es auch einmal aus, um die--container-width benutzerdefinierte Eigenschaft auf dem<article> Element beim Laden der Seite zu setzen.

js
const articleElem = document.querySelector("article");function setContainerWidth() {  const clientWidth = articleElem.getBoundingClientRect().width;  articleElem.style.setProperty(    "--container-width",    `${Math.floor(clientWidth)}px`,  );}window.addEventListener("resize", setContainerWidth);setContainerWidth();

Mit dieser Einrichtung können wir nun einige Eigenschaftswerte basierend auf der--container-width festlegen, sodass Teile unseres Designs dynamisch geändert werden, wenn die Fenstergröße angepasst wird.

CSS

Der folgende Abschnitt erklärt nur das CSS, das relevant ist, wie wir dieprogress() Funktion im Demo verwendet haben. Für das vollständige CSS, siehe denCSS-Quellcode.

Wir zentrieren zuerst das<article> im<body> mitflexbox, setzen dann einige benutzerdefinierte Eigenschaften darauf, um diemin-width undmax-width Werte darzustellen, die wir anderswo verwenden werden. Wir setzen dann das<article> Element, indem wir ihmmin-width undmax-width Werte geben, die gleich den zuvor gesetzten benutzerdefinierten Eigenschaften sind. Wir setzen seineposition aufrelative, damit wir seinen Inhalt relativ dazu positionieren können, dann geben wir ihm eine prozentualewidth, eine festeheight, und eineborder.

css
body {  height: inherit;  display: flex;  justify-content: center;  align-items: center;  --custom-min-width: 320px;  --custom-max-width: 1200px;}article {  min-width: var(--custom-min-width);  max-width: var(--custom-max-width);  position: relative;  width: 70%;  height: 600px;  border: 3px solid black;}

Nun zu unserem<div> mitprogress. Wir setzen seinewidth gleich einem Prozentsatz, basierend auf dem Fortschrittsverhältnis der--container-width benutzerdefinierten Eigenschaft, die über JavaScript auf dem<article> Element festgelegt wurde, zwischen dermin-width undmax-width (wir verwenden hier dieselben benutzerdefinierten Eigenschaften für die zweite und dritteprogress() Parameter wie wir für diemin-width undmax-width des<article> verwendet haben).

Wir geben ihm auch eineheight undbackground-color, dann positionieren wir ihn absolut in der linken oberen Ecke des<article>.

css
.progress {  width: calc(    progress(        var(--container-width),        var(--custom-min-width),        var(--custom-max-width)      ) *      100%  );  height: 4px;  background-color: red;  position: absolute;  top: 0;  left: 0;}

Als nächstes betrachten wir unser<section> mit Hintergrund. Wir positionieren es absolut relativ zu unserem<article>, indem wirinset: 0 darauf setzen, sodass es die gleiche Größe annimmt und darüber liegt. Wir setzen dann ein ziemlich breitesbackground-image darauf, und positionieren das Hintergrundbild, indem wir der Eigenschaftbackground-position-x denselben Wert geben wie der Breitenprozentwert des Fortschrittsbalkens. Dies hat den Effekt, dass, wenn Sie die Breite des Browserfensters vergrößern, das Hintergrundbild nach links verschoben wird und einen schönen Bildscroll-Effekt erzeugt.

css
.background {  position: absolute;  inset: 0;  background-image: url("https://mdn.github.io/shared-assets/images/examples/wide-background.jpg");  background-position-x: calc(    progress(        var(--container-width),        var(--custom-min-width),        var(--custom-max-width)      ) *      100%  );}

Wir positionieren das<section> mit Inhalt absolut, sodass es über dem Hintergrund<section> liegt, und geben ihm ein wenigpadding. Dann variieren wir zwei Eigenschaftswerte, während das Browserfenster angepasst wird, unter Verwendung desselben Fortschrittsverhältnisses wie zuvor:

  • Wir variieren die R- und G-Komponenten derbackground-color, indem wir das Fortschrittsverhältnis in beiden Fällen mit 255 multiplizieren, um einen proportionalen Kanalwert zu erhalten. Wenn das Fenster breiter wird, wird die Hintergrundfarbe weniger blau und mehr weiß, wodurch die Szene aussieht, als würde sie von Nacht zu Tag wechseln (der Farbwert hat eine Deckkraft von0.5, sodass er wie ein Farbton für das darunterliegende Bild wirkt).
  • Wir variieren dieopacity, damit der Inhalt ein wenig einblendet, wenn das Fenster breiter wird.
css
.content {  position: absolute;  inset: 0;  padding: 20px;  background-color: rgb(    calc(        255 *          progress(            var(--container-width),            var(--custom-min-width),            var(--custom-max-width)          )      )      calc(        255 *          progress(            var(--container-width),            var(--custom-min-width),            var(--custom-max-width)          )      )      255 / 0.5  );  opacity: calc(    (        progress(            var(--container-width),            var(--custom-min-width),            var(--custom-max-width)          ) /          2      ) +      0.5  );}

Spezifikationen

Specification
CSS Values and Units Module Level 5
# progress

Browser-Kompatibilität

Siehe auch

Help improve MDN

Learn how to contribute Diese Seite wurde automatisch aus dem Englischen übersetzt.

[8]ページ先頭

©2009-2025 Movatter.jp