Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Подправить рабочий JS код прокрутки до якоря с отступом сверху
Форумы портала PHP.SU » Клиентская разработка » JavaScript & VBScript » Подправить рабочий JS код прокрутки до якоря с отступом сверху

Страниц (1): [1]
 

1. Айратиус - 02 Апреля, 2015 - 08:53:56 - перейти к сообщению
Всем доброго дня. Есть рабочий код, который проводит прокрутку до якоря

http://jsfiddle[dot]net/mekwall/up4nu/

В нем ссылки


CODE (html):
скопировать код в буфер обмена
  1. <ul id="top-menu">
  2.   <li class="active">
  3.     <a href="#">Top</a>
  4.   </li>
  5.   <li>
  6.     <a href="#foo">Foo</a>
  7.   </li>
  8.   <li>
  9.     <a href="#bar">Bar</a>
  10.   </li>
  11.   <li>
  12.     <a href="#baz">Baz</a>
  13.   </li>
  14. </ul>

И все работает. Но не работает если ссылка имеет такой вид
CODE (html):
скопировать код в буфер обмена
  1. <ul id="top-menu">
  2.   <li class="active">
  3.     <a href="index.html">Top</a>
  4.   </li>
  5.   <li>
  6.     <a href="index.html#foo">Foo</a>
  7.   </li>
  8.   <li>
  9.     <a href="index.html#bar">Bar</a>
  10.   </li>
  11.   <li>
  12.     <a href="index.html#baz">Baz</a>
  13.   </li>
  14. </ul>




Помогите пожалуйста изменить JS чтобы при указании ссылки подобия index.html#foo (index.php#foo, any.php#foo) , скрипт тоже работал. Заранее благодарен за отзывчивость.

Ну и соответственно сам JS

