2010-01-26 14 views
8

¿Hay una unidad de medida en CSS (ya sea que esté planeada o ya exista) para establecer el relleno y los márgenes según el ancho de la fuente que se usa?CSS: ¿configura el relleno/márgenes según el ancho del texto?

Sé que se supone que em es la altura de la M mayúscula de la fuente que utiliza el navegador, lo que es realmente útil para agregar un doble espacio limpio. Pero a veces quiero que los márgenes laterales de las listas en línea tengan el ancho de un espacio normal sin interrupción, o el ancho de una mayúscula A. Con algunas fuentes, el uso de em es poco confiable.

Respuesta

4

Gracioso, pero es seems that nobody cares sobre el ancho de los tipos de letra. Todo lo que se mide, es la altura:

alt text

Si este es el caso de "la tipografía clásica", entonces hay aún menos esperanza en tipografía web que es una subclase de la primera.

EDITAR: En realidad hay un measurement named En que se refiere al "ancho de una letra minúscula" n "." Sin embargo, no he visto esto usado en la web.

+0

Esto es especialmente extraño, creo, ya que la composición tipográfica pasa mucho tiempo en el tema de interlineado, word-spacing, espaciado entre letras, etc, que todos parecen hacer frente a cómo se colocan las letras verticalmente. Uno pensaría que al menos uno de estos habría evolucionado a una "distancia de ancho real del carácter". – Anthony

+0

Veo en el artículo de Wikipedia que se refiere a que ** en ** se define como la mitad de 1 em, lo que significa que puede usar '0.5em' en lugar de' 1en' (no creo que * en * sea compatible como unidad en css). El artículo dice que * también es tradicionalmente el ancho de una letra minúscula "n" *. – awe

+0

Como nota al margen: la razón por la cual "a nadie parece importarle" el ancho de los elementos tipográficos, es que los caracteres tienen diferentes anchuras dentro de una fuente (a menos que sea una fuente monoespacial). Esto significa que el ancho no es una propiedad común en la fuente, sino en cada carácter dentro de la fuente. – awe

1

Me temo que no. CSS no ofrece una manera de referenciar las propiedades de las fuentes.

Pero siempre se puede escapar insertando   en los elementos de la primera y la última lista.

6

las especificaciones de W3C para css3 define una unidad que es el ancho de "0" el carácter de la fuente:

unidad ch

igual a la medida avance usado del "0" (ZERO, U + 0030) glifo encontrado en la fuente utilizada para representarlo.

Ver css3-values.

0

Se me ocurrió algo simple que me ayudó con un problema de relleno basado en el tamaño de la fuente. Quería compensar un <td> basado en un prefijo de cadena en la fila anterior. Cliff nota la versión, agrego el texto que representa el desplazamiento deseado en un tramo y lo hago invisible y no seleccionable. Mi solución está aquí:

.hiddenOffset { 
opacity: 0; 
-webkit-touch-callout: none; 
-webkit-user-select: none; 
-khtml-user-select: none; 
-moz-user-select: none; 
-ms-user-select: none; 
user-select: none; 
cursor: default; 
} 


<table> 
    <tr> 
    <td>NumElements</td> 
    </tr> 
    <tr> 
    <td><span class="hiddenOffset">Num</span>Offset Text</td> 
    </tr> 
</table> 

Esto me da la compensación perfecta y el prefijo está oculto y no seleccionable. En mi código real, uso JavaScript puro para especificar la cadena de prefijos, por lo que no está codificado y uso prefix.repeat(n) para establecer sangrías anidadas.

function processRepeatingGroupInstance(indent, group) { 
    let prefix = 'No'; 
    let html = ''; 
    for (let i = 0; i < group.length; i++) { 
     let field = group[i]; 
     if (field.hasOwnProperty('msgvaluedesc')) 
      html += `<tr><td><span class="hiddenOffset">${prefix.repeat(indent)}</span>${field.name}</td><td class="num">${field.number}</td><td class="value tooltip">${field.msgvaluedesc}<span class="tooltiptext">${field.msgvalue}</span></td></tr>`; 
     else 
      html += `<tr><td><span class="hiddenOffset">${prefix.repeat(indent)}</span>${field.name}</td><td class="num">${field.number}</td><td class="value">${field.msgvalue}</td></tr>`; 
     if (field.hasOwnProperty('repeating_group')) { 
      for (let j = 0; j < field.repeating_group.length; j++) 
       html += processRepeatingGroupInstance(indent + 1, field.repeating_group[j]); 
     } 
    } 
    return html; 
} 

Results

+0

https://jsfiddle.net/XJ45G19/0vuer99s/ – shaz

Cuestiones relacionadas