Foros del Web » Programando para Internet » Javascript »

Problema al mover elemento

Estas en el tema de Problema al mover elemento en el foro de Javascript en Foros del Web. Otra duda Ahora estoy haciendo una función que me mueva un elemento desde un lugar (left, top, right o bottom) n px. En principio no ...
  #1 (permalink)  
Antiguo 21/02/2011, 14:47
Avatar de _cronos2
Colaborador
 
Fecha de Ingreso: junio-2010
Mensajes: 2.062
Antigüedad: 13 años, 10 meses
Puntos: 310
Problema al mover elemento

Otra duda Ahora estoy haciendo una función que me mueva un elemento desde un lugar (left, top, right o bottom) n px. En principio no hay problema cuando el parámetro es left o top, pero con los otros dos sí. Posteo el código y os pediría que lo probaráis porque no sé explicar muy bien el problema XD :
Código Javascript:
Ver original
  1. // ...
  2.   posicion : function(donde){
  3.    var left = this.offsetLeft, top = this.offsetTop, padre = this.offsetParent, body = P(document.body);
  4.    while(!/(body|html)/i.test(padre.tagName)){
  5.     left += padre.offsetLeft;
  6.     top += padre.offsetTop;
  7.     padre = padre.offsetParent;
  8.    }
  9.    return {
  10.     'left' : left,
  11.     'right' : body.getStyle('width').match(/\d+/)[0]-left,
  12.     'top' : top,
  13.     'bottom' : body.getStyle('height').match(/\d+/)[0]-top
  14.    }[donde];
  15.   },
  16.   // el problema está en mover
  17.   mover : function(desde, cuanto){
  18.    var obj = { 'left' : 'right', 'top' : 'bottom', 'right' : 'left', 'bottom' : 'top' };
  19.    var estilo = P(this).css('height', P(this).getStyle('height')).css('width', P(this).getStyle('width')).posicion(desde);
  20.    return P(this).css('position', 'absolute').css(obj[desde], 'auto').css(desde, parseFloat(estilo + cuanto) + 'px');
  21.   },
  22. // ...
Saludos y gracias :D
__________________
" Getting older’s not been on my plans
but it’s never late, it’s never late enough for me to stay. "
Cigarettes - Russian Red
  #2 (permalink)  
Antiguo 21/02/2011, 16:30
Colaborador
 
Fecha de Ingreso: mayo-2008
Ubicación: $MX['VZ']['Xalapa']
Mensajes: 3.005
Antigüedad: 15 años, 11 meses
Puntos: 528
Respuesta: Problema al mover elemento

La verdad me da pereza hacer un código que llame a tu función para probar qué está mal, preferiría que lo explicaras aunque creas que lo explicas mal.

Pero imagino que se trata de que el objeto cuando lo mueves abajo o a la derecha no aparece donde quieres exactamente. De ser así, recuerda que debes saber cuánto mide el objeto de ancho y alto, y restar dichas medidas cuando lo vas a posicionar en uno de estos lugares.
  #3 (permalink)  
Antiguo 21/02/2011, 17:08
Avatar de _cronos2
Colaborador
 
Fecha de Ingreso: junio-2010
Mensajes: 2.062
Antigüedad: 13 años, 10 meses
Puntos: 310
Respuesta: Problema al mover elemento

Te paso la página para que lo veas.
Saludos y gracias :D
__________________
" Getting older’s not been on my plans
but it’s never late, it’s never late enough for me to stay. "
Cigarettes - Russian Red
  #4 (permalink)  
Antiguo 21/02/2011, 17:15
Colaborador
 
Fecha de Ingreso: mayo-2008
Ubicación: $MX['VZ']['Xalapa']
Mensajes: 3.005
Antigüedad: 15 años, 11 meses
Puntos: 528
Respuesta: Problema al mover elemento

Pues tal como esta el código, es normal que haga cosas raras.
Con el onmouseover lo mueve hacia el top, pero otra instrucción dice que en el onmouseout se mueva al bottom. Técnicamente son contradictorias ambas instrucciones.

¿Qué es lo que quieres hacer? por que así en el ejemplo la imagen no dejaría de brincar
  #5 (permalink)  
Antiguo 23/02/2011, 16:42
Avatar de _cronos2
Colaborador
 
Fecha de Ingreso: junio-2010
Mensajes: 2.062
Antigüedad: 13 años, 10 meses
Puntos: 310
Respuesta: Problema al mover elemento

Bueno ya conseguí solucionarlo para FF y Chrome, pero como siempre IE da problemas
El código está así:
Código Javascript:
Ver original
  1. // Le añadí la opción de ponerle tiempo
  2.   mover : function(desde, cuanto, tiempo){
  3.    var obj = { 'right' : 'left', 'bottom' : 'top' }, str = desde in obj ? obj[desde] : desde, multip = str == desde ? 1 : -1;
  4.    var resta = { 'left' : 'width', 'top' : 'height' }[str];
  5.    var n = cuanto - P(this).getStyle(resta).Numeros();
  6.    var estilo = P(this).css('position', 'absolute').css(resta, P(this).getStyle(resta)).posicion(str);
  7.    if(!tiempo){
  8.     return P(this).css(str, parseFloat(estilo + cuanto * multip) + 'px');
  9.    }else{
  10.     var incr = cuanto / (tiempo / 20), obj = P(this), timer = setInterval(function(){
  11.      if(obj.posicion(str) >= estilo + cuanto){
  12.       timer = clearInterval(timer);
  13.       return obj;
  14.      }else{
  15.       obj.css(str, parseFloat(obj.posicion(str) + incr * multip) + 'px');
  16.      }
  17.     }, 20);
  18.    }
  19.   },
  20. // ...
