27
mar

CSS PopUp con jQuery

Nueva versión CSS PopUp jQuery y Ajax.

Hemos visto como hacer un PopUp con un iframe transparente utilizando thichbox, os voy a mostrar otro método sin utilizar un iframe, simplemente con capas y con la ayuda de jQuery.
Lo primero que necesitamos es una capa que ocupe toda la pantalla y que tenga una opacidad.

<div id="capaPopUp"></div>

Luego necesitamos la ventana del popup.

<div id="popUpDiv">
	<div id="capaPng">
		<div>
			Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras sodales vulputate erat. Nulla facilisi. Sed porta velit. Sed nec mi.  
		</div>
		<a href="javascript:void(0);" title="Cerrar" id="cerrar"><img src="wp-content/examples/jquery/css-popup/imagenes/icons/cerrar.gif" title="Cerrar" alt="Cerrar" /></a>
	</div>
</div>

En nuestra hoja de estilos añadimos los siguientes estilos (Comento línea a línea para que sea fácil de entenderlo):

/**************************************************************************
ESTILOS PARA LA VENTANA POPUP 20090323@JCP
***************************************************************************/
#capaPopUp {
	background-color:#000;  	/* Le damos la el color de la opacidad. */ 
	opacity:0.65; 				/* Este valor mostrará la intensidad de la opacidad. */
	position:absolute; 			/* La posición tendrá que ser absoluta. */
	z-index:9001; 				/* Esta propidad es para añadir la capa superpuesta al nivel 9001. */
	top:0; 						/* Para que posicione la capa al punto '0' del top de la página. */
	left:0; 					/* Para que posicione la capa al punto '0' a la izquieda de la página. */
	width:100%; 				/* El valor por defecto que tendrá que expandirse. */
	height:100%; 				/* El valor por defecto que tendrá que expandirse. */
	display:none;				/* Por defecto estará desactiva */
}
#popUpDiv {
	position:absolute; 			/* La posición tendrá que ser absoluta. */
	z-index:9002; 				/* Esta propidad es para añadir la capa superpuesta al nivel 9002 (antes que la capa 'capaPopUp'). */	
	overflow:auto;				/* Esta propiedad la indicamos por si el contenido es más grande que la capa que por defecto salga el 'scroll'. */
	left:50%; 					/* Para posicionar horizontalmente la capa al centro de la página */
	display:none; 				/* Por defecto estará desactiva */
	top:50%; 					/* Para posicionar verticalmente la capa al centro de la página */
}
/**************************************************************************
ESTILOS PROPIOS DEL POPUP 20090323@JCP
***************************************************************************/
#capaContent {
	display:block;
	width:400px; 				/* Necesario para que el script centre la capa horizontalmente en la página */
	height:200px;				/* Necesario para que el script centre la capa verticalmente en la página */
	background-color:#FFF;
}

Para que Internet Explorer haga la opacidad tendremos que insertar un condicional en el ‘head’:

<!--[if IE]>
<style type="text/css" media="all">
	#capaPopUp 	{filter:alpha(opacity=65);}
</style>
<![endif]-->

Este condicional quiere decir: Si eres IE añade esta clase.

jQuery en acción…
Primero, añadimos la librería jQuery en el ‘head. Una vez hecho esto insertamos el script para hacer funcionar nuestra capa PopUp (comento las líneas para que sea más fácil entender el script).

/*
 * jQuery CSS popUp
 * http://dixso.net/
 *
 * Copyright (c) 2009 Julio De La Calle Palanques
 *
 * Date: 2009-03-27 12:34:00 - (Viernes, 27 Mar 2009)
 * 
 */
 
//Variable que almacenará la posición del scroll, por defecto tiene valor 0.
var scrollCachePosition = 0;

