Einfache animierte analoge Uhr in Tailwind.css

So erstellen Sie eine sehr einfache analoge Uhr mit Animation nur in Tailwind.css

Ein Uhrwerk-Rückenwind

Beim Entwerfen der Detailseite für Projekte, an denen ich gearbeitet habe (verfügbar auf meiner Portfolio-Seite), habe ich auch eine einfache animierte Analoguhr implementiert, die neben der Projektdauer gerendert wird.

Da ich keine neuen externen Bibliotheken oder Videos verwenden wollte, entschied ich mich, die Uhr über Tailwind.css und seine großartigen Animationsprogramme zu implementieren.

Codebeispiele

Es gibt nicht viel mehr zu sagen, da ich dachte, dass es für Sie am nützlichsten wäre, wenn ich einfach einige Codebeispiele für die Wiederverwendbarkeit anbiete.

Das Layout in jedem Beispiel ist fast gleich oder sehr ähnlich. Ich rendere einfach einige Div-Boxen durch absolute Positionierung übereinander. Da jede Box nur die kleinste verfügbare Breite hat, scheinen sie die in der Uhr sichtbaren Cursor zu sein.

Das letzte Beispiel zeigt, wie man um 12 Uhr beginnt. Die ersten beiden Beispiele beginnen jeweils um 3 Uhr, da sie in der Reihe angeordnet sind.

Beispiel 1: Einfachste Uhr

Image dbead4b8e463

export function Clock() {
  return (
    <div className="flex justify-center py-10 group">
      <div className="relative flex items-center justify-end w-20 h-20 overflow-hidden bg-gray-900 rounded-full ">
        <div className="absolute w-1/2 h-1 bg-white rounded-full origin-left -rotate-12 group-hover:rotate-[215deg] duration-1000 ease-in-out" />

        <div className="absolute w-1/2 h-1  origin-left rotate-[70] group-hover:rotate-[340deg] duration-1000 ease-in-out">
          <div className="w-2/3 h-full bg-white rounded-full" />
        </div>

        <div className="absolute flex justify-center flex-1 w-full">
          <div className="w-1 h-1 bg-white rounded-full" />
        </div>
      </div>
    </div>
  );
}

Beispiel 2: Uhr mit Rahmen und Indikatoren

Image 06597167696f

import React from "react";
// Note that I'm using 'clsx' for
// composing classnames.
import clsx from "clsx";

export function Clock() {
  return (
    <div className="relative flex items-center justify-end w-20 h-20 overflow-hidden rounded-full ring-gray-600 ring-1">
      {Array.from({ length: 8 }, (_, i) => (
        <div
          key={i}
          style={{ height: 1 }}
          className={clsx("absolute w-1/2 origin-left flex justify-end", {
            "rotate-0": i === 0,
            "rotate-45": i === 1,
            "rotate-90": i === 2,
            "rotate-[135deg]": i === 3,
            "rotate-180": i === 4,
            "rotate-[225deg]": i === 5,
            "rotate-[270deg]": i === 6,
            "rotate-[315deg]": i === 7,
          })}>
          <div className="w-1/3 h-full bg-gray-600 rounded-full" />
        </div>
      ))}

      <div className="absolute w-1/2 h-1 bg-gray-300 rounded-full origin-left -rotate-12 group-hover:rotate-[215deg] duration-1000 ease-in-out" />

      <div className="absolute w-1/2 h-1  origin-left rotate-[85deg] group-hover:rotate-[340deg] duration-1000 ease-in-out">
        <div className="w-2/3 h-full bg-gray-300 rounded-full" />
      </div>

      <div className="absolute flex justify-center flex-1 w-full">
        <div className="w-1 h-1 bg-gray-300 rounded-full" />
      </div>
    </div>
  );
}

Beispiel 3: Uhr, die um Mitternacht beginnt

Image c2d6bdde9e1e

export function Clock() {
  return (
    <div className="flex justify-center py-10 group">
      <div className="relative flex flex-col items-center justify-start w-20 h-20 overflow-hidden bg-gray-900 rounded-full ">
        <div className="absolute w-1 duration-1000 ease-in-out origin-bottom bg-gradient-to-t from-white to-red-400 rounded-full h-1/2 group-hover:rotate-[200deg]" />

        <div className="absolute h-1/2 w-1 origin-bottom rotate-[55deg] group-hover:rotate-[340deg] duration-1000 ease-in-out flex flex-col justify-end">
          <div className="w-full rounded-full bg-gradient-to-t from-white to-blue-400 h-2/3" />
        </div>

        <div className="absolute flex items-center justify-center flex-1 w-full h-full">
          <div className="w-1 h-1 bg-white rounded-full" />
        </div>
      </div>
    </div>
  );
}