CODE (javascript):
скопировать код в буфер обмена
  1. jQuery(function ($) {
  2.        
  3.        
  4.        
  5.         // Cache selectors
  6. var lastId,
  7.     topMenu = $("#top-menu"),
  8.     topMenuHeight = topMenu.outerHeight()+33,
  9.     // All list items
  10.     menuItems = topMenu.find("a"),
  11.     // Anchors corresponding to menu items
  12.     scrollItems = menuItems.map(function(){
  13.       var item = $($(this).attr("href"));
  14.       if (item.length) { return item; }
  15.     });
  16.  
  17. // Bind click handler to menu items
  18. // so we can get a fancy scroll animation
  19. menuItems.click(function(e){
  20.   var href = $(this).attr("href"),
  21.       offsetTop = href === "#" ? 0 : $(href).offset().top-topMenuHeight+1;
  22.   $('html, body').stop().animate({
  23.       scrollTop: offsetTop
  24.   }, 300);
  25.   e.preventDefault();
  26. });
  27.  
  28. // Bind to scroll
  29. $(window).scroll(function(){
  30.    // Get container scroll position
  31.    var fromTop = $(this).scrollTop()+topMenuHeight;
  32.    
  33.    // Get id of current scroll item
  34.    var cur = scrollItems.map(function(){
  35.      if ($(this).offset().top < fromTop)
  36.        return this;
  37.    });
  38.    // Get the id of the current element
  39.    cur = cur[cur.length-1];
  40.    var id = cur && cur.length ? cur[0].id : "";
  41.    
  42.    if (lastId !== id) {
  43.        lastId = id;
  44.        // Set/remove active class
  45.        menuItems
  46.          .parent().removeClass("active")
  47.          .end().filter("[href=#"+id+"]").parent().addClass("active");
  48.    }                  
  49. });
2. Faraon-san - 02 Апреля, 2015 - 09:48:21 - перейти к сообщению
CODE (javascript):
скопировать код в буфер обмена
  1. offsetTop = href === "#" ? 0 : $(href.split('#').pop()).offset().top-topMenuHeight+1;
3. Айратиус - 02 Апреля, 2015 - 09:57:10 - перейти к сообщению
Faraon-san пишет:
CODE (javascript):
скопировать код в буфер обмена
  1. offsetTop = href === "#" ? 0 : $(href.split('#').pop()).offset().top-topMenuHeight+1;



Стиль active присваивается, НО! пропала плавность перехода и отступ сверху не приминается в 33px
4. Faraon-san - 02 Апреля, 2015 - 09:59:20 - перейти к сообщению
CODE (javascript):
скопировать код в буфер обмена
  1. offsetTop = href === "#" ? 0 : $('#'+href.split('#').pop()).offset().top-topMenuHeight+1;
5. Айратиус - 02 Апреля, 2015 - 10:02:18 - перейти к сообщению
Faraon-san пишет:
CODE (javascript):
скопировать код в буфер обмена
  1. offsetTop = href === "#" ? 0 : $('#'+href.split('#').pop()).offset().top-topMenuHeight+1;

Извини мой косяк. Теперь все работает, а стиль active не применяется (В первом случае тоже не применялся. Не там посмотрел)
6. Faraon-san - 02 Апреля, 2015 - 10:04:10 - перейти к сообщению
а ты $(window).scroll() используешь что бы class присвоить?
7. Айратиус - 02 Апреля, 2015 - 10:06:58 - перейти к сообщению
Faraon-san пишет:
а ты $(window).scroll() используешь что бы class присвоить?


Ничего не скажу. Нашел этот метод в сети. В JS не рулю, только пхп
8. Faraon-san - 02 Апреля, 2015 - 10:13:43 - перейти к сообщению
CODE (javascript):
скопировать код в буфер обмена
  1. jQuery(function ($) {
  2.    
  3.   // Bind click handler to menu items
  4.   // so we can get a fancy scroll animation
  5.   $('#top-menu').find('a').on('click', (function(){
  6.     var topMenuHeight = $('#top-menu').outerHeight()+33,
  7.         href = $(this).attr('href'),
  8.         obj = $('#'+href.split('#').pop()),
  9.         offsetTop = href === '#' ? 0 : obj.offset().top-topMenuHeight+1;
  10.     $('#top-menu').find('li.active').removeClass('active');
  11.     obj.closest('li').addClass('active');
  12.     $('html, body').stop().animate({
  13.         scrollTop: offsetTop
  14.     }, 300);
  15.     return false;
  16.   });
  17.  
  18. });
9. Айратиус - 02 Апреля, 2015 - 10:26:33 - перейти к сообщению
Faraon-san пишет:
CODE (javascript):
скопировать код в буфер обмена
  1. jQuery(function ($) {
  2.    
  3.   // Bind click handler to menu items
  4.   // so we can get a fancy scroll animation
  5.   $('#top-menu').find('a').on('click', (function(){
  6.     var topMenuHeight = $('#top-menu').outerHeight()+33,
  7.         href = $(this).attr('href'),
  8.         obj = $('#'+href.split('#').pop()),
  9.         offsetTop = href === '#' ? 0 : obj.offset().top-topMenuHeight+1;
  10.     $('#top-menu').find('li.active').removeClass('active');
  11.     obj.closest('li').addClass('active');
  12.     $('html, body').stop().animate({
  13.         scrollTop: offsetTop
  14.     }, 300);
  15.     return false;
  16.   });
  17.  
  18. });

В 16 строке ошибку показывает какую-то (Uncaught ReferenceError: version is not defineddepartament:813 (anonymous function))
10. Faraon-san - 02 Апреля, 2015 - 10:31:24 - перейти к сообщению
CODE (javascript):
скопировать код в буфер обмена
  1. jQuery(function ($) {
  2.    
  3.   // Bind click handler to menu items
  4.   // so we can get a fancy scroll animation
  5.   $('#top-menu').find('a').on('click', function(){
  6.     var topMenuHeight = $('#top-menu').outerHeight()+33,
  7.         href = $(this).attr('href'),
  8.         obj = $('#'+href.split('#').pop()),
  9.         offsetTop = href === '#' ? 0 : obj.offset().top-topMenuHeight+1;
  10.     $('#top-menu').find('li.active').removeClass('active');
  11.     obj.closest('li').addClass('active');
  12.     $('html, body').stop().animate({
  13.         scrollTop: offsetTop
  14.     }, 300);
  15.     return false;
  16.   });
  17.  
  18. });
11. Айратиус - 02 Апреля, 2015 - 10:56:53 - перейти к сообщению
Вроде заработало, спасибо огромное!

 

Powered by ExBB FM 1.0 RC1