J'ai un élément de défilement à l'intérieur d'une fenêtre.
Dites une division ayant une classe "currentContainer" avec débordement automatique et cette division contient une énorme quantité de texte de sorte qu'elle soit définitivement assez grande pour être défilante.
Maintenant, je dois faire des calculs en fonction de la quantité de "currentContainer" qui a défilé vers le bas + quel est le décalage d'un élément spécifique de sa division de défilement parent (c'est-à-dire "currentCoantainer").
Mais lors du calcul de l'offset, j'obtiens toujours l'offset de l'élément enfant interne par rapport à la fenêtre et non avec le "currentContainer".
@Shikkediel J'ai également essayé d'utiliser position().top
au lieu de offset().top
mais donne également le même résultat. Jetez-y un œil:
Veuillez ne pas suggérer d'utiliser:
$("<reference of scrolling element").scrollTop()
+
$("<reference of child element whose offset I want to calculate>").offset().top
Parce que cela va compliquer mes calculs réels que je suis sur le point de faire au-delà de cela.
La raison pour laquelle je ne veux pas utiliser l'approche mentionnée ci-dessus est que j'essaie de modifier un code existant qui est déjà trop salissant mais qui fonctionne parfaitement en ce qui concerne la fenêtre, je dois juste le mettre à jour pour qu'il commence à fonctionner par rapport à son parent scrolling div.
J'ai essayé d'utiliser l'approche mentionnée ci-dessus mais cela m'a ouvert une boîte de crabes. parce que les fonctions sont trop étroitement couplées. Je pense donc que si je peux obtenir une solution simple et directe, c'est-à-dire remplacer .offset().top
par quelque chose d'autre.
J'ai essayé de déboguer le code et toujours pas de chance, j'ai ajouté le code réel à http://jsfiddle.net/arpitajain/kwkm7com/
P.S. C'est du code réel mais pas complet Je pense que le reste du code n'était pas nécessaire pour cette erreur.
Vous pouvez simplement soustraire l'offset de l'élément parent de l'offset de l'élément enfant. Est-ce que cela compliquera également les autres choses que vous devez faire?
$(".getoffset").offset().top - $(".getoffset").offsetParent().offset().top
C'est probablement ce que vous cherchez
var scrollOffset = $(".container .element")[0].offsetTop - $(".container")[0].offsetTop
———————————
Si vous voulez des informations, cela devrait vous permettre de faire la plupart du chemin:
// Position of first element relative to container top
var scrollTop = $(".container .element").offset().top - $(".container").offset().top;
// Position of selected element relative to container top
var targetTop = $(".container > *").offset().top - $(".container").offset().top;
// The offset of a scrollable container
var scrollOffset = scrollTop - targetTop;
// Scroll untill target element is at the top of its container
$(".container").scrollTop(scrollOffset);
Voir aussi: Calculer le décalage du haut des éléments à l'intérieur d'un div défilant
Une solution Javascript Vanilla serait:
const el = document.querySelector('.getoffset');
const offset = el.getBoundingClientRect().top - el.offsetParent.getBoundingClientRect().top;
Violon: http://jsfiddle.net/njb1xcz0/
Dans mon test
//has the same value
console.log(
'compare:',
$("#element").offset().left - $("#container").offset().left,
$("#element").position().left
);
Sorcière signifie qu'il obtient position absolue au parent. Pour obtenir position relative au parent, j'utilise:
let relative_position_x = Element.position().left + scroller.scrollLeft();
let relative_position_y = Element.position().top + scroller.scrollTop();