Bug-org 143038 Horizontal Scrolling with Mouse wheel+ modifier key
初回投稿日時: 2017年10月26日03時09分54秒
カテゴリ: Firefox Mozilla Core Mozilla58 WheelEvent バグ修正
固定リンク: id=2017102000
SNS:
Tweet (list)
実に16年前に報告されたバグですが、修正しました。
安いマウスだと今でもホイールは縦スクロールしかサポートしていませんし、また、少し古いノートPCのタッチパッドでも、縦スクロールしかサポートしていませんでした。この様なデバイスを使っている時でも、Shiftキーを押すことで横スクロールして欲しいというバグでした。
かなり前から巻き込まれていたのですが、今まで修正しなかったのは、WheelEvent
のdeltaY
をdeltaX
に回すべきか否かという問題が大きかったのと、既にXULアドオンでこれを実現するものが存在したからです。
WheelEvent.deltaY
をゼロにして、WheelEvent.deltaX
にWheelEvent.deltaY
の元の値をセットする方が個人的にはメリットがあると思いました。というのも、Webアプリによっては、自前でwheel
イベントを捕まえて、スクロール処理を行っている場合があります。この様なケースでも、ユーザは当然、Shiftキーを押していれば横スクロールを期待すると思います。
ですが、これをやってしまうと、Shiftキーを押した状態で、WheelEvent.deltaY
の値を使うようなゲーム等があった場合に、そのようなイベントは絶対に発生しないことになります。これは非常によくありません。Firefoxのシェアが下がっている今、このような、他のブラウザでのみテストされた場合に動かなくなるような修正はできません。
しかし、Google Chromeは、WheelEvent.deltaX
の値がゼロのまま、デフォルトアクションが単純に横スクロールになるという実装を行っていました。そこで、これに倣えば、現在のシェアを考えると、問題無く動作する(上記のようなWebアプリでは横スクロールできませんが)ということになりますし、前述のXULアドオンが57以降では使えなくなるということで、急遽、修正することにしました。
というわけで、Shiftキーを押しながら、縦スクロールの操作をホイールで行うと、Firefoxでも横スクロールするようになります。ただし、これはデフォルトアクションがそのように変わっただけで、発火されるWheelEvent
の内容に変化はありません。つまり、WheelEvent.deltaY
が非ゼロで、WheelEvent.deltaX
がゼロ、WheelEvent.shiftKey
がtrue
のイベントのデフォルトアクションが横スクロールになります。
また、これまでは、IEと動作をあわせるために、Shiftキーが押されている場合にはそのタブの履歴を辿るようになっていましたが、これは、これまでのmacOS版と同じAltキーに変更になりました。この設定は、mousewheel.default.action
、mousewheel.with_alt.action
等でカスタマイズ可能です。詳しくはソースコードにあるコメントを参照してください。
Web開発者のみなさんに注意していただきたいのは、macOS版でShiftキーを押しながら、このようなレガシーなマウスを利用した場合の動作についてです。macOSは、Shiftキーを押しながら、マウスホイールを縦に回すと、横スクロールのイベントがOSレベルで発火します。このため、macOS版Firefoxでは、
今回実装した機能は、デフォルト設定では無効化されています。しかし、macOS自身の機能により、横スクロールになります。そして困ったことに、WheelEvent.deltaY
はゼロです。つまり、macOS版とそれ以外のFirefoxでは、Shiftキーを押している時の、縦方向へのホイール操作によって発火するイベントが異なります。
この注意点はまさに、私が、WheelEvent.deltaX
の値を書き換えるべきではと思っていた理由のひとつではあるので、非常に気になるポイントです。