Gibt es Zufallszahlen in CSS?

Mit CSS können Sie dynamische Seitenlayouts und Webprojektschnittstellen erstellen. Aber CSS ist eine statische Sprache. Nachdem ein bestimmter Wert festgelegt wurde, kann er nicht mehr geĂ€ndert werden. Die Idee, bestimmte Werte zufĂ€llig zu Ă€ndern, wird hier nicht berĂŒcksichtigt.



Die Generierung von Zufallszahlen ist ein Gebiet von JavaScript, in das CSS nicht eingibt. Aber was ist, wenn dies nicht ganz stimmt? Wenn Sie die vom Benutzer ausgefĂŒhrten Aktionen berĂŒcksichtigen, wird das CSS dadurch etwas zufĂ€llig. Der Autor des Materials, dessen Übersetzung wir heute veröffentlichen, bietet an, dies zu diskutieren.

Externe CSS-Randomisierung


Sie können CSS-Variablen verwenden, um so etwas wie "dynamische Randomisierung" in CSS zu implementieren. Hier sind einige gute Sachen darĂŒber. Solche Problemlösungen sind jedoch kein reines CSS. Hier mĂŒssen Sie auf JavaScript-Funktionen zurĂŒckgreifen, um neue Zufallswerte in CSS-Variablen zu schreiben.

Sie können PrÀprozessoren wie Sass oder Less verwenden, um zufÀllige Werte zu generieren. Nach dem Kompilieren und Exportieren des CSS-Codes werden diese Werte jedoch festgelegt und das zufÀllige Element geht verloren. In einem Tweet zu diesem Thema wird dieser Ansatz zum Festlegen von CSS-Werten mit einer zufÀlligen Auswahl des Namens des Helden des Romans verglichen, die sich, sobald sie auf Papier geschrieben wurde, nicht geÀndert hat.

Warum bin ich daran interessiert, zufÀllige Werte in CSS zu verwenden?


Ich habe einmal einfache Anwendungen entwickelt, die ausschließlich auf CSS basieren. Dies ist ein Quiz , eine Partie Simon und Kartentricks . Aber ich wollte etwas komplizierteres machen. Ich gehe hier nicht auf die Fragen der Richtigkeit dieses Ansatzes, Fragen des Nutzens oder der praktischen Anwendbarkeit von Projekten ein, die ausschließlich auf CSS basieren.

Basierend auf der Annahme, dass einige Brettspiele als Finite State Machines (FSM) dargestellt werden können, können wir den Schluss ziehen, dass solche Spiele nur mit HTML und CSS implementiert werden können. Mit dieser Idee bewaffnet, begann ich das Spiel „ Snakes and Ladders “ zu entwickeln. Dies ist ein einfaches Spiel. Ihr Ziel ist es, einen WĂŒrfel zu werfen und vom Startpunkt des Spielfelds zum letzten zu gelangen, wĂ€hrend Schlangen vermieden und versucht werden, die Treppe zu benutzen.

Es schien mir, dass dieses Projekt in HTML und CSS durchgefĂŒhrt werden könnte. Allerdings habe ich etwas nicht berĂŒcksichtigt. Es geht um WĂŒrfel.

Der WĂŒrfelwurf (sowie der MĂŒnzwurf) werden allgemein als „Generatoren“ von Zufallswerten anerkannt. Jedes Mal, wenn wir einen Knochen oder eine MĂŒnze werfen, bekommen wir etwas, das uns vorher unbekannt war.

WĂŒrfel werfen Nachahmung


Ich wollte Ebenen mit Beschriftungen ĂŒberlagern und CSS-Animationen verwenden, um sie zu „scrollen“ und die oberste Ebene zu Ă€ndern. Es sah ungefĂ€hr so ​​aus wie das unten gezeigte.


Simulieren Sie Ebenenanimationen in einem Browser

Code, der ein solches System zum Erhalten von Zufallswerten implementiert, ist nicht besonders kompliziert. Es enthÀlt eine Beschreibung der Animation mit verschiedenen Verzögerungen. Hier ist der Code:

