Foros del Web » Programando para Internet » Javascript »

Problemas con el recalculo de la posicion de un layer

Estas en el tema de Problemas con el recalculo de la posicion de un layer en el foro de Javascript en Foros del Web. Prepare un script que genera tres layers para mostrar mensajes: Uno para fondo transparente a modo de overlay, otro que muestra el contenido y por ...
  #1 (permalink)  
Antiguo 11/01/2010, 18:11
Avatar de junihh  
Fecha de Ingreso: febrero-2004
Ubicación: República Dominicana
Mensajes: 997
Antigüedad: 20 años, 2 meses
Puntos: 7
Problemas con el recalculo de la posicion de un layer

Prepare un script que genera tres layers para mostrar mensajes: Uno para fondo transparente a modo de overlay, otro que muestra el contenido y por ultimo, una imagen que funciona como boton de cerrar.

La funcion trabajaba sin ningun problema y cada vez que la llamaba los elementos aparecian centrados en la ventana del navegador. El problema es que cada vez que se le llamaba, lo que realmente hacia era volver a generar todos los elementos del DOM.

Luego de leer este articulo sobre buenas practicas para escribir JS entendi que lo estaba haciendo mal, asi que reajuste el script y todo (o casi todo) funciono sin problemas, pero el layer del contenido y el boton de cerrar ahora no se centran en el navegador. Pueden ver un ejemplo de lo que me refiero aqui, usando los botones que encontraran arriba.

Este es todo mi codigo, a ver si podrian decirme que puede estar mal en el calculo de centrar, porque la verdad ya no se por donde mas girar la rueda:

Código HTML:
// Set all DOM objects

var msgFdo = document.createElement ('div');
msgFdo.style.backgroundColor = '#000000';
msgFdo.style.border = 'none';
msgFdo.style.padding = '0px';
msgFdo.style.position = 'fixed';
msgFdo.style.display = 'none';
msgFdo.style.zIndex = '4997';
msgFdo.id = 'lyrmsg_fdo';
msgFdo.style.width = '100%';
msgFdo.style.height = '100%';
document.body.appendChild (msgFdo);
msgFdo.style.top = '0px';
msgFdo.style.left = '0px';
transp (80,'lyrmsg_fdo');
msgFdo.style.zoom = 1;
    
var msgInf = document.createElement ('div');
msgInf.style.backgroundColor = '#FFFFFF';
msgInf.style.border = 'none';
msgInf.style.padding = '20px';
msgInf.style.position = 'fixed';
msgInf.style.display = 'none';
msgInf.style.zIndex = '4998';
msgInf.style.borderRadius = '8px';
msgInf.style.MozBorderRadius = '8px';
msgInf.style.WebkitBorderRadius = '8px';
msgInf.style.KhtmlBorderRadius = '8px';
msgInf.style.width = '500px';
msgInf.id = 'lyrmsg_inf';
document.body.appendChild (msgInf);
msgInf.style.top = '0px';
msgInf.style.left = '0px';
msgInf.style.zoom = 1;

var msgCls = document.createElement ('img');
msgCls.src = 'msg_close.gif';
msgCls.style.position = 'fixed';
msgCls.style.display = 'none';
msgCls.style.zIndex = '4999';
msgCls.onmouseover = function () { this.style.cursor = 'pointer'; this.style.cursor = 'hand'; }
msgCls.onmouseout = function () { this.style.cursor = 'default'; }
msgCls.onclick = function () { msgClose(); }
msgCls.id = 'lyrmsg_cls';
document.body.appendChild (msgCls);
msgCls.style.top = '0px';
msgCls.style.left = '0px';
msgCls.style.zoom = 1;

var msgInterCount;

// Message engine

function msgShow (msg)
{
    // Parametros usar: msgContenido, msgAncho, msgAlto, msgBotonClose, msgTimeClose
    //
    msgInf.style.width = (msg.msgAncho) ? msg.msgAncho + 'px' : 'auto';
    msgInf.style.height = 'auto';
    //
    if (msg.msgContenido) { msgInf.innerHTML = (msg.msgAlto) ? '<div style="height:' + msg.msgAlto + 'px;overflow:auto;padding-right:10px;">' + msg.msgContenido + '</div>' : msg.msgContenido; }
    //
    var posT = ((winWH('h') - msgInf.clientHeight) / 2); // Esto es el calculo para centrar, que ahora no funciona
    var posL = ((winWH('w') - msgInf.clientWidth) / 2); // Esto es el calculo para centrar, que ahora no funciona
    //
    msgInf.style.top = posT + 'px';
    msgInf.style.left = posL + 'px';
    //
    msgCls.style.top = (posT - 10) + 'px';
    msgCls.style.left = (posL - 10) + 'px';
    //
    msgFdo.style.display = 'block';
    msgInf.style.display = 'block';
    msgCls.style.display = (msg.msgBotonClose) ? 'block' : 'none';
    //
    clearInterval (msgInterCount);
    if (msg.msgTimeClose)
    {
        msgInterCount = setInterval(msgClose, msg.msgTimeClose * 1000);
    }
}

