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 ); |