Tablas y visualización de datos

Tabla comparativa de propuestas para el inventario de la pieza de exhibición

Completa una tabla de comparación de soluciones en un escenario de catálogo de inventario de exhibición: contenido real, controles interactivos, retroalimentación de estado clara y diseño adaptable a varios tamaños.

Tablas y visualización de datosTabla de comparación de propuestasHTML TableCSSJavaScript
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>Tabla comparativa de propuestas para el inventario de la pieza de exhibición</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:Didot,"Songti SC",serif; background:linear-gradient(30deg,transparent 48%,color-mix(in srgb,var(--accent) 9%,transparent) 49% 51%,transparent 52%),var(--paper);background-size:52px 90px; }
    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(1040px,calc(100% - 36px));margin:auto;padding:64px 0}.mast{display:grid;justify-items:center;text-align:center;border-block:3px double var(--accent);padding:26px;gap:20px;margin-bottom:32px}.mast h1{font-family:Didot,"Songti SC",serif;font-weight:700;font-size:clamp(38px,8vw,86px);letter-spacing:.035em;margin:0;line-height:1}.eyebrow{display:block;color:var(--accent);font:800 11px/1 ui-monospace,monospace;letter-spacing:.3em}.intro{max-width:600px;margin-inline:auto;line-height:1.8}.scenario{padding:8px 26px;border-inline:1px solid var(--accent);letter-spacing:.16em}.demo{border:4px double var(--accent);border-radius:0;clip-path:polygon(24px 0,calc(100% - 24px) 0,100% 24px,100% calc(100% - 24px),calc(100% - 24px) 100%,24px 100%,0 calc(100% - 24px),0 24px);position:relative;min-height:440px;overflow:hidden;padding:clamp(28px,5vw,60px);background:var(--paper)}@media(max-width:700px){.page{width:calc(100% - 20px);padding:24px 0}.mast{padding:18px}.demo{padding:18px}}
    .panel{padding:16px;border:3px double var(--accent);background:var(--paper)}.stack{display:grid;gap:14px}.row{display:grid;grid-auto-flow:column;grid-auto-columns:max-content;gap:10px;overflow:auto}.action{padding:10px 15px;border:1px solid var(--accent);background:transparent;font-family:Didot,serif;letter-spacing:.06em}.action.primary,.action.is-active{color:var(--paper);background:var(--ink)}.metric{font-family:Didot,serif;font-size:clamp(36px,8vw,74px);letter-spacing:.04em}.status{min-height:24px;padding:9px;border-inline:1px solid var(--accent);text-align:center}.muted{line-height:1.8}.chip{padding:5px 14px;border-inline:1px solid var(--accent);letter-spacing:.1em}.meter{height:5px;background:var(--line)}.meter>i{display:block;height:100%;background:linear-gradient(90deg,var(--accent),var(--secondary))}
    .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}
    .special-table{width:100%;border-collapse:collapse;background:var(--paper)}.special-table caption{padding:14px 16px;text-align:left;font-weight:800}.special-table th,.special-table td{padding:13px 16px;border-top:1px solid var(--line);text-align:left}.special-table tbody tr:hover{background:color-mix(in srgb,var(--secondary) 14%,transparent)}.special-table-shell{overflow:auto;border:1px solid var(--line);border-radius:18px;background:var(--paper)}.table-special-tools{display:flex;flex-wrap:wrap;gap:12px;align-items:center;justify-content:space-between;margin-bottom:14px}.table-special-tools select,.table-special-tools input{min-height:40px;padding:8px 11px;border:1px solid var(--line);border-radius:9px;background:var(--paper)}.comparison-table-studio{display:grid;gap:14px}.comparison-studio-tools{display:grid;grid-template-columns:1fr minmax(220px,.6fr);gap:18px;align-items:end}.comparison-studio-tools h2{margin:.3em 0}.comparison-studio-tools label{display:grid;grid-template-columns:1fr auto;gap:8px}.comparison-studio-tools input{grid-column:1/-1}.comparison-choice{display:flex;flex-wrap:wrap;gap:14px;border:1px solid var(--line);border-radius:12px}.comparison-choice legend{font-weight:800}.comparison-studio-board{display:grid;grid-template-columns:minmax(0,1.2fr) 240px;gap:14px}.comparison-table .is-featured{background:color-mix(in srgb,var(--accent) 12%,var(--paper))}.comparison-studio-board aside{display:grid;align-content:start;gap:10px;padding:18px;border-left:4px solid var(--accent);background:color-mix(in srgb,var(--secondary) 10%,transparent)}.comparison-studio-board aside ol{display:grid;gap:8px;padding-left:18px;margin:0}@media(max-width:760px){.comparison-studio-tools,.comparison-studio-board{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="art-deco" data-composition="control-deck">
  <main class="page">
    <header class="mast"><div><span class="eyebrow">art-deco / Tabla comparativa de soluciones / INTERMEDIATE</span><h1>Tabla comparativa de propuestas para el inventario de la pieza de exhibición</h1><p class="intro">Completa una tabla de comparación de soluciones en un escenario de catálogo de inventario de exhibición: contenido real, controles interactivos, retroalimentación de estado clara y diseño adaptable a varios tamaños.</p></div><span class="scenario">Catálogo de inventario de exhibición</span></header>
    <div class="composition-deck"><div class="deck-bar"><span>CONTROL DECK · 04</span><span>Tabla de comparación de propuestas</span><span class="deck-lights" aria-hidden="true"><i></i><i></i><i></i></span></div><section class="demo" aria-label="Área interactiva de la tabla comparativa de catálogo de existencias de la exposición"><div class="workflow-session"><header class="session-command"><div><span class="eyebrow">Libro de inventario de la exposición SESSION</span><h2>Mesa de cronometraje del inventario de la exposición</h2></div><output id="workflowSessionClock">00:45</output><label>Duración de la ronda<input id="workflowSessionLength" type="range" min="15" max="90" step="15" value="45"><span>segundo</span></label><button id="workflowSessionToggle" class="action primary" type="button">Aplicar la vista de inicio</button></header><div id="workflowSessionProgress" role="progressbar" aria-label="Progreso del inventario de la pieza de exhibición" 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:tables-data-comparison-grid --><div class="comparison-table-studio"><header class="comparison-studio-tools"><div><span class="eyebrow">COMPARISON GRID</span><h2>Tablero de decisión del catálogo de inventario de la exposición</h2></div><label>Límite presupuestario <input id="compareBudget" type="range" min="30" max="140" step="10" value="90"><output id="compareBudgetValue">¥90</output></label></header><fieldset class="comparison-choice"><legend>solución destacada</legend><label><input type="radio" name="comparePlan" value="0"> Versión ligera</label><label><input type="radio" name="comparePlan" value="1" checked data-core-bridge="tables-data-comparison-grid"> Versión colaborativa</label><label><input type="radio" name="comparePlan" value="2"> Versión profesional</label></fieldset><div class="comparison-studio-board"><div class="special-table-shell"><table class="special-table comparison-table"><caption>Comparación horizontal de planes de inventario de piezas de exposición</caption><thead><tr><th>capacidad</th><th data-plan="0" data-price="39">Versión ligera</th><th data-plan="1" data-price="79" class="is-featured">Versión colaborativa</th><th data-plan="2" data-price="119">Versión profesional</th></tr></thead><tbody><tr><th>Número de miembros</th><td data-plan="0">2 personas</td><td data-plan="1" class="is-featured">6 personas</td><td data-plan="2">10 personas</td></tr><tr><th>Historial</th><td data-plan="0">—</td><td data-plan="1" class="is-featured">✓ Compatible</td><td data-plan="2">✓ Compatible</td></tr><tr><th>Capacidad de exportación</th><td data-plan="0">—</td><td data-plan="1" class="is-featured">—</td><td data-plan="2">✓ Compatible</td></tr><tr><th>Modo de soporte</th><td data-plan="0">✓ Compatible</td><td data-plan="1" class="is-featured">✓ Compatible</td><td data-plan="2">✓ Compatible</td></tr></tbody></table></div><aside><strong id="compareDecision">Recomendado: versión colaborativa</strong><p id="compareDecisionReason">Ofrece una combinación más equilibrada de miembros y exportación dentro del presupuesto actual.</p><ol id="compareBudgetList"><li>Versión ligera · ¥39</li><li>Colaborativo · ¥79</li><li>Versión profesional · ¥119</li></ol></aside></div></div><!-- 11DZ_CORE_END --></section><footer class="session-log"><strong id="workflowSessionScore">0 puntos de interacción</strong><ol id="workflowSessionLaps" aria-label="Registro de ronda"></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:tables-data-comparison-grid */
const comparePlanNames=["Versión ligera","Versión colaborativa","Versión profesional"];const comparePrices=[39,79,119];const compareBudget=document.querySelector('#compareBudget');function renderComparisonDecision(){const budget=Number(compareBudget.value);document.querySelector('#compareBudgetValue').textContent='¥'+budget;const activePlan=Number(document.querySelector('[name="comparePlan"]:checked').value);document.querySelectorAll('[data-plan]').forEach(cell=>{const planIndex=Number(cell.dataset.plan);cell.classList.toggle('is-featured',planIndex===activePlan);if(cell.matches('th'))cell.hidden=comparePrices[planIndex]>budget+30;else if(cell.parentElement)cell.hidden=comparePrices[planIndex]>budget+30;});const choice=comparePrices[activePlan]<=budget?activePlan:Math.max(0,comparePrices.findIndex(price=>price<=budget));const winner=choice===-1?0:choice;document.querySelector('#compareDecision').textContent='Sugerencia:'+comparePlanNames[winner];document.querySelector('#compareDecisionReason').textContent=comparePrices[winner]<=budget?'Mantén un buen equilibrio de capacidades dentro del presupuesto actual.':'El presupuesto es ajustado; se recomienda empezar con la versión ligera.';document.querySelector('#compareBudgetList').replaceChildren(...comparePlanNames.map((plan,index)=>{const item=document.createElement('li');item.textContent=plan+' · ¥'+comparePrices[index]+(comparePrices[index]>budget?' · Por encima del presupuesto':'');return item;}));announce('Presupuesto actual ¥'+budget+',enfocado '+comparePlanNames[activePlan]);}document.querySelectorAll('[name="comparePlan"]').forEach(radio=>radio.addEventListener('change',renderComparisonDecision));compareBudget.addEventListener('input',renderComparisonDecision);renderComparisonDecision();
/* 11DZ_CORE_SCRIPT_END */
const workflowBridgeSpec={"name":"tables-data-comparison-grid","selector":"[data-core-bridge=\"tables-data-comparison-grid\"]","mode":"radio","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("keydown",workflowBridgeScheduleCommit);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 radios=[...workflowBridgeCore.querySelectorAll('input[type="radio"]')].filter(input=>input.name===workflowBridgeControl.name&&!input.disabled);const current=Math.max(0,radios.findIndex(input=>input.checked));radios[(current+1)%radios.length].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+' puntos de control de interacción';}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?'Reiniciar':'Siguiente turno';workflowSessionToggle.setAttribute('aria-pressed','false');workflowSessionDrive();announce(complete?'Finalización del ciclo del inventario del catálogo de exposiciones':'La ronda se ha pausado');}function workflowSessionStart(){if(workflowSessionState.phase==='complete'){workflowSessionState.elapsed=0;workflowSessionState.checkpoints=[];document.querySelector('#workflowSessionLaps').replaceChildren();}workflowSessionState.phase='running';workflowSessionToggle.textContent='Ronda en pausa';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('El turno del cuaderno de inventario de la exposición ha comenzado · '+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('operación con teclado');}});workflowSessionCore.addEventListener('click',event=>{if(event.target.closest('[data-core-bridge]'))workflowSessionLap('Operación principal · '+workflowBridgeSummary());});document.addEventListener('visibilitychange',()=>{if(document.hidden&&workflowSessionState.phase==='running')workflowSessionStop();});workflowSessionDrive();
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