/*    z-index —     . */ @keyframes changeOrder {   from { z-index: 6; }   to { z-index: 1; } } /*         . */ label {   animation: changeOrder 3s infinite linear;   background: #ddd;   cursor: pointer;   display: block;   left: 1rem;   padding: 1rem;   position: absolute;   top: 1rem;   user-select: none; }     /*      ,        */ label:nth-of-type(1) { animation-delay: -0.0s; } label:nth-of-type(2) { animation-delay: -0.5s; } label:nth-of-type(3) { animation-delay: -1.0s; } label:nth-of-type(4) { animation-delay: -1.5s; } label:nth-of-type(5) { animation-delay: -2.0s; } label:nth-of-type(6) { animation-delay: -2.5s; } 

Bitte beachten Sie, dass die Animation verlangsamt wurde, damit die Interaktion mit den entsprechenden Elementen einfacher wird (es stellte sich jedoch heraus, dass sie schnell genug war, um ein Problem zu verursachen, auf das weiter unten eingegangen wird). Hier ist die pseudozufÀllige Natur des vorgestellten Mechanismus deutlich sichtbar.

→ Hier ist ein Projekt auf CodePen, mit dem Sie diesen Ansatz untersuchen können


WĂŒrfel werfen Nachahmung

Eigentlich bin ich hier auf ein Problem gestoßen. Mein Programm gab zufĂ€llige Werte aus, aber manchmal, selbst wenn ich auf eine SchaltflĂ€che klickte, die einen Knochenwurf simulierte, gab das System ĂŒberhaupt nichts zurĂŒck.

Ich habe versucht, die Animationszeit zu verlÀngern, was meiner Meinung nach die Situation leicht verbessert hat, aber das System hat sich immer noch falsch verhalten.

Damals tat ich das, was alle Programmierer taten, und sah mich einem Problem gegenĂŒber, das sie mit einer Suchmaschine nicht lösen konnten. Ich habe eine Frage zu StackOverflow gestellt.

Zu meinem GlĂŒck erklĂ€rten sie mir alles und schlugen eine Lösung fĂŒr das Problem vor.

Eine vereinfachte Beschreibung meines Problems kann wie folgt dargestellt werden: "Der Browser mousedown das mousedown eines Elements nur aus, wenn das Element, das zum Zeitpunkt des mousedown des mousedown aktiv ist, aktiv bleibt, wenn das mouseup Ereignis auftritt."

Da sich die Elemente stĂ€ndig gegenseitig ersetzen, ist das oberste Element, bei dem das mousedown Ereignis beim mousedown der mousedown auftritt, nicht immer dasselbe Element, bei dem mouseup der Taste mouseup Ereignis auftritt. Damit die SchaltflĂ€che in dem Moment gedrĂŒckt und losgelassen werden kann, in dem sich dasselbe Element oben auf dem Stapel befindet, muss der Klick entweder schnell genug (damit das Element keine Zeit hat, die Oberseite des Stapels zu verlassen) oder eher langsam (also das Element) ausgefĂŒhrt werden Es besteht die Möglichkeit, nach oben zurĂŒckzukehren und einen vollen Kreis zu bilden. Aus diesem Grund kann das Problem durch eine VerlĂ€ngerung der Animationszeit maskiert werden.

Die Lösung bestand darin, den static Wert fĂŒr die position des aktiven Elements zu verwenden, wodurch es aus dem Elementstapel entfernt wurde. Ferner trat ein Pseudoelement wie ::before oder ::after , dem ein sehr großer z-index zugewiesen wurde, an seine Stelle. Bei diesem Ansatz befindet sich das aktive Element beim Loslassen der Maustaste immer oben im Stapel.

 /*           */ label:active {  margin-left: 200%;  position: static; } /* -         z-index */ label:active::before {  content: "";  position: absolute;  top: 0;  right: 0;  left: 0;  bottom: 0;  z-index: 10; } 

Hier ist ein Projekt, das diese Lösung implementiert und schnellere Animationen verwendet.

Nachdem ich diese Änderung am Projekt vorgenommen hatte, musste ich nur meine Erfolge zum Spiel hinzufĂŒgen. Das habe ich bekommen.


Fertiges Spiel

Nachteile der Methode


Die hier beschriebene Zufallsmethode weist offensichtliche Unannehmlichkeiten auf:

  • FĂŒr seine Arbeit erfordert die Teilnahme des Benutzers. Die Person muss auf das Etikett klicken, um den Prozess des „Generierens eines zufĂ€lligen Werts“ einzuleiten.
  • Es skaliert nicht gut. Diese Methode eignet sich gut fĂŒr die Arbeit mit kleinen WertesĂ€tzen. Wenn Sie jedoch einen zufĂ€lligen Wert aus einem großen Bereich abrufen mĂŒssen, ist die Verwendung sehr unpraktisch.
  • Seine Anwendung ermöglicht es, nicht zufĂ€llige, sondern pseudozufĂ€llige Werte zu erhalten. Der Punkt ist, dass der Computer leicht herausfinden kann, welcher "zufĂ€llige" Wert zu einem bestimmten Zeitpunkt ausgegeben wird.

Zusammenfassung


Die hier vorgestellte Methode basiert trotz der oben beschriebenen EinschrĂ€nkungen auf reinem CSS. Um es zu verwenden, werden keine PrĂ€prozessoren oder einige externe Hilfsmechanismen benötigt. Und fĂŒr den Benutzer sieht seine Verwendung so aus, als ob das Programm vollstĂ€ndig zufĂ€llige Zahlen erzeugt.

Diese Methode eignet sich ĂŒbrigens nicht nur zur Erzeugung von Zufallszahlen. Es ermöglicht Ihnen, alles zufĂ€llig zu ordnen. Zum Beispiel - in diesem Projekt basiert es auf der "zufĂ€lligen" Auswahl, die der Computer im Spiel "Rock, Paper, Scissors" trifft.


Das Spiel "Stein, Schere, Papier" in reinem CSS

Liebe Leser! Planen Sie, die in diesem Material hervorgehobenen Ideen in Ihren Projekten zu verwenden?


Source: https://habr.com/ru/post/de474310/


All Articles