Capacidades de medios y dispositivos del navegador

Prueba de capacidad del cursor en el puesto de sensado clínico ambulatorio

Completa una detección de capacidades del puntero en un escenario de asiento de sensores de consulta externa: incluye contenido real, controles interactivos, estados claros y diseño adaptable a distintos tamaños.

Capacidades de medios y dispositivos del navegadorDetección de capacidad del punteroHTMLCSSBrowser API
Tras activar JavaScript, puedes editar, ejecutar y guardar este ejemplo. El código fuente fijado es el siguiente:
<!doctype html>
<html lang="es" dir="ltr">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>Prueba de capacidad del cursor en el puesto de sensado clínico ambulatorio</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 / detección de capacidad del puntero / BEGINNER</span><h1>Prueba de capacidad del cursor en el puesto de sensado clínico ambulatorio</h1><p class="intro">Completa una detección de capacidades del puntero en un escenario de asiento de sensores de consulta externa: incluye contenido real, controles interactivos, estados claros y diseño adaptable a distintos tamaños.</p></div><span class="scenario">Consultorio de sensores</span></header>
    <div class="composition-deck"><div class="deck-bar"><span>CONTROL DECK · 04</span><span>Detección de capacidad del puntero</span><span class="deck-lights" aria-hidden="true"><i></i><i></i><i></i></span></div><section class="demo" aria-label="Área interactiva de detección de capacidad del puntero del asiento sensorial de la clínica"><div class="workflow-compare"><form id="workflowCompareControls" class="compare-controls"><fieldset><legend>Canal comparativo</legend><label><input type="radio" name="workflowChannel" value="A" checked>A · Verificación de permisos del asiento de sensores ambulatorios</label><label><input type="radio" name="workflowChannel" value="B">B · Registro de capacidad del asiento de sensores de consulta</label></fieldset><label>Peso de los elementos de evaluación<input id="workflowCompareWeight" type="range" min="10" max="90" value="50"><output id="workflowCompareWeightValue">Elemento 50</output></label><label><input id="workflowCompareFreeze" type="checkbox">Congelar la versión actual</label><button id="workflowCompareCapture" class="action primary" type="button">Muestrear y registrar capacidades</button><ol id="workflowCompareShelf" aria-label="Muestra de versión"></ol></form><section class="compare-stage"><header><span class="eyebrow">Asiento de sensor de consulta COMPARE</span><h2>Versión comparativa doble del puesto de sensores clínicos</h2><output id="workflowCompareLive">Versión A en espera de muestreo</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>Panel de trayectoria del puntero de la silla de sensores de la consulta externa</h2><dl><div><dt>Puntero principal</dt><dd id="pointerPrimary">—</dd></div><div><dt>Capacidad de pasar el cursor</dt><dd id="pointerHover">—</dd></div><div><dt>Punto de contacto de actividad</dt><dd id="pointerActive">0</dd></div></dl></header><section id="pointerPad" tabindex="0" aria-label="Mueva el ratón, el lápiz óptico o el dedo para muestrear el puntero"><i id="pointerDot"></i><output id="pointerCoordinates">x 0 · y 0</output><p>Desplace el puntero en esta área; los usuarios de teclado pueden mover el punto de muestreo con las flechas.</p></section><aside><label>Persistencia del trazo<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">Borrar trazo</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?'Preciso':'Aproximado o no';document.querySelector('#pointerHover').textContent=matchMedia('(hover:hover)').matches?'Compatible':'No compatible';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('El rastro del puntero se ha borrado');});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+' · versión principal '+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+' Elemento';document.querySelector('#workflowCompareLive').textContent=workflowCompareState.channel+' versión · '+workflowCompareState.weight+' Elemento'+(workflowCompareState.frozen?' · congelado':'');announce('El puesto de sensores de la consulta está revisando '+workflowCompareState.channel+' versión');}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+' ítem · '+snapshot.bridge+'</small>';document.querySelector('#workflowCompareShelf').prepend(item);announce('muestreado '+snapshot.channel+' Versión y registro de capacidades · '+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('Muestra de botón'));workflowCompareCore.addEventListener('dblclick',()=>workflowCompareCapture('Vista principal doble clic'));workflowCompareDrive();
workflowBridgeReset();
  </script>
</body>
</html>
Comentarios de la página¿Has encontrado un problema o tienes sugerencias de mejora?
Las funciones de retroalimentación deben usarse en la versión en línea

Envía tras activar JavaScript en la versión en línea; las funciones locales de la herramienta o del ejemplo no se verán afectadas.

Ir a la versión en línea para dar feedback