Donnerstag, 11 Dezember 2025

Diese Woche am beliebtesten

Vertiefendes Material

Edel PHP Adventskalender

Lade dir unseren festlichen Adventskalender herunter und bringe Weihnachten direkt auf deine Website. Dieses Dreamcodes Script ist vollständig selbstständig: beim ersten Aufruf erstellt es automatisch alle notwendigen Dateien (style.css, script.js, data.php) und läuft sofort im Browser.

Highlights:

  • 24 Türchen mit Text, Bildern oder Videos
  • Schneefall und Konfetti Effekte
  • Türchen Shake bei verfrühtem Öffnen
  • Festliche Glocken oder Trommel-Sounds
  • Animierte Modals im Neumorphism/Glass-Look
  • Responsive Design, optimiert für Desktop, Tablet und Mobile
  • Zustandsspeicherung via localStorage

Einfach installieren:

  1. Abspeichern als .php Datei - hochladen
  2. Browser öffnen – alles wird automatisch generiert
  3. Adventskalender genießen – Spass haben 😉

Perfekt für Webseiten, Weihnachtsaktionen oder interaktive Überraschungen.

<?php
declare(strict_types=1);
$baseDir=__DIR__.DIRECTORY_SEPARATOR;
$files=['style.css','script.js','data.php'];
foreach($files as $f){
    $path=$baseDir.$f;
    if(!file_exists($path)){
        $content=match($f){
            'style.css'=>getCss(),
            'script.js'=>getJs(),
            'data.php'=>getData(),
            default=>''
        };
        @file_put_contents($path,$content);
        @chmod($path,0644);
    }
}

$ADVENT=include $baseDir.'data.php';
$doors=$ADVENT['doors']??[];
$config=$ADVENT['__config']??[];
$serverDay=(int)date('j'); $serverMonth=(int)date('n');

?><!doctype html>
<html lang="de">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Luxus Weihnachts-Adventskalender</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<main class="app">
<header class="topbar"><div class="brand">🎄 Adventskalender 🎅</div><div class="meta">Server: <?= date('Y-m-d') ?></div></header>
<section class="grid" role="list">
<?php for($i=1;$i<=($config['days']??24);$i++): ?><article class="door" data-day="<?= $i ?>" role="listitem" aria-label="Tag <?= $i ?>"><div class="door-face"><div class="num"><?= $i ?></div><div class="glass"></div></div></article><?php endfor; ?></section>
<div id="modal" class="modal" aria-hidden="true"><div class="modal-backdrop" data-close="true"></div><div class="modal-card"><button class="close" data-close="true">✕</button><h2 id="modal-title"></h2><div id="modal-media"></div><div id="modal-body"></div><footer class="modal-footer"><button id="mark-read" class="btn">Als gelesen markieren</button></footer></div></div>
<footer class="footer">Powered by <a href="https://www.dreamcodes.net" target="_blank" rel="noopener">Dreamcodes</a></footer>
<script>window.ADVENT_CONFIG=<?= json_encode($ADVENT,JSON_UNESCAPED_UNICODE|JSON_THROW_ON_ERROR) ?>;window.SERVER_DAY=<?= $serverDay ?>;window.SERVER_MONTH=<?= $serverMonth ?>;</script>
<script src="script.js" defer></script>
</body>
</html>