Sin embargo, en IE me da error en la función posicion :
Código Javascript:
Ver original
  1. // ...
  2.   posicion : function(donde){
  3.    var left = this.offsetLeft, top = this.offsetTop, padre = this.offsetParent, body = P(document.body);
  4.    while(!/(body|html)/i.test(padre.tagName)){
  5.     left += padre.offsetLeft;
  6.     top += padre.offsetTop;
  7.     padre = padre.offsetParent;
  8.    }
  9.    return {
  10.     'left' : left,
  11.     'right' : body.getStyle('width').match(/\d+/)[0]-left,
  12.     'top' : top,
  13.     'bottom' : body.getStyle('height').match(/\d+/)[0]-top
  14.    }[donde];
  15.   },
  16. // ...
Haciendo pruebas resulta que el error está en
Código Javascript:
Ver original
  1. 'right' : body.getStyle('width').match(/\d+/)[0]-left,
porque devuelve auto.
¿Cómo puedo averiguar cuánto mide el body (y todos los demás porque siempre me devuelve auto -.-') ?
Saludos (:
__________________
" Getting older’s not been on my plans
but it’s never late, it’s never late enough for me to stay. "
Cigarettes - Russian Red
  #6 (permalink)  
Antiguo 23/02/2011, 17:21
Avatar de zerokilled
Javascripter
 
Fecha de Ingreso: abril-2009
Ubicación: Isla del Encanto, La Borinqueña [+>==]
Mensajes: 8.050
Antigüedad: 15 años
Puntos: 1485
Respuesta: Problema al mover elemento

que tal...

desgraciadamente iexplorer tiene el inconveniente de que al leer el valor computado -cuando no se le asigna un valor- devuelve auto. en realidad auto es el valor por defecto en algunas propiedades pero lo que uno espera es el valor computado no el valor por defecto. intenta con la propiedad offsetWidth.
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.
  #7 (permalink)  
Antiguo 26/02/2011, 15:38
Avatar de _cronos2
Colaborador
 
Fecha de Ingreso: junio-2010
Mensajes: 2.062
Antigüedad: 13 años, 10 meses
Puntos: 310
Respuesta: Problema al mover elemento

Muchas gracias @ZK, conseguí solucionarlo como dijiste:
Código Javascript:
Ver original
  1. // ...
  2.   mover : function(desde, cuanto, tiempo){
  3.    var obj = { 'right' : 'left', 'bottom' : 'top' }, str = desde in obj ? obj[desde] : desde, multip = str == desde ? 1 : -1;
  4.    var resta = { 'left' : 'width', 'top' : 'height' }[str], tam = P(this)['offset' + resta.capitalize()];
  5.    var n = cuanto - tam;
  6.    var estilo = P(this).css('position', 'absolute').css(resta, tam).posicion(str);
  7.    if(!tiempo){
  8.     return P(this).css(str, parseFloat(estilo + cuanto * multip) + 'px');
  9.    }else{
  10.     var incr = cuanto / (tiempo / 20), obj = P(this), timer = setInterval(function(){
  11.      if(obj.posicion(str) >= estilo + cuanto){
  12.       timer = clearInterval(timer);
  13.       return obj;
  14.      }else{
  15.       obj.css(str, parseFloat(obj.posicion(str) + incr * multip) + 'px');
  16.      }
  17.     }, 20);
  18.    }
  19.   },
  20. // ...
Sin embargo ahora se me plantea otra duda. ¿Cómo puedo hacer que al moverlo, rebote y vuelve hacia atrás? Algo como esto (al pasar por encima de los items del menú). He probado así pero ni se acerca XD
Código Javascript:
Ver original
  1. // ...
  2.   rebote : function(desde, cuanto, tiempo){
  3.    var este = P(this), inverso = {'left' : 'right', 'top' : 'bottom' };
  4.    var obj = { 'right' : 'left', 'bottom' : 'top' }, str = desde in obj ? obj[desde] : desde;
  5.    var resta = { 'left' : 'width', 'top' : 'height' }[str], tam = P(this)['offset' + resta.capitalize()];
  6.    var estilo = este.css('position', 'absolute').css(resta, tam).posicion(str);
  7.    var incr = (cuanto * 1.1 / (tiempo * 11/12)) * 20, timer = setInterval(function(){
  8.     if(este.posicion(str) >= estilo + cuanto * 1.1){ timer = clearInterval(timer); return este; }
  9.     else{
  10.      este.css(str, parseFloat(este.posicion(str) + incr) + 'px');
  11.     }
  12.    }, 20);
  13.    incr = (cuanto * -0.1 / (tiempo * 1/12)) * 20, timer = setInterval(function(){
  14.     if(este.posicion(inverso[desde] || obj[desde]) <= estilo + cuanto){ timer = clearInterval(timer); return este; }
  15.     else{
  16.      este.css(str, parseFloat(este.posicion(str) + incr) + 'px');
  17.     }
  18.    }, 20);
  19.   },
  20. // ...
Saludos!
__________________
" Getting older’s not been on my plans
but it’s never late, it’s never late enough for me to stay. "
Cigarettes - Russian Red

Etiquetas: mover
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 09:56.