Skip to content

Commit 8cf2563

Browse files
author
Gordon Smith
committed
Activate/Deactivate fire at wrong time
Issues: Activate/Deactivate events fired at wrong times. When scrolling up the active event was firing too soon. Minor improvements: Add method to jump to page. Prevent tweening on home/end. Pressing F5 should reset to top? Signed-off-by: Gordon Smith <gordon.smith@lexisnexis.com>
1 parent 01546be commit 8cf2563

File tree

1 file changed

+27
-13
lines changed

1 file changed

+27
-13
lines changed

stack.v1.js

Lines changed: 27 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ function stack() {
6060
sectionNext = d3.select(section[0][1]).style("display", "block");
6161

6262
d3.select(window)
63+
.on("beforeunload", function () { scrollTo(0, 0); }) // Reset to top on F5
6364
.on("resize.stack", resize)
6465
.on("scroll.stack", reposition)
6566
.on("keydown.stack", keydown)
@@ -119,34 +120,31 @@ function stack() {
119120
if (!isNaN(y0)) scrollTo(0, (y = y0) * windowHeight);
120121
}
121122

122-
function reposition() {
123-
var y1 = pageYOffset / windowHeight,
124-
i1 = Math.max(0, Math.min(n - 1, Math.floor(y1)));
123+
function reposition(_pageYOffset) {
124+
_pageYOffset = _pageYOffset || pageYOffset;
125+
var y1 = _pageYOffset / windowHeight,
126+
i1 = Math.max(0, Math.min(n - 1, y1));
127+
i1 = i1 > i ? Math.floor(i1) : Math.ceil(i1);
125128

126129
if (i !== i1) {
127130
if (i1 === i + 1) { // advance one
128131
sectionCurrent.style("display", "none");
129132
sectionCurrent = sectionNext;
130133
sectionNext = d3.select(section[0][i1 + 1]);
131-
dispatchEvent({type: "deactivate"}, i);
132-
if (i1 < n - 1) dispatchEvent({type: "activate"}, i1 + 1);
133134
} else if (i1 === i - 1) { // rewind one
134135
sectionNext.style("display", "none");
135136
sectionNext = sectionCurrent;
136137
sectionCurrent = d3.select(section[0][i1]);
137-
if (i < n - 1) dispatchEvent({type: "deactivate"}, i + 1);
138-
dispatchEvent({type: "activate"}, i1);
139138
} else { // skip
140139
sectionCurrent.style("display", "none");
141140
sectionNext.style("display", "none");
142141
sectionCurrent = d3.select(section[0][i1]);
143142
sectionNext = d3.select(section[0][i1 + 1]);
144-
if (!isNaN(i)) dispatchEvent({type: "deactivate"}, i + 1), dispatchEvent({type: "deactivate"}, i);
145-
dispatchEvent({type: "activate"}, i1);
146-
if (i1 < n - 1) dispatchEvent({type: "activate"}, i1 + 1);
147143
}
148144
sectionCurrent.style("display", "block").style("opacity", 1);
149145
sectionNext.style("display", "block");
146+
if (!isNaN(i)) dispatchEvent({ type: "deactivate" }, i);
147+
if (i1 < n) dispatchEvent({ type: "activate" }, i1);
150148
i = i1;
151149
}
152150

@@ -173,8 +171,11 @@ function stack() {
173171
case 33: // page up
174172
delta = d3.event.metaKey ? -Infinity : -1; break;
175173
case 32: // space
176-
delta = d3.event.shiftKey ? -1 : 1;
177-
break;
174+
delta = d3.event.shiftKey ? -1 : 1; break;
175+
case 36: // home
176+
delta = -Infinity; break;
177+
case 35: // end
178+
delta = Infinity; break;
178179
default: return;
179180
}
180181

@@ -187,7 +188,7 @@ function stack() {
187188
d3.select(document.documentElement)
188189
.interrupt()
189190
.transition()
190-
.duration(500)
191+
.duration(Math.abs(delta) > 1 ? 0 : 500)
191192
.tween("scroll", function() {
192193
var i = d3.interpolateNumber(pageYOffset, yt * windowHeight);
193194
return function(t) { scrollTo(0, i(t)); };
@@ -197,6 +198,19 @@ function stack() {
197198
d3.event.preventDefault();
198199
}
199200

201+
stack.scrollToPage = function (page) {
202+
sectionCurrent.transition()
203+
.style("opacity", 0)
204+
.each("end", function() {
205+
reposition(page * windowHeight);
206+
sectionCurrent
207+
.transition()
208+
.style("opacity", 1)
209+
;
210+
})
211+
;
212+
};
213+
200214
stack.size = function(_) {
201215
return arguments.length ? (size = [+_[0], +_[1]], resize(), stack) : size;
202216
};

0 commit comments

Comments
 (0)