Herzlich willkommen zum SELF-Treffen 2026
vom 24.04. – 26.04.2026
in Halle (Saale)
Beispiel:Memo-Card-3.html
<!DOCTYPE html> <html lang="de"> <head>
<meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link rel="stylesheet" media="screen" href="./Beispiel:Grundlayout.css"> <title>Memo-Quiz - fertig!</title> <style>
- gameboard {
display: grid; gap: 1em;
grid-template-columns: repeat(4, 1fr); width: 32em; }
- gameboard button {
width: 8em; aspect-ratio: 1 / 1; perspective: 500px; background: transparent; border: 0; padding: 0;
}
img {
max-width: 100%; display: block;
}
.flip-card-inner {
position: relative; width: 100%; height: 100%; text-align: center; transition: transform 0.6s; transform-style: preserve-3d;
}
ul {
text-align: start;
}
.flip-card[aria-selected="true"] .flip-card-inner {
transform: rotateY(180deg);
}
.flip-card-front, .flip-card-back {
position: absolute; top: 0; left: 0; width: 100%; height: 100%; border: thin solid black; backface-visibility: hidden;
}
.flip-card-front {
background-color: #e6f2f7; transform: rotateY(180deg);
}
.flip-card-front img {
width: 100%; height: auto; background-color: #fff; display: block;
}
.flip-card-back {
background: white url(https://wiki.selfhtml.org/images/4/45/SELF-Logo.svg); background-size: contain; background-repeat: no-repeat; background-position: center;
}
.error, .success { padding: 1rem 2rem; }
.error { background: #ffdddd; color: red; }
.success { background: #ddffdd; color: green; white-space: pre-wrap; }
</style>
</head>
<body>
Memo-Quiz
Wähle zwei Karten aus und prüfe, ob sie ein Set sind.
<img src="https://wiki.selfhtml.org/images/f/fd/Snowman.svg" alt="snowman"> <img src="https://wiki.selfhtml.org/images/9/90/Advent-candles-4.svg" alt="candles"> <img src="https://wiki.selfhtml.org/images/0/01/Selfhtml-logo-Weihnachten.png" alt="SELF-Logo mit Nikloausmütze, ca 2008"> <img src="https://wiki.selfhtml.org/images/5/59/Selfangel.jpg" alt="SELF-Mitglied als Weihnachtsengel, ca 2008"> <img src="https://wiki.selfhtml.org/images/4/47/Elf.svg" alt="ELF"> <img src="https://wiki.selfhtml.org/images/6/66/SELF-Logo-Nikolaus.svg" alt="logo">
<script> document.addEventListener("DOMContentLoaded", () => {
const gameboard = document.querySelector("#gameboard");
const hint = document.querySelector("#hint");
let selectedCards = []; let totalPairs; let matchedPairs = 0;
function alert(text, type) {
if (text) {
setTimeout(() => {
hint.textContent = text;
hint.className = type ? type : "error";
}, 50);
} else {
hint.textContent = "";
hint.className = "";
}
}
function shuffle(array) {
for (let i = array.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
[array[i], array[j]] = [array[j], array[i]];
}
}
function initializeGame() {
const images = Array.from(gameboard.querySelectorAll("img"));
const cards = [];
images.forEach((img) => {
cards.push({ src: img.src, alt: img.alt });
cards.push({ src: img.src, alt: img.alt });
});
shuffle(cards);
gameboard.innerHTML = ""; matchedPairs = 0; totalPairs = cards.length / 2;
cards.forEach(({ src, alt }) => {
const button = createCard(src, alt);
gameboard.appendChild(button);
});
}
function createCard(src, alt) {
const button = document.createElement("button");
button.classList.add("flip-card");
button.setAttribute("aria-selected", "false");
const flipCardInner = document.createElement("div");
flipCardInner.classList.add("flip-card-inner");
const flipCardFront = document.createElement("img");
flipCardFront.classList.add("flip-card-front");
flipCardFront.src = src;
flipCardFront.alt = alt;
const flipCardBack = document.createElement("div");
flipCardBack.classList.add("flip-card-back");
flipCardInner.appendChild(flipCardFront); flipCardInner.appendChild(flipCardBack); button.appendChild(flipCardInner);
button.addEventListener("click", () => {
handleCardClick(button, src);
});
return button; }
function handleCardClick(card, src) {
if (selectedCards.length >= 2 || card.getAttribute("aria-selected") === "true") {
return;
}
card.setAttribute("aria-selected", "true");
selectedCards.push({ card, src });
if (selectedCards.length === 2) {
const [firstCard, secondCard] = selectedCards;
if (firstCard.src === secondCard.src) {
matchedPairs++;
selectedCards = [];
if (matchedPairs === totalPairs) {
alert("Herzlichen Glückwunsch!", "success");
}
} else {
setTimeout(() => {
firstCard.card.setAttribute("aria-selected", "false");
secondCard.card.setAttribute("aria-selected", "false");
selectedCards = [];
}, 1000);
}
}
}
initializeGame();
}); </script> </body> </html>