diff --git a/public/images/month-picker.jpeg b/public/images/month-picker.jpeg new file mode 100644 index 0000000..aaef7d4 Binary files /dev/null and b/public/images/month-picker.jpeg differ diff --git a/src/components/slides/html-forms/basics.astro b/src/components/slides/html-forms/basics.astro new file mode 100644 index 0000000..fbc027d --- /dev/null +++ b/src/components/slides/html-forms/basics.astro @@ -0,0 +1,153 @@ + + +
+
+

Basics eines Formulars

+
+ +
+

Alle abzufragenden Inhalte werden in ein spezielles form-Tag platziert

+
+ +
+

+      <form action="https://example.com/" method="get">
+        <!-- Hier kommen die Eingabe-Felder hinein -->
+      </form>
+    
+
+ +
+

Das action-Attribut definiert wohin die Daten gesendet werden, wenn der User auf "absenden" klickt.

+

Das method-Attribut definiert wie die Daten versendet werden (HTTP-Methode)

+
+ +
+

Label & Eingabefeld

+
+ +
+

Es empfiehlt sich, jedes Eingabefeld mit einem label-Tag zu versehen.

+

Der Nutzer versteht einfacher, was er eingeben muss und zusätzlich erhält der Screenreader mehr Informationen zum vorlesen.

+
+ +
+

Das erste Tag, um Daten einzugeben, ist input.

+

Mithilfe von Input können alle Text-Relevanten Informationen eingegeben werden.

+

Das Tag bietet Attribute um die gewünschte Eingabe zu verfeinern.

+
+ +
+

+      <form action="https://example.com/" method="get">
+        <p>
+          <label for="name">Dein Name:</label>
+          <input type="text" id="name" name="username">
+        </p>
+      </form>
+    
+
+ +
+
+

+ +

+
+
+ +
+

Wir können auch ein Textfeld im Voraus ausfüllen, nutze dafür das value Attribut!

+

+      <form action="https://example.com/" method="get">
+        <p>
+          <label for="name">Dein Name:</label>
+          <input
+            type="text"
+            id="name"
+            name="username"
+            value="Hier könnte deine Werbung stehen!"
+          >
+        </p>
+      </form>
+    
+
+ +
+
+

+ +

+
+
+ +
+

+      <form action="https://example.com/" method="get">
+        <p>
+          <label for="name">Dein Name:</label>
+          <input
+            type="text"
+            id="name"
+            name="username"
+            value="Hier könnte deine Werbung stehen!"
+          >
+        </p>
+      </form>
+    
+
+ +
+

Das for-Attribut des Labels sollte dem id-Attribute des referenzierten Eingabefeldes entsprechen.

+
+ +
+

textarea für größere Texteingaben

+

Mithilfe von <textarea> kann eine Eingabebox mit variabler Größe erzeugt werden

+
+ +
+

+      <textarea>
+        Hier steht ein default-value Text
+      <textarea>  
+    
+
+ +
+ +
+ +
+

Mithilfe der Attribute cols und rows kann die Textarea eine bestimmte Anfangs-Größe Einnehmen

+
+ +
+

+      <textarea cols="50" rows="10"><textarea>
+    
+
+ +
+ +
+

Beam me up! button um Daten zu versenden

+
+ +
+

Mithilfe eines <button> kann das Formular abgeschickt werden.

+
+ +
+

+      <button type="submit">Absenden</button>
+    
+
+ +
+ +
+

Der Browser verwendet die Daten aus dem Form-Tag (action + method), sowie die Eingaben aus den Formular-Feldern.

+

Der Browser versendet die Daten als key-value-Paare. Dabei wird das name-Attribut von jedem Eingabefeld als key verwendet.

+
+
\ No newline at end of file diff --git a/src/components/slides/html-forms/beyond-text.astro b/src/components/slides/html-forms/beyond-text.astro new file mode 100644 index 0000000..f0abcbe --- /dev/null +++ b/src/components/slides/html-forms/beyond-text.astro @@ -0,0 +1,191 @@ +
+
+

Eingaben über Texte hinaus

+
+
+ Neben den bisher vorgestellten Möglichkeiten, bietet HTML mit input und weiteren Elementen zusätzliche Eingabemöglichkeiten +
+ +
+

input type="radio"

+
+ +
+

Dieser Eingabetyp erstellt "Radioboxen", Elemente die gruppiert werden können und nur ein Element gleichzeitig ausgewählt sein darf.