<?php
function getCss(): string{
return <<<CSS
:root{--bg:#0b0b2a;--card:#1b0b3a;--glass:rgba(255,255,255,0.08);--accent:#ff4444;--radius:16px;--gap:20px}
body{margin:0;font-family:-apple-system,BlinkMacSystemFont,'SF Pro Text',Arial;background:linear-gradient(#0b0b2a,#2a0b2a);color:#fff;overflow-x:hidden}
.grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(100px,1fr));gap:var(--gap);padding:20px}
.door{position:relative;height:150px;border-radius:var(--radius);cursor:pointer;transform-style:preserve-3d;transition:transform .4s ease-in-out}
.door-face{position:absolute;inset:0;border-radius:inherit;padding:10px;display:flex;align-items:flex-end;justify-content:flex-end;background:linear-gradient(180deg,rgba(255,255,255,0.05),rgba(0,0,0,0.05));backdrop-filter:blur(10px) saturate(150%);box-shadow:0 4px 12px rgba(0,0,0,0.5)}
.num{font-size:28px;font-weight:900;color:#ffeb3b;text-shadow:0 0 8px #fff}
.door.open .door-face{transform:rotateX(20deg) translateY(-20px);box-shadow:0 30px 60px rgba(0,0,0,0.7)}
.door.shake{animation:shake .6s}@keyframes shake{0%{transform:translateX(0)}20%{transform:translateX(-6px)}40%{transform:translateX(6px)}60%{transform:translateX(-4px)}80%{transform:translateX(2px)}100%{transform:translateX(0)}}
.modal{position:fixed;inset:0;display:none;align-items:center;justify-content:center;z-index:60}
.modal[aria-hidden=false]{display:flex}
.modal-backdrop{position:absolute;inset:0;background:rgba(0,0,0,0.7);backdrop-filter:blur(8px)}
.modal-card{position:relative;z-index:70;max-width:720px;width:94%;border-radius:20px;padding:24px;background:linear-gradient(180deg,rgba(255,255,255,0.03),rgba(255,255,255,0.05));box-shadow:0 10px 40px rgba(0,0,0,0.8);animation:fadeIn .5s ease}
@keyframes fadeIn{0%{opacity:0}100%{opacity:1}}
.close{position:absolute;right:12px;top:10px;background:transparent;border:none;color:#ffeb3b;font-size:20px;cursor:pointer}
.modal-footer{display:flex;justify-content:flex-end}.btn{background:linear-gradient(180deg,#ff6b6b,#c70039);border:none;padding:12px 18px;border-radius:12px;color:#fff;cursor:pointer;font-weight:700}
.footer{text-align:center;margin-top:18px;font-size:13px;color:#eee}
#snowfall{position:fixed;top:0;left:0;width:100%;height:100%;pointer-events:none;z-index:50}
.flake{position:absolute;color:white;user-select:none}
CSS;
}

function getJs(): string{
return <<<JS
'use strict';
const STORAGE_KEY='advent_luxury_opened';
const state={opened:new Set(JSON.parse(localStorage.getItem(STORAGE_KEY)||'[]'))};
function saveState(){localStorage.setItem(STORAGE_KEY,JSON.stringify(Array.from(state.opened)))}
function queryDay(el){return parseInt(el.getAttribute('data-day'))||0}
function showModal(data){const m=document.getElementById('modal');m.setAttribute('aria-hidden','false');document.getElementById('modal-title').textContent=data.title||'Inhalt';document.getElementById('modal-media').innerHTML='';if(data.media){if(data.media.type==='img'){let img=document.createElement('img');img.src=data.media.src;document.getElementById('modal-media').appendChild(img);}else if(data.media.type==='video'){let iframe=document.createElement('iframe');iframe.src=data.media.src;iframe.width='100%';iframe.height='360';iframe.setAttribute('allow','accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture');document.getElementById('modal-media').appendChild(iframe);}}document.getElementById('modal-body').innerHTML=data.html||''}
function closeModal(){document.getElementById('modal').setAttribute('aria-hidden','true')}
function playSound(){let audio=new Audio('https://www.myinstants.com/media/sounds/christmas-bells.mp3');audio.volume=0.5;audio.play().catch(()=>{});}
function showConfetti(){const canvas=document.createElement('canvas');canvas.style.position='fixed';canvas.style.top='0';canvas.style.left='0';canvas.style.width='100%';canvas.style.height='100%';canvas.style.pointerEvents='none';canvas.style.zIndex='9999';document.body.appendChild(canvas);const ctx=canvas.getContext('2d');canvas.width=window.innerWidth;canvas.height=window.innerHeight;const particles=[];for(let i=0;i<150;i++){particles.push({x:Math.random()*canvas.width,y:Math.random()*canvas.height,r:Math.random()*5+2,dx:(Math.random()-0.5)*2,dy:Math.random()*2+1,color:'hsl('+Math.random()*360+',100%,50%)',tilt:Math.random()*20});}function draw(){ctx.clearRect(0,0,canvas.width,canvas.height);particles.forEach(p=>{ctx.save();ctx.translate(p.x,p.y);ctx.rotate(p.tilt*Math.PI/180);ctx.fillStyle=p.color;ctx.fillRect(-p.r/2,-p.r/2,p.r,p.r);ctx.restore();p.x+=p.dx;p.y+=p.dy;p.tilt+=0.1;if(p.y>canvas.height){p.y=0;p.x=Math.random()*canvas.width}if(p.x>canvas.width){p.x=0}}requestAnimationFrame(draw)}draw();setTimeout(()=>canvas.remove(),3000)}
(function(){const snow=document.createElement('div');snow.id='snowfall';document.body.appendChild(snow);for(let i=0;i<100;i++){const f=document.createElement('div');f.className='flake';f.style.left=Math.random()*100+'%';f.style.top=Math.random()*window.innerHeight+'px';f.style.fontSize=(10+Math.random()*10)+'px';f.innerHTML='❄';snow.appendChild(f);}})();
document.addEventListener('click',async ev=>{const door=ev.target.closest('.door');if(!door)return;const day=queryDay(door);const payload=await fetch('?action=get&day='+day).then(r=>r.json()).catch(_=>({ok:false}));if(!payload.ok){door.classList.add('shake');return;}if(!payload.allowed){door.classList.add('shake');alert('Erst am richtigen Tag öffnbar!');return;}door.classList.add('open');state.opened.add(day);saveState();showModal(payload.content);playSound();showConfetti();});
document.addEventListener('click',e=>{if(e.target.dataset.close)closeModal()});document.addEventListener('keydown',e=>{if(e.key==='Escape')closeModal()});document.getElementById('mark-read').addEventListener('click',()=>{const t=document.getElementById('modal-title').textContent||'';const m=t.match(/(\d{1,2})$/);if(m){state.opened.add(parseInt(m[1]));saveState();document.querySelectorAll('.door').forEach(d=>{if(state.opened.has(parseInt(d.dataset.day)))d.classList.add('open');});}closeModal();});document.querySelectorAll('.door').forEach(d=>{if(state.opened.has(parseInt(d.dataset.day)))d.classList.add('open')});
JS;
}

function getData(): string{
$doors=[];
for($i=1;$i<=24;$i++){
$doors[$i]=['title'=>'🎁 Tag '.$i,'html'=>'<p>Weihnachtsüberraschung für Tag '.$i.'</p>','media'=>null];
if(in_array($i,[3,7,12,18])){$doors[$i]['media']=['type'=>'img','src'=>'https://picsum.photos/seed/xmas'.$i.'/800/450'];}
if(in_array($i,[5,10,20])){$doors[$i]['media']=['type'=>'video','src'=>'https://www.youtube.com/embed/dQw4w9WgXcQ?rel=0'];}}
$config=['days'=>24,'allow_any_month'=>false];
return "<?php\nreturn ".var_export(['__config'=>$config,'doors'=>$doors],true).";\n";
}
?>
Vorheriges Tutorial
Nächstes Tutorial
Dreamcodes Redaktion
Dreamcodes Redaktion
Seit 1999 bewegt sich Dreamcodes in der Welt der digitalen Entwicklung, zwischen Codezeilen, Designentscheidungen und technischen Herausforderungen, die manchmal kleiner aussehen, als sie wirklich sind. Die Herausforderung besteht darin, komplexe Themen wie Webentwicklung, SEO, SEA, GEO, IT-Strukturen, Softwareentwicklung und moderne Technologien so aufzubereiten, dass sie verständlich, nachvollziehbar und vor allem praktisch nutzbar werden. Der Fokus liegt dabei darauf, Wissen nicht nur zu erklären, sondern es für reale Projekte anwendbar zu machen. Egal ob ein einfaches Script, ein umfangreicher Leitfaden oder ein tiefes technisches Tutorial: Das oberste Ziel dabei ist, dass Leser am Ende wirklich weiterkommen und ein Thema greifbarer wird als vorher. Über die Jahre gab es viele verschiedene Ansätze, Tools und Trends die kammen und auch wieder gingen. Genau das hilft neben Jahrelanger IT Erfahrung und mehrjähriger Tätigkeit im IT Bereich heute dabei, Inhalte mit Tiefe zu schreiben, die nicht nur Grundlagen vermitteln, sondern auch Hintergründe, Zusammenhänge und Best Practices erklären. Dreamcodes teilt diese Erfahrungen, mit dem Ziel, digitale Bildung für alle zugänglich zu machen, die neugierig sind, nach Lösungen suchen oder eigene digitale Projekte erfolgreich voranbringen möchten. Wenn dieses Wissen jemandem Zeit spart, ein Problem löst oder eine neue Idee auslöst, hat sich der Aufwand dahinter gelohnt. ;)

Vielleicht einen Blick wert