Tipografía y efectos de texto

Ajuste de la medida de lectura para columna de especial de archivo

Completa el ajuste de longitud de línea de lectura en el escenario de la columna de archivo: incluye contenido real, controles operables, feedback de estado claro y un diseño adaptable a distintos tamaños.

Tipografía y efectos de textoAjuste del interlineadoHTMLCSS TypographyJavaScript
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>Ajuste de la medida de lectura para columna de especial de archivo</title>
  <style>
    :root { --ink:#ecf7f3; --paper:#071310; --accent:#d45f3e; --secondary:#8fc4ad; --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:"Trebuchet MS","PingFang SC",sans-serif; background:radial-gradient(circle at 20% 10%,color-mix(in srgb,var(--accent) 22%,transparent),transparent 35%),radial-gradient(circle at 85% 90%,color-mix(in srgb,var(--secondary) 20%,transparent),transparent 38%),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; } }
    .page{width:min(1160px,calc(100% - 30px));margin:auto;padding:60px 0}.mast{display:flex;justify-content:space-between;border-left:4px solid var(--accent);padding-left:22px;gap:28px;align-items:center;margin-bottom:34px}.mast h1{font-family:"Trebuchet MS","PingFang SC",sans-serif;font-weight:900;font-size:clamp(42px,9vw,94px);text-shadow:0 0 28px color-mix(in srgb,var(--accent) 55%,transparent);margin:0;line-height:.92}.eyebrow{display:block;margin-bottom:14px;color:var(--accent);font:900 11px/1 ui-monospace,monospace;letter-spacing:.2em}.intro{max-width:680px;color:color-mix(in srgb,var(--ink) 68%,transparent);line-height:1.7}.scenario{padding:10px 16px;border:1px solid var(--secondary);border-radius:4px;box-shadow:0 0 20px color-mix(in srgb,var(--secondary) 30%,transparent)}.demo{border-color:color-mix(in srgb,var(--accent) 55%,transparent);border-radius:24px;box-shadow:inset 0 0 40px color-mix(in srgb,var(--accent) 8%,transparent),0 0 60px color-mix(in srgb,var(--secondary) 12%,transparent);position:relative;min-height:410px;overflow:hidden;padding:clamp(24px,4vw,50px);background:color-mix(in srgb,var(--paper) 86%,transparent)}@media(max-width:700px){.mast{display:grid}.page{padding:22px 0}.demo{padding:16px}}
    .panel{padding:18px;border:3px solid var(--ink);background:var(--paper);box-shadow:8px 8px 0 var(--ink)}.stack{display:grid;gap:12px}.row{display:flex;flex-wrap:wrap;gap:8px}.action{min-height:42px;padding:8px 13px;border:3px solid var(--ink);background:var(--paper);font-weight:900}.action.primary,.action.is-active{color:var(--paper);background:var(--ink)}.status{min-height:24px;padding:8px;color:var(--paper);background:var(--ink);font-weight:900}.metric{font-size:clamp(34px,8vw,76px);font-weight:900;letter-spacing:-.08em}.muted{font-weight:600}.chip{padding:5px 8px;border:2px solid var(--ink);font-weight:900}.meter{height:14px;border:3px solid var(--ink)}.meter>i{display:block;height:100%;background:var(--ink)}
    .composition-studio{display:grid;gap:14px}.studio-ruler{display:flex;justify-content:space-between;padding:0 4px;color:color-mix(in srgb,var(--ink) 55%,transparent);font:700 11px/1 ui-monospace,monospace;letter-spacing:.14em}.studio-ruler::before{content:"01 / WORKING PROTOTYPE"}.studio-ruler::after{content:"360 · 768 · 1440"}.composition-studio .demo::after{content:"";position:absolute;right:18px;bottom:18px;width:24px;height:24px;border-right:2px solid var(--accent);border-bottom:2px solid var(--accent);pointer-events:none}
    .reading-measure-lab{display:grid;grid-template-columns:minmax(230px,.58fr) minmax(0,1.42fr);gap:18px}.measure-controls{display:grid;align-content:start;gap:18px}.measure-controls label{display:grid;grid-template-columns:1fr auto;gap:8px;font-weight:800}.measure-controls input{grid-column:1/-1;width:100%}.measure-article{--measure:58ch;--leading:1.75;--body-size:18px;min-height:420px;padding:clamp(28px,7vw,78px);border:1px solid var(--line);background:var(--paper)}.measure-article>span{color:var(--accent);font:800 11px/1 ui-monospace,monospace;letter-spacing:.18em}.measure-article h3{max-width:16ch;margin:.5em 0;font-size:clamp(34px,6vw,68px);line-height:1}.measure-article p{max-width:var(--measure);font-size:var(--body-size);line-height:var(--leading)}@media(max-width:720px){.reading-measure-lab{grid-template-columns:1fr}.measure-article{min-height:0}}.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="dark-neon" data-composition="studio">
  <main class="page">
    <header class="mast"><div><span class="eyebrow">dark-neon / ajuste de longitud de línea de lectura / INTERMEDIATE</span><h1>Ajuste de la medida de lectura para columna de especial de archivo</h1><p class="intro">Completa el ajuste de longitud de línea de lectura en el escenario de la columna de archivo: incluye contenido real, controles operables, feedback de estado claro y un diseño adaptable a distintos tamaños.</p></div><span class="scenario">Columna de archivo</span></header>
    <div class="composition-studio"><div class="studio-ruler" aria-hidden="true"></div><section class="demo" aria-label="Área interactiva de ajuste de la longitud de línea de lectura para la columna de archivo"><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 · ajuste del diseño de la columna de archivo</label><label><input type="radio" name="workflowChannel" value="B">B · Énfasis en los puntos clave de la columna de archivo</label></fieldset><label>Peso de longitud de lectura<input id="workflowCompareWeight" type="range" min="10" max="90" value="50"><output id="workflowCompareWeightValue">50 letra</output></label><label><input id="workflowCompareFreeze" type="checkbox">Congelar la versión actual</label><button id="workflowCompareCapture" class="action primary" type="button">Muestrea y aplica la composición</button><ol id="workflowCompareShelf" aria-label="Muestra de versión"></ol></form><section class="compare-stage"><header><span class="eyebrow">Columna de archivo COMPARE</span><h2>Comparativa de doble versión de la columna de archivo</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:typography-text-reading-measure --><div class="reading-measure-lab"><aside class="measure-controls panel"><span class="eyebrow">READING MEASURE</span><h2>Ajuste del interlineado</h2><label>Anchura de caracteres por línea <input id="measureWidth" type="range" min="32" max="78" value="58" data-core-bridge="typography-text-reading-measure"><output id="measureWidthValue">58ch</output></label><label>Interlineado del cuerpo <input id="measureLeading" type="range" min="140" max="210" value="175"><output id="measureLeadingValue">1.75</output></label><label>Cuerpo del texto <input id="measureSize" type="range" min="15" max="22" value="18"><output id="measureSizeValue">18px</output></label></aside><article id="measureArticle" class="measure-article"><span>Archivo de columna · READING ROOM</span><h3>Una longitud de línea adecuada facilita que la vista encuentre la siguiente línea.</h3><p>Leer no consiste simplemente en agrandar el texto. La cantidad de caracteres por línea, el espacio entre líneas y el tamaño del cuerpo determinan juntos si la lectura continua resulta cómoda. Un párrafo demasiado ancho dificulta el salto de línea, mientras que uno demasiado estrecho interrumpe con frecuencia el sentido.</p><p>Arrastra el control de la izquierda; el contenedor del texto principal cambiará de ancho de forma real, mientras que el título mantendrá su jerarquía independiente, lo que facilita comparar las diferencias de ritmo que producen distintos parámetros.</p></article></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:typography-text-reading-measure */
const measureArticle=document.querySelector('#measureArticle');const measureWidth=document.querySelector('#measureWidth');const measureLeading=document.querySelector('#measureLeading');const measureSize=document.querySelector('#measureSize');function renderMeasure(){const leading=(Number(measureLeading.value)/100).toFixed(2);measureArticle.style.setProperty('--measure',measureWidth.value+'ch');measureArticle.style.setProperty('--leading',leading);measureArticle.style.setProperty('--body-size',measureSize.value+'px');document.querySelector('#measureWidthValue').textContent=measureWidth.value+'ch';document.querySelector('#measureLeadingValue').textContent=leading;document.querySelector('#measureSizeValue').textContent=measureSize.value+'px';announce('Longitud de línea del cuerpo del texto '+measureWidth.value+' caracteres, altura de línea '+leading);}[measureWidth,measureLeading,measureSize].forEach(input=>input.addEventListener('input',renderMeasure));renderMeasure();
/* 11DZ_CORE_SCRIPT_END */
const workflowBridgeSpec={"name":"typography-text-reading-measure","selector":"[data-core-bridge=\"typography-text-reading-measure\"]","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+' caracteres';document.querySelector('#workflowCompareLive').textContent=workflowCompareState.channel+' versión · '+workflowCompareState.weight+' caracteres'+(workflowCompareState.frozen?' · congelado':'');announce('Vista actual de la columna de archivo '+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+' Carácter · '+snapshot.bridge+'</small>';document.querySelector('#workflowCompareShelf').prepend(item);announce('muestreado '+snapshot.channel+' versión y aplica el diseño de página · '+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