稼働範囲を拡大するテスト版
「Ameblo Lightbox JS」は、ブログの「記事本文の画像」に限り、拡大表示の対象として来ました。 これは、主に下の理由からです。
◎他は元が粗い画像で、拡大表示する意味が無いものが殆どなので
◎対象を記事本文内に限った方が、スクリプトが軽く動作できる
◎クリックで動作するリンク機能を無効にするので、サイドバー等にも適用範囲を広げると、ユーザーの通常の操作を妨げることになる
対象範囲を「記事本文の画像」に限定するために、「img要素」を選定(取得)する部分で、以下のコードで使っています。
「#entryBody」はブログ本文部分の要素の事で、その中にある「img要素」をここで対象に選択しています。「サイドバー」や「画像つき記事」などは、他の要素となり、その範囲の「img要素」は最初から対象外になるわけです。
アメブロの他のページでも使いたい
これまでは、「Ameblo Lightbox」をブログ記事専用のビューアとして利用して来ましたが、便利さに慣れると他の場面でも使いたくなります。 たとえば、下の「Ameba News」のページです。
通常のブログに似た体裁のページで、掲載画像のクオリティも低くなさそうです。
このページで「Lightbox」を動作させるには、先ず「Ameba News」をスクリプトの適用範囲に入れる必要があります。 スクリプトヘッダーに以下のパラメーター行を追加しました。
これで「Ameba News」のページでもスクリプトは起動しますが、上記の「ブログ本文記事」の括りの「img要素」を対象にするコードでは、何も動作できません。
で、テストケースとして最初のコードの部分を以下に変更しました。
このコードで、「Ameba News」のページ上の全ての「img要素」が拡大対象にできます。
ただし、この書換えは元のブログページでのスクリプト動作に影響します。 ブログページ上の全ての「img要素」に対して「Lightbox」が機能するわけです。
起動操作を変更する
更に多くの画像が拡大表示の対象になると、最初に書いた様に、リンク先に飛ぶ事を期待してクリックしたユーザーは戸惑うかも知れません。 この問題は「Lightbox」の適用範囲を拡げた場合の一番の問題です。 そこで「Lightbox」の起動を機能キー付きの「Ctrl+左クリック」に変更する事にしました。 これで画像の「左クリック」は本来の動作に戻り、ユーザーが操作に戸惑う心配はなくなります。
「Lightbox」の起動を「Ctrl+左クリック」としたのに合わせ、これまでの box内の再拡大のショートカット「Alt+左クリック」を「Ctrl+左クリック」に変更し覚え易くします。
なお Chromeの場合は、リンクの「Shift+左クリック」は別ウインドウにリンク先を開く指示になります。
最初は「Alt+左クリック」を起動ショートカットにしましたが、「Lightbox」が起動しない場合にこれがファイルダウンロードの指示となり、不要なファイル処理に苦労しました。
このため、 起動ショートカットを「Ctrl+左クリック」に改めました。 また、 暗転後の再拡大機能も「Ctrl+左クリック」に変更して覚え易くします。
このページのバージョン以降の掲載コードも、記事上の説明の記述も、全てショートカットを改めて、混乱を防ぐことにします。
画像のリンクに予防的な設定
ブログページ上の掲載画像(リンク)のデフォルトデザインは、マウスポインターを乗せると白淡化しますが、これは画像の色を変えるデザインなのでキャンセルしています。
従来はこの設定だけでしたが、「Ameba News」で「Lightbox」の表示に応じない画像が多くあり、これに対処が必要になりました。 ニュースは著作権の問題からか、画像のクリックを無効にする「pointer-events: none;」の設定がされていて、これがツールの動作を無効にしていました。
この指定をキャンセルするため、全ての「img要素」に以下のコードで予防的な処理をしています。 この処理は、ページを開いた最初の一瞬で実行されます。
テストバージョン です
今回、ページ上の「img要素」を全て対象にした事で、何か操作上で困るという事が出て来ないか、色々なページで様子を見る必要があります。 今回の ver1.2は テストバージョンの段階です。
またこのバージョンは、アメーバのページに限らず、ネット上のあらゆるページで「Lightbox」の動作が可能なコードになっています。 スクリプトヘッダーに以下のパラメーター行を追加すれば、「https://」で始まる多くのページでこれを試せます。
操作は画像を「Ctrl+左クリック」するだけです。 様々なHTMLのページがあるので、全てではないですが、かなりのページの画像をLightboxに表示できると思います。
「Ameblo Lightbox JS」 ver. 1.2 を使用するには
「Ameblo Lightbox JS」は Chrome/Edge/Firefox の拡張機能「Tampermonkey」上で動作します。
❶「Tampermonkey」を導入します
◎ 使用しているブラウザに拡張機能「Tampermonkey」を導入する事が必要です。
既に「Tampermonkey」を導入している場合は、この手順 ❶ は不要です。
拡張機能の導入については、以下のページに簡単な説明があるので参照ください。
❷「Tampermonkey」にスクリプトを登録します
◎「Tampermonkey」の「+」マークの「新規スクリプト」タブを開きます。
◎「新規スクリプト」には、最初からテンプレートが記入されています。 これは全て削除して、完全に空白の編集枠に 下のコードをコピー&ペーストします。
〔コピー方法〕 軽量シンプルなツール「PreBox Button 」を使うと
コード枠内を「Ctrl+左Click」➔「Copy code 」を「左Click」
の操作で、掲載コードのコピーが可能になります。
◎ 最後に「ファイル」メニューの「保存」を押すと、ツールが使用可能になります。
◎ ver. 1.1 以前の「Ameblo Lightbox JS」を利用されている場合は、旧バージョンは Tampermonkey上でOFFにして、登録した ver. 1.2 のみ ONにしてください。 複数の「Ameblo Lightbox」を同時にONとすると正常な動作が保証されません。
〔 Ameblo Lightbox JS 〕 ver. 1.2
// ==UserScript==
// @name Ameblo Lightbox JS
// @namespace http://tampermonkey.net/
// @version 1.2
// @description ブログ掲載画像の高精細な暗転拡大表示
// @author Ameba Blog User
// @match https://ameblo.jp/*
// @match https://news.ameba.jp/*
// @noframes
// @grant none
// ==/UserScript==
let disp_mode=0; // 拡張ディスプレイモードの判別
let back_color; // Lightbox背景色
let comic_w; // スクロール拡大(縦)の最大幅
let html_=document.querySelector('html');
let target=document.querySelector('body');
let monitor=new MutationObserver(catch_photo);
monitor.observe(target, { childList: true, subtree: true });
catch_photo();
function catch_photo(){
let page_img=document.querySelectorAll('img');
if(page_img.length!=0){
box_env0();
box_env1(); // Lightbox背景色設定
for(let k=0; k<page_img.length; k++){
if(page_img[k].parentNode.tagName=='A'){
page_img[k].parentNode.style.opacity='1'; } // ホバーの薄化表示を無効化
let style=window.getComputedStyle(page_img[k]);
if(style.getPropertyValue('pointer-events')=='none'){
page_img[k].style.pointerEvents='auto'; }} // クリック防止指定を無効化
for(let k=0; k<page_img.length; k++){
page_img[k].addEventListener('mousedown', function(event){
if(event.ctrlKey==true){
event.preventDefault();
box_env2(page_img[k]);
set_img(page_img[k]);
to_storage(page_img[k]);
close(); }}); }}} // catch_photo()
function box_env0(){
let body=document.querySelector('body');
let css=
'@keyframes fadeIn { 0% {opacity: 0} 100% {opacity: 1}} '+
'.fin { animation: fadeIn .5s ease 0s 1 normal; animation-fill-mode: both; } '+
'@keyframes fadeOut { 0% {opacity: 1} 100% {opacity: 0}} '+
'.fout { animation: fadeOut .2s ease 0s 1 normal; animation-fill-mode: both; } '+
'#lightbox { position: fixed; top: 0; left: 0; z-index: 3000; visibility: hidden; '+
'background: black; width: 100vw; height: 100vh; text-align: center; } '+
'#photo_sw { position: fixed; width: 100%; height: 15%; } '+
'#photo_sw:hover #photo_link { opacity: 1; } '+
'#photo_link { position: absolute; top: 20px; left: 30px; opacity: 0; '+
'font: bold 21px Meiryo; padding: 3px 12px 2px 10px; background: #fff; '+
'color: #000; border: 2px solid #000; border-radius: 6px; cursor: pointer; } '+
'#photo_link::before { content: "\\f00e"; font: 36px AmebaNewSymbols; '+
'color: #000; padding-right: 6px; vertical-align: -9px; } '+
'#photo_sw:hover .bc { opacity: 1; } '+
'.bc { position: absolute; top: 24px; right: 24px; height: 24px; overflow: hidden;'+
'font: normal 24px/26px Meiryo; border-radius: 4px; cursor: pointer; opacity: 0; } '+
'#wp { right: 100px; font-weight: bold; } #wm { right: 70px; font-weight: bold; } '+
'#ws { right: 145px; line-height: 28px; padding: 0 5px; } '+
'#box_img { width: 96vw; height: 96vh; padding: 2vh 2vw; object-fit: contain; } ';
let style=document.createElement('style');
style.setAttribute('id', 'light_style');
style.textContent=css;
if(!document.querySelector('#light_style')){
body.appendChild(style); }
let box=document.createElement('div');
box.setAttribute('id', 'lightbox');
box.innerHTML=
'<div id="photo_sw"><p id="photo_link">Photo Storage</p>'+
'<p id="ws" class="bc"></p>'+
'<p id="wp" class="bc">+</p><p id="wm" class="bc">-</p>'+
'<p id="bow" class="bc">◤</p></div>'+
'<img id="box_img">';
if(!document.querySelector('#lightbox')){
body.appendChild(box); }} // box_env0()
function box_env1(){
back_color=get_cookie('Lightbox_back');
if(back_color!='black' && back_color!='white'){
back_color='black'; }
document.cookie='Lightbox_back='+back_color+'; Max-Age=2592000'; // Cookieの更新
icon_color();
comic_w=get_cookie('Lightbox_comic_w');
if(isNaN(comic_w) || comic_w<20 || comic_w>90){
comic_w=90; }
document.cookie='Lightbox_comic_w='+comic_w+'; Max-Age=2592000'; // Cookieの更新
b_or_w();
disp_wpm(disp_mode);
comic_width(); } // box_env1()
function b_or_w(){
let lightbox=document.querySelector('#lightbox');
lightbox.style.background=back_color; // 背景色をCookieから指定
let bow=document.querySelector('#bow');
if(bow){
bow.onclick=function(event){
event.stopImmediatePropagation();
if(lightbox.style.backgroundColor!='white'){
lightbox.style.backgroundColor='white';
back_color='white'; }
else{
lightbox.style.backgroundColor='black';
back_color='black'; }
icon_color();
document.cookie='Lightbox_back='+back_color+'; Max-Age=2592000'; // Cookieの更新
}}}
function icon_color(){
let bc=document.querySelectorAll('#photo_sw .bc');
for(let k=0; k<bc.length; k++){
if(back_color=='black'){
bc[k].style.color='white';
bc[k].style.background='#000';
bc[k].style.border='2px solid #fff'; }
else{
bc[k].style.color='black';
bc[k].style.background='#fff';
bc[k].style.border='2px solid #000'; }}}
function comic_width(){
let ws=document.querySelector('#ws');
if(ws){
ws.textContent=comic_w; }
let wp=document.querySelector('#wp');
if(wp){
wp.onclick=function(event){
event.stopImmediatePropagation();
if(comic_w<81){
comic_w=Number(comic_w) +10; }
let box_img=document.querySelector('#box_img');
if(box_img){
box_img.style.width=comic_w+'vw'; }
ws.textContent=comic_w;
document.cookie='Lightbox_comic_w='+comic_w+'; Max-Age=2592000'; // Cookieの更新
}}
let wm=document.querySelector('#wm');
if(wm){
wm.onclick=function(event){
event.stopImmediatePropagation();
if(comic_w>29){
comic_w=Number(comic_w) -10; }
let box_img=document.querySelector('#box_img');
if(box_img){
box_img.style.width=comic_w+'vw'; }
ws.textContent=comic_w;
document.cookie='Lightbox_comic_w='+comic_w+'; Max-Age=2592000'; // Cookieの更新
}}}
function disp_wpm(n){
let wp=document.querySelector('#wp');
if(wp){
if(n==0){
wp.style.visibility='hidden'; }
else{
wp.style.visibility='visible'; }}
let wm=document.querySelector('#wm');
if(wm){
if(n==0){
wm.style.visibility='hidden'; }
else{
wm.style.visibility='visible'; }}
let ws=document.querySelector('#ws');
if(ws){
if(n==0){
ws.style.visibility='hidden'; }
else{
ws.style.visibility='visible'; }}}
function get_cookie(name){
let cookie_req=document.cookie.split('; ').find(row=>row.startsWith(name));
if(cookie_req){
if(cookie_req.split('=')[1]==null){
return 0; }
else{
return cookie_req.split('=')[1]; }}
if(!cookie_req){
return 0; }}
function box_env2(target_img){
let photo_link=document.querySelector('#photo_link');
if(photo_link){
if(target_img.parentNode.getAttribute('href')
&& target_img.parentNode.classList.contains('detailOn')){
photo_link.style.visibility='visible'; }
else{
photo_link.style.visibility='hidden'; }}}
function hide_photo_link(){
let photo_link=document.querySelector('#photo_link');
if(photo_link){
photo_link.style.visibility='hidden'; }}
function set_img(target_img){
let lightbox=document.querySelector('#lightbox');
let box_img=lightbox.querySelector('#box_img');
let img_url=target_img.getAttribute('src').split('?caw=');
if(lightbox && img_url[0]!=''){
html_.style.overflow='hidden';
box_img.src=img_url[0];
lightbox.style.visibility='visible';
zoom_reset(lightbox);
lightbox.classList.remove('fout');
lightbox.classList.add('fin'); }}
function zoom_reset(l_box){
let body=document.querySelector('body');
let zoom_f=window.getComputedStyle(body).getPropertyValue('zoom');
if(zoom_f || zoom_f!=1){ // bodyで拡大ツールによるのzoom指定がある場合
l_box.style.zoom=1/zoom_f; }}
function to_storage(target_img){
let photo_link=document.querySelector('#photo_link');
if(photo_link){
photo_link.onclick=function(event){
event.stopImmediatePropagation();
location.href=target_img.parentNode.getAttribute('href'); }}}
function close(){
let html_=document.querySelector('html');
let lightbox=document.querySelector('#lightbox');
let box_img=lightbox.querySelector('#box_img');
if(lightbox){
lightbox.onclick=function(event){
event.preventDefault();
let i_width=box_img.naturalWidth;
let i_height=box_img.naturalHeight;
let w_width= window.innerWidth;
let w_height= window.innerHeight;
if(!event.ctrlKey){
html_.style.overflow='inherit';
lightbox.classList.remove('fin');
lightbox.classList.add('fout');
lightbox.style.overflow='hidden'; // overflowのリセット
box_img.style.height='96vh';
box_img.style.width='96vw';
box_img.style.padding='2vh 2vw';
setTimeout(()=>{
lightbox.style.visibility='hidden';
box_img.src='';
}, 200);
hide_photo_link(); // 画像一覧へのリンクを無効化
disp_mode=0; // 拡張ディスプレイモード リセット
disp_wpm(disp_mode); }
if(event.ctrlKey){
if(i_width*w_height/w_width/i_height>1.1){ // 画像とウインドウを比較:横長
lightbox.style.overflowX='scroll';
lightbox.style.overflowY='hidden';
box_img.style.height='90vh';
box_img.style.width='auto';
box_img.style.padding='4vh 2vw'; }
else { // 画像とウインドウを比較:縦長
disp_mode=1; // 拡張ディスプレイモード 縦長
disp_wpm(disp_mode);
lightbox.style.overflowX='hidden';
lightbox.style.overflowY='auto';
box_img.style.height='auto';
box_img.style.width=comic_w +'vw';
box_img.style.padding='2vh 5vw'; }}
}}}
「Ameblo Lightbox JS」最新版について
旧いバージョンの JavaScriptツールは、アメーバのページ構成の変更で動作しない場合があり、導入する場合は最新バージョンをお勧めします。
●「Ameblo Lightbox JS」の最新バージョンへのリンクは、以下のページのリンクリストから探せます。