$(function() {
	$("#abrirPop").click(function(event) {
		scrollCachePosition = $(window).scrollTop();
		//Envío el scroll a la posición 0 (left), 0 (top), es decir, arriba de todo.
		window.top.scroll(0,0);

		//Si el body es mas grande que la capa 'wrapper' incrementa la altura del body a la capa 'capaPopUp'.
		if ($("body").outerHeight()>$("#wrapper").outerHeight()){
			var altura=$("body").outerHeight();
	    }else{
		//Si la capa 'wrapper' es más grande que el body incrementa la altura de la capa 'wrapper' a la capa 'capaPopUp'.
			var altura=$("#wrapper").outerHeight();
		}
		window.document.getElementById("capaPopUp").style.height=altura+"px";
		event.preventDefault();
		//Muestro la capa con el efecto 'slideToggle'.
		$("#capaPopUp").slideToggle();

		//Calculo la altura de la capa 'popUpDiv' y lo divido entre 2 para darle un margen negativo.
		var altura=$("#popUpDiv").outerHeight();
		$("#popUpDiv").css("margin-top","-"+parseInt(altura/2)+"px");
		
		//Calculo la anchura de la capa 'popUpDiv' y lo divido entre 2 para darle un margen negativo.
		var anchura=$("#popUpDiv").outerWidth();
		$("#popUpDiv").css("margin-left","-"+parseInt(anchura/2)+"px");
		
		//Muestro la capa con el efecto 'slideToggle'.
		$("#popUpDiv").slideToggle();
	});
	$("#cerrar").click(function(event) {
		event.preventDefault();
		//Cierro las capas con el efecto 'slideToggle'.
		$("#capaPopUp").slideToggle();
		$("#popUpDiv").slideToggle();
		//Si la variable scrollCachePosition es mayor que 0 incrementará la posición del scroll al valor que se almacenó. 
		if (scrollCachePosition > 0) {
			window.top.scroll(0,scrollCachePosition);
			//Reseteamos la variable scrollCachePosition a 0 para poder ejecutar el script tantas veces sea necesario.
			scrollCachePosition = 0;
		}
	});
});

¿Qué hace el script exactamente?
- Calcula la altura actual de todo el ‘body’ para hacer la opacidad.
- Calcula la altura y anchura de la ventana popUp definida en las CSS para poder centrar la capa horizontal y vertical.
- Almacena en una variable la posición del scroll actual para ser redirigido una vez al cerrar la ventana popUp.
- Añade efectos jQuery para la visualización de la ventana PopUp.

¿Ventajas respecto a un iFrame?
No muchas, teniendo en cuenta que en un iFrame se puede interactuar mejor, pero este script es mucho más rápido que un iFrame ya que llama la venta cuando ya está cargada en el código ‘html’.

También este script es útil cuando la venta popUp tiene mucha altura (El scroll sale en el navegador, lo contrario que en un iFrame, el scroll saldría en la propia ventana). Otra ventaja sería que tenemos el control total del evento, es decir, podemos personalizar nuestra ventana popUp a nuestro gusto.

En el ejemplo veréis que he añadido mucho texto para que salga el scroll y poder ver el script con todas sus funcionalidades, el link para “lanzar” el popUp está bajo de todo.

Nota: Este script funciona con TODOS los navegadores incluido el Internet Explorer 6.

Ejemplo: aquí.
Descarga: aquí.

25
mar

Recopilación menús desplegables

Como regla general, la mayoría de los desarrolladores web, especialmente los aficionados en usabilidad, dicen que es una mala práctica usar menús desplegables, ya que son confusos, molestos y muchas veces disfuncional.

Desde un punto de vista de diseño, sin embargo, menús desplegables son una excelente opción, ya que puede ayudar a limpiar una concurrida presentación.

Aquí os dejo una buena recopilación de menús desplegables.

24
mar

Variables en CSS

Esta técnica es sencilla, la idea es que Apache redirija cualquier hoja de estilo a un script PHP. Este script abrirá la hoja de estilos y leerá línea por línea para buscar y reemplazar cualquier variable que hayamos definido anteriormente.
Por último, el contenido se analiza y se muestra como CSS, además, los navegadores no notarán la diferencia.
También veremos cómo procesaremos este script en cache para evitar el mal uso de memoria en la CPU.

