2012-04-13 7 views
26

¿Hay alguna manera de forzar una fuente para que se monoespacio con CSS?Forzar fuente no monoespacial en ancho fijo mediante CSS

Con esto quiero decir, utilizando una fuente no monoespacial, ¿puede forzar al navegador a representar cada carácter con un ancho fijo?

+0

El navegador no controla esto, es todo acerca de la fuente . Entonces no, no es posible. ¿Qué pasa con solo usar una fuente monoespaciada? –

+3

Tiene que coincidir con el resto de la tipografía. –

Respuesta

0

No, a menos que sea una fuente real de espaciado único.

2

No, no hay forma de forzar nada en CSS. Y ni siquiera hay una manera de sugerir que una fuente no monoespacial se represente como una fuente monoespaciada.

10

No se puede hacer esto con CSS. Incluso si se pudiera, el resultado será verse horrible:

enter image description here

Si realmente no necesita hacer esto, se podía usar JavaScript para envolver cada carácter individual en un elemento (o simplemente hacerlo a mano):

function wrap_letters($element) { 
 
    for (var i = 0; i < $element.childNodes.length; i++) { 
 
     var $child = $element.childNodes[i]; 
 

 
     if ($child.nodeType === Node.TEXT_NODE) { 
 
      var $wrapper = document.createDocumentFragment(); 
 

 
      for (var i = 0; i < $child.nodeValue.length; i++) { 
 
       var $char = document.createElement('span'); 
 
       $char.className = 'char'; 
 
       $char.textContent = $child.nodeValue.charAt(i); 
 

 
       $wrapper.appendChild($char); 
 
      } 
 

 
      $element.replaceChild($wrapper, $child); 
 
     } else if ($child.nodeType === Node.ELEMENT_NODE) { 
 
      wrap_letters($child); 
 
     } 
 
    } 
 
} 
 

 
wrap_letters(document.querySelectorAll('.boxes')[0]); 
 
wrap_letters(document.querySelectorAll('.boxes')[1]);
.char { 
 
    outline: 1px solid rgba(255, 0, 0, 0.5); 
 
} 
 

 
.monospace .char { 
 
    display: inline-block; 
 
    width: 15px; 
 
    text-align: center; 
 
}
<h2 class="boxes">This is a title</h2> 
 
<h2 class="boxes monospace">This is a title</h2>

+3

Eso realmente se ve horrible. – thirtydot

+0

imo se ve mejor con text-align: http://jsfiddle.net/f7TPf/3/ pero todavía es bastante horrible –

+1

@Blender, en general está en lo cierto, pero hay casos en los que una fuente monoespacial realmente agrega ancho para fuente atributos como negrita y cursiva, y esto puede ser malo si * los necesita alinear. Consola Lucida es una de esas fuentes. Hace que sea inútil utilizarlo en un IDE si desea resaltar la sintaxis para usar negrita, ya que la consola Lucida 12pt tiene aproximadamente 1 píxel más de ancho cuando está en negrita. Hace imposible alinear el código por espacios (más allá del espacio en blanco inicial en una línea). Un IDE que encontré fue lo suficientemente inteligente como para tener una casilla de verificación para bloquear el negrita en el ancho normal. –

8

por qué no pensar fuera de la caja y dentro de una tabla para esto:

<table cellpadding="0" cellspacing="0"> 
<tr><td>T</td><td>h</td><td>e</td><td></td><td>r</td><td>a</td><td>i</td><td>n</td><td></td><td>i</td><td>n</td><td></td><td>S</td><td>p</td><td>a</td><td>i</td><td>n</td><td></td><td>s</td><td>t</td><td>a</td><td>y</td><td>s</td></tr> 
<tr><td>m</td><td>a</td><td>i</td><td>n</td><td>l</td><td>y</td><td></td><td>i</td><td>n</td><td></td><td>t</td><td>h</td><td>e</td><td></td><td>p</td><td>l</td><td>a</td><td>i</td><td>n</td><td>s</td><td>.</td></tr> 
</table> 
+39

Eso es aún más 'dentro de la caja' (lo siento, tuve que hacerlo) –

+32

Creo que deberíamos presentar esta idea por ahora. –

+20

No nos metamos en una discusión sobre esto ... – DSimon

1

que he hecho una cosa bastante mucho encanto, a veces durante la cuenta atrás:

html:

<div class="counter"> 
    <span class="counter-digit counter-digit-0">2</span> 
    <span class="counter-digit counter-digit-1">4</span> 
    <span class="counter-digit counter-digit-divider">/</span> 
    <span class="counter-digit counter-digit-2">5</span> 
    <span class="counter-digit counter-digit-3">7</span> 
