Gebaut auf Vercels UI SDK 0.1.0-beta.1. Die API kann sich ändern.
Image cropper
Ein Bild-Cropper auf Vercels UI SDK mit skalierbarer Auswahl, Seitenverhältnissen, rundem Avatar-Rahmen, Zoom, Drehen und Spiegeln.
- Komponente
- 10 Teilen
- 6 Beispielen
@tabler/icons-react@ui-sdk/core@ui-sdk/reactclass-variance-authority
pnpm dlx shadcn@latest add https://hextaui.com/r/ui-sdk-image-cropper.jsonFügt die Komponente, die HextaUI-Theme-Tokens und alle HextaUI-Komponenten hinzu, von denen sie abhängt.
Füge die Theme-Tokens zu deinem globalen CSS hinzu, falls du das noch nicht getan hast.
Installiere die Abhängigkeiten.
pnpm add @ui-sdk/react@0.1.0-beta.1 @ui-sdk/core@0.1.0-beta.1 @tabler/icons-react class-variance-authority cnKopiere den folgenden Code und füge ihn in dein Projekt ein.
components/ui/ui-sdk-image-cropper.tsx components/ui/button.tsx Passe die Importpfade an dein Projekt-Setup an.
UI SDK bringt etwas eigenes CSS in einem Cascade Layer namens ui-sdk mit. Deklariere diesen Layer ganz oben im globalen Stylesheet, über dem Tailwind-Import, damit deine Klassen gewinnen.
Der Ausschnitt ist ein Rechteck in den Pixeln des Bildes, mit Drehung und Spiegelung. Übergib ihn an cropImage, um eine Datei zum Hochladen zu bekommen. Ein Bild von einer anderen Website braucht CORS, sonst lässt der Browser die Seite seine Pixel nicht lesen.
Mit mode="frame" bleibt die Auswahl stehen, und du verschiebst und zoomst das Bild darunter. shape="circle" macht sie rund, also übergib auch shape: "circle" an cropImage.
ImageCropperRotate dreht das Bild eine Vierteldrehung im Uhrzeigersinn, und ImageCropperFlip spiegelt es. Ohne Kinder sind es Symbol-Buttons mit englischen Labels.
Schneide ein Foto aus einem Datei-Input per Object-URL zu. Gib dem Cropper einen key, damit ein neues Foto neu beginnt.
onCropCommit läuft, sobald Ziehen oder Tastendruck enden, also speichere dort. Ein Controller aus createImageCropperController() setzt den Ausschnitt von überall.
Ein deaktivierter Cropper lässt sich weder fokussieren noch ändern, und Zoom und Buttons sind deaktiviert.
| Taste | Aktion |
|---|---|
| ←→↑↓ | Bewegt die Auswahl, oder an einem Griff dessen Kanten. |
| Shift← | Bewegt zehnmal so weit. |
| +- | Zoomt um die Mitte des Ausschnitts hinein oder heraus. |
| R | Dreht das Bild eine Vierteldrehung im Uhrzeigersinn, mit Shift zurück. |
| Esc | Setzt den Ausschnitt während des Ziehens an den Startpunkt zurück. |
Der Cropper ist eine Gruppe, benannt durch aria-label. Die Auswahl und jeder Griff sind Slider, die den Ausschnitt in Worten nennen, etwa „300 by 300 pixels, at 50, 0“, und der Zoom nennt seine Stufe, etwa „125%“. Diese Namen sind englisch, also übergib jedem Teil ein aria-label in der Sprache deiner Seite.
Das Raster blendet nur beim Ziehen ein, bei reduzierter Bewegung gar nicht. Griffe bekommen auf Touchscreens eine größere Trefferfläche, die Seite scrollt beim Ziehen nicht, und im Modus „Erzwungene Farben“ bekommt die Auswahl einen Rahmen in Systemfarbe.
Jeder Teil umhüllt den gleichnamigen UI-SDK-Teil und nimmt alle seine Props an, auch render und einen className, der eine Funktion des Zustands sein kann.
| Prop | Typ | Standard |
|---|---|---|
src | string | – |
cropDer Ausschnitt in Bildpixeln, mit rotation, flipX und flipY. | ImageCrop | – |
defaultCrop | ImageCrop | – |
onCropChange | (crop, details) => void | – |
onCropCommitLäuft, sobald Ziehen, Tastendruck oder Mausrad endet. | (crop, details) => void | – |
mode | "box" | "frame" | "box" |
aspectRatio | number | – |
shape | "rectangle" | "circle" | "rectangle" |
minWidth | number | – |
minHeight | number | – |
maxZoom | number | 10 |
disabled | boolean | false |
controllerAus createImageCropperController(). | ImageCropperController | – |
| Attribut | Beschreibung |
|---|---|
data-slot="image-cropper" | Spricht den Cropper in CSS an. |
data-mode | box oder frame. |
data-shape | rectangle oder circle. |
data-loading | Vorhanden, bis das Bild geladen ist. |
data-error | Vorhanden, wenn das Bild nicht geladen werden konnte. |
data-dragging | Vorhanden, solange ein Zeiger zieht. |
| Prop | Typ | Standard |
|---|---|---|
render | ReactElement | (props, state) => ReactElement | – |
| Attribut | Beschreibung |
|---|---|
data-slot="image-cropper-viewport" | Spricht den Viewport in CSS an. |
--image-cropper-aspect-ratio | Breite durch Höhe des Bildes, sobald es geladen ist. Der Viewport nutzt es als Seitenverhältnis. |
| Prop | Typ | Standard |
|---|---|---|
altErforderlich. | string | – |
render | ReactElement | (props, state) => ReactElement | – |
| Prop | Typ | Standard |
|---|---|---|
aria-label | string | "Crop" |
render | ReactElement | (props, state) => ReactElement | – |
| Attribut | Beschreibung |
|---|---|
data-slot="image-cropper-selection" | Spricht die Auswahl in CSS an. |
| Prop | Typ | Standard |
|---|---|---|
childrenStandard sind Linien in Dritteln. | ReactNode | – |
| Prop | Typ | Standard |
|---|---|---|
positionDie Kante oder Ecke, die er skaliert. | "n" | "e" | "s" | "w" | "ne" | "nw" | "se" | "sw" | – |
ImageCropperHandles rendert alle acht. Im Frame-Modus erscheinen keine Griffe.
Ein natives Range-Input von 1, dem größten Ausschnitt, bis maxZoom.
| Prop | Typ | Standard |
|---|---|---|
childrenStandard ist ein Symbol mit dem Label Rotate. Mit Kindern ist es ein kleiner Text-Button. | ReactNode | – |
| Prop | Typ | Standard |
|---|---|---|
direction | "horizontal" | "vertical" | "horizontal" |
childrenStandard ist ein Symbol mit englischem Label. | ReactNode | – |
- ButtonButtons in allen Varianten und Größen, mit eingebautem Lade-, Erfolgs- und Fehlerablauf, der den Spinner bei schnellen Anfragen überspringt.
- Video playerEin Videoplayer mit scrubbarer Suchleiste, automatisch ausblendenden Steuerelementen, Tastenkürzeln, Geschwindigkeit, Bild-in-Bild und Vollbild.