function msgClose ()
{
    clearInterval (msgInterCount);
    msgFdo.style.display = 'none';
    msgInf.style.display = 'none';
    msgCls.style.display = 'none';
}

function transp (tr,id)
{
    var obj = document.getElementById(id).style;
    //
    obj.opacity = (tr / 100);
    obj.MozOpacity = (tr / 100);
    obj.KhtmlOpacity = (tr / 100);
    obj.filter = 'progid:DXImageTransform.Microsoft.Alpha(opacity=' + tr + ')';
    obj.filter = 'alpha(opacity=' + tr + ')';
    obj.zoom = 1; 
}

function winWH (wh)
{
    var siz = 0;
    //
    if ( typeof (window.innerWidth) == 'number' )
    {
        siz = (wh == 'w') ? window.innerWidth : window.innerHeight;
    } else if ( document.documentElement && (document.documentElement.clientWidth || document.documentElement.clientHeight) )
    {
        siz = (wh == 'w') ? document.documentElement.clientWidth : document.documentElement.clientHeight;
    } else if ( document.body && (document.body.clientWidth || document.body.clientHeight) )
    {
        siz = (wh == 'w') ? document.body.clientWidth : document.body.clientHeight;
    }
    //
    return siz;
}
Agradezco de antemano cualquier ayuda, link o idea que me puedan dar.
__________________
JuniHH
- Mi blog
- Mi portafolio

Última edición por junihh; 11/01/2010 a las 18:28
  #2 (permalink)  
Antiguo 12/01/2010, 00:37
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años
Puntos: 1284
Respuesta: Problemas con el recalculo de la posicion de un layer

Hola:

Por lo que veo, lo que centras es la esquina superior izquierda de la capa... luego tendrías que restar en el eje x la mitad de la anchura, y al eje y la mitad de la altura...

Código:
msgInf.style.top = posT - (msg.msgAlto / 2) +  'px';
Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo

Última edición por caricatos; 12/01/2010 a las 00:38 Razón: Error en las dimensiones...
  #3 (permalink)  
Antiguo 12/01/2010, 06:56
Avatar de junihh  
Fecha de Ingreso: febrero-2004
Ubicación: República Dominicana
Mensajes: 997
Antigüedad: 20 años, 2 meses
Puntos: 7
Respuesta: Problemas con el recalculo de la posicion de un layer

Gracias por responder @caricatos, pero ahora tengo un conflicto. Aqui como tengo la funcion ahora:

Código HTML:
function msgShow (msg)
{
    // Parametros usar: msgContenido, msgAncho, msgAlto, msgBotonClose, msgTimeClose
    //
    msgInf.style.width = (msg.msgAncho) ? msg.msgAncho + 'px' : 'auto';
    msgInf.style.height = 'auto';
    //
    if (msg.msgContenido) { msgInf.innerHTML = (msg.msgAlto) ? '<div style="height:' + msg.msgAlto + 'px;overflow:auto;padding-right:10px;">' + msg.msgContenido + '</div>' : msg.msgContenido; }
    //
    var posT = ((winWH('h') - msgInf.clientHeight) / 2);
    var posL = ((winWH('w') - msgInf.clientWidth) / 2);
    posT = posT - (msg.msgAlto / 2);
    posL = posL - (msg.msgAncho / 2);
    //
    msgInf.style.top = posT + 'px';
    msgInf.style.left = posL + 'px';
    //
    msgCls.style.top = (posT - 10) + 'px';
    msgCls.style.left = (posL - 10) + 'px';
    //
    msgFdo.style.display = 'block';
    msgInf.style.display = 'block';
    msgCls.style.display = (msg.msgBotonClose) ? 'block' : 'none';
    //
    clearInterval (msgInterCount);
    if (msg.msgTimeClose) { msgInterCount = setInterval(msgClose, msg.msgTimeClose * 1000); }
}
El caso es que en el ejemplo tengo dos botones: Uno muestra un mensaje de dialogo y otro muestra una barra de "waiting", los dos usos basicos que dare a esa funcion en este momento.

El dialogo se pega al tope de la ventana aunque se muestra centrada horizontalmente y la barra de "waiting" aparece en la misma posicion que lo hizo la de dialogo, por tanto no se actualizan individualmente.

Con este caso trate de aplicar un metodo similar al que uso en AS2 para centrar un objeto en la ventana, o sea:

Código HTML:
objeto._x = (Stage._width - objeto._width) / 2;
objeto._y = (Stage._height - objeto._height) / 2;
Como veras es un calculo bien simple, asegurandome que el punto central del objeto este en la esquina superior izquierda (como bien mencionas). Del centro estar en el propio centro del objeto, solo hago esto:

Código HTML:
objeto._x = Stage._width / 2;
objeto._y = Stage._height / 2;
Lo que recomiendas es lo mismo que haria en AS, pero por lo visto es un lio hacer que reconozca el calculo. Acaso lo aplique mal ??
__________________
JuniHH
- Mi blog
- Mi portafolio

Etiquetas: layer, posicion
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:39.