Cómo crear un teletipo de noticias simple
Spanish (Español) translation by Andrijana Mitevska (you can also view the original English article)
En este tutorial veremos cómo podemos transformar algo de HTML subyacente semántico y accesible en un teletipo de noticias atractivo y funcional que desplaza suavemente tu contenido. Algunos tickers de noticias son horizontales y otros verticales; el que vamos a crear hoy será vertical.
El contexto del ejemplo es un desplazador de noticias, por lo que trabajaremos con texto sin formato, pero deberíamos poder poner lo que queramos en el marcado subyacente; imágenes, o enlaces, o lo que sea. Usaremos jQuery como la biblioteca JS subyacente y un poco de HTML y CSS. Empecemos.
El HTML subyacente
En una nueva página en tu editor de texto, agrega el siguiente código:
1 |
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "https://www.w3.org/TR/html4/strict.dtd">
|
2 |
<html>
|
3 |
<head>
|
4 |
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> |
5 |
<title>Simple News Ticker</title> |
6 |
<link rel="stylesheet" type="text/css" href="simpleTicker.css"> |
7 |
</head>
|
8 |
<body>
|
9 |
<dl id="ticker"> |
10 |
<dt>This is a news title!</dt><dd>This is a snippet of the news. It could be the whole news item or it could link to another page containing...</dd> |
11 |
<dt>News Heading 2</dt><dd>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</dd> |
12 |
<dt>News Heading 3</dt><dd>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</dd> |
13 |
<dt>News Heading 4</dt><dd>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</dd> |
14 |
<dt class="heading">This item is long!</dt><dd class="text">Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</dd> |
15 |
</dl>
|
16 |
<script type="text/javascript" src="jquery-1.3.2.js"></script> |
17 |
<script type="text/javascript"> |
18 |
|
19 |
</script>
|
20 |
</body>
|
21 |
</html>
|
Guárdalo como simpleTicker.html en un directorio que contenga jQuery 1.3.2. Además del mobiliario de página habitual (DOCTYPE, tipo de contenido META, título, etc.), tenemos una hoja de estilo personalizada que crearemos en un momento y enlazamos a jQuery al final del cuerpo (por razones de rendimiento). ).


