Hoshizora_Header

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

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

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