Подтвердить что ты не робот

Как получить максимальное значение scrollLeft?

Хорошо, я использую 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

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

ИЗМЕНИТЬ Чтобы уточнить, я также попробовал $(window).width() и $(document).width(), которые дали мне 1280 и 1580 соответственно.

4b9b3361

Ответ 1

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

var maxScrollLeft = element.scrollWidth - element.clientWidth;

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

Ответ 2

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/

Ответ 3

Простым решением является

var maxScrollLeft = $(document).width() - $(window).width();

Ответ 4

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

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

Ответ 5

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

$('#elemID').prop("scrollWidth") - $('#elemID').width();

Ответ 6

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

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

Здесь код polyfill go:

(function(elmProto){
    if ('scrollTopMax' in elmProto) {
        return;
    }
    Object.defineProperties(elmProto, {
        'scrollTopMax': {
            get: function scrollTopMax() {
              return this.scrollHeight - this.clientTop;
            }
        },
        'scrollLeftMax': {
            get: function scrollLeftMax() {
              return this.scrollWidth - this.clientLeft;
            }
        }
    });
}
)(Element.prototype);

используйте пример:

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

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

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

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

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

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

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

используйте пример:

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

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

Посмотрите, как работает getter, если хотите: 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>

Ответ 7

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

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

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

Ответ 8

var scrollContainer = $('.b-partners .b-partners__inner');
var maxScrollLeft = $(scrollContainer)[0].scrollWidth - $(scrollContainer).width();
console.log(maxScrollLeft);