Skip to content

Commit ddbc120

Browse files
trondpetTrond Pettersen
andauthored
fix(wheel): fixes issue with shiftKey + mouse wheel not treated as horizontal scroll in normalizeWheel (certain platforms) (#48)
chore: npx browserslist@latest --update-db Co-authored-by: Trond Pettersen <Trond.Pettersen@blackline.com>
1 parent 65f4548 commit ddbc120

File tree

3 files changed

+173
-11
lines changed

3 files changed

+173
-11
lines changed

package-lock.json

Lines changed: 16 additions & 10 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/WheelHandler.ts

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,15 @@ import emptyFunction from './utils/emptyFunction';
22
import normalizeWheel from './utils/normalizeWheel';
33
import requestAnimationFramePolyfill from './requestAnimationFramePolyfill';
44

5+
const swapWheelAxis = normalizedEvent => {
6+
return {
7+
spinX: normalizedEvent.spinY,
8+
spinY: normalizedEvent.spinX,
9+
pixelX: normalizedEvent.pixelY,
10+
pixelY: normalizedEvent.pixelX
11+
};
12+
};
13+
514
class WheelHandler {
615
animationFrameID = null;
716
deltaX = 0;
@@ -40,7 +49,13 @@ class WheelHandler {
4049
}
4150

4251
onWheel(event) {
43-
const normalizedEvent = normalizeWheel(event);
52+
let normalizedEvent = normalizeWheel(event);
53+
54+
// on some platforms (e.g. Win10), browsers do not automatically swap deltas for horizontal scroll
55+
if (navigator.platform !== 'MacIntel' && event.shiftKey) {
56+
normalizedEvent = swapWheelAxis(normalizedEvent);
57+
}
58+
4459
const deltaX = this.deltaX + normalizedEvent.pixelX;
4560
const deltaY = this.deltaY + normalizedEvent.pixelY;
4661
const handleScrollX = this.handleScrollX(deltaX, deltaY);

test/wheelSpec.js

Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
import { WheelHandler } from '../src';
2+
3+
describe('WheelHandler', () => {
4+
let mockEvent;
5+
let originalNavigator = global.navigator;
6+
7+
beforeEach(() => {
8+
mockEvent = {
9+
preventDefault: () => {},
10+
deltaX: 10,
11+
deltaY: 0
12+
};
13+
14+
Object.defineProperty(global, 'navigator', {
15+
value: {
16+
platform: 'MacIntel'
17+
}
18+
});
19+
});
20+
21+
after(() => {
22+
Object.defineProperty(global, 'navigator', {
23+
value: originalNavigator
24+
});
25+
});
26+
27+
it('Should return deltaX and deltaY', done => {
28+
const wheelHandler = new WheelHandler(
29+
(dX, dY) => {
30+
expect(dX).to.equal(10);
31+
expect(dY).to.equal(0);
32+
done();
33+
},
34+
true,
35+
true
36+
);
37+
wheelHandler.onWheel(mockEvent);
38+
});
39+
40+
it('Should normalize deltas correctly when delta unit is lines', done => {
41+
const wheelHandler = new WheelHandler(
42+
(dX, dY) => {
43+
expect(dX).to.equal(8000);
44+
expect(dY).to.equal(800);
45+
done();
46+
},
47+
true,
48+
true
49+
);
50+
wheelHandler.onWheel({
51+
...mockEvent,
52+
deltaMode: 2,
53+
deltaX: 10,
54+
deltaY: 1
55+
});
56+
});
57+
58+
it('Should normalize deltas when delta unit is pages', done => {
59+
const wheelHandler = new WheelHandler(
60+
(dX, dY) => {
61+
expect(dX).to.equal(400);
62+
expect(dY).to.equal(40);
63+
done();
64+
},
65+
true,
66+
true
67+
);
68+
wheelHandler.onWheel({
69+
...mockEvent,
70+
deltaMode: 1,
71+
deltaX: 10,
72+
deltaY: 1
73+
});
74+
});
75+
76+
it('Should take horizontal scrolling with shiftKey + wheel into account on non-MacIntel platforms', done => {
77+
Object.defineProperty(global, 'navigator', {
78+
value: {
79+
platform: 'Win64'
80+
}
81+
});
82+
83+
const wheelHandler = new WheelHandler(
84+
(dX, dY) => {
85+
expect(dX).to.equal(10);
86+
expect(dY).to.equal(0);
87+
done();
88+
},
89+
true,
90+
true
91+
);
92+
wheelHandler.onWheel({
93+
...mockEvent,
94+
shiftKey: true,
95+
deltaX: 0,
96+
deltaY: 10
97+
});
98+
});
99+
100+
it('Should not treat as horizontal scrolling when event.shiftKey == true if platform is MacIntel', done => {
101+
Object.defineProperty(global, 'navigator', {
102+
value: {
103+
platform: 'MacIntel'
104+
}
105+
});
106+
107+
const wheelHandler = new WheelHandler(
108+
(dX, dY) => {
109+
expect(dX).to.equal(0);
110+
expect(dY).to.equal(10);
111+
done();
112+
},
113+
true,
114+
true
115+
);
116+
wheelHandler.onWheel({
117+
...mockEvent,
118+
shiftKey: true,
119+
deltaX: 0,
120+
deltaY: 10
121+
});
122+
});
123+
124+
it('Should treat as horizontal scrolling when side scrolling on FF', done => {
125+
const wheelHandler = new WheelHandler(
126+
(dX, dY) => {
127+
expect(dX).to.equal(500);
128+
expect(dY).to.equal(0);
129+
done();
130+
},
131+
true,
132+
true
133+
);
134+
wheelHandler.onWheel({
135+
detail: 50,
136+
axis: 1,
137+
HORIZONTAL_AXIS: 1,
138+
preventDefault: () => {}
139+
});
140+
});
141+
});

0 commit comments

Comments
 (0)