Requisitos:
* Apache con Rewrite mod on (Activado).
* PHP 5
Leer más…

23
mar

Autocompletar con jQuery

El plugin autocomplete de jQuery realiza un seguimiento de la información introducida recientemente, como direcciones Web, información de formularios y consultas de búsqueda. A medida que escribes información nueva, autocomplete intentará anticiparse a lo que escribamos y nos ofrecerá posibles coincidencias. Se ahorra tiempo porque no es necesario escribir toda la información: basta con seleccionar la coincidencia del autocomplete.

Primero insertamos las librerías y la hoja de estilo del plugin en el ‘head’:

<link rel="stylesheet" type="text/css" href="css/jquery.autocomplete.css" media="all" />
<script language="javascript" type="text/javascript" src="javascript/jquery/jquery-1.3.2.min.js"></script>
<script language="javascript" type="text/javascript" src="javascript/jquery/jquery.autocomplete.pack.js"></script>
<script language="javascript" type="text/javascript" src="javascript/jquery/jquery.bgiframe.min.js"></script>

La librería jquery.bgiframe.min.js la ulilizamos para IE6, nos ayuda a posicionar bien las capas, más info aquí.

Vamos a ver dos ejemplos, un campo de búsqueda que hace un ‘scandir’ de un directorio y otro campo de búsqueda que consulta los datos en la base de datos.

A) Scandir de un directorio, insertamos el script en el ‘head’:

<script type="text/javascript">
$().ready(function() {
	$("#monumento").autocomplete("fns/images.php", {
		width: 320,
		max: 4,
		highlight: false,
		scroll: true,
		scrollHeight: 300,
		formatItem: function(data, i, n, value) {
			return "<img src='imagenes/" + value + "'/> " + value.split(".")[0];
		},
		formatResult: function(data, value) {
			return value.split(".")[0];
		}
	});
});
</script>

Y en el ‘body’ insertamos el formulario:

<form action="javascript:void(0);" enctype="application/x-www-form-urlencoded" method="post" id="formulario">
	<label for="monumento">Busca monumento</label><br />
	<input type="text" id="monumento" style="width:200px;" /><br /><br />
</form>

La función que se ejecuta en el fichero images.php es el siguiente:

<?php
$term = $_REQUEST['q'];
$images = array_slice(scandir("../imagenes"), 2);
foreach($images as $value) {
	if( strpos(strtolower($value), $term) === 0 ) {
		echo $value . "\n";
	}
}
?>

B) Consultar campos a la base de datos en un campo de búsqueda:

<script type="text/javascript">
$().ready(function() {
	$("#usuarios").autocomplete("fns/usuarios.php", {
		/************************************************************************************************************
		Valores de configuración del autocomplete que se mandan a usuarios.php
		*************************************************************************************************************/
		minChars: 0, /* El número mínimo de caracteres que un usuario tiene que escribir antes de la autocompletar.*/
		width: 320, /* Anchura del listado de búsqueda, si no se indica la anchura se adaptará al input */
		highlight: false, /* Si se indica 'false' no resaltará los valores de búsqueda */
		scroll: true, /* Si tendrá scroll el campo de búsqueda */
		scrollHeight: 300, /* Altura del scroll en el campo de búsqueda */
		formatItem: function(data, i, n, value) { /* Muestra el valor devuelto se dentro de un elemento LI en la lista de resultados. */
			/************************************************************************************************************
			Listado de valores a seleccionar 
			*************************************************************************************************************/
			return value; /* Devuélve el valor de la función usuarios.php */
		},
		formatResult: function(data, value) { /* Similar a formatItem, pero proporciona el formato para el valor, que se pondrán en el campo de entrada. */
			/************************************************************************************************************
			devuelve el valor de la cadena que se ha seleccionado partiendo según el carácrete "["
			*************************************************************************************************************/
			return value.split("[")[0]; /* Inserta en el campo de búsqueda el valor pero separa el contenido 'split' */
		}
	});
});
</script>

Y en el ‘body’ insertamos el formulario:

