CSS: cómo truncar texto con puntos suspensivos automáticamente

Post original en JASoft.org: http://www.jasoft.org/Blog/post/CSS-como-truncar-texto-con-puntos-suspensivos-automaticamente.aspx

Cuando diseñamos una interfaz de usuario o una página web, es muy complicado saber de antemano si un determinado texto va a caber dentro de un elemento o no, sobre todo teniendo en cuenta que los diseños fluidos actuales varían constantemente su tamaño para adecuarse al espacio disponible.

Para ver a qué me refiero imagina por ejemplo, el título de un artículo que quieres que entre en una sola línea para que no se desplace hacia abajo, rompiendo el diseño, cuando es muy largo. O por ejemplo que quieres crear algunos “tiles” del estilo de los que tiene Windows 8, con textos variables en longitud, y que aunque sean textos muy largos no quieres que puedan ocupar más espacio horizontal del disponible.

Por ejemplo, consideremos este código sencillo de una página:

   1: <!doctype html>

   2: <html lang="en">

   3: <head>

   4:     <meta charset="UTF-8">

   5:     <title>Texto truncado</title>

   6:     <style type="text/css">

   7:         #contenido {

   8:             width:80%;

   9:             height:200px;

  10:             background-color:orange;

  11:             color:white;

  12:             font-size:24pt;

  13:         }

  14:         

  15:     </style>

  16: </head>

  17: <body>

  18:     <div id="contenido">

  19:         Todo lo que siempre quisiste saber sobre HTML, CSS y JavaScript y no te atreviste a preguntar.

  20:     </div>

  21: </body>

  22: </html>

Si renderizamos este bloque obtendremos la siguiente figura:

TruncarTexto_1

El texto, al ser mucho más largo que el ancho disponible, se cambia de línea y mueve todo el contenido hacia abajo.

Podemos añadirle al estilo lo siguiente:

white-space:nowrap;

y conseguiremos que el texto no cambie de línea, pero se saldrá por el fondo dejándose de ver, lo cual queda muy feo:

TruncarTexto_2

En estos casos lo que se suele hacer es cortar el texto añadiéndole unos puntos suspensivos al final, para denotar que el texto sigue. Se trata de una indicación ya estándar hoy en día y que todos los usuarios entienden. Lo ideal sería que quedara algo así (fíjate en los puntos suspensivos del final):

TruncarTexto_3

Además esto debería ser dinámico, de modo que si el usuario cambia el tamaño de la pantalla, en tiempo real se truncase el texto por el lugar adecuado, teniendo en cuenta además el posible “padding” o relleno que exista, etc…

Conseguir esto en un diseño de ancho fijo es sencillo porque podemos cortar el texto y añadirle los puntos antes de enviarlo al cliente y listo. El problema es que, como comentaba antes, los diseños actuales suelen ser fluidos, de modo que adaptan sus dimensiones horizontales al espacio disponible en la pantalla. Ello no nos permite calcular en cuántos caracteres debemos cortar para añadir los puntos suspensivos, por lo que no hay una forma fácil de conseguirlo mediante código, ni siquiera con JavaScript (se puede, pero es complejo).

CSS3 viene a nuestro rescate con una propiedad nueva llamada text-overflow, que hay que utilizar combinada con otras.

Esta propiedad nos permite indicar qué caracteres queremos usar para truncar una cadena de texto lineal en caso de que no entre en su contenedor. Es decir, justo lo que queremos conseguir. En la práctica el único valor que podemos asignarle es “ellipsis”, que es el nombre que reciben esos tres puntos. En el estándar está definido que si le asignas una cadena cualquiera será la que utilice para truncar el texto, pero el único navegador que soporta esa características es Firefox hoy en día, así que mejor obviarlo. El otro valor posible es “clip” que lo que hace es cortarlo simplemente, o sea, el comportamiento por defecto.

Las condiciones para poder usarlo y conseguir el efecto deseado son que el texto debe estar en una única línea, es decir, no puede hacerse “wrapping” del mismo, lógicamente, sino no hay necesidad de truncarlo. Además debemos establecer explícitamente el tipo de “overflow” del contenedor y asignarle el valor “hidden” para que no muestre elementos que queden fuera del contenedor.

Este post está basado en material extraído de mi curso online de HTML(5) y CSS(3) de campusMVP. Si quieres aprender de verdad sobre este tema y tenerme como tutor para contestar tus dudas empieza hoy mismo.

Según todo esto, los estilos que debemos utilizar para conseguir el efecto de la última figura serían estos:

#contenido {

    width:80%;

    height:200px;

    background-color:orange;

    color:white;

    font-size:24pt;

    overflow:hidden;

    white-space:nowrap;

    text-overflow: ellipsis;

}

Es decir, las 3 últimas líneas, le están indicando al contenido que si se sale por un lateral que no se muestre, que no se cambie de línea el contenido “inline” y que, en caso de salirse el texto por un lateral, que le incluya los puntos suspensivos automáticamente por donde proceda.

