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í.

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í.

16
mar

Detectar el navegador mediante jQuery

Versión mejorada del script: aquí.

Este script nos ayudará cuando maquetemos nuestras hojas de estilos y veamos que cada navegador interpretan cosas que no deberían ser así, muy común en IE, sobretodo en la versión 6.

Antes de nada, se necesita la librería jquery para hacer funcionar el script.

Dividimos el script en dos partes, la primera detectamos los navegadores más comunes:

var userAgent = navigator.userAgent.toLowerCase();
jQuery.browser = {
	version: (userAgent.match( /.+(?:rv|it|ra|ie|me)[\/: ]([\d.]+)/ ) || [])[1],
	chrome: /chrome/.test( userAgent ),
	safari: /webkit/.test( userAgent ) &amp;amp;&amp;amp; !/chrome/.test( userAgent ),
	opera: /opera/.test( userAgent ),
	msie: /msie/.test( userAgent ) &amp;amp;&amp;amp; !/opera/.test( userAgent ),
	mozilla: /mozilla/.test( userAgent ) &amp;amp;&amp;amp; !/(compatible|webkit)/.test( userAgent )
};

Una vez el script detecta el navegador que estamos utilizando pasaremos los condicionales para escribir una ruta de css u otra:

if ($.browser.chrome) {
	document.write("<link rel='stylesheet' type='text/css' href='css/browsers/chrome.css'>");
	}else if ($.browser.msie){
   		if ($.browser.version>=7){
	  document.write("<link rel='stylesheet' type='text/css' href='css/browsers/ie7.css'>");
   		}else{
	  		document.write("<link rel='stylesheet' type='text/css' href='css/browsers/ie6.css'>");
   		}
	}else if ($.browser.safari) {
    document.write("<link rel='stylesheet' type='text/css' href='css/browsers/safari.css'>");
	}else if ($.browser.opera) {
    document.write("<link rel='stylesheet' type='text/css' href='css/browsers/opera.css'>");
	}else if ($.browser.mozilla) {
    document.write("<link rel='stylesheet' type='text/css' href='css/browsers/firefox.css'>");
	}
	

Por ejemplo, la primera condición dice, si estás utilizando el navegador Chrome añadirá:

<link rel='stylesheet' type='text/css' href='css/browsers/chrome.css'>

Al final de la etiqueta:

</html>

Versión mejorada del script aquí.

« Anterior página