diff -r 910e293663cb Doc/tools/pydoctheme/static/pydoctheme.css --- a/Doc/tools/pydoctheme/static/pydoctheme.css Fri Sep 09 00:05:42 2016 -0700 +++ b/Doc/tools/pydoctheme/static/pydoctheme.css Fri Sep 09 14:11:24 2016 +0200 @@ -27,6 +27,7 @@ border-radius: 5px; line-height: 130%; font-size: smaller; + position: relative; } div.sphinxsidebar h3, div.sphinxsidebar h4 { @@ -41,6 +42,22 @@ margin-bottom: 0.4em; } +div.sphinxsidebarwrapper li.highligthed { + border-radius: 3px; + background-color: #fff; + color: #0072aa; +} + +div.sphinxsidebarwrapper li.div.sphinxsidebarwrapper li.highligthed { + border-radius: 3px; + background-color: #fff; + color: #0072aa; +} + a { + color: #0072aa; +} + + div.sphinxsidebar a:hover { color: #0095C4; } diff -r 910e293663cb Doc/tools/static/sidebar.js --- a/Doc/tools/static/sidebar.js Fri Sep 09 00:05:42 2016 -0700 +++ b/Doc/tools/static/sidebar.js Fri Sep 09 14:11:24 2016 +0200 @@ -5,7 +5,7 @@ * This script makes the Sphinx sidebar collapsible and implements intelligent * scrolling. * - * .sphinxsidebar contains .sphinxsidebarwrapper. This script adds in + * .sphinxsidebar contains .sphinxsidebarwrappersphinxsidebarwrapper. This script adds in * .sphixsidebar, after .sphinxsidebarwrapper, the #sidebarbutton used to * collapse and expand the sidebar. * @@ -162,32 +162,50 @@ set_position_from_cookie(); - /* intelligent scrolling */ - function scroll_sidebar() { - var sidebar_height = sidebarwrapper.height(); - var viewport_height = get_viewport_height(); - var offset = sidebar.position()['top']; - var wintop = jwindow.scrollTop(); - var winbot = wintop + viewport_height; - var curtop = sidebarwrapper.position()['top']; - var curbot = curtop + sidebar_height; - // does sidebar fit in window? - if (sidebar_height < viewport_height) { - // yes: easy case -- always keep at the top - sidebarwrapper.css('top', $u.min([$u.max([0, wintop - offset - 10]), - jdocument.height() - sidebar_height - 200])); + var headers = $('.body h1, .body h2, .body h3'); + function findFirstElement() { + var i = 0, top; + for(; i 0 && top < window.innerHeight) { + return headers[i]; + } } - else { - // no: only scroll if top/bottom edge of sidebar is at - // top/bottom edge of window - if (curtop > wintop && curbot > winbot) { - sidebarwrapper.css('top', $u.max([wintop - offset - 10, 0])); - } - else if (curtop < wintop && curbot < winbot) { - sidebarwrapper.css('top', $u.min([winbot - sidebar_height - offset - 20, - jdocument.height() - sidebar_height - 200])); + i = headers.length - 1; + for(; i>0; i--) { + top = headers[i].getBoundingClientRect().top; + if(top < 0) { + return headers[i]; } } } - jwindow.scroll(scroll_sidebar); + + var initial_top = parseInt(sidebarwrapper.position().top, 10); + var sidebar_top = initial_top; + sidebarwrapper.css('position', 'absolute'); + var previous; + + jwindow.scroll(function() { + var h = findFirstElement(); + if(h) { + var href = $('.headerlink, .headerlink', h).attr('href'); + var sidebar_link = $('.sphinxsidebar a[href$="'+href+'"]').parent(); + if(!sidebar_link[0]) { + if(previous) { + previous.removeClass('highligthed'); + } + sidebarwrapper.css('top', initial_top + 'px'); + return; + } + var diff = sidebar_link[0].getBoundingClientRect().top; + sidebar_top = Math.max(sidebar_top - diff + 50, initial_top); + sidebarwrapper.css('top', sidebar_top + 'px'); + if(previous) { + previous.removeClass('highligthed'); + } + sidebar_link.addClass('highligthed'); + previous = sidebar_link; + } + + }); });