Як прокрутити рядок таблиці у вигляд (element.scrollintoView) за допомогою jQuery?


74

Я динамічно додаю рядки до таблиці за допомогою jQuery. tableЗнаходиться всередині , divякий , overflow:autoтаким чином , викликаючи вертикальну смугу прокрутки.

Тепер я хочу автоматично прокрутити мій контейнер divдо останнього рядка. Що таке версія jQuery tr.scrollintoView()?


10
Відповідно до цієї відповіді , це, очевидно, вбудована функція DOM, що підтримується у всіх основних браузерах. Просто element.scrollIntoView()буде працювати.
Kirk Woll

Відповіді:


78
var rowpos = $('#table tr:last').position();

$('#container').scrollTop(rowpos.top);

повинен зробити трюк!


4
Я знайшов випадок, коли це не спрацювало належним чином, додавши як відповідь нижче із дещо іншим джерелом.
user1338062

Це не буде працювати з новою fixed scrollingфункціональністю / плагіном datatable .
Лоренц Ло Зауер,

85

Це наступне працює краще, якщо вам потрібно прокрутити довільний елемент у списку (а не завжди до кінця):

function scrollIntoView(element, container) {
  var containerTop = $(container).scrollTop(); 
  var containerBottom = containerTop + $(container).height(); 
  var elemTop = element.offsetTop;
  var elemBottom = elemTop + $(element).height(); 
  if (elemTop < containerTop) {
    $(container).scrollTop(elemTop);
  } else if (elemBottom > containerBottom) {
    $(container).scrollTop(elemBottom - $(container).height());
  }
}

8
Це, сер, не просто відповідь, це рішення. Дякую.
witttness

1
Ви можете видалити аргумент контейнера і замінити його на var container = element.offsetParent; ...
Лоренс Холст

2
@Laurens: Це працює лише в тому випадку, якщо прокручуваний елемент є прямим батьком дочірнього об'єкта. Більш надійним рішенням буде повторення своїх попередників, поки він не знайде елемент, де .css ("переповнення") повертає "auto" або "scroll".
Роберт Дж. Волкер,

2
чи не повинен ваш четвертий рядок бути var elemTop = element.get (0) .offsetTop? Код не працював, поки я цього не зробив.
Jacques

1
Хоча це рішення майже працює, воно має серйозні проблеми. Одним з них є друкарська помилка, але більш серйозним є той факт, що він не граційно обробляє предмети будь-якої висоти. Кращим рішенням є плагін від @Robert Koritnik
boatcoder

29

Плагін, який прокручується (з анімацією) лише за потреби

Я написав плагін jQuery, який робить саме те, що написано на жерсті (а також саме те, що вам потрібно ). Добре в тому, що він буде прокручувати контейнер лише тоді, коли елемент насправді вимкнено. Інакше прокрутка виконуватися не буде.

Це працює так просто:

$("table tr:last").scrollintoview();

Він автоматично знаходить найближчого прокручуваного предка, який має надлишковий вміст і показує смуги прокрутки. Отже, якщо є ще один предок із, overflow:autoале не прокручуваний, буде пропущено. Таким чином, вам не потрібно надавати прокручуваний елемент, оскільки іноді ви навіть не знаєте, який з них можна прокручувати (я використовую цей плагін на своєму сайті Sharepoint, де вміст / майстер не залежить від розробника, тому це поза моїм контролем - HTML може змінитися коли сайт працює, так що можна прокручувати контейнери).


Цей справді працює. Спробував виправити роботу з @Abhijit Rao, але у неї багато проблем. Цей просто працює.
човновий кодер

@ Mark0978: Але майте на увазі, що я повинен оновити його для коректної роботи з jQuery 1.8+ Визначення користувацького селектора повинно бути зроблено інакше з 1.8+.
Robert Koritnik

1
Отримав плагін від GitHub і працює безперебійно, як і обіцяли. Чудова робота!
Бернуллі, IT

чотири роки з моменту оновлення, і цей плагін все ще працює як шарм. Я використав це в кутовій директиві :)
Шаунак

1
Через чотири роки плагін для мене не працює - іноді пропускає позначку з ціллю майже, але не в поле зору. Сьогодні, припускаючи, що ціль - це лише один елемент, я використовую javascript: var target = $(selector); target.get(0).scrollIntoView();
subsci

19

набагато простіше:

$("selector for element").get(0).scrollIntoView();

якщо в селекторі повертається більше одного елемента, get (0) отримає лише перший елемент.


це також вплине на прокрутку сторінки. Тож це не спрацювало.
Jacques

Це не робить анімації, а також не стосується прокрутки всередині прокручуваного div.
шлюпкодер

Це не робить анімації, але я вважаю, що анімовані рішення не спрацьовують у моєму конкретному випадку використання, який має неймовірно довгий елемент. Анімовані рішення іноді пропускають оцінку невеликим зміщенням. @ Mark0978 мій варіант використання - це прокручуваний div - не впевнений, чому це працює в моєму випадку, але не у вас
subsci

5

Цей приклад, що працює, показує, як використовувати scrollIntoView (), який підтримується у всіх сучасних браузерах: https://developer.mozilla.org/en-US/docs/Web/API/Element.scrollIntoView#Browser_Compatibility