En la página está el contenido que mejoraremos progresivamente en el ticker de noticias; se compone de un elemento de lista de definiciones simple, que se siente apropiado para nuestros propósitos. Aunque solo se puede colocar contenido en línea en cada elemento <dt>, el contenido a nivel de bloque se puede colocar en los elementos.
El código es mínimo y muy accesible; Los navegadores, dispositivos móviles y lectores de pantalla no deberían tener ninguna dificultad para interpretarlo y reproducirlo. Sin embargo, sin estilo, se ve bastante impactante:
Proporcionar estilo predeterminado
Agreguemos un estilo básico; incluso con JavaScript desactivado, nadie quiere ver la lista tal como está en este momento. En un nuevo archivo en tu editor de texto, agrega el siguiente código:
1 |
#ticker { |
2 |
width:180px; height:300px; overflow:auto; border:1px solid #aaaaaa; |
3 |
}
|
4 |
#ticker dt { |
5 |
font:normal 14px Georgia; padding:0 10px 5px 10px; |
6 |
background-color:#e5e5e5; padding-top:10px; border:1px solid #ffffff; |
7 |
border-bottom:none; border-right:none; |
8 |
}
|
9 |
#ticker dd { |
10 |
margin-left:0; font:normal 11px Verdana; padding:0 10px 10px 10px; |
11 |
border-bottom:1px solid #aaaaaa; background-color:#e5e5e5; |
12 |
border-left:1px solid #ffffff; |
13 |
}
|
14 |
#ticker dd.last { border-bottom:1px solid #ffffff; |
Guarda este archivo en el mismo directorio que la página y llámalo simpleTicker.css. Le damos a la lista un ancho y alto establecidos y establecemos la propiedad de desbordamiento en auto; la altura del ticker es menor que el espacio requerido para mostrar todas las noticias, por lo que la barra de desplazamiento permitirá a los visitantes con JavaScript desactivado ver todo el contenido.
Algunos de los estilos son puramente de presentación; cualquier cosa que establezca un color de fondo, borde o fuente es totalmente arbitrario y se usa para hacer el ejemplo un poco más atractivo. El widget ahora debería verse así:
Por mínimo que elijamos hacerlo, es una gran mejora en el renderizado predeterminado; encajaría felizmente en una barra lateral o columna ahora; es una alternativa aceptable del widget terminado y una gran base para mejorar progresivamente.
Mejora progresiva del ticker
Ahora podemos pasar a la parte divertida: agregar el JavaScript que convertirá esto de una lista simple en un ticker automático; en el elemento vacío en la parte inferior de la página agregue el siguiente código:
1 |
$(function() { |
2 |
|
3 |
//cache the ticker
|
4 |
var ticker = $("#ticker"); |
5 |
|
6 |
//wrap dt:dd pairs in divs
|
7 |
ticker.children().filter("dt").each(function() { |
8 |
|
9 |
var dt = $(this), |
10 |
container = $("<div>"); |
11 |
|
12 |
dt.next().appendTo(container); |
13 |
dt.prependTo(container); |
14 |
container.appendTo(ticker); |
15 |
});
|
16 |
|
17 |
//hide the scrollbar
|
18 |
ticker.css("overflow", "hidden"); |
19 |
|
20 |
//animator function
|
21 |
function animator(currentItem) { |
22 |
|
23 |
//work out new anim duration
|
24 |
var distance = currentItem.height(), |
25 |
duration = (distance - Math.abs(parseInt(currentItem.css("marginTop")))) / 0.025; |
26 |
|
27 |
//animate the first child of the ticker
|
28 |
currentItem.animate({ marginTop: -distance }, duration, "linear", function() { |
29 |
|
30 |
//move current item to the bottom currentItem.appendTo(currentItem.parent()).css("marginTop", 0);
|
31 |
|
32 |
//recurse
|
33 |
animator(currentItem.parent().children(":first")); |
34 |
});
|
35 |
};
|
36 |
|
37 |
//start the ticker
|
38 |
animator(ticker.children(":first")); |
39 |
});
|
Todo nuestro código está encerrado dentro del documento jQuery. Listo atajo $ (function () {}) que ejecutará la función anónima tan pronto como se cargue la página. Lo primero que hacemos es almacenar en caché nuestro selector principal, que es el elemento externo <dl>; esto nos evitará tener que seleccionar repetidamente el elemento del DOM cada vez que queramos trabajar con él y mejorará el rendimiento de la página.
La lista de definiciones subyacente contiene tanto el término de definición como los elementos de descripción de la definición, todos los cuales podrían ser potencialmente de diferentes tamaños. Para hacer las cosas un poco más fáciles en nuestro script, a continuación envolvemos cada par <dt> y <dd> en un elemento <div> que lo contiene; esto nos permite agrupar los diferentes elementos de forma lógica y suavizar las animaciones. También significa que podemos usar cualquier margen y relleno en * lt; dt> y
Para hacer esto, seleccionamos todos los hijos de nuestro selector en caché y usamos el método de filtro jQuery para descartar todos los elementos. Luego, para cada restante<dt>, creamos un nuevo contenedor <div> y agregamos tanto el <dt> como el <dd> al nuevo contenedor. . Primero tenemos que agregar el <dd> que sigue al <dt> actual, porque una vez que el <dt> se ha agregado al contenedor, no tendrá un <dd> después. Por lo tanto, necesitamos usar el método anteponer en el <dt> una vez que se haya agregado el<dd>.
Una vez que todos los pares <dt> y <dd> se han envuelto en elementos <div>, cambiamos la propiedad CSS de desbordamiento del ticker a oculta para eliminar la barra de desplazamiento. Esto es parte de la estrategia de accesibilidad y garantiza que solo los visitantes con JavaScript habilitado puedan ver el ticker mejorado.
A continuación, definimos nuestra función de animador, que es donde estableceremos la animación que hace que el ticker comience a desplazarse y luego siga desplazándose indefinidamente. Esta es una función JavaScript normal que acepta un solo parámetro; cuando llamamos a esta función, pasaremos el primer elemento contenedor dentro del ticker.
Lo primero que hacemos dentro de esta función es calcular la distancia que debe recorrer el elemento seleccionado y la duración de la animación. La parte de la distancia es fácil; es solo la altura del elemento contenedor actual. La duración es un poco más compleja; es la distancia total a recorrer menos la distancia ya recorrida, dividida por una velocidad de referencia que he establecido arbitrariamente en 0,025. La altura ya será un número entero, pero el método css devolverá una cadena que representa el margen superior del elemento que se está animando, por lo que debemos usar la función parseInt () de JavaScript para convertirlo en un número. También será un número negativo, por lo que usamos la función de JavaScript Math.abs () para convertirlo de un número negativo a uno absoluto (positivo).
En mi opinión, la velocidad de referencia por la que dividimos la distancia restante para viajar es bastante lenta; He visto tickers antes (construidos con Java) y han tenido aproximadamente la misma velocidad y no me mareo por movimiento ni sufrí efectos nocivos. Si crees que la animación es demasiado rápida (o incluso demasiado lenta), no dudes en cambiar esta cifra. Sin embargo, debe ser un número muy pequeño; cualquier cosa en el rango de 0.01 a 0.09 probablemente estará bien.
Una vez que tengamos estas figuras, podemos crear la animación usando el método animado de jQuery. El primer parámetro de este método es la propia animación; queremos que el primero de los elementos del contenedor en el ticker se mueva hacia arriba hasta que esté completamente oculto en el desbordamiento, pero también queremos arrastrar el resto de los elementos del contenedor hacia arriba en la misma distancia, así que usamos ajustar el margen el elemento.
El segundo argumento del método animado es la duración que calculamos hace un momento. El tercer argumento es el método de relajación; Las animaciones jQuery personalizadas obtienen automáticamente dos tipos de suavizado: swing y lineal. El swing hace que la animación se acelere y desacelere, mientras que el lineal lo hace suave y continuo, por lo que esta es la opción para nosotros en esta situación.
El argumento final es una función de devolución de llamada anónima que se ejecutará cuando finalice la animación. Dentro de esta función, movemos el elemento que se acaba de animar al final del conjunto de contenedores, restablecemos su marginTop de nuevo a 0, y luego llamamos de forma recursiva a la función animador nuevamente, pasando el nuevo primer hijo del ticker.
Finalmente, necesitamos llamar a la función animador una vez para comenzar todo el proceso. Cuando vemos esta página en un navegador, el ticker debe desplazarse suavemente por cada uno de los elementos de la lista repetidamente:
Iniciar y detener
Ahora tenemos que pensar en lo que queremos que suceda cuando un visitante pasa el ratón por encima de una noticia; personalmente, creo que el comportamiento predeterminado debería ser que se pausa al pasar el mouse y luego se reinicia nuevamente cuando se saca el mouse. Podemos agregar fácilmente este comportamiento con un par de controladores de eventos jQuery; agrega el siguiente código justo antes del combo final de llaves / llaves:
1 |
//set mouseenter
|
2 |
ticker.mouseenter(function() { |
3 |
|
4 |
//stop current animation
|
5 |
ticker.children().stop(); |
6 |
|
7 |
});
|
8 |
|
9 |
//set mouseleave
|
10 |
ticker.mouseleave(function() { |
11 |
|
12 |
//resume animation
|
13 |
animator(ticker.children(":first")); |
14 |
});
|
Ambas funciones son realmente simples; usamos mouseenter y mouseleave en lugar de mouseover y mouseout porque hace que estas funciones sean agradables y pequeñas; no tenemos que preocuparnos por ignorar las salidas del mouse cuando el puntero se mueve desde el elemento exterior del ticker a uno de los elementos secundarios. En la función mouseenter simplemente detenemos la animación. En la función mouseleave, simplemente reiniciamos la animación una vez más, pasando el primer hijo del ticker.
Reparando IE
Nos queda un problema por resolver y, afortunadamente, es fácil. Ejecutar la página como está en IE (probado en la versión 8) arroja un error tan pronto como se carga. El error se debe a que la primera vez que la función animador ejecuta el primer contenedor <div> tendrá su margin-top establecido en auto por el navegador. Otros navegadores interpretarán el margen superior como 0. Qué navegador es correcto es discutible, aunque te dejaré sacar tu propia conclusión sobre el hecho de que IE es el único navegador que causa el problema. Todo lo que tenemos que hacer para solucionarlo es establecer explícitamente el margen superior de los elementos del contenedor. Podemos hacer esto agregando la siguiente línea de código a la hoja de estilo:
1 |
#ticker div { margin-top:0; } |
Ahora la página también debería funcionar en IE:
Resumen
Ahora, esto nos lleva al final del tutorial, ahora deberíamos tener un ticker de noticias simple pero efectivo que se puede usar de varias maneras. Al usar texto, como en este ejemplo, definir los encabezados y las secciones de contenido asociadas dentro de una lista de definiciones tiene sentido desde una perspectiva semántica, y es fácil agregar cualquier elemento adicional que podamos necesitar a medida que avanzamos.
- Síguenos en Twitter o suscríbate a la fuente RSS de Nettuts + para obtener más información y artículos sobre desarrollo web diarios.





