Falls das mal jemand testen möchte; das wäre nur als grober Test gedacht für das Prinzip.
Die Idee wäre, dass das Script möglichst wenig an Fx Code und nativer Funktion überschreibt; die Aktivierungsfläche ist für eben den Test sichtbar und recht gross, und agiert auch als Resizer.
Kann verschoben und verkleinert werden.
Ein Teil vom JS Code ist teils vom OP übernommen, teils mit freundlicher Hilfe von Perplexity AI entstanden, aber generell manuell angepasst. CSS ist 100% by Horst-AI. ![]()
JavaScript
// floating hover sidebar Test
(function() {
if (location.href !== 'chrome://browser/content/browser.xhtml')
return;
// adjust height to browser window
let brow_size = document.getElementById("browser");
let observer = new ResizeObserver(() => {
let rect = brow_size.getBoundingClientRect();
document.getElementById('sidebar-box').style.setProperty('--height_sidebar', rect.height + 'px');
//document.getElementById('sidebar-box').style.setProperty('--height_sidebar_top', rect.top + 'px');
});
observer.observe(brow_size);
let floater = document.getElementById('sidebar-box');
// keep sidebar open when open popup is hovered
window.addEventListener("popupshowing", (e) => {
if (e.target.id === "sidebarMenu-popup" || e.target.getAttribute("viewid")?.startsWith("sidebar-")) {
floater.classList.add("menu_up");
}
else {
floater.classList.remove("menu_up");
}
});
// resizer
let resizer = document.createElement("div");
resizer.id = "sidebar_resizer";
floater.appendChild(resizer);
let isResizing = false;
let startX, startWidth;
let isRight;
resizer.addEventListener("mousedown", e => {
isResizing = true;
startX = e.clientX;
startWidth = floater.getBoundingClientRect().width;
isRight = floater.hasAttribute("positionend") || floater.hasAttribute("sidebar-positionend");
e.preventDefault();
});
window.addEventListener("mousemove", e => {
if (!isResizing) return;
let delta;
if (isRight) {
delta = startX - e.clientX;
} else {
delta = e.clientX - startX;
}
let newWidth = startWidth + delta;
floater.style.width = newWidth + "px";
});
window.addEventListener("mouseup", () => {
isResizing = false;
});
let css =`
#sidebar-box {
--ug-handle_size: 32px;
--ug-trans_delay_out: 0.25s;
--ug-trans_delay_in: 1s;
position: fixed !important;
/*max-width: unset !important;*/
right: 0px;
left: unset;
bottom: 0px;
height: var(--height_sidebar);
z-index: 99999 !important;
transform: translateX(0%);
transition: transform 0.5s ease !important;
transition-delay: var(--ug-trans_delay_out) !important;
}
#sidebar-box:not([positionend],[sidebar-positionend]) {
right: unset;
left: 0px;
}
/* Resizer */
#sidebar_resizer {
position: absolute;
top: 0;
right: unset;
left: calc(-1*var(--ug-handle_size));
width: var(--ug-handle_size);
height: 64px;
cursor: ew-resize;
background: hsla(35, 0%, 50%, 0.25);
outline: 2px solid lightblue;
outline-offset: -2px;
}
#sidebar-box:not([positionend],[sidebar-positionend]) #sidebar_resizer {
right: calc(-1*var(--ug-handle_size));
left: unset;
}
/* hide */
#sidebar-box:not(:hover, .menu_up) {
transform: translateX(100%);
transition-delay: var(--ug-trans_delay_in) !important;
}
#sidebar-box:not([positionend],[sidebar-positionend]):not(:hover, .menu_up) {
transform: translateX(-100%);
}
/* stuff */
#sidebar,
#sidebar-header {
background-color: whitesmoke !important;
border-inline: 1px solid grey;
border-inline-width: 1px 0px;
}
#sidebar-box:not([positionend],[sidebar-positionend]) :is(#sidebar, #sidebar-header) {
border-inline-width: 0px 1px;
}
#sidebar-splitter {
display: none !important;
}
`;
const sss = Cc['@mozilla.org/content/style-sheet-service;1'].getService(Ci.nsIStyleSheetService);
const uri = Services.io.newURI('data:text/css,' + encodeURIComponent(css));
sss.loadAndRegisterSheet(uri, sss.AGENT_SHEET);
})();
Alles anzeigen
Test 2:
JavaScript
// floating_autohide_sidebar_test2.uc.js
// floating autohide hover sidebar Test 2
// Hover/resizer handle options for position and width
// Additional hover area in toolbar option
// User settings at the start of JS and CSS code blocks
(function() {
if (location.href !== 'chrome://browser/content/browser.xhtml')
return;
// User settings JS
// true = enabled, false = disabled
// Additional hover area in toolbar
let hover_button = true;
// Hover/resizer handle narrow and full height
let full_height = false;
// Test colors
let test_colors = true;
// User settings JS end
// adjust height to browser window
let brow_size = document.getElementById("browser");
let observer = new ResizeObserver(() => {
let rect = brow_size.getBoundingClientRect();
document.getElementById('sidebar-box').style.setProperty('--height_sidebar', rect.height + 'px');
//document.getElementById('sidebar-box').style.setProperty('--height_sidebar_top', rect.top + 'px');
});
observer.observe(brow_size);
let floater = document.getElementById('sidebar-box');
// keep sidebar open when open popup is hovered
window.addEventListener("popupshowing", (e) => {
if (e.target.id === "sidebarMenu-popup" || e.target.getAttribute("viewid")?.startsWith("sidebar-")) {
floater.classList.add("menu_up");
}
else {
floater.classList.remove("menu_up");
}
});
// Hover button
if (hover_button) {
try {
CustomizableUI.createWidget({
id: 'sb_hover_button',
defaultArea: CustomizableUI.AREA_NAVBAR,
label: 'Hover Button',
tooltiptext: 'Sidebar Hover',
});
} catch (e) {}
let hover_btn = document.getElementById("sb_hover_button");
hover_btn.addEventListener('mouseover',function(){
floater.classList.add("hover_that");
})
hover_btn.addEventListener('mouseleave',function(){
floater.classList.remove("hover_that");
});
// prevent click
hover_btn.onmousedown = function(event) {
event.preventDefault();
}
};
// Resizer
let resizer = document.createElement("div");
resizer.id = "sidebar_resizer";
floater.appendChild(resizer);
let isResizing = false;
let startX, startWidth;
let isRight;
resizer.addEventListener("mousedown", e => {
isResizing = true;
startX = e.clientX;
startWidth = floater.getBoundingClientRect().width;
isRight = floater.hasAttribute("positionend") || floater.hasAttribute("sidebar-positionend");
floater.classList.add("resizinger");
let rect_r = resizer.getBoundingClientRect();
offsetX = rect_r.width / 2;
offsetY = rect_r.height / 2;
floater.style.transition = "none";
e.preventDefault();
});
window.addEventListener("mousemove", e => {
if (!isResizing) return;
let delta;
if (isRight) {
delta = startX - e.clientX;
} else {
delta = e.clientX - startX;
}
let newWidth = startWidth + delta;
floater.style.width = newWidth + "px";
//floater.style.setProperty('--end_width_sidebar', newWidth + 'px');
});
window.addEventListener("mouseup", () => {
isResizing = false;
floater.classList.remove("resizinger");
});
let css =`
#sidebar-box {
/*-- User settings CSS --*/
--ug-handle_height: 64px;
--ug-handle_width: 32px;
--ug-handle_distance_top: 0px;
--ug-handle_width_fullheight: 16px;
--ug-trans_duration: 0.35s;
--ug-trans_delay_out: 0.25s;
--ug-trans_delay_in: 1s;
/*-- User settings CSS end --*/
--ug-handle_position: calc(-1*var(--ug-handle_width) + 5px);
--ug-handle_width_resize: calc(100% + var(--ug-handle_width));
position: fixed !important;
/*max-width: unset !important;*/
right: 0px;
left: unset;
bottom: 0px;
height: var(--height_sidebar);
z-index: 99999 !important;
transform: translateX(100%);
transition: transform var(--ug-trans_duration) ease !important;
transition-delay: var(--ug-trans_delay_in) !important;
}
#sidebar-box:not([positionend],[sidebar-positionend]) {
transform: translateX(-100%);
right: unset;
left: 0px;
}
/* show */
#sidebar-box:is(:hover, .menu_up, .hover_that) {
transform: translateX(0%);
transition-delay: var(--ug-trans_delay_out) !important;
}
/* Resizer */
#sidebar_resizer {
position: absolute;
top: var(--ug-handle_distance_top);
right: unset;
left: var(--ug-handle_position);
width: var(--ug-handle_width);
height: var(--ug-handle_height);
cursor: ew-resize;
}
#sidebar-box:not([positionend],[sidebar-positionend]) #sidebar_resizer {
right: var(--ug-handle_position);
left: unset;
}
#sidebar-box.resizinger #sidebar_resizer {
width: var(--ug-handle_width_resize);
}
/* Hover buton */
#sb_hover_button > .toolbarbutton-icon {
height: calc(2 * var(--toolbarbutton-inner-padding) + 16px) !important;
width: 64px !important;
background-image: url(chrome://global/skin/icons/arrow-right.svg), url(chrome://global/skin/icons/arrow-left.svg) !important;
background-position: center left 20%, center right 20% !important;
background-size: 50% 50% !important;
background-repeat: no-repeat !important;
}
#sb_hover_button {
padding: 0px 2px !important;
}
/* colors, border */
#sidebar,
#sidebar-header {
background-color: var(--sidebar-background-color) !important;
border-inline: 1px solid var(--sidebar-border-color);
border-inline-width: 1px 0px;
}
#sidebar-box:not([positionend],[sidebar-positionend]) :is(#sidebar, #sidebar-header) {
border-inline-width: 0px 1px;
}
#sidebar-splitter {
display: none !important;
}
`;
if (full_height) {
css += `
/* full height */
#sidebar-box {
--ug-handle_height: 100%;
--ug-handle_distance_top: 0px;
--ug-handle_width: var(--ug-handle_width_fullheight);
--ug-handle_position: calc(-1*var(--ug-handle_width) /2);
}
`;
}
if (test_colors) {
css += `
/* Test colors */
#sidebar_resizer {
background: hsla(35, 0%, 50%, 0.25);
outline: 2px solid lightblue;
outline-offset: -2px;
}
`;
}
const sss = Cc['@mozilla.org/content/style-sheet-service;1'].getService(Ci.nsIStyleSheetService);
const uri = Services.io.newURI('data:text/css,' + encodeURIComponent(css));
sss.loadAndRegisterSheet(uri, sss.AGENT_SHEET);
})();
Alles anzeigen