+
+ +
+

+      <input type="radio" name="frucht" id="apfel" value="Apfel">
+      <input type="radio" name="frucht" id="birne" value="Birne">
+      <input type="radio" name="frucht" id="banane" value="Banane">
+    
+
+ +
+

Hinweis: Alle Inputs wurden mit einem Label versehen

+

+ + +

+

+ + +

+

+ + +

+
+ +
+ +
+ +
+

input type="checkbox"

+
+ +
+

+ Checkboxen erlauben eine true/false Abfrage beim User im Stil einer anklickbaren Checkbox +

+
+ +
+

+      <input type="checkbox" name="akzeptiert" id="accepted">
+    
+
+ +
+

Hinweis: Dieser Checkbox wurde zusätzlich ein Label hinzugefügt

+

+
+ +
+

Lange Listen: select

+
+ +
+

Das select-Element erlaubt es, lange Listen in einem extra Container mit einer Scrollbar anzuzeigen.

+
+ +
+

+      <select name="animals">
+        <option value="cat">Katze</option>
+        <option value="dog">Hund</option>
+        <option value="bird">Vogel</option>
+      </select>
+    
+
+ +
+ + +
+ +
+

Eine option mit value="" dient als Anzeige eines noch nicht ausgewählten Wertes

+
+ +
+

+      <select name="animals">
+        <option value="">Biete wähle ein Tier</option>
+        <option value="cat">Katze</option>
+        <option value="dog">Hund</option>
+        <option value="bird">Vogel</option>
+      </select>
+    
+
+ +
+ + +
+ +
+

Wenn mehrere Optionen Auswählbar sein sollen, lässt sich dies mit dem multiple-Attribut verwirklichen.

+

Dabei wird das select als eine Box mit mehrere Zeilen (mit Scroll) dargestellt. Mehrere Optionen können gleichzeitig mit STRG/CMD ausgewählt werden.

+
+ +
+

Falls eine Option mit leerem Wert (value="") existiert, kann dieses mit dem Attribut disabled nicht Anwählbar angezeigt werden.

+
+ +
+

+      <select name="animals">
+        <option value="" disabled>Biete wähle ein Tier</option>
+        <option value="cat">Katze</option>
+        <option value="dog">Hund</option>
+        <option value="bird">Vogel</option>
+      </select>
+    
+
+ +
+ + +
+ +
+

Weiter lassen sich die Optionen in einem select mithilfe des Tag optgroup kategorisieren

+
+ +
+

+      <select name="animals">
+        <optgroup label="Katzenrassen">
+          <option value="bsh">British Shorthair</option>
+          <option value="mc">Maine Coon</option>
+        </optgroup>
+        <optgroup label="Hunderassen">
+          <option value="gs">Schäferhund</option>
+          <option value="poodle">Pudel</option>
+        </optgroup>
+      </select>
+    
+
+ +
+ + +
+ +
+

Select bietet (auch heutzutage) einen großen Nachteil: Die Elemente sind schwer zu stylen.

+

Falls eine visuell ansprechendere Komponente gewünscht ist, muss eine eigene implementiert werden (inklusive Unterstüztung von Barrierefreiheits-Features)

+

Alternativ bietet sich auch die Nutzung von Komponenten-Bibliotheken an.

+
+
\ No newline at end of file diff --git a/src/components/slides/html-forms/index.astro b/src/components/slides/html-forms/index.astro new file mode 100644 index 0000000..d425348 --- /dev/null +++ b/src/components/slides/html-forms/index.astro @@ -0,0 +1,19 @@ +--- +import TitleSlide from './title.astro' +import Introduction from './introduction.astro' +import Basics from './basics.astro' +import Structuring from './structuring.astro' +import Inputs from './inputs.astro' +import MoreInputs from './beyond-text.astro' +import Validation from './validation.astro' +--- + +
+ + + + + + + +
\ No newline at end of file diff --git a/src/components/slides/html-forms/inputs.astro b/src/components/slides/html-forms/inputs.astro new file mode 100644 index 0000000..5b8f9a0 --- /dev/null +++ b/src/components/slides/html-forms/inputs.astro @@ -0,0 +1,144 @@ + + + + +
+
+

Mehr Eingabemöglichkeiten

+
+
+

Bisher haben wir nur das Standard-Textfeld zur Eingabe von Text verwendet.

