Hoshizora_Header

星空文庫にヘッダーを追加する

当前为 2015-02-17 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name Hoshizora_Header
  3. // @namespace phodra
  4. // @description 星空文庫にヘッダーを追加する
  5. // @version 1.0
  6. // @include http://slib.net/*
  7. // ==/UserScript==
  8.  
  9.  
  10. (function (){
  11. if( !$("#overview").size() )
  12. {
  13. return;
  14. }
  15. var $box = $("<div id='header_box' />");
  16. $("body").append($box);
  17. var $header_org = $("#identity");
  18. var $header = $header_org.clone(true);
  19. $box.append($header);
  20. $header_org.css( 'visibility', 'hidden');
  21. $header.css(
  22. {
  23. 'position': 'absolute',
  24. 'margin': 0,
  25. 'padding': 0,
  26. 'top': 0,
  27. 'width': $(window).width(),
  28. 'height': $header_org.outerHeight(),
  29. 'backgroundColor': '#fdfdfd',
  30. 'borderBottom': '1px solid #eeeeee'
  31. }
  32. );
  33. var $hz = $header.children("div");
  34. $hz.css(
  35. {
  36. 'position': 'absolute',
  37. 'display': 'block',
  38. 'width': $hz.outerWidth(),
  39. 'height': $hz.outerHeight(),
  40. 'top': 0,
  41. 'bottom': 0,
  42. 'left': 10,
  43. 'margin': 'auto'
  44. }
  45. );
  46.  
  47. const HZH_MENU = "hzHeader_menu";
  48. const HZH_BUTTON = "hzHeader_button";
  49. var hzh_menu = "<div class=" + HZH_MENU + " />";
  50. var hzh_btn = "<div class=" + HZH_BUTTON + " />";
  51. var hzh_a = "<a class=" + HZH_BUTTON + " />";
  52. var $ov_org = $("#overview");
  53. // 保存メニュー
  54. var $file_ul = $(".files");
  55. $file_ul.children(":eq(-1)").css( 'margin', 0);
  56. var $file_menu = $(hzh_menu);
  57. $file_menu.attr("id", "overview");
  58. $file_menu.append($file_ul);
  59. var $file_a = $(hzh_a);
  60. $file_a.text("保存");
  61. var $file_btn = $(hzh_btn);
  62. $file_btn.append($file_a);
  63. $file_btn.append($file_menu);
  64. $file_btn.hover(
  65. function()
  66. {
  67. $file_menu.show();
  68. },
  69. function()
  70. {
  71. $file_menu.hide();
  72. }
  73. );
  74.  
  75. // 目次メニュー
  76. // チャプタージャンプ
  77. var $chapter_ol = $(".chapter");
  78. var $chapter_a = $chapter_ol.find("a");
  79. $chapter_a.css('cursor','pointer');
  80. $chapter_a.attr("href", null);
  81. $chapter_a.click( function()
  82. {
  83. var i = $("#header_box .chapter a").index($(this));
  84. $("html,body").animate(
  85. {
  86. 'scrollTop': $("section").eq(i).offset().top
  87. -$header.outerHeight()
  88. }, "normal"
  89. );
  90. }
  91. );
  92. // 情報欄ジャンプ
  93. var $data_ul = $(".data");
  94. $data_ul.css('display','block');
  95. var $data_a = $data_ul.find("a");
  96. $data_a.css('cursor','pointer');
  97. $data_a.attr("href", null);
  98. $data_a.click( function()
  99. {
  100. $("html,body").animate(
  101. {
  102. 'scrollTop': $("#data").offset().top
  103. -$header.outerHeight()
  104. }, "normal"
  105. );
  106. }
  107. );
  108. var $jump_menu = $(hzh_menu);
  109. $jump_menu.attr("id", "overview");
  110. $jump_menu.append($chapter_ol);
  111. $jump_menu.append($data_ul);
  112.  
  113. var $jump_a = $(hzh_a);
  114. $jump_a.text("目次");
  115. $jump_a.attr("href", "#");
  116. var $jump_btn = $(hzh_btn);
  117. $jump_btn.append($jump_a);
  118. $jump_btn.append($jump_menu);
  119. $jump_btn.hover(
  120. function(){
  121. $jump_menu.show();
  122. },
  123. function(){
  124. $jump_menu.hide();
  125. }
  126. );
  127.  
  128. var $menu = $("<div />");
  129. $header.append($menu);
  130. $menu.append($file_btn);
  131. $menu.append($jump_btn);
  132. $("div."+HZH_MENU).css(
  133. {
  134. 'display': 'none',
  135. 'position': 'absolute',
  136. 'backgroundColor': '#fdfdfd',
  137. 'margin': 0,
  138. 'padding': 5,
  139. 'right': 10,
  140. // 'top': $btn.height(),
  141. // 'right': 0,
  142. 'minWidth': 70
  143. }
  144. );
  145. $("div."+HZH_BUTTON).css(
  146. {
  147. 'float': 'left',
  148. 'backgroundColor': 'lightgray',
  149. 'margin': '0px 5px',
  150. 'position': 'relative'
  151. }
  152. );
  153. $("a."+HZH_BUTTON).css(
  154. {
  155. 'color': '#333',
  156. 'padding': '5px 10px',
  157. 'textDecoration': 'none'
  158. }
  159. );
  160. $menu.css(
  161. {
  162. 'position': 'absolute',
  163. 'display': 'block',
  164. 'height': $menu.children().outerHeight(),
  165. 'top': 0,
  166. 'bottom': 0,
  167. 'right': 10,
  168. 'margin': 'auto'
  169. }
  170. );
  171. $box.css(
  172. {
  173. 'position': 'fixed',
  174. 'height': $header.outerHeight(),
  175. 'width': $header.outerWidth(),
  176. 'top': 0
  177. }
  178. );
  179.  
  180.  
  181.  
  182. // フラグ
  183. var _show = 0, _boxon = 0, _lock = 0;
  184.  
  185. // ヘッダー領域にマウスが侵入
  186. $box.hover(
  187. function(){
  188. _boxon=1;
  189. HeaderShow(!_lock);
  190. },
  191. function(){
  192. _boxon=0;
  193. HeaderClose(!_lock);
  194. }
  195. );
  196.  
  197. // ヘッダーを表示させる
  198. var HeaderShow = function(bool)
  199. {
  200. if( _show <= 0 && bool )
  201. {
  202. // 消えている最中でもすぐにまた表示させる
  203. $header.stop();
  204. // ヘッダーを表示させるアニメ
  205. $header.animate(
  206. { 'top': 0},
  207. { 'duration': 'fast',
  208. 'easing' : 'swing',
  209. 'complete': function()
  210. {
  211. _show = 2;
  212. }
  213. }
  214. );
  215. _show = 1;
  216. }
  217. }
  218. // ヘッダーを隠す
  219. var HeaderClose = function(bool)
  220. {
  221. if( _show > 0 && bool )
  222. {
  223. $header.stop();
  224. // ヘッダーを非表示にするアニメ
  225. $header.animate(
  226. { 'top': -$header.outerHeight()},
  227. {
  228. 'duration': 'normal',
  229. 'easing' : 'linear',
  230. 'complete': function()
  231. {
  232. _show = 0;
  233. },
  234. // 途中で目標位置に到達した場合
  235. 'progress' : function(s)
  236. {
  237. var scTop = -$(window).scrollTop();
  238. if( parseInt($(this).css('top')) <= scTop )
  239. {
  240. $(this).stop();
  241. $(this).css( 'top', scTop);
  242. _show = 0;
  243. }
  244. }
  245. }
  246. );
  247. _show = -1;
  248. }
  249. }
  250. // スクロール位置によってヘッダー位置を調整
  251. var HeaderPosSet = function()
  252. {
  253. var scTop = $(window).scrollTop();
  254. var hHgt = $header.outerHeight();
  255. if( scTop <= hHgt )
  256. {
  257. // 上端ならスクロール位置に合わせて絶対座標っぽく
  258. $header.css( 'top', -scTop);
  259. }else if( parseInt($header.css('top')) != -hHgt )
  260. {
  261. // 上部の表示される位置でなければ、画面のすぐ上
  262. $header.css( 'top', -hHgt);
  263. }
  264. }
  265.  
  266. // ロードした時、ヘッダーが見えない位置なら隠す
  267. $(document).ready( function()
  268. { HeaderPosSet(); }
  269. );
  270. // ウィンドウのスクロールが発生した時
  271. $(window).scroll(
  272. function(event)
  273. {
  274. if( _show == 0 )
  275. {
  276. HeaderPosSet();
  277. }
  278. var scTop = $(window).scrollTop();
  279. var btmline = $("#data");
  280. if( !btmline.size() ) btmline = $('.information');
  281. if( btmline.offset().top < scTop + $(window).height() )
  282. {
  283. if(!_lock)
  284. {
  285. HeaderShow(!_boxon);
  286. _lock=1;
  287. }
  288. }else if(_lock)
  289. {
  290. HeaderClose(!_boxon);
  291. _lock=0;
  292. }
  293. }
  294. );
  295. })();