Con esto conseguimos el efecto deseado y además los puntos se colocan en tiempo real si variamos el ancho del contenedor por el motivo que sea.

¡Espero que te sea útil!

Calculando valores de propiedades CSS dinámicamente sin programar

Post original en JASoft.org: http://www.jasoft.org/Blog/post/Calculando-valores-de-propiedades-CSS-dinamicamente-sin-programar.aspx

AbacoUna característica muy interesante introducida en CSS3 es la posibilidad de asignar valores a propiedades CSS utilizando cálculos, de forma que en lugar de utilizar valores constantes coo siempre, se utilicen valores dinámicos que varíen en función de ciertas condiciones.

Para ello se ha diseñado la función calc de CSS3.

Es una función específica para trabajar con valores numéricos (generalmente dimensiones) y que nos permite realizar operaciones matemáticas muy sencillas. Los operadores que permite utilizar son solamente la suma (+), la resta (-), la multiplicación (*) y la división (/).

Su principal característica, y para lo que vamos a usarlo realmente la mayor parte de las veces, es que gracias a calc podemos mezclar unidades de medida, incluso relativas y absolutas, en los valores de las propiedades CSS.

Por ejemplo: ¿cómo centrarías un elemento dentro de otro de modo que el centro de ambos quede superpuesto? (es decir, un centrado perfecto).

Si tenemos estos dos elementos:

   1: <div id="contenedor">

   2:     <div id="caja"></div>

   3: </div>

con estos estilos asignados:

   1: <style type="text/css">

   2:     #contenedor {

   3:         position:relative;

   4:         width: 500px;

   5:         height:500px;

   6:         border: 1px solid black;

   7:     }

   8:     #caja {

   9:         width: 100px;

  10:         height: 100px;

  11:         background-color:red;

  12:     }

  13: </style>

¿cómo haríamos para centrar “caja” dentro de “contenedor”?

El primer impulso sería definir una clase llamada “centrada” y asignárselo a “caja”, de modo que le asignemos un posicionamiento absoluto a la caja de la siguiente manera:

   1: .centrada {

   2:     position:absolute;

   3:     left:50%;

   4:     top:50%;

   5: }

El problema es que esto centrará la equina superior izquierda de la caja en el contenedor, obteniendo el siguiente resultado:

calc_1_mal

Como vemos no está centrada como querríamos.

Existen maneras de conseguir el efecto deseado usando subterfugios, como por ejemplo poniendo la mitad del lado de la caja como margen negativo, pero, gracias a calc podemos conseguirlo de manera muy sencilla de la siguiente forma:

   1: .centrada {

   2:     position:absolute;

   3:     left:calc(50% - 50px);

   4:     top:calc(50% - 50px);

   5: }

Con calc le indicamos que lo queremos meter en la mitad, como antes, pero restándole la mitad del lado de la caja (mide 100px, así que le restamos 50px). Listo, ahora obtenemos el resultado deseado, que es este:

calc_2_bien

Existen muchas aplicaciones para esta funcionalidad, y seguro que le encuentras una rápidamente. Por ejemplo:

  • Para centrar fácilmente elementos, como acabamos de ver.
  • Para que los elementos se adapten en ancho y alto al contenedor restándole el tamaño de ciertos elementos (por ejemplo una cabecera)
  • Para hacer que todos los campos de un formulario se adapten al ancho de éste (sea cual sea) dejando al mismo tiempo cierto margen
  • Para posicionar imágenes de fondo con mayor precisión
  • Para conseguir elementos divididos fácilmente para repartirse el espacio y con una separación entre ellos, sin tener que andar calculando porcentajes o anchos fijos, ni cambiar el modelo de renderizado de caja.
  • Muchas aplicaciones más.

Por ejemplo, para conseguir lo que dice el último ejemplo (cajas divididas en un espacio sin cálculos complejos de porcentajes), considera que tenemos la siguiente estructura de elementos:

   1: <div id="contenedor">

   2:     <div id="col1"></div>

   3:     <div id="col2"></div>

   4:     <div id="col3"></div>

   5: </div>

Lo que queremos es que las tres cajas se repartan el espacio disponible en el contenedor (que puede ser relativo y cambiar con el tiempo) de modo que ocupen respectivamente el 25%, 25% y 50% del espacio disponible.

Esto es muy fácil de conseguir porque basta con asignar esos porcentajes al ancho de cada columna. La dificultad viene si además queremos que haya una cierta separación entre ellas y los bordes, de manera que queden de la siguiente manera:

calc_3_separacionColumnas

En este caso las he separado 1.5em de los bordes y entre sí. Lo que quiero es poder especificar esos porcentajes (25%, 25% y 50%) de manera sencilla y no tener que volverme loco cambiando los porcentajes a otros con decimales o andar haciendo números para calcularlos de manera absoluta. Es más, quiero que la caja contenedora tenga un ancho relativo y pueda variar automáticamente el conjunto si cambio las dimensiones de la ventana del navegador.

