Commit 71b34f50de91ed336896caecfc6b4fba906ee22d
1 parent
ab7a4bc7
Navigation preserve scroll height
Well, native browsing does it, but since it takes time to update a page (even without any animation), if it tries to scroll high to a big page from a small page, the small page will block further scrolling, resulting in a mid-scroll on the big page.
Showing
1 changed file
with
25 additions
and
8 deletions
Show diff stats
js/crep.js
... | ... | @@ -12,12 +12,20 @@ function pageName(href) { |
12 | 12 | return false |
13 | 13 | } |
14 | 14 | |
15 | +function updateScrollData() { | |
16 | + history.state.scrollTop = $(document.body).scrollTop() | |
17 | + history.replaceState(history.state) | |
18 | +} | |
19 | + | |
15 | 20 | function pageSpecific(location) { |
16 | 21 | if (pageName(location) == 'contact') { |
17 | 22 | initializeMap() |
18 | 23 | } |
24 | + $(document).scroll(updateScrollData) | |
19 | 25 | } |
20 | 26 | |
27 | + | |
28 | + | |
21 | 29 | function actLink(ev) { |
22 | 30 | var location = ev.currentTarget.href |
23 | 31 | var page = pageName(location) |
... | ... | @@ -43,7 +51,6 @@ function loadDoc(location, callback) { |
43 | 51 | } |
44 | 52 | var eventsLeft = 2 |
45 | 53 | var html = '' |
46 | - | |
47 | 54 | var mainContainer = $("#mainContainer") |
48 | 55 | var oldHeight = mainContainer.height() |
49 | 56 | |
... | ... | @@ -69,6 +76,10 @@ function loadDoc(location, callback) { |
69 | 76 | } |
70 | 77 | } |
71 | 78 | // Out |
79 | + $(document).off('scroll', updateScrollData) | |
80 | + $(document.body).animate({ | |
81 | + scrollTop: $('.navbar-lower').height() | |
82 | + }, 'fast') | |
72 | 83 | $.get(location + '?c', function (data) { |
73 | 84 | html = data |
74 | 85 | events() |
... | ... | @@ -77,19 +88,25 @@ function loadDoc(location, callback) { |
77 | 88 | mainContainer.animate({ |
78 | 89 | opacity: 0 |
79 | 90 | }, 'fast', events) |
80 | - $(document.body).animate({ | |
81 | - scrollTop: $('.navbar-lower').height() | |
82 | - }) | |
83 | - | |
84 | 91 | } |
85 | 92 | |
86 | 93 | function historyChange(ev) { |
87 | - loadDoc(ev.state.loc) | |
94 | + loadDoc(ev.state.loc, function () { | |
95 | + if (ev.state.scrollTop > $('.navbar-lower').height()) { | |
96 | + $(document.body).animate({ | |
97 | + scrollTop: ev.state.scrollTop | |
98 | + }, 'fast') | |
99 | + } | |
100 | + }) | |
88 | 101 | } |
89 | 102 | |
90 | 103 | $(document).ready(function () { |
91 | - dynamiseLinks(document) | |
92 | - pageSpecific(window.location.href) | |
104 | + dynamiseLinks(document.body) | |
105 | + var current = window.location.href | |
106 | + pageSpecific(current) | |
107 | + history.replaceState({ | |
108 | + loc: current | |
109 | + }, document.title, current) | |
93 | 110 | window.onpopstate = historyChange |
94 | 111 | }) |
95 | 112 | ... | ... |