</div> 

SCSS:

$digit-width: 18px; 
.counter { 

    text-align: center; 
    font-size: $digit-width; 

    position: relative; 

    width : $digit-width * 4.5; 
    margin: 0 auto; 
    height: 48px; 
} 
.counter-digit { 

    position: absolute; 
    top: 0; 
    width: $digit-width; 
    height: 48px; 
    line-height: 48px; 
    padding: 0 1px; 

    &:nth-child(1) { left: 0; text-align: right; } 
    &:nth-child(2) { left: $digit-width * 1; text-align: left;} 
    &:nth-child(3) { left: $digit-width * 2; text-align: center; width: $digit-width/2} // the divider (/) 
    &:nth-child(4) { left: $digit-width * 2.5; text-align: right;} 
    &:nth-child(5) { left: $digit-width * 3.5; text-align: left;} 
} 
2

Bueno, usted no dijo usando solamente CSS. Es posible hacer esto con solo un poco de Javascript para envolver cada letra en un span. El resto está en CSS ...

window.onload = function() { 
 
    const secondP = document.getElementById('fixed'); 
 
    const text = secondP.innerText; 
 
    const newText = text.split('').map(c => { 
 
    const span = `<span>${c}</span>`; 
 
    return span; 
 
    }).join(''); 
 
    secondP.innerHTML = newText; 
 
}
p { 
 
    position: relative; 
 
    border: 1px solid black; 
 
    border-radius: 1em; 
 
    padding: 1em; 
 
    margin: 3em 1em; 
 
} 
 

 
p::after { 
 
    content: attr(name); 
 
    display: block; 
 
    background-color: white; 
 
    color: green; 
 
    padding: 0 0.5em; 
 
    position: absolute; 
 
    top: -0.6em; 
 
    left: 0.5em; 
 
} 
 

 
#fixed span { 
 
    display: inline-block; 
 
    width: 1em; 
 
    text-align: center; 
 
}
<p id="variable" name="Variable Width">It might not look nice, but with a little Javascript, I can force a variable width font to act like a fixed-width font.</p> 
 
<p id="fixed" name="Fixed Width">It might not look nice, but with a little Javascript, I can force a variable width font to act like a fixed-width font.</p>

En un párrafo con el texto normal, se ve terrible, pero hay casos en los que esto tiene sentido. Las fuentes de iconos y los símbolos Unicode podrían usar esta técnica.

Encontré esta pregunta al intentar encontrar una solución para los símbolos Unicode que estaban desplazando el texto normal a la derecha cuando fueron reemplazados por otros símbolos Unicode.

+0

yes horrible, y efecto visual equivalente al dividir la cadena usando celdas de tabla centradas, o bloques en línea, o javascript. Pero hay formas tipográficamente correctas de mejorar la representación en columnas de datos tabulares, especialmente para números (ver abajo: sin truco HTML, sin javascripts, solo una propiedad CSS para definir, más posiblemente otra propiedad CSS para alinear los puntos para no entero números de precisión variable y rango) –

3

Si esto es para los dígitos de alineación en mesas donde algunas fuentes (con la tipografía tradicional) las hacen por defecto con ancho variable (por ejemplo Segoe UI en Windows), usted debe buscar en las propiedades CSS para:

font-variant-numeric: tabular-nums;

(esto desactiva el valor proportional-nums predeterminado para la variante numérica espacio)

No se necesita Javascript!Es la forma más limpia de deshabilitar los glifos de ancho variable en estas fuentes y obligarlos a usar dígitos tabulares (esto generalmente usa los mismos glifos en la misma fuente, pero su brecha inicial y final aumenta, así que los 10 dígitos de 0 a 9 se renderizará con el mismo ancho, sin embargo, algunos tipos de letra pueden evitar el espaciado interdigital de la variable visual y ligeramente algunos dígitos, o pueden agregar signos inferiores al pie del dígito 1.

Tenga en cuenta que esto no desactiva la altura variable observado con Segoe interfaz de usuario (como algunos dígitos será altura x solamente como letras minúsculas, otros tendrán ascendentes o los descendentes). Estas formas tradicionales de dígitos puede ser desactivada con CSS también, usando

font-variant-numeric: lining-nums;

(Esto desactiva el valor de numérico-figura variante por defecto "de estilo antiguo-nums")

Se pueden combinar los dos:

font-variant-numeric: tabular-nums lining-nums;

+0

No tenía conocimiento de esta propiedad de CSS, gracias. Lamentablemente, Edge e IE no lo admiten. – Blender

Cuestiones relacionadas