Styles und JavaScript‑Interaktionen für deine Web‑App

Erste Schritte: Styles und JavaScript‑Interaktionen für deine Web‑App: HTML / CSS / JS

Nachdem die PHP‑Logik steht, braucht deine Anwendung ein schickes Äußeres
und ein wenig Frontend‑Interaktivität.
Hier lernst du, wie du einfache CSS‑Styles definierst
und mit JavaScript DOM‑Elemente manipulierst –
ohne Framework‑Ballast, nur pures HTML/CSS/JS.

1. Grundgerüst – Einbinden von CSS & JS

<!DOCTYPE html>
<html lang="de">
<head>
  <meta charset="UTF-8">
  <title>TaskBoard</title>

  <!-- eigenes CSS -->
  <link rel="stylesheet" href="/assets/style.css">

  <meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>

  <!-- Seiteninhalt hier -->

  <!-- JavaScript erst nach dem Parsen laden -->
  <script src="/assets/app.js" defer></script>
</body>
</html>

Nutze dieses Muster immer dann, wenn ein <pre>‑Block HTML enthält –
so bleibt der Inhalt sichtbar und wird nicht von WordPress gefiltert.

  • style.css und app.js liegen im public/assets/ Ordner.
  • defer sorgt dafür, dass JS erst nach dem Parsen ausgeführt wird – kein Blocken.

2. CSS – Basis‑Styles & Layout

2.1 Farben, Typografie, Reset

/* assets/style.css */
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }

body {
  font-family: system-ui, sans-serif;
  line-height: 1.5;
  background: #f4f6f8;
  padding: 2rem;
  color: #222;
}

h1 { margin-bottom: 1rem; }
a  { color: #2563eb; text-decoration: none; }
button { cursor: pointer; }

2.2 Flex‑Layout für Task‑Spalten

.board {
  display: flex;
  gap: 1rem;
}

.column {
  flex: 1;
  background: #fff;
  border-radius: .5rem;
  padding: 1rem;
  min-height: 60vh;
}

.card {
  background: #fefefe;
  border: 1px solid #e5e7eb;
  border-radius: .3rem;
  padding: .75rem;
  margin-bottom: .5rem;
}

.status-open  { border-left: 4px solid #f59e0b; } /* orange */
.status-doing { border-left: 4px solid #3b82f6; } /* blue   */
.status-done  { border-left: 4px solid #10b981; } /* green  */

2.3 Responsives Verhalten

@media (max-width: 800px) {
  .board { flex-direction: column; }
}

Bei schmalen Bildschirmen (max‑width 800px) stapeln sich die Spalten
untereinander – perfekt fürs Smartphone.

3. JavaScript – DOM‑Interaktion

3.1 Aufgaben live zwischen Spalten verschieben (Drag & Drop Mini)

// assets/app.js
document.addEventListener('DOMContentLoaded', () => {
  const cards   = document.querySelectorAll('.card');
  const columns = document.querySelectorAll('.column');

  cards.forEach(card => {
    card.draggable = true;

    card.addEventListener('dragstart', e => {
      e.dataTransfer.setData('text/plain', card.dataset.id);
      card.classList.add('dragging');
    });
    card.addEventListener('dragend', () => card.classList.remove('dragging'));
  });

  columns.forEach(col => {
    col.addEventListener('dragover', e => e.preventDefault());
    col.addEventListener('drop', async e => {
      e.preventDefault();
      const id = e.dataTransfer.getData('text/plain');
      const card = document.querySelector(`.card[data-id="${id}"]`);
      col.appendChild(card);

      // Ajax‑Update an PHP‑Backend
      await fetch('/task/' + id + '/update', {
        method: 'POST',
        headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
        body: new URLSearchParams({ status: col.dataset.status })
      });
    });
  });
});
  • Jede Card trägt data-id; jede Column data-status.
  • Beim Drop wird per fetch die neue Spalte an den Controller gemeldet.
  • Funktioniert ohne externe Library; progressive Enhancement.

3.2 Form‑Validation (Client‑Side)

function validateTaskForm() {
  const title = document.querySelector('#title');
  if (!title.value.trim()) {
    alert('Titel darf nicht leer sein');
    title.focus();
    return false;
  }
  return true;
}
/* in 
… */

4. Accessibility & kleine Details

  • Sorge für kontrastreiche Farben (WCAG).
  • Verwende <button> statt <div onclick>,
    damit Keyboard‑User Tabs nutzen können.
  • Beschrifte Inputs mit <label for>.

5. Build‑Tools oder pur?

Für eine kleine App reicht pures CSS/JS.
Willst du SCSS, PostCSS oder ESBuild einsetzen, integriere sie später.
Beginne minimal, deploy fast, verbessere iterativ.

Fazit

Mit wenigen Zeilen CSS verleihst du deiner PHP‑App ein aufgeräumtes,
responsives Design.
Ein bisschen Vanilla‑JavaScript macht Aufgaben per Drag & Drop
beweglich und prüft Formulare schon vor dem Absenden.
So entsteht aus der funktionalen Backend‑Logik ein rundes Benutzer‑Erlebnis,
ohne sofort zu großen Frameworks greifen zu müssen.