2026-05-04

dorawii@新刊発売(予定)

// ==UserScript==

// @name 検索一番下に移動

// @namespace http://tampermonkey.net/

// @version 2026-05-03

// @match https://booklive.jp/search/keyword/keyword/*

// @grant GM_getValue

// @grant GM_setValue

// ==/UserScript==

// ==UserScript==

// @name 検索一番下に移動

// @namespace http://tampermonkey.net/

// @version 2026-05-04

// @match file:///*

// @grant GM_getValue

// @grant GM_setValue

// ==/UserScript==

(function() {

'use strict';

const STORAGE_KEY = 'buttonPosition';

function isMobilePage() {

// BookLive のスマホ特有DOM

if (document.querySelector(

'meta[name="apple-mobile-web-app-title"][content="ブックライブ"]'

)) {

return true;

}

// 最後保険

return false;

}

const btn = document.createElement('button');

btn.textContent = 'bl-pager下端へ移動';

btn.style.position = 'fixed';

btn.style.zIndex = 99999;

btn.style.opacity = '0.9';

btn.style.cursor = 'move';

document.body.appendChild(btn);

// ---- 位置復元 ----

const saved = GM_getValue(STORAGE_KEY, null);

if (saved && saved.left && saved.top) {

btn.style.left = saved.left;

btn.style.top = saved.top;

btn.style.right = 'auto';

} else {

btn.style.top = '10px';

btn.style.right = '10px';

}

// ---- クリック処理 ----

btn._moved = false;

btn.addEventListener('click', e => {

if (btn._moved) {

e.preventDefault();

e.stopPropagation();

return;

}

// ---- ここから変更:PC版は2番目の .bl-pager.page_nav を使う ----

let target;

if (isMobilePage()) {

console.log('スマホ版として処理');

target = document.querySelector(

'.bk_pageing.section_content.bl-pager.clearfix'

);

} else {

console.log('PC版として処理');

const targets = document.querySelectorAll('.bl-pager.page_nav');

// 2番目を使用

target = targets[1];

}

if (!target) {

alert('対象bl-pager が見つかりません');

return;

}

// ---- ここまで変更:PC版は2番目の .bl-pager.page_nav を使う ----

const rect = target.getBoundingClientRect();

// 要素下端のページ全体基準座標

const absoluteBottom = rect.bottom + window.scrollY;

// 要素下端をウィンドウ下端へ一致

const destination = absoluteBottom - window.innerHeight;

window.scrollTo({

top: destination,

behavior: 'auto'

});

});

// ---- ドラッグ処理 ----

let dragging = false;

let startX = 0;

let startY = 0;

let offsetX = 0;

let offsetY = 0;

btn.addEventListener('mousedown', e => {

dragging = true;

btn._moved = false;

startX = e.clientX;

startY = e.clientY;

const rect = btn.getBoundingClientRect();

offsetX = e.clientX - rect.left;

offsetY = e.clientY - rect.top;

e.preventDefault();

});

document.addEventListener('mousemove', e => {

if (!dragging) return;

if (

Math.abs(e.clientX - startX) > 5 ||

Math.abs(e.clientY - startY) > 5

) {

btn._moved = true;

}

if (btn._moved) {

btn.style.left = `${e.clientX - offsetX}px`;

btn.style.top = `${e.clientY - offsetY}px`;

btn.style.right = 'auto';

}

});

document.addEventListener('mouseup', () => {

if (!dragging) return;

dragging = false;

if (btn._moved) {

GM_setValue(STORAGE_KEY, {

left: btn.style.left,

top: btn.style.top

});

}

});

})();

まともに指示すればAIはこれぐらいお手の物に出せるようになったな。

手動でスクロールしてるとつい事故って下の方のランダム表示のおすすめ作品欄が目に入る位置までスクロールしちゃって、ランダムから後で気になったとしてもまた見れるとは限らないからとスクショが増える羽目になっていたのが、これで防げるようになった。

dorawiiより


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA512

https://anond.hatelabo.jp/20260504175957# 
-----BEGIN PGP SIGNATURE-----

iHUEARYKAB0WIQTEe8eLwpVRSViDKR5wMdsubs4+SAUCafhgDQAKCRBwMdsubs4+
SDc1AQCfvf159m/85ngaE1SU7DnOiPC03RG4l9qI2Ce8Bp0j7QEAzIp52/FQfpXI
vmRTMM52g1VEwry0pmg+4p0QQZlkEAk=
=FTvE
-----END PGP SIGNATURE-----

記事への反応(ブックマークコメント)

ログイン ユーザー登録
ようこそ ゲスト さん