D'accord, j'utilise jQuery et j'obtiens actuellement la valeur maximale de la barre de défilement:
var $body = $('body');
$body.scrollLeft(99999); // will give me the max value since I've overshot
var max_value = $body.scrollLeft(); // returns 300
$('body').scrollLeft(0);
Quand j'essaye ceci: $body[0].scrollWidth
je viens d'obtenir la largeur réelle du contenu - 1580
Je pense qu'il doit y avoir un meilleur moyen que j'oublie.
EDIT Pour clarifier, j’ai aussi essayé $(window).width()
et $(document).width()
qui m’a donné 1280 et 1580, respectivement.
Vous pouvez calculer la valeur maximale de element.scrollLeft
avec:
var maxScrollLeft = element.scrollWidth - element.clientWidth;
Notez qu'il peut y avoir des problèmes particuliers au navigateur que je ne sache pas.
Autant que je sache, vous devez calculer vous-même la valeur de défilement maximale. Il s'agit de la différence entre la largeur du parent/conteneur et la largeur de l'enfant/contenu.
Un exemple sur la façon de faire cela avec jQuery:
HTML:
<div id="container">
<div id="content">
Very long text or images or whatever you need
</div>
</div>
CSS:
#container {
overflow: scroll;
width: 200px;
}
#content {
width: 400px;
}
JS:
var maxScroll = $("#content").width() - $("#container").width();
// maxScroll would be 200 in this example
Dans votre cas, window est le parent/conteneur et document l'enfant/le contenu.
Voici un JSFiddle avec cet exemple: http://jsfiddle.net/yP3wW/
Tout d'abord, il y a une propriété native qui est implémentée dans mozilla et uniquement pour mozilla scrollLeftMax
(également scrollTopMax
). regardez ici: https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollLeftMax
Voici un polyfill que j’ai écrit et qui rendra cette propriété disponible pour IE8 +, et tous les autres navigateurs. Ajoutez-le simplement en haut de votre fichier ou code js.
Voici le code polyfill aller:
(function(elmProto){
if ('scrollTopMax' in elmProto) {
return;
}
Object.defineProperties(elmProto, {
'scrollTopMax': {
get: function scrollTopMax() {
return this.scrollHeight - this.clientHeight;
}
},
'scrollLeftMax': {
get: function scrollLeftMax() {
return this.scrollWidth - this.clientWidth;
}
}
});
}
)(Element.prototype);
exemple d'utilisation:
var el = document.getElementById('el1');
var max = el.scrollLeftMax;
Le support ici dépend du support defineProperties()
. qui est IE8 + (pour IE8, la méthode est supportée uniquement par les éléments DOM, ce qui est le cas pour notre utilisation et nos méthodes polyfill).
Recherchez ici la liste complète des navigateurs pris en charge: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty#compatNote_1
surtout cela suffira.
Sinon, vous pouvez ajouter fonctions séparées directement. et vous obtenez un support pour IE6 + et tous les autres navigateurs. (à présent, cela dépendra du support de l’opérateur. IE6 +)
Voici un exemple que j’ai choisi d’ajouter simplement un «i» à la fin du nom. scrollLeftMaxi()
et scrollTopMaxi()
(function (elmProto) {
elmProto.scrollTopMaxi = function () {
return this.scrollTop - this.clientHeight;
};
elmProto.scrollLeftMaxi = function () {
return this.scrollLeft - this.clientWidth;
};
})(Element.prototype);
exemple d'utilisation:
var element = document.getElementById('el');
var leftMax = element.scrollLeftMaxi();
var topMax = element.scrollTopMaxi();
console.log(leftMax);
console.log(topMax);
Le code ci-dessus crée les propriétés du prototype d’élément et attribue les fonctions que nous avons définies. Lorsque appelé scrollLeftMaxi()
. La chaîne de prototypes est traversée jusqu'à atteindre Element.prototype
. Où il trouvera la propriété. Sachez-le en suivant la chaîne de prototypes. Et comment les propriétés sont vérifiées. Si vous avez deux propriétés du même nom à un endroit différent de la chaîne. Un comportement inattendu est juste à prévoir. C'est pourquoi un nouveau nom, scrollLeftMaxi
, convient. (Si j'ai gardé le même nom que celui natif de mozilla, celui-ci ne sera pas remplacé, et ils sont à deux endroits différents de la chaîne, et le natif a la priorité. avoir un getter derrière, tout comme nous l'avons fait avec le polyfill ci-dessus, si je l'appelle comme une fonction. Une erreur se déclenchera, disant que ce n'est pas une fonction. à titre d'exemple).
Regardez ici comment fonctionne getter si vous aimez: https://www.hongkiat.com/blog/getters-setters-javascript/
voici un test de violon, il montre que nous obtenons le même résultat que la propriété native de mozilla (assurez-vous de tester dans mozilla)
(function(elmProto) {
elmProto.scrollTopMaxi = function() {
return this.scrollHeight - this.clientHeight;
};
elmProto.scrollLeftMaxi = function() {
return this.scrollWidth - this.clientWidth;
};
})(Element.prototype);
// here we will test
var container = document.getElementById('container');
// here a comparison between the native of mozilla and this one
console.log("scrollLeftMaxi = " + container.scrollLeftMaxi());
console.log("scrollLeftMax = " + container.scrollLeftMax);
#container {
height: 500px;
width: 700px;
overflow: auto;
border: solid 1px blue;
}
#inner {
height: 2000px;
width: 1500px;
background: #928ae6;
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<div id="container">
<div id="inner"></div>
</div>
</body>
</html>
Qu'en est-il de l'utiliser avec jquery:
var max = $('#element')[0].scrollLeftMax; // when using the polyfill
var max = $('#element')[0].scrollLeftMaxi(); // when using the other alternative more support IE6+
La solution simple est
var maxScrollLeft = $(document).width() - $(window).width();
Vous pouvez utiliser $(document).width()
pour obtenir la largeur totale de votre document et $(window).width()
pour obtenir la largeur de la fenêtre/fenêtre.
Jquery (> 1.9.1): La valeur maximale que scrollLeft
peut être est la suivante:
$('#elemID').prop("scrollWidth") - $('#elemID').width();