Как мне получить максимальное значение scrollLeft? - PullRequest
43 голосов
/ 28 февраля 2011

Хорошо, я использую jQuery и в настоящее время получаю максимальное значение полосы прокрутки, делая это:

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);

Когда я пытаюсь это сделать: $body[0].scrollWidth Я просто получаю фактическую ширину содержимого - 1580

Я думаю, что должен быть лучший способ, которым я забыл.

EDIT Чтобы уточнить, я также попытался $(window).width() и $(document).width(), что дало мне 1280 и 1580 соответственно.

Ответы [ 8 ]

81 голосов
/ 18 апреля 2011

Вы можете рассчитать максимальное значение element.scrollLeft с помощью:

var maxScrollLeft = element.scrollWidth - element.clientWidth;

Обратите внимание, что могут быть некоторые специфические особенности браузера, о которых я не знаю.

4 голосов
/ 13 марта 2014

AFAIK Вы должны рассчитать максимальное значение прокрутки самостоятельно, это разница между шириной родительского элемента / контейнера и ширины дочернего элемента / содержимого.

Пример того, как сделать это с помощью 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

В вашем случае окно является родителем /контейнер и документ дочерний элемент / содержимое.

Вот JSFiddle с этим примером: http://jsfiddle.net/yP3wW/

2 голосов
/ 14 января 2018

Прежде всего, есть нативное свойство, которое реализовано в mozilla и только в mozilla scrollLeftMax (также scrollTopMax). смотрите здесь: https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollLeftMax

Здесь polyfill , который я написал, который сделает это свойство доступным для IE8 + и для всех других браузеров . Просто добавьте его в начало вашего js-файла или кода.

Вот код полизаполнения:

(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);

пример использования:

var el = document.getElementById('el1');
var max = el.scrollLeftMax; 

Поддержка здесь зависит от defineProperties() поддержки. это IE8 + (для IE8 метод поддерживается только для элементов DOM, что имеет место в случае использования и методов нашего заполнения).

Просмотрите весь список поддерживаемых браузеров: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty#compatNote_1

В основном этого будет достаточно.

Если нет, вы можете добавить отдельных функций напрямую . и вы получите поддержку IE6 + и всех других браузеров . (теперь это будет зависеть от поддержки оператора. Это IE6 +)

Вот пример, который я выбрал, чтобы добавить только «я» в конце имени. scrollLeftMaxi() и scrollTopMaxi()

(function (elmProto) {
    elmProto.scrollTopMaxi = function () {
        return this.scrollTop - this.clientHeight;
    };
    elmProto.scrollLeftMaxi = function () {
        return this.scrollLeft - this.clientWidth;
    };
})(Element.prototype);

пример использования:

 var element = document.getElementById('el');
 var leftMax = element.scrollLeftMaxi();
 var topMax = element.scrollTopMaxi();
 console.log(leftMax);
 console.log(topMax);

Приведенный выше код создает свойства прототипа Element и назначает функции, которые мы определили. При вызове scrollLeftMaxi(). Прототип цепочки пересекается, пока не достигнет Element.prototype. Где он найдет недвижимость. Знайте, что следуя цепочке прототипов. И как свойства проверяются. Если есть два свойства с одинаковым именем в разных местах в цепочке. Неожиданное поведение просто следовало ожидать. Вот почему новое имя как scrollLeftMaxi подходит. (Если я сохранил то же самое, что и у родного Mozilla, то у нативного не будет переопределения, и они находятся в двух разных местах в цепочке, а нативный имеет приоритет. А нативный не имеет тип функции. Атрибут, который за ним стоит геттер, как мы делали с полифилом выше, если я вызову его как функцию. Ошибка сработает, сказав, что это не функция. И поэтому без изменения имени у нас возникнет проблема с mozilla. для примера).

Посмотрите, как работает геттер, если хотите: https://www.hongkiat.com/blog/getters-setters-javascript/

вот тест скрипки, он показывает, что мы получаем тот же результат, что и нативное свойство в mozilla (не забудьте протестировать в 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>

Как насчет использования этого с jquery:

var max = $('#element')[0].scrollLeftMax; // when using the polyfill
var max =  $('#element')[0].scrollLeftMaxi(); // when using the other alternative more support IE6+
1 голос
/ 21 ноября 2015

Простое решение

var maxScrollLeft = $(document).width() - $(window).width();
0 голосов
/ 23 ноября 2016

Jquery (> 1.9.1): максимальное значение scrollLeft может быть:

$('#elemID').prop("scrollWidth") - $('#elemID').width();
0 голосов
/ 27 августа 2014
var scrollContainer = $('.b-partners .b-partners__inner');
var maxScrollLeft = $(scrollContainer)[0].scrollWidth - $(scrollContainer).width();
console.log(maxScrollLeft);
0 голосов
/ 28 февраля 2013

Я думаю, что вы могли бы использовать что-то вроде этого:

this.children().width()*(this.children().length+1)-this.width()-10;

Предыдущая строка кода собирается получить ширину одного из дочерних элементов и умножить это на количество детей, наконец, вынеобходимо вычесть ширину элемента минус смещение

0 голосов
/ 28 февраля 2011

Вы можете использовать $(document).width(), чтобы получить полную ширину вашего документа, и $(window).width(), чтобы получить ширину окна / области просмотра.

http://api.jquery.com/width/

...