OperaだとFastladderもニュルっとするのでユーザースクリプトでなんとかする

少しデザインがズレていたので修正。あとオリジナルの (LDR の) ほうでもズレていたので、こちらを LDR 対応にした。

下のやつの Fastladder 移植版。ほとんど同じ。

ニュルっとするというのは、マウスや PageDown キーなどでスクロールするときに、ちょっとだけスクロールしすぎてしまうこと。本来なら表示している要素の領域がウィンドウの中身の領域とぴったり合ってないといけないのだけど、スクロールバーの幅の分だけ計算がずれていることによって起こる。

  • fastladderlfixvscroll.user.js ←拡張子は .user.js じゃないと動かない。
// ==UserScript==
// @name         livedoorReader fix vertical scroll for Opera
// @namespace    http://bmky.net/
// @include      http://reader.livedoor.com/reader/
// @include      http://reader.livedoor.com/public/*
// @include      http://fastladder.com/reader/
// ==/UserScript==

(function(){
var fl = ( location.host !== 'reader.livedoor.com' ) ? 33 : 0;

style_updater("left_container", function(){
  setStyle(this,{
    display : State.show_left ? "block": "none",
    width   : State.leftpane_width   + "px",
    height  : (State.container_height + fl - 16) + "px"
  });
}._try());

style_updater("subs_container", function(){
  var h = State.container_height - $("subs_tools").offsetHeight - 16;

  setStyle(this,{
    display : State.show_left ? "block": "none",
    width   : State.leftpane_width + "px",
    height  : h + fl + "px"
  })
}._try());

style_updater("right_container", function(){
  setStyle(this,{
    height : (State.container_height - 16) + "px",
    width  : document.body.offsetWidth - State.leftpane_width - 2 + "px"
  });
}._try());

if(fl) style_update(/container/);

setStyle($("right_container"), {
  borderLeftWidth : "2px",
  overflow        : "auto"
});

setStyle($("subs_container"), {
  overflow : "auto"
});
})();

「変更点」と書いたところだけがオリジナルからの変更点。(もちろんヘッダーの fastladder というところもだけど)

ソースを読むと、Fastladder の場合は 33px 高さを変えてあるっぽかったので、それを考慮に入れた。

スクロールバーの幅は 16px で決め打ちしてあるけど、これはスキンによって変わったりしないのだろうか? 僕のところでは不都合はなかったけど。

悩んだのがこの一行

style_update(/container/);

何故か LDR 版ではこれがなくてもちゃんと動くのに、Fastladder 版ではこれがないと動かなかった。


http://twitter.com/szsk/statuses/4500235487 を参考にまた微修正。