+
+ +
+

Der type beim <input>

+
+ +
+

Soweit haben wir bei Inputs das Attribut type als text definiert.

+

Das Textfeld kann aber spezialisiert werden um Eingaben zu sammeln

+
+ +
+

Sichere Eingaben mittels password

+

+      <input type="password" value="geheim">
+    
+
+ +
+ +
+

Zahleneingabe mittels number

+

+      <input type="number" value="5">
+    
+
+
+ +
+ +
+ +
+

Zahleneingabe mittels number

+

+      <input type="number" min="1" max="10" step="2" value="1">
+    
+
+
+ +
+

Alternative Zahleneingabe mit range

+
+ +
+

Eine weitere Möglichkeit, Zahlen einzugeben, besteht darin einen Slider anzuzeigen

+
+ +
+

+      <input type="range" min="1" max="10" step="1" value="1">
+    
+
+
+
+

Nachteil: Ohne Feedback und Anzeige des aktuellen Wertes, eher sinnlos

+
+ +
+

Alles was Zeiten betrifft

+
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+

Man sieht, nicht alle Werte bewirken etwas auffälliges, manche Types helfen aber auf mobilen Geräten.

+ Ein Monats-Picker auf einem iOS Gerät geöffnet +
+ +
+

Jetzt wirds bunt: color

+

+      <input type="color" value="#00ff00">
+    
+
+
+ +
+

Dateien auswählen mit file

+

+      <input type="file">
+    
+
+
+ +
+

Weitere Text-Basierte Typen

+
+ +
+ +
+ +
+

Manche Eingabearten validieren die Eingabe, wenn ein User auf "submit" drückt.

+

Oft wird aber mittels Javascript eine komplexere Validierung implementiert (die meist schon Hinweise nach der Eingabe in einem Textfeld auf fehler hinweist)

+
+
+ diff --git a/src/components/slides/html-forms/introduction.astro b/src/components/slides/html-forms/introduction.astro new file mode 100644 index 0000000..38a3481 --- /dev/null +++ b/src/components/slides/html-forms/introduction.astro @@ -0,0 +1,39 @@ + +
+
+

Bisher haben wir HTML nur dazu verwendet, etwas anzuzeigen.

+

Aber natürlich hat jeder von uns schon einmal Daten in irgendeiner Form auf einer Website eingegeben

+
+ +
+ +
+ +
+

🍕

+
+ +
+

+ Wenn auch vieles heutzutage auf Apps gemacht wird, wird euch regelmäßig eine Webform innerhalb einer App über den Weg laufen. +

+
+ +
+ +
+ +
+ HTML bietet eine Reihe von Tags um Daten einzugeben, zu sammeln und diese final an einen Server zu schicken um dort bearbeitet zu werden. +
+
\ No newline at end of file diff --git a/src/components/slides/html-forms/structuring.astro b/src/components/slides/html-forms/structuring.astro new file mode 100644 index 0000000..f926e35 --- /dev/null +++ b/src/components/slides/html-forms/structuring.astro @@ -0,0 +1,54 @@ + + +
+
+

Gruppieren von Eingabe-Elementen

+
+ +
+

+ Mithilfe der Tags fieldset und legend können Zusammenhängende Abschnitte in einem Formular zusammengefasst werden. +

+

+ Die Tags haben keinen Einfluss darauf, wie die Daten versendet werden. +

+
+ +
+

+      <form>
+        <fieldset>
+          <legend>Name</legend>
+          <p>
+            <label for="vorname">Vorname</label>
+            <input id="vorname" name="firstname" type="text">
+          </p>
+          <p>
+            <label for="nachname">Nachname</label>
+            <input id="nachname" name="lastname" type="text">
+          </p>
+        </fieldset>
+      </form>
+    
+
+ +
+
+
+ Name +

+ + +

+

+ + +

+
+
+
+ +
+ Alle Zusammenhängende Elemente können in ein fieldset gepackt werden und zusätzlich mit einem legend Beschrieben werden +
+
\ No newline at end of file diff --git a/src/components/slides/html-forms/title.astro b/src/components/slides/html-forms/title.astro new file mode 100644 index 0000000..f7990e5 --- /dev/null +++ b/src/components/slides/html-forms/title.astro @@ -0,0 +1,3 @@ +
+

Daten verschicken mit Formularen

