(Primero disculpas al resto de la lista porque cuando envié el mensaje
originalmente omití indicar que se trataba de un off-topic. )
Hola Luis,
Gracias por contestar. Ya lo creo que es todo un tema, particularmente cuando
se trata de hacer algo que funcione de igual forma en los browser más
populares. En este caso especificar un float no me permitiría superponer un
objeto sobre otro, y z-index me ayudaría solo en el caso de que los elementos
ya se encuentren correctamente posicionados y superpuestos.
Intentaré dar un ejemplo simplificado de lo que intento lograr.
<html>
<head>
<style>
#src {
background-color:yellow;
}
#elt1 {
background-color:#ffeeff;
padding:40px;
}
#elt2 {
border:solid 30px;
padding:40px;
}
</style>
<script>
function moverAqui(dst) {
var src = document.getElementById('src');
// parche para IE para forzar hasLayout
dst.style.zoom = '1';
// esto es simplificado, ya que si el elemento se encontrara
anidado dentro de
// otros elementos posicionados habría que recorrer la jerarquia
sumando los offsets
src.style.position = 'absolute';
src.style.top = dst.offsetTop + dst.offsetParent.offsetTop + 'px';
src.style.left = dst.offsetLeft + dst.offsetParent.offsetLeft +
'px';
src.style.height = dst.clientHeight + 'px';
src.style.width = dst.clientWidth + 'px';
}
</script>
</head>
<body>
<h1 id="elt1" onclick="moverAqui(this);">Esto es un elemento cualquiera.
Haga clic aqui!</h1>
<h1 id="elt2" onclick="moverAqui(this);">Esto es otro elemento cualquiera.
Haga clic aqui!</h1>
<div id="src">ESTE ES EL ELEMENTO A POSICIONAR</div>
</body>
</html>
Haciendo clic en cualquiera de los dos elementos, 'elt1' y 'elt2', posiciona el
<div> sobre el elemento en cuestión. Como el elemento 'elt1' carece de borde,
el div cubre el area de contenido correctamente. Sin embargo, el estilo del
elemento 'elt2' indica un borde, y el div aparece en la posición incorrecta. Mi
problema es encontrar la forma de encontrar las coordenadas del 'area interior'
del elemento, por adentro del borde. No encuentro un mecanismo que me devuelva
el ancho del borde en pixels y que funcione en forma 'cross-browser'.
Por ahora encontré una alternativa que es copiar el estilo del elemento sobre
el cual se va a posicionar, de tal forma que el div tenga el mismo borde. De
esta forma el efecto visual es correcto. Pero estoy teniendo otros problemas
con esta solución así que todavía no estoy seguro si es viable.
Saludos,
Fernando Tubio
----- Original Message -----
From: Luis Farzati
To: [email protected]
Sent: Friday, December 15, 2006 6:46 PM
Subject: [puntonet] Recuperar la posicion de un elemento HTML
Hola Fernando,
La obtención de las posiciones es todo un tema, tienen ciertas reglas que
tienen que ver con la forma de renderear el elemento que tiene el browser.
Si te posteás un pequeño ejemplo del problema concreto, como para que sea más
visible, vemos cómo lo podemos encarar. Pero mi sugerencia es que, si lo que
querés es superponer un objeto, pruebes combinando el float y z-index (o
z-order?) del CSS. En mi experiencia siempre es conveniente esquivar
posicionado absoluto, en lo posible.
Saludos,
Luis
On 12/12/06, Fernando Tubio <[EMAIL PROTECTED]> wrote:
Necesito posicionar un <div> en forma absoluta de tal forma que se
superponga al area de contenido de un elemento en una página HTML, pero
estoy encontrando dificultades en hallar un mecanismo que me devuelva las
dimensiones necesarias. Puedo calcular las coordenadas del ángulo superior
izquierdo del elemento sumando los valores de offsetLeft y offsetTop de la
jerarquía de elementos contenedores, pero el resultado corresponde a las
coordenadas del borde externo del elemento. Necesito las coordenadas del
área de contenido, excluyendo bordes y padding.
Internet Explorer posee las propiedades clientLeft y clientTop que podrían
ser útiles, pero por desgracia no son estándar y no han sido implementadas
en Mozilla por ejemplo, a pesar de que este último si dispone de clientWidth
y clientHeight. Para determinar las dimensiones del borde + padding supongo
que podría usar algo similar a (offsetWidth - clientWidth) / 2, pero esto
asume que el borde y el padding son iguales en cada lado del elemento, y
esto no siempre es el caso. Los valores disponibles a partir de la propiedad
style no pueden ser usados para realizar el cálculo ya que sus unidades no
son siempre uniformes. Se podría tener por ejemplo un valor para el ancho
del borde expresado como 'thick' o '1em'. Necesito un valor expresado en
pixels.
¿Alguna sugerencia?
Saludos,
Fernando Tubio