Mundo Web
manuales - recursos - gráficos - programación...

Home - WebScript - Capas

Caja arrastrable
por Luciano Moreno, del departamento de diseño web de BJS Software.


Vamos a ver ahora cómo se crea una caja mediante una capa, caja que va a poseer la facultad de que se puede arrastrar por la ventana del navegador con el ratón.

Es una caja que puede resultar muy útil, ya que podemos crear cuantas deseemos en una página, ofreciendo con ello al usuario una forma de presentación de datos que él puede distribuirse por la ventana, situando las diferentes cajas donde guste, lo que le puede permitir comparar los contenidos de dos o más cajas.

Es un script cross-browser, es decir, compatible con todos los navegadores de cuarta generación.

Para la construcción de caja vamos a usar una capa padre, dentro de la cual situaremos una tabla que usamos para formatear la presentación. El tema de mayor dificultad en éste script es la captura de eventos, sobre todo en el caso de Nestcape Navigator 6x.

No voy a entrar en muchas explicaciones. Digamos que éste es un script para usuarios avanzados si deseáis profundizar en él, aunque nada impide un uso realtivamente fácil del mismo a cualquiera.

El código necesario para la página es el siguiente:

<html>
<head> 
 
<style type="text/css">   

      #caja1{border: 2pxsolid red}      

</style>

 <script language="JavaScript">

        var permisoN4=0;
        var leftN4;
        var topN4;
        var idCapa;
        var idCapax;
        var idCapay;
               
        /**
        * funciones para manejar eventos de raton en Nestcape 4x
        */      

        function capturaN4(e)
        {
            idCapa.captureEvents(Event.MOUSEMOVE)
            leftN4=e.x
            topN4=e.y
        }               
        /**
        * funciones para arrastrar la capa en Nestcape 4x
        */
        function arrastraN4(e)
        {
            if (permisoN4==1)
            {
                idCapa.moveBy(e.x-leftN4,e.y-topN4)
                return false
            }
        }
        /**
        * funcion para detener la captura de los eventos de raton
        */
        function paraN4()
        {
            idCapa.releaseEvents(Event.MOUSEMOVE)
        }


        /**
        * funciones y variables para manejar eventos de raton en Internet Explorer y mover la capa
        */

        var permisoIE=false

        function arrastraIE(id)
        {
            if (permisoIE==true)
            {
                document.all[id].style.pixelLeft=idCapax+event.clientX-iex
                document.all[id].style.pixelTop=idCapay+event.clientY-iey
                return false
            }
        }
       
       
        var permisoN6=false

        function arrastraN6(e)
        {
            if (permisoN6==true)
            {
                idCapa.style.left=idCapax+e.clientX-n6x+"px"
                idCapa.style.top=idCapay+e.clientY-n6y+"px"
                return false
            }
        }       
        function paramN6(e)
        {
                n6x=e.clientX ;
                n6y=e.clientY;
                idCapa.addEventListener("mousemove", arrastraN6, false);                
        }

        function inicializa(id)
        {
            if(document.all)
            {
                iex=event.clientX
                iey=event.clientY
                idCapax=document.all[id].style.pixelLeft
                idCapay=document.all[id].style.pixelTop
                permisoIE=true
                arrastraIE('caja1');
            }
            else if(document.layers)
            {
                idCapa=eval(id);
                idCapa.captureEvents(Event.MOUSEDOWN | Event.MOUSEUP);
                idCapa.onmousedown=capturaN4;
                idCapa.onmousemove=arrastraN4;
                idCapa.onmouseup=paraN4;
            }
            else if(document.getElementById)
            {
                idCapa = document.getElementById(id);
                idCapa.addEventListener("mousedown", paramN6, false);               
                idCapax=parseInt(document.getElementById(id).style.left);        
                idCapay=parseInt(document.getElementById(id).style.top);
                permisoN6=true
            }          
        }       
      
       
        /**
        * funcion para esconder la capa
        */

        function esconde(id)
        {
            if (document.all)
                document.all[id].style.visibility="hidden"
            else if (document.layers)
                document.layers[id].visibility="hide"
            else if (document.getElementById)
                document.getElementById(id).style.visibility="hidden"
         }

  </script>
 
</head>

<bodyonmouseMove="arrastraIE('caja1')"onmouseup="permisoIE=false;permisoN6=false">

<div id="caja1" style="position:absolute;width:250px;left:50px;top:50px;padding:0px;margin:0px;border-width:2px;">
  <table border="0" width="250" cellspacing="0" cellpadding="0" class="caja" style="margin:0px;">
    <tr>
      <td width="100%" valign="top">
        <table border="0" width="100%" cellspacing="0" cellpadding="0">
          <tr bgcolor="red">
            <td onMousedown="inicializa('caja1');" style="cursor:hand;" width="95%" height="22">
              <ilayer width="100%" left="0">
                <layer width= "100%"onMouseover="permisoN4= 1;inicializa(caja1)"onMouseout="permisoN4=0">
                  <font face="Verdana" color="#FFFFFF"><strong><smallLa Vida es Sue&ntilde;o</small></strong></font>
                </layer>
              </ilayer>
            </td>
            <td style="cursor:hand" align="center">
              <a href="#" onClick="esconde('caja1');return false">
               <img src="close.gif" width="16" height="16" border="0" alt="cerrar">
              </a>
            </td>
          </tr>
          <tr>
            <td width="100%" bgcolor="#FFFFFF"  colspan="2">             
              <font face="Verdana" size="2">
                Cuentan de un sabio que un d&iacute;a,<br>
                tan pobre y m&iacute;sero estaba,<br>
                que s&oacute;lo se sustentaba<br>
                de unas yerbas que cog&iacute;a.<br>
             </font>
            </td>
          </tr>
        </table>
      </td>
    </tr>
  </table>
</div>

</body>
</html>

Consideraciones:

1) Aplicamos diferente sintaxis de código para cada navegador, ya que cada uno de ellos maneja las capas de forma diferente. Para más información, ver diferentes artículos de DHTML en este mismo portal.

2) Debemos capturar los eventos MOUSEDOWN, MOUSEUP y MOUSEMOVE tanto para Nestcape 4x como para Nestcape 6x, siendo la forma de hacerlo diferente en cada uno de ellos. Para más información, os recomiendo visitar la sección sobre JavaScript en www.webreference.com

3) El esquema general de funcionamiento es: capturamos los eventos en los dos Navigator, usando en las versiones 4x los eventos onmousedown y onmouseout situados en un conjunto layer - ilayer, ya que éste navegador no admite éstos eventos ni en tablas ni en capas creadas con DIV o SPAN. Con éstos eventos controlamos cuando el usuario pincha y despincha con su ratón en la parte superior de la caja, con lo que podemos arrancar o finalizar el efecto de arrastre, que controlamos con el evento onmousemove.

El resultado de este código podéis verlo pinchando aquí.

Eso es todo, amigos. Si tenéis alguna duda, escribidnos.



Home - WebScript - Capas