<form action="javascript:void(0);" enctype="application/x-www-form-urlencoded" method="post" id="formulario">
    <label for="usuarios">Busca nombre</label><br />
    <input type="text" id="usuarios" style="width:200px;" /><br /><br />
</form>

La función que se ejecuta en el fichero usuarios.php es el siguiente:

<?
$term = $_REQUEST['q'];
$link = mysql_connect("localhost", "user","password"); /* Conecto a la base de datos */
mysql_select_db("base_de_datos", $link);  /* Seleccion la base de datos */
$sql="SELECT name, email FROM usuarios WHERE name LIKE '%$term%'";
$result = mysql_query($sql, $link);
while ($fila = mysql_fetch_assoc($result)) {
	echo $fila['name']." [".$fila['email']."]<br />\n ";
}
?>

Importante: el script envía los datos por:

<?
$term = $_REQUEST['q'];
?>

Ejemplo aquí.
También podéis ir a la web del autor y ver más ejemplos de este magnífico plugin.

20
mar

iFrame transparente con thickbox

ThickBox es una librería motorizada por jQuery que permite mostrar tanto imágenes como código html.
La finalidad es crear un iframe con el efecto del ThickBox con fondo transparente utilizando un png con transparencia.
En el ‘head’ hacemos las llamadas necesarias:

<link rel="stylesheet" type="text/css" href="css/iframe.css" media="screen" />
<script language="javascript" type="text/javascript">var CLOSE = "Cerrar";</script>
<script language="javascript" type="text/javascript" src="javascript/jquery-1.3.2.min.js"></script>
<script language="javascript" type="text/javascript" src="javascript/browser.detect.js"></script>
<script language="javascript" type="text/javascript" src="javascript/thickbox.js"></script>

La hoja de estilo iframe.css es la del iFrame.
La librería jquery-1.3.2.min.js es el motor de la web (por así decirlo).
Utilizo el Browser detect (browser.detect.js) porque para llamar al iframe se utilizan ‘filter’ y así especifico al navegador el elemento que necesita sin perjudicar a los demás.

En el ‘body’ insertamos lo siguiente:

Lorem ipsum dolor

frame_png.php – Nombre del fichero físico.
KeepThis=true&TB_iframe=true – Parámetros necesarios para hacer la llamada al iFrame con thickbox.
height - La altura del iframe (tendrá que ser la misma altura que la capa del iframe).
width - La anchura del iframe (tendrá que ser la misma anchura que la capa del iframe).
modal=true – Modo de ejecución.

Más información aquí.

El fichero iframe.
En el head insertamos los siguientes estilos:

<style type="text/css" media="all">
body {
	background-color:transparent; /* fondo transparente para los navegadores NORMALES */
	font-family:Arial, Helvetica, sans-serif; font-size:14px;

}
#capaPng {
	text-align:center;
	background:url(imagenes/huevo.png) no-repeat top center;
	display:block;
	width:411px;
	height:500px;
}
#capaPng p {padding:90px 70px 0 70px;}
#capaPng div {padding:120px 53px 80px 52px;}
</style>
<!--[if gte IE 6]>
<style type="text/css">
    #capaPng {background-image:none; filter:progid:DXImageTransform.Microsoft.AlphaImageLoader (src='imagenes/huevo.png', sizingMethod='crop');}
</style>
<![endif]-->

He añadido una condicional para que IE coja que png transparente, lo podríamos a ver hecho con una hoja de estilos aparte pero así también aprendemos que también se le pueden añadir condiciones al Internet Explorer, en los próximos días añadiré un artículo sobre los condicionales de dicho navegador.

Y para finalizar en el ‘body’ añadimos esto:

<div id="capaPng">
<p>Contenido. <br /><br /><br />
<a href="javascript:void(0);" onClick="self.parent.tb_remove();" title="Cerrar" style="position:absolute; z-index:2;"></a></p>
</div>

Para quitar el iFrame utilzamos un elemento ‘onClick’ en el enlace:

onClick="self.parent.tb_remove();"

