Firefox userChrome.js: ナビゲーションバーを垂直化 2
Firefox userChrome.js: ナビゲーションバーを垂直化を改良。
ナビゲーションバーの表示切替に伴うブックマークツールバーのレイアウト変更を廃止。
userChrome.css での表示位置の調整に変更。
ロケーションバーをタブバー左に移動させるスクリプトと併用。
Firefox 72 以降での使用を推奨。
Firefox 68 ESR でも使用可。
ボタンでナビゲーションバーを水平⇔垂直切り替え。
ボタンでブックマークツールバーの表示切り替え。
ナビゲーションバーのカスタマイズは水平表示で編集可。
アドオンのインストール、更新は水平表示推奨。
全画面表示は水平表示推奨。
オーバーフローメニュー
垂直配置でウインドウを縮小すると
格納無効(overflows="false"
)に設定しているアイテム以外は全て
オーバーフローメニューに格納されてしまう。
復元は水平表示でのみ可。
userChrome.js
( () => {
const uNavToolbox = document.getElementById("navigator-toolbox");
const uNavBar = document.getElementById("nav-bar");
const uNBTrg = document.getElementById("nav-bar-customization-target");
const uPersonalToolbar = document.getElementById("PersonalToolbar");
const uBrowser = document.getElementById("browser");
// 配置されたアイテムを読み込むためブックマークツールバーを一時表示
// ブックマークツールバーボタンを使用しないなら不要
if(uPersonalToolbar.collapsed == true) {
uPersonalToolbar.collapsed = false;
setTimeout( () => {uPersonalToolbar.collapsed = true;}, 500 );
};
let uVerNavbar = {
init() {
this.cloneToolbarButton(); // 68ESRでは不要
this.setPersonalToolbarButton(); // 使用しないなら不要
this.setNavBarButton();
this.disableOverflows();
this.setPersonalToolbarObserver(); // 表示位置を調整しないなら不要
this.eventToggleNavBar();
uVerNavbar = null;
},
toolbarButton: null, // 68ESRでは不要
cloneToolbarButton() {
// Document.createElement("toolbarbutton") で生成したツールバーボタンが機能しないため
// 既存のものを複製、属性全除去、クラス設定
// 68ESRでは不要
this.toolbarButton = uNBTrg.querySelector("toolbarbutton").cloneNode(false);
do {
this.toolbarButton.removeAttribute( this.toolbarButton.getAttributeNames()[0] );
} while ( this.toolbarButton.hasAttributes() );
this.toolbarButton.className = "toolbarbutton-1 chromeclass-toolbar-additional";
},
setPersonalToolbarButton() {
// ブックマークツールバーの表示を切り替えるボタンを設置
// 使用しないなら不要
let ptButton = this.toolbarButton.cloneNode(false); // 68ESRでは不要
/* let ptButton = document.createElement("toolbarbutton"); // 68ESRで使用 */
uNBTrg.insertBefore(ptButton, uNBTrg.firstChild); // ボタン挿入
ptButton.id = "personalToolbar-button";
/* ptButton.className = "toolbarbutton-1 chromeclass-toolbar-additional"; // 68ESRで使用 */
ptButton.setAttribute("label", "ブックマークツールバー");
ptButton.setAttribute("tooltiptext", "ブックマークツールバーを表示します");
ptButton.setAttribute("style", "list-style-image: url('chrome://browser/skin/bookmarks-toolbar.svg');");
ptButton.onclick = () => { uPersonalToolbar.collapsed = !uPersonalToolbar.collapsed; };
ptButton = null;
},
setNavBarButton() {
let nbButton = this.toolbarButton.cloneNode(false); // 68ESRでは不要
/* let nbButton = document.createElement("toolbarbutton"); // 68ESRで使用 */
uNBTrg.insertBefore(nbButton, uNBTrg.firstChild); // ボタン挿入
nbButton.id = "navbar-button";
/* nbButton.className = "toolbarbutton-1 chromeclass-toolbar-additional"; // 68ESRで使用 */
nbButton.setAttribute("label", "ツールバー切り替え");
nbButton.setAttribute("tooltiptext", "ツールバーの配置を切り替えます");
nbButton.setAttribute("style", "list-style-image: url('chrome://devtools/skin/images/command-frames.svg');");
nbButton.onclick = this.eventToggleNavBar;
nbButton = null;
},
eventToggleNavBar() {
if (uNavBar.orient == "") {
// ナビゲーションバー垂直表示
uNavBar.orient = "vertical";
uNBTrg.orient = "vertical";
// ナビゲーションバー移動
// 左配置
uBrowser.insertBefore(uNavBar, uBrowser.firstChild);
/*
// 右配置
uNavBar.ordinal = "6"; // 配置順序指定
uBrowser.appendChild(uNavBar);
*/
} else {
// ナビゲーションバー水平表示
uNavBar.removeAttribute("orient");
uNBTrg.removeAttribute("orient");
// 配置順序指定削除
uNavBar.removeAttribute("ordinal");
// ナビゲーションバー移動
uNavToolbox.insertBefore(uNavBar, uPersonalToolbar);
};
},
disableOverflows() {
// ナビゲーションバーに配置された任意のアイテムに
// オーバーフローメニューへの格納無効を設定
/*
document.getElementById("sidebar-button").setAttribute("overflows", false);
*/
// ナビゲーションバーに配置された全てのアイテムに
// オーバーフローメニューへの格納無効を設定
let nbTrgItems = uNBTrg.childNodes;
for (let i = 0; i < nbTrgItems.length; i++) {
nbTrgItems[i].setAttribute("overflows", false);
};
nbTrgItems = null;
},
setPersonalToolbarObserver() {
// ブックマークツールバーの表示切替を検知するオブザーバを設置
// ブックマークツールバーの表示位置を調整しないなら不要
// ナビゲーションバーにブックマークツールバーの表示状態を示す属性を設定
uNavBar.setAttribute("PersonalToolbar", !uPersonalToolbar.collapsed);
// オブザーバを設置
let ptObserver = new MutationObserver(
() => {
uNavBar.setAttribute("PersonalToolbar", !uPersonalToolbar.collapsed);
}
);
ptObserver.observe(uPersonalToolbar, {attributeFilter: ["collapsed"]});
ptObserver = null;
}
};
// 初期化
setTimeout( () => { uVerNavbar.init(); });
} ) ();
userChrome.css
/* ナビゲーションバー */
/* 垂直表示でのナビゲーションバーの幅 */
#nav-bar[orient="vertical"] {
max-width: 30px !important;
min-width: 30px !important;
}
/* ブックマークツールバー */
/* 垂直表示でのブックマークツールバーの表示位置調整 */
#titlebar + #PersonalToolbar {
padding-left: 30px !important; /* ナビゲーションバー左配置 */
/* padding-right: 30px !important; */ /* ナビゲーションバー右配置 */
}
#nav-bar[orient="vertical"][PersonalToolbar="true"] {
margin-top: -21px !important;
}
/* コンバインドボタン */
/* 垂直表示での2つ以上結合したボタンの表示調整 */
#nav-bar-customization-target[orient="vertical"] > .toolbaritem-combined-buttons {
-moz-box-orient: vertical !important;
margin: 2px 0 !important;
padding: 0 1px !important;
}
#nav-bar-customization-target[orient="vertical"] > .toolbaritem-combined-buttons > separator {
height: 1px !important;
background-size: 24px 1px !important;
}
/* ズームボタン */
/* 垂直表示でのボタン順序とフォントサイズ調整 */
#nav-bar-customization-target[orient="vertical"] > #zoom-controls > #zoom-out-button { -moz-box-ordinal-group: 5 !important; }
#nav-bar-customization-target[orient="vertical"] > #zoom-controls > #zoom-out-button + separator { -moz-box-ordinal-group: 2 !important; }
#nav-bar-customization-target[orient="vertical"] > #zoom-controls > #zoom-reset-button { -moz-box-ordinal-group: 3 !important; }
#nav-bar-customization-target[orient="vertical"] > #zoom-controls > #zoom-reset-button > .toolbarbutton-text {
font-size: 11px !important;
min-width: 28px !important;
padding: 5px 0 !important;
}
#nav-bar-customization-target[orient="vertical"] > #zoom-controls > #zoom-reset-button + separator { -moz-box-ordinal-group: 4 !important; }
#nav-bar-customization-target[orient="vertical"] > #zoom-controls > #zoom-in-button { -moz-box-ordinal-group: 1 !important; }