0

Если таблица, где каждая строка имеет свой id так же есть ряд элементов с ссылками содержащими id -

href ='"#"+id'

При нажатии на элемент таблица скролится к элементу строки таблицы. Использую я для этого такой скрипт:

$(document).ready(function () {
    $('.a').click(function () {
        var scroll_el = $(this).attr('href');
        if ($(scroll_el).length != 0) {
            $('html, body').animate({scrollTop: $(scroll_el).offset().top}, 500);
        }
        return false;
    });
});

И у меня 2 проблемы:

  1. Скрипт срабатывает 1 раз(закидывает в адресную строку #id), и больше при нажатии ничего не происходит.
  2. Скрипт работает не плавно, а мгновенно (все файлы js подключены и обновлены, всё остальное работает)
mymedia
  • 8,602
  • http://ru.stackoverflow.com/questions/73455/%D0%9A%D0%B0%D0%BA-%D0%BF%D1%80%D0%BE%D1%81%D0%BA%D1%80%D0%BE%D0%BB%D0%B8%D1%82%D1%8C-%D0%BF%D0%BB%D0%B0%D0%B2%D0%BD%D0%BE-%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D1%83-%D0%B2%D0%BD%D0%B8%D0%B7-%D0%B4%D0%BE-%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BD%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE-%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%B0 – Visman Mar 25 '17 at 12:08
  • Visman, ну я так и сделал. но работает с проблемами – Bagajok Dota Mar 25 '17 at 12:37
  • все потому, что ссылка это элемент а, а ты добавляешь обработчик для элементов с классом а. Скорее всего, тебе надо просто убрать точку: $('.a') -> $('a') – Grundy Mar 26 '17 at 17:31

1 Answers1

0

Я так обычно решаю (без проверки, а по фильтру+data):

$('.link').on('click', function(e){
  e.preventDefault();

var link = $(this).attr('href');

var dir = link.replace(/#/, ''), section = $('.section').filter('[data-section="' + dir + '"]'), pos = section.offset().top;

$('html, body').animate({scrollTop: pos}, 1000); });

.section  {
  height: 500px;
  border: 1px solid #ccc;
}
<script src="https://code.jquery.com/jquery-2.1.4.js"></script>

<a href="#item-1" class="link">item-1</a>
<a href="#item-2" class="link">item-2</a>
<a href="#item-3" class="link">item-3</a>

  <div class="section" data-section="item-1">1</div>
  <div class="section" data-section="item-2">2</div>
  <div class="section" data-section="item-3">3</div>

С таблицей:

$('.link').on('click', function(e){
  e.preventDefault();

var link = $(this).attr('href');

var dir = link.replace(/#/, ''), section = $('tr').filter('[data-section="' + dir + '"]'), pos = section.offset().top;

$('html, body').animate({scrollTop: pos}, 1000); });

tr  {
  height: 500px;
  border: 1px solid #ccc;
}
<script src="https://code.jquery.com/jquery-2.1.4.js"></script>


<a href="#item-1" class="link">item-1</a>
<a href="#item-2" class="link">item-2</a>
<a href="#item-3" class="link">item-3</a>

<table>
  <tr data-section="item-1">
    <td>td</td>
    <td>td</td>
  </tr>
   <tr data-section="item-2">
    <td>td</td>
    <td>td</td>
  </tr>
   <tr data-section="item-3">
    <td>td</td>
    <td>td</td>
  </tr>
</table>

Вариант с таблицей и до середины ячейки:

$('.link').on('click', function(e){
  e.preventDefault();

var link = $(this).attr('href');

var dir = link.replace(/#/, ''), section = $('tr').filter('[data-section="' + dir + '"]'), pos = section.offset().top +section.height()/2;

$('html, body').animate({scrollTop: pos}, 1000); });

table {
  width: 100%;
}

tr  {
  height: 500px;
  background: #ccc;
}
<script src="https://code.jquery.com/jquery-2.1.4.js"></script>


<a href="#item-1" class="link">item-1</a>
<a href="#item-2" class="link">item-2</a>
<a href="#item-3" class="link">item-3</a>

<table>
  <tr data-section="item-1">
    <td>td</td>
    <td>td</td>
  </tr>
   <tr data-section="item-2">
    <td>td</td>
    <td>td</td>
  </tr>
   <tr data-section="item-3">
    <td>td</td>
    <td>td</td>
  </tr>
</table>
SVE
  • 22,387
  • Ну вот тоже самое, при второй попытке нажать - ни ссылка старая с адресной строки не убирается, ни скрипт не работает. И выдаёт Uncaught TypeError: Cannot read property 'top' of undefined – Bagajok Dota Mar 25 '17 at 14:24
  • кликаю второй раз по ссылке и все ок, все без ошибок – SVE Mar 25 '17 at 14:39
  • Да всё отлично поправил у себя ошибку. А есть ли возможность выбранный объект центрировать не в самом верху и по середине. И плавность всё равно не работает. Всё просиходит мгновенно – Bagajok Dota Mar 25 '17 at 14:47
  • @BagajokDota, видимо еще какая-то ошибка раз не плавно, у меня то плавность в примере работает. А по поводу середины, не совсем понятно что Вы имеете ввиду. Варьируйте pos как необходимо. – SVE Mar 25 '17 at 15:10
  • всё получилось, только непонятно как регулировать pos. Нужно посередине – Bagajok Dota Mar 26 '17 at 17:18
  • @BagajokDota, обновила ответ, добавила вариант прокрутки до середины ячейки (секции) – SVE Mar 26 '17 at 17:28
  • у меня значение section.offset().top варьируется от -3000 до 17000. А section.height()/2 = 17. Так что еrо ни прибавлять ни отнимать нету смысла( – Bagajok Dota Mar 27 '17 at 12:08
  • @BagajokDota, section.height()/2 - это середина ячейки. О какой середине Вы говорите, я не понимаю! Поэтому "И дальше тишина" – SVE Mar 28 '17 at 15:20