У наведеному нижче прикладі для вибору елемента використовується jQuery #yourid.

$( "#yourid" )[0].scrollIntoView();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<p>..</p>
<p>..</p>
<p>..</p>
<p>..</p>
<p>..</p>
<p>..</p>
<p>..</p>
<p>..</p>
<p>..</p>
<p>..</p>
<p>..</p>
<p>..</p>
<p>..</p>
<p>..</p>
<p>..</p>
<p>..</p>
<p>..</p>
<p id="yourid">Hello world.</p>
<p>..</p>
<p>..</p>
<p>..</p>
<p>..</p>



2

Якщо ви просто хочете прокрутити, ви можете скористатися методом jQuery scrollTop. http://docs.jquery.com/CSS/scrollTop

var table = jQuery( 'table' );
table.scrollTop( table.find( 'tr:last' ).scrollTop() );

Щось подібне, можливо?


2

Я знайшов випадок (переповнення div> table> tr> td), коли прокрутка до відносного положення tr не працює. Натомість мені довелося прокрутити контейнер переповнення (div) за допомогою scrollTop до <tr>.offset().top - <table>.offset().top. Наприклад:

$('#container').scrollTop( $('#tr').offset().top - $('#td').offset().top )

2

Те саме зверху з невеликими змінами

function focusMe() {
       var rowpos = $('#FocusME').position();
        rowpos.top = rowpos.top - 30;
        $('#container').scrollTop(rowpos.top);
    }
<html>
<script src="https://code.jquery.com/jquery-3.1.0.min.js" integrity="sha256-cCueBR6CsyA4/9szpPfrX3s49M9vUU5BgtiJj06wt/s=" crossorigin="anonymous"></script>
<body>
    <input type="button" onclick="focusMe()" value="focus">
    <div id="container" style="max-height:200px;overflow:scroll;">
        <table>
            <tr>
                <td>1</td>
                <td></td>
            </tr>
            <tr>
                <td>2</td>
                <td></td>
            </tr>
            <tr>
                <td>3</td>
                <td></td>
            </tr>
            <tr>
                <td>4</td>
                <td></td>
            </tr>
            <tr>
                <td>5</td>
                <td></td>
            </tr>
            <tr>
                <td>6</td>
                <td></td>
            </tr>
            <tr>
                <td>7</td>
                <td></td>
            </tr>
            <tr>
                <td>8</td>
                <td></td>
            </tr>
            <tr>
                <td>9</td>
                <td></td>
            </tr>
            <tr id="FocusME">
                <td>10</td>
                <td></td>
            </tr>
            <tr>
                <td>11</td>
                <td></td>
            </tr>
            <tr>
                <td>12</td>
                <td></td>
            </tr>
            <tr>
                <td>13</td>
                <td></td>
            </tr>
            <tr>
                <td>14</td>
                <td></td>
            </tr>
            <tr>
                <td>15</td>
                <td></td>
            </tr>
            <tr>
                <td>16</td>
                <td></td>
            </tr>
            <tr>
                <td>17</td>
                <td></td>
            </tr>
            <tr>
                <td>18</td>
                <td></td>
            </tr>
            <tr>
                <td>19</td>
                <td></td>
            </tr>
            <tr>
                <td>20</td>
                <td></td>
            </tr>
        </table>
    </div>
</body>

</html>


0

$( "#yourid" )[0].scrollIntoView();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<p>..</p>
<p>..</p>
<p>..</p>
<p>..</p>
<p>..</p>
<p>..</p>
<p>..</p>
<p>..</p>
<p>..</p>
<p>..</p>
<p>..</p>
<p>..</p>
<p>..</p>
<p>..</p>
<p>..</p>
<p>..</p>
<p>..</p>
<p id="yourid">Hello world.</p>
<p>..</p>
<p>..</p>
<p>..</p>
<p>..</p>


Прокручує всю сторінку і буквально є копією відповіді від @BarryStaes
Mark Carpenter Jr

0

Я не міг додати коментар до відповіді Абхіджіта Рао вище, тому подаю це як додаткову відповідь.

Мені потрібно було, щоб стовпець таблиці прокручувався на широкій таблиці, тому я додав ліві функції прокрутки у функцію. Як хтось згадував, він стрибає, коли прокручується, але це спрацювало для моїх цілей.

function scrollIntoView(element, container) {
  var containerTop = $(container).scrollTop();
  var containerLeft = $(container).scrollLeft();
  var containerBottom = containerTop + $(container).height();
  var containerRight = containerLeft + $(container).width();

  var elemTop = element.offsetTop;
  var elemLeft = element.offsetLeft;
  var elemBottom = elemTop + $(element).height();
  var elemRight = elemLeft + $(element).width();

  if (elemTop < containerTop) {
    $(container).scrollTop(elemTop);
  } else if (elemBottom > containerBottom) {
    $(container).scrollTop(elemBottom - $(container).height());
  }

  if(elemLeft < containerLeft) {
    $(container).scrollLeft(elemLeft);
  } else if(elemRight > containerRight) {
    $(container).scrollLeft(elemRight - $(container).width());
  }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.