+
\ No newline at end of file diff --git a/src/components/slides/html-forms/validation.astro b/src/components/slides/html-forms/validation.astro new file mode 100644 index 0000000..84a32d1 --- /dev/null +++ b/src/components/slides/html-forms/validation.astro @@ -0,0 +1,146 @@ + +
+
+

Ist das so richtig? Validierung von Formularen

+
+ +
+

Disclaimer Vorweg:

+

Vertraue niemals von Nutzern eingegebene Daten, selbst wenn eine (Vor)-Validierung im Frontend geschieht!

+

Es sollte sowohl auf der Frontend als auch auf der Backend-Seite validiert werden. Der Nutzer sieht was er falsch gemacht hat und auf der Server-Seite kann man von "sicheren" Daten ausgehen.

+
+ +
+

Validierung im Frontend passiert auf 2 Arten:

+ +
+ +
+

Diese Präsentation fokusiert sich auf Attribute die den Tags mitgegeben werden können.

+

Drückt ein Nutzer auf den Absende-Button, so validiert der Browser alle Eingabefelder innerhalb des form-Elementes

+

Das Verhalten bei einer Fehlerhaften Eingabe variiert von Browser zu Browser

+
+ +
+

Eine Notwendigkeit: * (required)

+
+ +
+

Das Attribut required kann als "boolsches" Attribut ohne Wert in einer Komponente stehen.

+

Sie sorgt dafür, dass der User einen Wert eingeben haben muss, bevor das Formular durch den Browser versendet wird.

+
+ +
+

+      <form>
+        <label for="input">Eingabe</label>
+        <input type="text" id="input" required>
+        <input type="submit">
+      </form>
+    
+
+ +
+
+ + + +
+
+ +
+

Eingabe-Länge beschränken: mit minlength & maxlength

+
+ +
+

Mithilfe der Attribute minlength & maxlength kann bei Text-Basierten Eingaben auf eine mindestlänge des Eingegebenen Textes (Zeichenlänge) erzwungen werden.

+
+ +
+

+      <form>
+        <label for="input">Eingabe (3-15 Zeichen)</label>
+        <input type="text" id="input" minlength="3" maxlength="15">
+        <input type="submit">
+      </form>
+    
+
+ +
+
+ + + +
+
+ +
+

Das Attribut maxlength sorgt dafür, dass auch nach dem 15. Zeichen kein weiteres Eingegeben werden kann.

+

minlength führt bei zu wenigen Zeichen zum gleichen Effekt wie beim Attribut required (aber mit einer spezifischen Fehlermeldung)

+
+ +
+

Ober- und Untergrenzen bei Zahlen: min & max

+
+ +
+

Wie bereits in einer vorherigen Slide gesehen, dienen die Attribute min & max dazu, obere sowie untere Grenzen in einer Zahleneingabe festzulegen.

+
+ +
+

+      <form>
+        <label for="input">Eingabe Zahl (1 bis 10)</label>
+        <input type="number" id="input" min="1" max="10" value="1">
+        <input type="submit">
+      </form>
+    
+
+ +
+
+ + + +
+
+ +
+

Komplexe Textvalidierung mithilfe von pattern

+
+ +
+

Pattern bietet ein Effektives mittel um komplexe Anforderungen an Texte zu prüfen

+

Das Pattern wird mithilfe eines regulären Ausdrucks (Regular Expression) definiert

+
+ +
+

+      <form>
+        <label for="input">Eingabe (banane oder kirsche)</label>
+        <input type="text" id="input" pattern="banane|kirsche">
+        <input type="submit">
+      </form>
+    
+
+ +
+
+ + + +
+
+ +
+

Validierung mittels type?!

+
+ +
+

Wie vielleicht bereits beobachtet, haben Eingabefelder wie z.B. type="email" bereits eine selber eingebaute Validierung.

+

Diese Validierung "reicht" aber zumeist nicht und wird mithilfe von pattern und JavaScript erweitert um den Anforderungen gerecht zu werden.

+
+
\ No newline at end of file diff --git a/src/pages/slides/forms.astro b/src/pages/slides/forms.astro new file mode 100644 index 0000000..31511be --- /dev/null +++ b/src/pages/slides/forms.astro @@ -0,0 +1,8 @@ +--- +import Reveal from "../../layouts/Reveal.astro"; +import Slides from '../../components/slides/html-forms/index.astro' +--- + + + + \ No newline at end of file