Capacités des médias et des appareils du navigateur

Contrôle du mode plein écran de l’espace de démonstration

Dans une scène d’espace de présentation, réalisez un contrôle de scène plein écran : contenu réel, contrôles interactifs, retour d’état clair et mise en page responsive.

Capacités des médias et des appareils du navigateurContrôle de scène en plein écranHTMLCSSBrowser API
Cette démonstration nécessite des autorisations de navigateur. Veuillez laisser « l’exécution isolée » désactivée et déclencher l’action en cliquant vous-même ; si l’autorisation est refusée ou non prise en charge, un état de repli sera affiché.
Après activation de JavaScript, ce cas peut être modifié, exécuté et enregistré. Code source fixe ci-dessous :
<!doctype html>
<html lang="fr" dir="ltr">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>Contrôle du mode plein écran de l’espace de démonstration</title>
  <style>
    :root { --ink:#24213a; --paper:#f6f1e8; --accent:#e6a23c; --secondary:#a8a1d8; --line:color-mix(in srgb, var(--ink) 18%, transparent); --shadow:0 24px 60px color-mix(in srgb, var(--ink) 16%, transparent); color-scheme:light; }
    * { box-sizing:border-box; }
    html { min-width:320px; background:var(--paper); }
    body { min-height:100vh; margin:0; overflow-x:hidden; color:var(--ink); font-family:"DIN Alternate","Arial Narrow",sans-serif; background:repeating-linear-gradient(135deg,color-mix(in srgb,var(--ink) 5%,transparent) 0 1px,transparent 1px 18px),var(--paper); }
    button,input,select,textarea { color:inherit; font:inherit; }
    button,[role="button"],input,select,textarea { accent-color:var(--accent); }
    button { cursor:pointer; }
    button:focus-visible,input:focus-visible,select:focus-visible,textarea:focus-visible,[tabindex]:focus-visible { outline:3px solid var(--accent); outline-offset:3px; }
    [hidden] { display:none !important; }
    @media (max-width:700px) { .mast h1 { line-height:1.08 !important; letter-spacing:-.035em !important; overflow-wrap:anywhere; } }
    @media (prefers-reduced-motion:reduce) { *,*::before,*::after { scroll-behavior:auto !important; animation-duration:.01ms !important; animation-iteration-count:1 !important; transition-duration:.01ms !important; } }
    .mast{display:flex;justify-content:space-between;border-bottom:6px solid var(--ink);padding-bottom:18px;gap:20px;align-items:flex-end;margin:0 0 22px}.page{width:min(1240px,calc(100% - 28px));margin:auto;padding:34px 0 70px}.scenario{padding:8px 12px;border:2px solid var(--ink);font:900 12px/1 ui-monospace,monospace}.mast h1{font-family:"DIN Condensed","Arial Narrow",sans-serif;font-weight:900;text-transform:uppercase;font-size:clamp(44px,10vw,104px);letter-spacing:-.02em;max-width:1000px;margin:0;line-height:.82}.intro{max-width:720px;font-family:"Arial Narrow",sans-serif;line-height:1.5}.eyebrow{display:inline-block;padding:6px 9px;color:var(--paper);background:var(--accent);font:900 10px/1 ui-monospace,monospace;letter-spacing:.12em}.demo{border-radius:3px;box-shadow:10px 10px 0 var(--accent);position:relative;min-height:400px;overflow:hidden;padding:32px;background:var(--paper)}@media(max-width:700px){.mast{display:grid;grid-template-columns:1fr}.page{width:calc(100% - 16px);padding-top:16px}.demo{padding:14px}}
    .panel{padding:20px;border:1px dashed var(--secondary);border-radius:8px;background:color-mix(in srgb,var(--paper) 92%,#000)}.stack{display:grid;gap:10px}.row{display:flex;flex-wrap:wrap;gap:7px}.action{min-height:40px;padding:8px 12px;border:1px solid var(--secondary);border-radius:5px;color:var(--ink);background:transparent;font:700 12px/1 ui-monospace,monospace}.action.primary,.action.is-active{color:var(--paper);background:var(--accent)}.status{min-height:22px;color:var(--secondary);font:700 12px/1.5 ui-monospace,monospace}.status::before{content:"status: "}.metric{font:800 clamp(28px,6vw,56px)/1 ui-monospace,monospace}.muted{opacity:.64;font-family:ui-monospace,monospace}.meter{height:8px;background:repeating-linear-gradient(90deg,var(--line) 0 8px,transparent 8px 10px)}.meter>i{display:block;height:100%;background:var(--secondary)}.chip{padding:4px 7px;border:1px solid var(--secondary);font:700 10px/1 ui-monospace,monospace}
    .composition-split{display:grid;grid-template-columns:150px minmax(0,1fr);gap:18px;align-items:start}.split-note{position:sticky;top:20px;display:grid;gap:14px;padding:18px 12px;border-block:3px double var(--accent);font-size:13px;line-height:1.65}.split-note b{font:900 12px/1 ui-monospace,monospace;letter-spacing:.12em}.split-note span{writing-mode:vertical-rl;min-height:120px;color:color-mix(in srgb,var(--ink) 60%,transparent)}.composition-split .demo{min-width:0}@media(max-width:900px){.composition-split{grid-template-columns:1fr}.split-note{position:static;grid-template-columns:auto 1fr}.split-note span{writing-mode:horizontal-tb;min-height:0}}
    .fullscreen-studio{display:grid;grid-template-columns:minmax(0,1.45fr) minmax(200px,.55fr);min-height:390px;border:1px solid var(--line)}#fullscreenStage{display:grid;align-content:space-between;min-height:390px;padding:clamp(26px,7vw,72px);color:#fff;background:radial-gradient(circle at 80% 20%,#7c3aed,#172554 58%)}#fullscreenStage:fullscreen{min-height:100vh}#fullscreenSlides{padding:0;margin:0;list-style:none}#fullscreenSlides li b{font-size:14px;letter-spacing:.2em}#fullscreenSlides h2{max-width:700px;margin:.3em 0;font-size:clamp(40px,9vw,92px);line-height:.95}#fullscreenProgress{height:8px;background:#ffffff33}#fullscreenProgress i{display:block;width:33.333%;height:100%;background:#fff;transition:width .25s}.fullscreen-studio>aside{display:grid;align-content:center;gap:18px;padding:24px;background:var(--paper)}.fullscreen-studio>aside output{font-size:28px;font-weight:900}.fullscreen-studio>aside div{display:grid;gap:8px}@media(max-width:700px){.fullscreen-studio{grid-template-columns:1fr}}.workflow-session{display:grid;gap:14px}.session-command{display:grid;grid-template-columns:1fr auto minmax(170px,.45fr) auto;gap:16px;align-items:end;padding:18px;border-block:4px double var(--ink)}.session-command h2{margin:.2em 0}.session-command output{font:900 clamp(28px,5vw,54px)/1 ui-monospace,monospace}.session-command label{display:grid;grid-template-columns:1fr auto;gap:7px;font-size:12px}.session-command input{grid-column:1/-1;width:100%}#workflowSessionProgress{height:12px;overflow:hidden;border-radius:2px;background:var(--line)}#workflowSessionProgress i{display:block;width:0;height:100%;background:var(--accent)}.session-stage{min-width:0;transition:filter .25s,transform .25s}.session-stage[data-session-phase="running"]{transform:translateY(-3px)}.session-stage[data-session-phase="paused"]{filter:grayscale(.65)}.session-stage[data-session-phase="complete"]{filter:contrast(.78);opacity:.72}.session-log{display:grid;grid-template-columns:auto 1fr;gap:18px;align-items:start}.session-log ol{display:flex;flex-wrap:wrap;gap:7px;padding:0;margin:0;list-style:none}.session-log li{padding:5px 8px;border:1px solid var(--line);font-size:12px}@media(max-width:900px){.session-stage{order:-1}.session-command{grid-template-columns:1fr auto}.session-command label{grid-column:1/-1}.session-log{grid-template-columns:1fr}}
  </style>
</head>
<body data-aesthetic="industrial" data-composition="split-note">
  <main class="page">
    <header class="mast"><div><span class="eyebrow">industriel / contrôle de scène en plein écran / ADVANCED</span><h1>Contrôle du mode plein écran de l’espace de démonstration</h1><p class="intro">Dans une scène d’espace de présentation, réalisez un contrôle de scène plein écran : contenu réel, contrôles interactifs, retour d’état clair et mise en page responsive.</p></div><span class="scenario">Espace de démonstration</span></header>
    <div class="composition-split"><aside class="split-note"><b>CASE 02</b><span>Maîtriser la structure sémantique du contrôle de scène en plein écran, la composition réactive, les opérations au clavier et la synchronisation des états.</span></aside><section class="demo" aria-label="Zone d’interaction de contrôle de scène en plein écran pour l’espace de présentation"><div class="workflow-session"><header class="session-command"><div><span class="eyebrow">Espace de démonstration SESSION</span><h2>Tableau de chronométrage de démonstration</h2></div><output id="workflowSessionClock">00:45</output><label>Durée du tour<input id="workflowSessionLength" type="range" min="15" max="90" step="15" value="45"><span>s</span></label><button id="workflowSessionToggle" class="action primary" type="button">Démarrer la présentation</button></header><div id="workflowSessionProgress" role="progressbar" aria-label="Progression de la minuterie de démonstration" aria-valuemin="0" aria-valuemax="100" aria-valuenow="0"><i></i></div><section id="workflowCore" class="workflow-core session-stage" data-session-phase="ready" tabindex="-1"><!-- 11DZ_CORE_START:browser-media-device-fullscreen-stage --><div class="fullscreen-studio"><section id="fullscreenStage" tabindex="0"><span class="eyebrow">FULLSCREEN STAGE</span><ol id="fullscreenSlides"><li data-slide="0"><b>01</b><h2>Préparer l’environnement</h2><p>Espace de présentation · Utilisez les flèches gauche et droite pour changer de vue.</p></li><li data-slide="1" hidden><b>02</b><h2>Flux principal de démonstration</h2><p>Espace de présentation · Utilisez les flèches gauche et droite pour changer de vue.</p></li><li data-slide="2" hidden><b>03</b><h2>Vérifier l’état de repli</h2><p>Espace de présentation · Utilisez les flèches gauche et droite pour changer de vue.</p></li></ol><div id="fullscreenProgress" role="progressbar" aria-label="Progression de la page de présentation" aria-valuemin="1" aria-valuemax="3" aria-valuenow="1"><i></i></div></section><aside><output id="fullscreenState">Fenêtre normale</output><p>Le mode plein écran ne peut être activé que par l’utilisateur ; en cas de refus, il est toujours possible de continuer à tourner les pages.</p><div><button id="fullscreenBack" class="action" type="button">Page précédente</button><button id="fullscreenNext" class="action" type="button" data-core-bridge="browser-media-device-fullscreen-stage">Page suivante</button><button id="fullscreenToggle" class="action primary" type="button">Entrer en plein écran</button></div></aside></div><!-- 11DZ_CORE_END --></section><footer class="session-log"><strong id="workflowSessionScore">0 points de contrôle interactifs</strong><ol id="workflowSessionLaps" aria-label="Journal de ronde"></ol></footer></div><p id="status" class="status" role="status" aria-live="polite"></p></section></div>
  </main>
  <script>
    'use strict';
    const statusOutput = document.querySelector('#status');
    const announce = message => { statusOutput.textContent = message; };
    /* 11DZ_CORE_SCRIPT_START:browser-media-device-fullscreen-stage */
const fullscreenStage=document.querySelector('#fullscreenStage');const fullscreenSlides=[...document.querySelectorAll('[data-slide]')];const fullscreenState={index:0};const fullscreenStateOutput=document.querySelector('#fullscreenState');const fullscreenToggle=document.querySelector('#fullscreenToggle');let fullscreenFallback=false;function renderFullscreen(){fullscreenSlides.forEach((slide,index)=>{slide.hidden=index!==fullscreenState.index;});const progress=document.querySelector('#fullscreenProgress');progress.setAttribute('aria-valuenow',String(fullscreenState.index+1));progress.querySelector('i').style.width=(fullscreenState.index+1)/fullscreenSlides.length*100+'%';document.querySelector('#fullscreenBack').disabled=fullscreenState.index===0;document.querySelector('#fullscreenNext').disabled=fullscreenState.index===fullscreenSlides.length-1;}function moveFullscreen(step){fullscreenState.index=Math.max(0,Math.min(fullscreenSlides.length-1,fullscreenState.index+step));renderFullscreen();announce('Démonstration numéro '+(fullscreenState.index+1)+' page');}document.querySelector('#fullscreenBack').addEventListener('click',()=>moveFullscreen(-1));document.querySelector('#fullscreenNext').addEventListener('click',()=>moveFullscreen(1));fullscreenToggle.addEventListener('click',async()=>{try{if(document.fullscreenElement){fullscreenFallback=false;await document.exitFullscreen();}else if(fullscreenStage.requestFullscreen){fullscreenFallback=false;await fullscreenStage.requestFullscreen();}else{throw new Error('unsupported');}}catch{fullscreenFallback=true;fullscreenStateOutput.textContent='L’environnement actuel ne prend pas en charge le plein écran ou l’a refusé';fullscreenToggle.textContent='Entrer en plein écran';announce('Impossible d’entrer en plein écran, le changement de diapositive reste disponible');}});document.addEventListener('fullscreenchange',()=>{const active=document.fullscreenElement===fullscreenStage;if(active){fullscreenFallback=false;fullscreenStateOutput.textContent='En plein écran sur la scène';}else if(!fullscreenFallback){fullscreenStateOutput.textContent='Fenêtre normale';}fullscreenToggle.textContent=active?'Quitter le plein écran':'Entrer en plein écran';});fullscreenStage.addEventListener('keydown',event=>{if(event.key==='ArrowRight')moveFullscreen(1);if(event.key==='ArrowLeft')moveFullscreen(-1);});renderFullscreen();
/* 11DZ_CORE_SCRIPT_END */
const workflowBridgeSpec={"name":"browser-media-device-fullscreen-stage","selector":"[data-core-bridge=\"browser-media-device-fullscreen-stage\"]","mode":"click","key":"Enter"};const workflowBridgeCore=document.querySelector('#workflowCore');const workflowBridgeControl=workflowBridgeCore.querySelector(workflowBridgeSpec.selector);if(!workflowBridgeControl)throw new Error('Missing core bridge: '+workflowBridgeSpec.name);const workflowBridgeControlledId=workflowBridgeControl.getAttribute('aria-controls');const workflowBridgeControlled=workflowBridgeControlledId?document.getElementById(workflowBridgeControlledId):null;workflowBridgeCore.dataset.workflowBridge=workflowBridgeSpec.name;workflowBridgeCore.dataset.workflowVersion='0';function workflowBridgeSerialize(){const visualNode=workflowBridgeCore.firstElementChild||workflowBridgeCore;const visual=getComputedStyle(visualNode);const outputs=[...workflowBridgeCore.querySelectorAll('output,[role="status"],[aria-live],meter,progress')].map(node=>node.textContent.trim()+'|'+node.getAttribute('aria-valuenow')+'|'+node.getAttribute('value'));const canvas=[...workflowBridgeCore.querySelectorAll('canvas')].map(node=>{try{return node.toDataURL().slice(-160);}catch{return 'canvas-unavailable';}});return JSON.stringify({html:workflowBridgeCore.innerHTML,status:statusOutput.textContent,outputs,canvas,visual:[visual.display,visual.visibility,visual.opacity,visual.transform,visual.filter,visual.backgroundColor,visual.width,visual.height],scroll:workflowBridgeSpec.mode==='scroll'?workflowBridgeControl.scrollTop:null});}let workflowBridgeLastEffect=workflowBridgeSerialize();function workflowBridgeSummary(){const label=(workflowBridgeControl.getAttribute('aria-label')||workflowBridgeControl.textContent||workflowBridgeControl.value||workflowBridgeSpec.name).trim().replace(/\s+/g,' ').slice(0,72);return label+' · Version de base '+workflowBridgeCore.dataset.workflowVersion;}function workflowBridgeCommit(){const effect=workflowBridgeSerialize();if(effect===workflowBridgeLastEffect)return {changed:false,summary:workflowBridgeSummary()};workflowBridgeLastEffect=effect;workflowBridgeCore.dataset.workflowVersion=String(Number(workflowBridgeCore.dataset.workflowVersion||0)+1);return {changed:true,summary:workflowBridgeSummary()};}function workflowBridgeScheduleCommit(){queueMicrotask(workflowBridgeCommit);setTimeout(workflowBridgeCommit,0);}workflowBridgeControl.addEventListener("click",workflowBridgeScheduleCommit);const workflowBridgeStateTargets=new Set(workflowBridgeCore.querySelectorAll('dialog'));if(workflowBridgeControlled&&workflowBridgeCore.contains(workflowBridgeControlled))workflowBridgeStateTargets.add(workflowBridgeControlled);workflowBridgeStateTargets.forEach(target=>['close','cancel','toggle'].forEach(eventName=>target.addEventListener(eventName,workflowBridgeScheduleCommit)));function workflowBridgeActivate(){workflowBridgeControl.focus();workflowBridgeControl.click();const result=workflowBridgeCommit();setTimeout(workflowBridgeCommit,0);return result;}function workflowBridgeReset(){workflowBridgeCore.dataset.workflowVersion='0';workflowBridgeLastEffect=workflowBridgeSerialize();}
const workflowSessionCore=document.querySelector('#workflowCore');const workflowSessionToggle=document.querySelector('#workflowSessionToggle');const workflowSessionLength=document.querySelector('#workflowSessionLength');const workflowSessionState={phase:'ready',elapsed:0,limit:Number(workflowSessionLength.value),checkpoints:[],timer:null};function workflowSessionFormat(seconds){return String(Math.floor(seconds/60)).padStart(2,'0')+':'+String(seconds%60).padStart(2,'0');}function workflowSessionDrive(){const percent=Math.min(100,Math.round(workflowSessionState.elapsed/workflowSessionState.limit*100));document.querySelector('#workflowSessionClock').textContent=workflowSessionFormat(Math.max(0,workflowSessionState.limit-workflowSessionState.elapsed));const progress=document.querySelector('#workflowSessionProgress');progress.setAttribute('aria-valuenow',String(percent));progress.querySelector('i').style.width=percent+'%';workflowSessionCore.dataset.sessionPhase=workflowSessionState.phase;document.querySelector('#workflowSessionScore').textContent=workflowSessionState.checkpoints.length+' points de contrôle d’interaction';}function workflowSessionLap(label){workflowSessionState.checkpoints.push({label,at:workflowSessionState.elapsed});const item=document.createElement('li');item.textContent=label+' · '+workflowSessionFormat(workflowSessionState.elapsed);document.querySelector('#workflowSessionLaps').append(item);workflowSessionDrive();}function workflowSessionStop(complete=false){clearInterval(workflowSessionState.timer);workflowSessionState.timer=null;workflowSessionState.phase=complete?'complete':'paused';workflowSessionToggle.textContent=complete?'Recommencer':'Tour suivant';workflowSessionToggle.setAttribute('aria-pressed','false');workflowSessionDrive();announce(complete?'Tour de chronométrage de démonstration terminée':'La ronde est suspendue');}function workflowSessionStart(){if(workflowSessionState.phase==='complete'){workflowSessionState.elapsed=0;workflowSessionState.checkpoints=[];document.querySelector('#workflowSessionLaps').replaceChildren();}workflowSessionState.phase='running';workflowSessionToggle.textContent='Tour de pause';workflowSessionToggle.setAttribute('aria-pressed','true');const bridge=workflowBridgeActivate();workflowSessionLap(bridge.summary);clearInterval(workflowSessionState.timer);workflowSessionState.timer=setInterval(()=>{workflowSessionState.elapsed+=1;if(workflowSessionState.elapsed>=workflowSessionState.limit){workflowSessionStop(true);return;}workflowSessionDrive();},1000);workflowSessionDrive();announce('Le tour de chronométrage de la présentation a commencé · '+bridge.summary);}workflowSessionToggle.addEventListener('click',()=>workflowSessionState.phase==='running'?workflowSessionStop():workflowSessionStart());workflowSessionLength.addEventListener('input',()=>{workflowSessionState.limit=Number(workflowSessionLength.value);workflowSessionState.elapsed=Math.min(workflowSessionState.elapsed,workflowSessionState.limit);workflowSessionDrive();});workflowSessionCore.addEventListener('keydown',event=>{if(event.key==='Enter'||event.key===' '){workflowSessionLap('Opérations au clavier');}});workflowSessionCore.addEventListener('click',event=>{if(event.target.closest('[data-core-bridge]'))workflowSessionLap('Opération principale · '+workflowBridgeSummary());});document.addEventListener('visibilitychange',()=>{if(document.hidden&&workflowSessionState.phase==='running')workflowSessionStop();});workflowSessionDrive();
workflowBridgeReset();
  </script>
</body>
</html>
Commentaires sur la pageVous avez découvert un problème ou avez une suggestion d’amélioration ?
Les fonctions de retour nécessitent l’utilisation de la version en ligne

Veuillez activer JavaScript dans la version en ligne avant de soumettre ; les fonctionnalités locales de l’outil ou du cas ne sont pas affectées.

Aller vers la version en ligne pour envoyer des commentaires