Con calc es muy sencillo de conseguir y este sería el CSS necesario:

   1: #contenedor {

   2:     width: 80%;

   3:     height:300px;

   4:     border: 1px solid black;

   5:     overflow:auto;

   6: }

   7: #col1 {

   8:     float:left;

   9:     width: calc(25% - 3em);

  10:     height: 100%;

  11:     margin-left: 1.5em;

  12:     margin-right: 1.5em;

  13:     background-color:red;

  14: }

  15: #col2 {

  16:     float:left;

  17:     width: calc(25% - 1.5em);

  18:     height: 100%;

  19:     margin-right: 1.5em;

  20:     background-color:blue;

  21: }

  22: #col3 {

  23:     float:left;

  24:     width: calc(50% - 1.5em);

  25:     height: 100%;

  26:     margin-right: 1.5em;

  27:     background-color:green;

  28: }

Fíjate en como calculo el ancho usando los porcentajes que quería utilizar y simplemente restándoles los espacios en blanco de más que tienen cada uno. Dado que hay cuatro separaciones de 1.5em (las dos entre los tres bloques más las dos de los laterales), tengo que restarle a uno de ellos de los extremos el doble de espacio para que entren bien. En este caso se la resto al primero, por eso tiene 3em en el cálculo.

Soporte de navegadores y algunas cosas a tener en cuenta

Esta característica es de CSS3 por lo que es relativamente moderna. Aún así hace ya algunos años que está soportada por la mayoría de los navegadores, por lo que si vamos a soportar navegadores que tengan solo unos pocos años podemos hacerlo con bastante confianza. Está soportada a partir de Internet Explorer 9, Chrome 29, Firefox 23 y Safari 6. También se soporta en las versiones móviles de los navegadores: en iOS desde la versión 6.0 y en Windows Phone desde la 8.0. En Android solamente en la nueva versión Kit Kat 4.4, así que cuidado con esto si es importante que funciones en móviles o tablets con el sistema operativo de Google.

Además hay que tener en cuenta un par de cosas adicionales:

  • Es obligatorio poner espacios a ambos lados de los operadores “+” y “-“. Si escribes por ejemplo esto: calc(100%-10px); se interpretará como una expresión no válida y se considerará un 0, por lo que puedes volverte loco para saber qué está pasando. La expresión correcta sería esta: calc(100% – 10px);(fíjate en los espacios). Esto es así para evitar problemas con valores negativos de unidades. No existe ese problema en el caso de la multiplicación y la división, pero por coherencia yo trataría de usar los espacios también ahí.
  • Si divides entre 0 se produce un error y el elemento ni siquiera se renderizará. Así que mucho ojo con despistarnos con esto.

Este post está basado en material extraído de mi curso online de HTML(5) y CSS(3) en campusMVP. Si quieres aprender de verdad este tema y tenerme como tutor para contestar tus dudas empieza hoy mismo.

He dejado los dos ejemplos anteriores en este archivo ZIP (1 KB) por si quieres probarlos sin tener que escribir.

¡Espero que te sea útil!

TRUCO: Acceder a SQL Server Configuration Manager en Windows 8

Post original en JASoft.org: http://www.jasoft.org/Blog/post/TRUCO-Acceder-a-SQL-Server-Configuration-Manager-en-Windows-8.aspx

Esto es algo muy tonto, pero que te puede llegar a frustrar…

Si quieres modificar las configuraciones de SQL Server, acceder a las propiedades de las instancias y los servicios, la configuración de red, etc… necesitas acceder al Configuration manager:

SQLServerConfigurationManager

En Windows 7 y versiones anteriores es muy sencillo acceder a esta herramienta ya que tiene un icono muy claro en el menú de inicio:

SQLServerConfigurationManager_Icono

Sin embargo, si tienes instalado SQL Server en Windows 8 o posterior, aunque busques en la lista completa de programas de Windows en la pantalla de inicio, no aparece por ningún lado.

El motivo es que, en realidad, este programa no es un ejecutable normal y corriente, sino que es un "snap-in" o complemento "enchufable" de la consola de administración del sistema, Microsoft Management Console (MMS), y por eso no lo considera el nuevo menú de inicio.

¿Cómo podemos acceder a esta funcionalidad de manera sencilla?

Bueno, una forma sería lanzar MMC.exe y agregar el complemento desde allí, guardando la consola resultante.

Sin embargo es innecesario porque ya lo tenemos hecho tras la instalación de SQL Server.

Vete al menú de incio, pulsa CTRL+F para buscar, y busca:

  • SQLServerManager11.msc: para SQL Server 2012
  • SQLServerManager10.msc: para el caso de que tengas instalado SQL Server 2008 o 2008 R2.

Tienes que meter el nombre completo, pues no saldrá en los resultados parciales. Cuando aparezca, pulsa con el botón derecho sobre el programa y en el menú inferior elige la opción de anclarlo al inicio:

SQLServerConfigurationManager_Anhadir

Ahora tendrás acceso a esta utilidad como si fuera un programa más:

SQLServerConfigurationManager_Icono_Anhadido

Un truco tonto, pero que te puede traer por la calle de la amargura si no te lo cuentan 🙂

¡Espero que te resulte útil!