| 9 | | var $body, $window, sidebar, toolbarOffset; |
| | 9 | var $body, $window, $document, $sidebar, adminbarOffset, top = false, |
| | 10 | bottom = false, windowWidth, windowHeight, lastWindowPos = 0, |
| | 11 | topOffset = 0, documentHeight, sidebarWidth, sidebarHeight, resizeTimer; |
| 52 | | // Sidebar (un)fixing: fix when short, un-fix when scroll needed |
| 53 | | function fixedOrScrolledSidebar() { |
| 54 | | if ( $window.width() >= 955 ) { |
| 55 | | if ( sidebar.scrollHeight < ( $window.height() - toolbarOffset ) ) { |
| 56 | | $body.addClass( 'sidebar-fixed' ); |
| 57 | | } else { |
| 58 | | $body.removeClass( 'sidebar-fixed' ); |
| | 60 | if ( 955 >= windowWidth ) { |
| | 61 | top = bottom = false; |
| | 62 | $sidebar.removeAttr( 'style' ); |
| | 63 | } |
| | 64 | } |
| | 65 | |
| | 66 | function scroll() { |
| | 67 | var windowPos = $window.scrollTop(); |
| | 68 | |
| | 69 | if ( 955 <= windowWidth && sidebarHeight + adminbarOffset < documentHeight ) { |
| | 70 | if ( sidebarHeight + adminbarOffset > windowHeight ) { |
| | 71 | if ( windowPos > lastWindowPos ) { |
| | 72 | if ( top ) { |
| | 73 | top = false; |
| | 74 | topOffset = ( $sidebar.offset().top > 0 ) ? $sidebar.offset().top - adminbarOffset : 0; |
| | 75 | $sidebar.attr( 'style', 'top: ' + topOffset + 'px;' ); |
| | 76 | } else if ( ! bottom && windowPos + windowHeight > sidebarHeight + $sidebar.offset().top ) { |
| | 77 | bottom = true; |
| | 78 | $sidebar.attr( 'style', 'position: fixed;bottom: 0;' ); |
| | 79 | } |
| | 80 | } else if ( windowPos < lastWindowPos ) { |
| | 81 | if ( bottom ) { |
| | 82 | bottom = false; |
| | 83 | topOffset = ( $sidebar.offset().top > 0 ) ? $sidebar.offset().top - adminbarOffset : 0; |
| | 84 | $sidebar.attr( 'style', 'top: ' + topOffset + 'px;' ); |
| | 85 | } else if ( ! top && windowPos + adminbarOffset < $sidebar.offset().top ) { |
| | 86 | top = true; |
| | 87 | $sidebar.attr( 'style', 'position: fixed;' ); |
| | 88 | } |
| | 89 | } else { |
| | 90 | top = bottom = false; |
| | 91 | topOffset = ( $sidebar.offset().top > 0 ) ? $sidebar.offset().top - adminbarOffset : 0; |
| | 92 | $sidebar.attr( 'style', 'top: ' + topOffset + 'px;' ); |
| | 93 | } |
| | 94 | } else if ( ! top ) { |
| | 95 | top = true; |
| | 96 | $sidebar.attr( 'style', 'position: fixed;' ); |
| 83 | | // only initialize 'em if we need 'em |
| 84 | | $body = $( 'body' ); |
| 85 | | $window = $( window ); |
| 86 | | sidebar = $( '#sidebar' )[0]; |
| 87 | | toolbarOffset = $body.is( '.admin-bar' ) ? $( '#wpadminbar' ).height() : 0; |
| | 115 | $window |
| | 116 | .on( 'scroll.twentyfifteen', scroll ) |
| | 117 | .on( 'resize.twentyfifteen', function() { |
| | 118 | clearTimeout( resizeTimer ); |
| | 119 | resizeTimer = setTimeout( resizeAndScroll, 500 ); |
| | 120 | } ); |
| | 121 | $sidebar.on( 'click keydown', 'button', resizeAndScroll ); |