Ejemplo aquí.
Descarga aquí.

20
mar

iFrame con transparencia

Para insertar un iframe y que tenga transparencia hay que añadir lo siguiente en el código html:

<iframe allowtransparency="allowtransparency" style="border:#FFF solid 2px;" src="iframe.php"></iframe>

Nota:
- Para lograr la transparencia es necesario el elemento: allowtransparency=”allowtransparency” para IE, claro.
- El borde que le pongo al iframe es para que se vea mejor el ejemplo (más a bajo).

Én el fichero dónde se llamará el iframe añadimos el siguiente estilo:

body 	{background-color:transparent;} /* fondo transparente para los navegadores NORMALES */

Ejemplo aquí.

19
mar

PNG transparente en IE6

Por suerte hay muchos métodos para lograr que Internet Explorer 6 logre coger transparéncia a los formatos png’s.
Aquí os muestro una manera mediante CSS:

#capaPng {
	height:300px;
	width:400px;
	background-image:url(imagenes/img.png) !important;
	background-image:none;
	filter:none !important;
	filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='http://dixso.net/wp-content/examples/css/png-ie/imagenes/img.png');
}

Y en el código html esto:

<div id="capaPng"></div>

Nota:
- Es necesario poner la altura (height) y anchura (width) de la capa para que los navegadores posicionen correctamente el png.
- Los ‘filter’ (para IE6) es necesario poner la ruta absoluta del png, si no insertáis la ruta absoluta no saldrá reflejado el png.

Ejemplo aquí.

El elemento ‘filter’ no es válido según W3C para las hojas de estilos, por lo tanto, esto no sería del todo correcto… ¿Solución?

Añadir esto:

	background-image:none;
	filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='http://dixso.net/wp-content/examples/css/png-ie/imagenes/img.png');

En nuestras hojas de estilo IE6 del Browser detect jQuery, de esta forma tendremos nuestra hoja de estilos principal validada y en la hoja de estilos de IE6 insertaremos todos los hack’s que sean necesarios para ver las cosas correctamente.

Ejemplo aquí.

18
mar

SEO: Mejorar la indexación y el posicionamiento en Google

Excelente artículo que hace una breve reseña de cómo mejorar la indexación (capacidad de un buscador para rastrear tu web) y el posicionamiento dentro de una búsqueda.
Es realmente interesante ya que es cosa de “todos” diseñadores y programadores para aplicar algunos conceptos que expongo a continuación.

Leer más…

18
mar

Galería Polaroids con jQuery

Están desarrollando una galería de imágenes motorizada por jQuery y usando las nuevas propiedades de CSS3. La galería sólo funciona en Safari/Webkit, Chrome y Firefox 3.1.
Estaremos pendientes de los progresos de esta galería.

Demo aquí.
Descarga aquí.
Noticia en anieto2k.

18
mar

Eliminar borde en el elemento select

Al crear un formulario y añadir el elemento “select” por defecto IE6 y IE7 (En IE8 ya solventaron el problema) lo muestra con borde, pero claro, hay formularios que queremos que se muestren de otra forma que no con el borde blanco.

Ejemplo de select por defecto en IE6 y IE7:
Elemento select en IE6 y IE7

En el resto de navegadores bastaría con ponerle esto a nuestra hoja de estilos (css):

select {border:none;}

Nos quedaría de la siguiente forma:
Select navegadores estándares
Para que nos quedara igual como el resto de los navegadores estándares tendríamos que añadir lo siguiente en nuestra hoja de estilos (css) yo recomiendo añadir el código en una hoja específica para cada navegador (IE6 y IE7).

.capaSelect {
  position:relative; 
  width:126px;
  height:18px;
  overflow:hidden;
}
.capaSelect select {
  background:#9999CC;
  position:absolute;
  width:130px;
  top:-2px;
  left:-2px;
}

Y el código html:

<div class="capaSelect">
    <form>
        <select>
            <option>dixso.net</option>
        </select>	
    </form>
</div>

Ejemplo aquí.

Siguiente página »