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

Détection des capacités du pointeur du poste de consultation ambulatoire

Dans le contexte d’un siège de capteur ambulatoire, effectuez un test des capacités du pointeur : contenu réel, contrôles interactifs, retour d’état clair et disposition adaptée à différentes tailles d’écran.

Capacités des médias et des appareils du navigateurDétection des capacités du pointeurHTMLCSSBrowser API
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>Détection des capacités du pointeur du poste de consultation ambulatoire</title>
  <style>
    :root { --ink:#18314f; --paper:#f7f8f2; --accent:#ff6b5e; --secondary:#71c9b5; --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:Baskerville,"Songti SC",serif; background:linear-gradient(90deg,var(--paper) 0 72%,color-mix(in srgb,var(--secondary) 18%,var(--paper)) 72%); }
    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; } }
    .page{width:min(1200px,calc(100% - 38px));margin:auto;padding:76px 0}.mast{display:grid;grid-template-columns:2fr 1fr;gap:7vw;align-items:center;margin-bottom:44px}.mast h1{font-family:Baskerville,"Songti SC",serif;font-weight:800;font-size:clamp(48px,11vw,112px);line-height:.86;letter-spacing:-.06em;margin:0}.eyebrow{display:block;margin-bottom:22px;color:var(--accent);font:800 11px/1 ui-monospace,monospace;letter-spacing:.26em}.intro{max-width:46ch;margin-top:26px;font-size:17px;line-height:1.85}.scenario{align-self:end;padding-bottom:14px;border-bottom:5px solid var(--accent);font-weight:800}.demo{border-radius:0 60px 0 0;box-shadow:-16px 18px 0 color-mix(in srgb,var(--accent) 22%,transparent);position:relative;min-height:460px;overflow:hidden;padding:clamp(30px,6vw,72px);background:color-mix(in srgb,var(--paper) 92%,#fff)}@media(max-width:700px){.page{width:calc(100% - 22px);padding:30px 0}.mast{grid-template-columns:1fr}.demo{padding:20px}}
    .panel{padding:20px;border:1px solid color-mix(in srgb,var(--accent) 50%,transparent);border-radius:18px;background:color-mix(in srgb,var(--paper) 88%,transparent);box-shadow:inset 0 0 24px color-mix(in srgb,var(--accent) 7%,transparent)}.stack{display:grid;gap:16px}.row{display:flex;flex-wrap:wrap;gap:9px}.action{padding:11px 16px;border:1px solid var(--accent);border-radius:6px;color:var(--accent);background:transparent;box-shadow:0 0 14px color-mix(in srgb,var(--accent) 10%,transparent)}.action.primary,.action.is-active{color:var(--paper);background:var(--accent)}.status{min-height:24px;color:var(--secondary);text-shadow:0 0 10px currentColor}.metric{font-size:clamp(30px,7vw,64px);font-weight:900;text-shadow:0 0 18px color-mix(in srgb,var(--accent) 40%,transparent)}.muted{opacity:.7}.chip{padding:6px 9px;border:1px solid var(--secondary);border-radius:4px}.meter{height:7px;background:color-mix(in srgb,var(--accent) 15%,transparent)}.meter>i{display:block;height:100%;box-shadow:0 0 12px var(--accent);background:var(--accent)}
    .composition-deck{display:grid;grid-template-rows:auto 1fr;border:1px solid var(--line);border-radius:24px;overflow:hidden;background:color-mix(in srgb,var(--ink) 4%,var(--paper))}.deck-bar{display:flex;justify-content:space-between;gap:18px;align-items:center;padding:12px 18px;color:var(--paper);background:var(--ink);font:700 12px/1 ui-monospace,monospace}.deck-lights{display:flex;gap:7px}.deck-lights i{width:10px;height:10px;border-radius:50%;background:var(--accent)}.deck-lights i:nth-child(2){background:var(--secondary)}.deck-lights i:nth-child(3){background:color-mix(in srgb,var(--paper) 55%,transparent)}.composition-deck .demo{border:0;border-radius:0;box-shadow:none}
    .pointer-profiler{display:grid;grid-template-columns:minmax(0,1.35fr) minmax(190px,.65fr);gap:14px}.pointer-profiler>header{grid-column:1/-1;display:grid;grid-template-columns:1fr auto;gap:16px;padding:18px;border-block:3px solid var(--ink)}.pointer-profiler h2{margin:.2em 0}.pointer-profiler header dl{display:flex;gap:8px;margin:0}.pointer-profiler header dl div{min-width:100px;padding:8px;border-left:1px solid var(--line)}.pointer-profiler header dd{margin:5px 0 0;font-weight:900}#pointerPad{position:relative;min-height:330px;overflow:hidden;border:1px solid var(--line);background:radial-gradient(circle at center,color-mix(in srgb,var(--secondary) 24%,var(--paper)),var(--paper));touch-action:none}#pointerPad>i{position:absolute;left:50%;top:50%;width:24px;aspect-ratio:1;border:3px solid var(--paper);border-radius:50%;background:var(--accent);box-shadow:0 0 0 2px var(--accent);transform:translate(-50%,-50%)}#pointerPad output{position:absolute;right:14px;top:14px;padding:7px;background:var(--ink);color:var(--paper)}#pointerPad p{position:absolute;left:18px;bottom:12px;max-width:330px}.pointer-profiler>aside{display:grid;align-content:start;gap:14px;padding:20px;border:1px solid var(--line)}.pointer-profiler>aside label{display:grid;grid-template-columns:1fr auto;gap:7px}.pointer-profiler>aside input{grid-column:1/-1}.pointer-profiler ol{display:grid;gap:5px;padding-left:18px;font-size:11px}@media(max-width:680px){.pointer-profiler{grid-template-columns:1fr}.pointer-profiler>header{grid-template-columns:1fr}.pointer-profiler header dl{flex-wrap:wrap}}.workflow-compare{display:grid;grid-template-columns:minmax(230px,.55fr) minmax(0,1.45fr);gap:18px}.compare-stage{display:grid;gap:12px;min-width:0}.compare-stage>header{display:flex;justify-content:space-between;gap:16px;align-items:end}.compare-stage h2{margin:.2em 0}.compare-core{--compare-split:50%;min-width:0;padding:14px;clip-path:inset(0 calc(100% - var(--compare-split)) 0 0);outline:1px dashed var(--accent);outline-offset:-8px;transition:clip-path .25s,filter .25s}.compare-core[data-compare-channel="B"]{filter:hue-rotate(32deg) saturate(1.15)}.compare-controls{display:grid;align-content:start;gap:16px;padding:20px;border:1px solid var(--line);border-radius:24px 4px 24px 4px;background:var(--paper)}.compare-controls fieldset,.compare-controls>label{display:grid;gap:8px}.compare-controls input[type="range"]{width:100%}#workflowCompareShelf{display:grid;gap:6px;padding:0;margin:0;list-style:none}#workflowCompareShelf li{display:grid;grid-template-columns:auto 1fr auto;gap:8px;padding:9px;border-top:1px solid var(--line);font-size:12px}@media(max-width:900px){.workflow-compare{grid-template-columns:1fr}.compare-stage{order:-1}.compare-core{clip-path:none;border-left:8px solid var(--accent)}}
  </style>
</head>
<body data-aesthetic="magazine" data-composition="control-deck">
  <main class="page">
    <header class="mast"><div><span class="eyebrow">magazine / test de capacité du pointeur / BEGINNER</span><h1>Détection des capacités du pointeur du poste de consultation ambulatoire</h1><p class="intro">Dans le contexte d’un siège de capteur ambulatoire, effectuez un test des capacités du pointeur : contenu réel, contrôles interactifs, retour d’état clair et disposition adaptée à différentes tailles d’écran.</p></div><span class="scenario">Siège de capteurs pour consultation externe</span></header>
    <div class="composition-deck"><div class="deck-bar"><span>CONTROL DECK · 04</span><span>Détection des capacités du pointeur</span><span class="deck-lights" aria-hidden="true"><i></i><i></i><i></i></span></div><section class="demo" aria-label="Zone interactive de détection des capacités du siège capteur de clinique"><div class="workflow-compare"><form id="workflowCompareControls" class="compare-controls"><fieldset><legend>Canal de comparaison</legend><label><input type="radio" name="workflowChannel" value="A" checked>A · Vérification des autorisations du siège capteur ambulatoire</label><label><input type="radio" name="workflowChannel" value="B">B · Journal des capacités du siège de capteurs en consultation</label></fieldset><label>Poids des éléments de contrôle<input id="workflowCompareWeight" type="range" min="10" max="90" value="50"><output id="workflowCompareWeightValue">élément 50</output></label><label><input id="workflowCompareFreeze" type="checkbox">Geler la version actuelle</label><button id="workflowCompareCapture" class="action primary" type="button">Échantillonner et enregistrer les capacités</button><ol id="workflowCompareShelf" aria-label="Enregistrement de version"></ol></form><section class="compare-stage"><header><span class="eyebrow">Cabinet de consultation capteur COMPARE</span><h2>Comparatif double version du siège de capteurs en clinique</h2><output id="workflowCompareLive">Version A en attente d’échantillonnage</output></header><section id="workflowCore" class="workflow-core compare-core" data-compare-channel="A" style="--compare-split:50%"><!-- 11DZ_CORE_START:browser-media-device-pointer-profile --><div class="pointer-profiler"><header><span class="eyebrow">POINTER PROFILER</span><h2>Tableau de trajectoire du pointeur du siège de consultation</h2><dl><div><dt>Pointeur principal</dt><dd id="pointerPrimary">—</dd></div><div><dt>Capacité de survol</dt><dd id="pointerHover">—</dd></div><div><dt>Point de contact d’activité</dt><dd id="pointerActive">0</dd></div></dl></header><section id="pointerPad" tabindex="0" aria-label="Déplacer la souris, le stylet ou le doigt pour échantillonner le pointeur"><i id="pointerDot"></i><output id="pointerCoordinates">x 0 · y 0</output><p>Déplacez le pointeur dans cette zone ; les utilisateurs au clavier peuvent déplacer le point d’échantillonnage avec les touches fléchées.</p></section><aside><label>Conservation de la trajectoire<input id="pointerTrailLength" type="range" min="3" max="20" value="8" data-core-bridge="browser-media-device-pointer-profile"><output>8</output></label><button id="pointerClear" class="action" type="button">Effacer la trajectoire</button><ol id="pointerSamples"></ol></aside></div><!-- 11DZ_CORE_END --></section></section></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-pointer-profile */
const pointerPad=document.querySelector('#pointerPad');const pointerDot=document.querySelector('#pointerDot');const pointerSamples=[];const activePointers=new Map();let pointerPosition={x:50,y:50};function describePointers(){document.querySelector('#pointerPrimary').textContent=matchMedia('(pointer:fine)').matches?'Fin':'Grossier ou absent';document.querySelector('#pointerHover').textContent=matchMedia('(hover:hover)').matches?'Pris en charge':'Non pris en charge';document.querySelector('#pointerActive').textContent=String(activePointers.size);}function samplePointer(type,pressure){const limit=Number(document.querySelector('#pointerTrailLength').value);pointerSamples.unshift({type,x:Math.round(pointerPosition.x),y:Math.round(pointerPosition.y),pressure:Math.round((pressure||0)*100)});pointerSamples.splice(limit);document.querySelector('#pointerSamples').replaceChildren(...pointerSamples.map(sample=>{const item=document.createElement('li');item.textContent=sample.type+' · '+sample.x+','+sample.y+' · '+sample.pressure+'%';return item;}));}function movePointer(clientX,clientY,type='keyboard',pressure=0){const rect=pointerPad.getBoundingClientRect();pointerPosition={x:Math.max(0,Math.min(100,(clientX-rect.left)/rect.width*100)),y:Math.max(0,Math.min(100,(clientY-rect.top)/rect.height*100))};pointerDot.style.left=pointerPosition.x+'%';pointerDot.style.top=pointerPosition.y+'%';document.querySelector('#pointerCoordinates').textContent='x '+Math.round(pointerPosition.x)+' · y '+Math.round(pointerPosition.y);samplePointer(type,pressure);}pointerPad.addEventListener('pointerdown',event=>{activePointers.set(event.pointerId,event.pointerType);pointerPad.setPointerCapture(event.pointerId);movePointer(event.clientX,event.clientY,event.pointerType,event.pressure);describePointers();});pointerPad.addEventListener('pointermove',event=>movePointer(event.clientX,event.clientY,event.pointerType,event.pressure));pointerPad.addEventListener('pointerup',event=>{activePointers.delete(event.pointerId);describePointers();});pointerPad.addEventListener('keydown',event=>{if(!['ArrowLeft','ArrowRight','ArrowUp','ArrowDown'].includes(event.key))return;event.preventDefault();const rect=pointerPad.getBoundingClientRect();const x=rect.left+rect.width*(pointerPosition.x+(event.key==='ArrowRight'?4:event.key==='ArrowLeft'?-4:0))/100;const y=rect.top+rect.height*(pointerPosition.y+(event.key==='ArrowDown'?4:event.key==='ArrowUp'?-4:0))/100;movePointer(x,y);});document.querySelector('#pointerTrailLength').addEventListener('input',event=>{event.currentTarget.nextElementSibling.textContent=event.currentTarget.value;});document.querySelector('#pointerClear').addEventListener('click',()=>{pointerSamples.length=0;document.querySelector('#pointerSamples').replaceChildren();announce('Trace du pointeur effacée');});describePointers();
/* 11DZ_CORE_SCRIPT_END */
const workflowBridgeSpec={"name":"browser-media-device-pointer-profile","selector":"[data-core-bridge=\"browser-media-device-pointer-profile\"]","mode":"range","key":"ArrowRight"};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("input",workflowBridgeScheduleCommit);workflowBridgeControl.addEventListener('change',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();const step=Number(workflowBridgeControl.step)||1;const min=workflowBridgeControl.min===''?-Infinity:Number(workflowBridgeControl.min);const max=workflowBridgeControl.max===''?Infinity:Number(workflowBridgeControl.max);let next=Math.min(max,Math.max(min,(Number(workflowBridgeControl.value)||0)+step));if(next===Number(workflowBridgeControl.value))next=Math.max(min,Number(workflowBridgeControl.value)-step);workflowBridgeControl.value=String(next);workflowBridgeControl.dispatchEvent(new Event('input',{bubbles:true}));workflowBridgeControl.dispatchEvent(new Event('change',{bubbles:true}));const result=workflowBridgeCommit();setTimeout(workflowBridgeCommit,0);return result;}function workflowBridgeReset(){workflowBridgeCore.dataset.workflowVersion='0';workflowBridgeLastEffect=workflowBridgeSerialize();}
const workflowCompareCore=document.querySelector('#workflowCore');const workflowCompareWeight=document.querySelector('#workflowCompareWeight');const workflowCompareState={channel:'A',weight:50,frozen:false,snapshots:[]};function workflowCompareFingerprint(){const controls=[...workflowCompareCore.querySelectorAll('input,select,textarea')];const outputs=[...workflowCompareCore.querySelectorAll('output,[role="status"],strong')].map(node=>node.textContent.trim()).filter(Boolean);return {controlValues:controls.map(control=>control.type==='checkbox'||control.type==='radio'?control.checked:control.value),summary:outputs.slice(0,4).join(' / '),nodes:workflowCompareCore.querySelectorAll('*').length};}function workflowCompareDrive(){workflowCompareCore.dataset.compareChannel=workflowCompareState.channel;workflowCompareCore.style.setProperty('--compare-split',workflowCompareState.weight+'%');document.querySelector('#workflowCompareWeightValue').textContent=workflowCompareState.weight+' élément';document.querySelector('#workflowCompareLive').textContent=workflowCompareState.channel+' Version · '+workflowCompareState.weight+' élément'+(workflowCompareState.frozen?' · figé':'');announce('Le siège capteur de la clinique est en cours de consultation '+workflowCompareState.channel+' Version');}function workflowCompareCapture(source){const bridge=workflowBridgeActivate();const snapshot={...workflowCompareFingerprint(),channel:workflowCompareState.channel,weight:workflowCompareState.weight,source,bridge:bridge.summary};workflowCompareState.snapshots.push(snapshot);const item=document.createElement('li');item.innerHTML='<b>'+snapshot.channel+'</b><span>'+(snapshot.summary||snapshot.bridge)+'</span><small>'+snapshot.weight+' élément · '+snapshot.bridge+'</small>';document.querySelector('#workflowCompareShelf').prepend(item);announce('échantillonné '+snapshot.channel+' Version et enregistrement des capacités · '+bridge.summary);}document.querySelectorAll('[name="workflowChannel"]').forEach(input=>input.addEventListener('change',()=>{workflowCompareState.channel=input.value;workflowCompareDrive();}));workflowCompareWeight.addEventListener('input',()=>{workflowCompareState.weight=Number(workflowCompareWeight.value);workflowCompareDrive();});document.querySelector('#workflowCompareFreeze').addEventListener('change',event=>{workflowCompareState.frozen=event.currentTarget.checked;workflowCompareDrive();});document.querySelector('#workflowCompareCapture').addEventListener('click',()=>workflowCompareCapture('Échantillonnage du bouton'));workflowCompareCore.addEventListener('dblclick',()=>workflowCompareCapture('Double-clic sur la vue principale'));workflowCompareDrive();
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