Die Meldung besagt, dass browser.formfill.enable nicht auf true steht.
Auf true gestellt, und jetzt funktioniert es hier auch. Danke!
Die Meldung besagt, dass browser.formfill.enable nicht auf true steht.
Auf true gestellt, und jetzt funktioniert es hier auch. Danke!
Hat das auch damit zu tun? Standard ist wohl false.
browser.search.suggest.enabled → true
browser.urlbar.suggest.searches → true.
Ja, und hier die Batterie an Fehlern:
Error: Form history is disabled, only remove operations are allowed
update resource://gre/modules/FormHistory.sys.mjs:1075
addToFormHistory moz-src:///browser/components/urlbar/UrlbarUtils.sys.mjs:1243
pickResult chrome://browser/content/urlbar/UrlbarInput.mjs:1704
pickElement chrome://browser/content/urlbar/UrlbarInput.mjs:1386
handleNavigation chrome://browser/content/urlbar/UrlbarInput.mjs:1126
handleCommand chrome://browser/content/urlbar/UrlbarInput.mjs:1063
_on_click chrome://browser/content/urlbar/UrlbarInput.mjs:4931
handleEvent chrome://browser/content/urlbar/UrlbarInput.mjs:1024
Zwecks Test hier so eingestellt:
Nichts zu machen, ob Stable, Beta oder Nightly, funktioniert hier nicht.![]()
Sieht hier so damit aus:
Hier geht es nicht damit, komisch, hat das auch was mit Einstellungen zu tun, dass es überhaupt erst Wirkung zeigt?
Es fügt oben in der Suchliste einen Pfeil nach unten ein und bei klick drauf
wird die Suchchronik angezeigt.
Der Pfeil wird angezeigt, das ist nicht das Problem. Das Problem besteht neuerdings darin (wenn ich es richtig verstanden habe), dass aus Sicherheitsgründen nicht mehr einfach so auf die Chronik zugegriffen werden kann. Deshalb scheitert auch das Script aus #1, wobei mein vorgestelltes Script eine eigene Suchchronik anlegt, und deshalb funktioniert.
Ja, geldhuegel , alles versucht, aber vergebens. Nun habe ich aber ein eigenes Script für die Funktion gebastelt. Es erstellt in der Navbar einen verschiebbaren Button, bei Klick darauf öffnet sich ein Sub-Menü. Darin kannst du über Einstellungen angeben, wieviel Einträge gespeichert werden sollen, und außerdem die History löschen. Sind Einträge vorhanden, dann kannst du mit einem Klick darauf diese in einem Tab wieder aufrufen. Achte darauf, es ist der Pfad zu einem Icon für den Button angegeben, den du dann bei dir anpassen musst (nur wenn du Lust darauf hast
). So, dann teste bitte!
// ==UserScript==
// @name SearchHistoryButton.uc.js
// @include main
// @charset UTF-8
// @note Button in der Navbar + Popup mit eigener Suchhistory
// @version 2.2
// ==/UserScript==
(function () {
if (location != 'chrome://browser/content/browser.xhtml') return;
'use strict';
const lazy = {};
ChromeUtils.defineESModuleGetters(lazy, {
SearchService: "moz-src:///toolkit/components/search/SearchService.sys.mjs",
SearchUIUtils: "moz-src:///browser/components/search/SearchUIUtils.sys.mjs",
});
if (window.SHB) return;
window.SHB = {
buttonCreated: false,
hooked: false,
_hookInterval: null,
_hookStart: 0,
_urlbarHooked: false,
_searchbarHooked: false,
_lastRecord: { q: '', t: 0 },
icon: 'file:///C:/FoxIcons2/002.png',
maxItems: 30,
maxItemsPrefName: 'extensions.shb.maxItems',
prefName: 'extensions.shb.searchHistory',
init: function () {
this.maxItems = this.loadMaxItems();
const waitForToolbar = () => {
const navbar = document.getElementById('nav-bar');
if (navbar && !this.buttonCreated) {
this.createToolbarButton();
} else if (!this.buttonCreated) {
setTimeout(waitForToolbar, 100);
}
};
waitForToolbar();
this.hookSearchUI();
},
// =========================
// 🔘 BUTTON
// =========================
createToolbarButton: function () {
if (this.buttonCreated) return;
try {
CustomizableUI.createWidget({
id: 'shb-button',
type: 'custom',
defaultArea: CustomizableUI.AREA_NAVBAR,
removable: true,
label: 'Suchverlauf',
onBuild: (doc) => {
const btn = doc.createXULElement('toolbarbutton');
btn.id = 'shb-button';
btn.className = 'toolbarbutton-1 chromeclass-toolbar-additional';
btn.setAttribute('type', 'menu');
btn.setAttribute('label', 'Suchverlauf');
btn.setAttribute('tooltiptext', 'Suchverlauf anzeigen');
btn.setAttribute('image', this.icon);
btn.style.listStyleImage = `url("${this.icon}")`;
this.initButtonPopup(btn);
this.buttonCreated = true;
return btn;
}
});
} catch (e) {
console.log('CustomizableUI Fehler:', e);
}
},
initButtonPopup: function (btn) {
const mp = btn.appendChild(document.createXULElement('menupopup'));
mp.id = 'shb-popup';
mp.addEventListener('popupshowing', (event) => this.onPopup(event));
},
// =========================
// 📜 POPUP
// =========================
onPopup: function (event) {
const mp = event.target;
if (mp.id !== 'shb-popup') return;
while (mp.firstChild) mp.firstChild.remove();
this.addSettingsMenu(mp);
const items = this.loadHistory();
if (!items.length) {
const empty = document.createXULElement('menuitem');
empty.setAttribute('label', 'Keine Suchanfragen gespeichert.');
empty.setAttribute('disabled', 'true');
mp.appendChild(empty);
return;
}
for (const query of items) {
const item = document.createXULElement('menuitem');
item.setAttribute('label', query);
item.setAttribute('tooltiptext', 'Suche in neuem Tab öffnen');
let opened = false;
const openItem = (ev) => {
if (opened) return;
opened = true;
try {
ev?.preventDefault?.();
ev?.stopPropagation?.();
ev?.stopImmediatePropagation?.();
} catch (e) {}
try {
mp.hidePopup();
} catch (e) {}
setTimeout(() => this.openQueryInTab(query), 0);
};
item.addEventListener('command', openItem);
item.addEventListener('click', (ev) => {
if (ev.button === 0) openItem(ev);
});
mp.appendChild(item);
}
mp.appendChild(document.createXULElement('menuseparator'));
const clearItem = document.createXULElement('menuitem');
clearItem.setAttribute('label', 'Suchverlauf löschen');
clearItem.addEventListener('command', () => {
this.saveHistory([]);
});
mp.appendChild(clearItem);
},
addSettingsMenu: function (mp) {
const menu = document.createXULElement('menu');
menu.setAttribute('label', 'Einstellungen');
const popup = document.createXULElement('menupopup');
const title = document.createXULElement('menuitem');
title.setAttribute('label', 'Max. gespeicherte Suchanfragen');
title.setAttribute('disabled', 'true');
popup.appendChild(title);
popup.appendChild(document.createXULElement('menuseparator'));
const values = [10, 20, 30, 50, 100];
for (const n of values) {
const item = document.createXULElement('menuitem');
item.setAttribute('label', `${n} Einträge`);
if (this.maxItems === n) {
item.setAttribute('type', 'checkbox');
item.setAttribute('checked', 'true');
}
const setValue = (ev) => {
try {
ev?.preventDefault?.();
ev?.stopPropagation?.();
ev?.stopImmediatePropagation?.();
} catch (e) {}
this.saveMaxItems(n);
try {
mp.hidePopup();
} catch (e) {}
};
item.addEventListener('command', setValue);
item.addEventListener('click', (ev) => {
if (ev.button === 0) setValue(ev);
});
popup.appendChild(item);
}
menu.appendChild(popup);
mp.appendChild(menu);
mp.appendChild(document.createXULElement('menuseparator'));
},
// =========================
// 🔥 HOOKS
// =========================
hookSearchUI: function () {
if (this._hookInterval) return;
this._hookStart = Date.now();
const record = (val, source = 'unknown') => {
val = String(val || '').trim();
if (!val) return;
const now = Date.now();
const key = val.toLowerCase();
if (this._lastRecord.q === key && (now - this._lastRecord.t) < 1500) {
return;
}
this._lastRecord = { q: key, t: now };
console.log('[SHB] Record from', source + ':', val);
this.recordQuery(val);
};
const patchMethod = (obj, methodName, label, valueGetter) => {
if (!obj || typeof obj[methodName] !== 'function') return false;
if (obj.__shbPatched?.[methodName]) return false;
const original = obj[methodName].bind(obj);
obj.__shbPatched = obj.__shbPatched || {};
obj.__shbPatched[methodName] = true;
obj[methodName] = (...args) => {
try {
const val = typeof valueGetter === 'function'
? valueGetter(args)
: (obj.value || obj.textbox?.value || obj.inputField?.value || '');
record(val, label);
} catch (e) {
console.error('[SHB] Record fehlgeschlagen in', label + ':', e);
}
return original(...args);
};
console.log('[SHB] gepatcht:', label, methodName);
return true;
};
const hookField = (node, label) => {
if (!node || node.__shbHooked) return false;
node.addEventListener('command', () => record(node.value, label + ':command'));
node.addEventListener('change', () => record(node.value, label + ':change'));
node.addEventListener('blur', () => record(node.value, label + ':blur'));
node.addEventListener('keydown', (e) => {
if (e.key === 'Enter') {
setTimeout(() => record(node.value, label + ':Enter'), 0);
}
}, true);
node.__shbHooked = true;
console.log('[SHB] Feld-Hook aktiv:', label);
return true;
};
const getSearchbarCandidates = () => {
const seen = new Set();
const list = [];
for (const id of ['searchbar-new', 'searchbar']) {
const node = document.getElementById(id);
if (node && !seen.has(node)) {
seen.add(node);
list.push(node);
}
}
return list;
};
const tryHook = () => {
let attachedAny = false;
if (window.gURLBar) {
const urlField = window.gURLBar.inputField || window.gURLBar.textbox || window.gURLBar;
if (urlField) {
attachedAny = hookField(urlField, 'gURLBar.input') || attachedAny;
}
attachedAny = patchMethod(
window.gURLBar,
'handleCommand',
'gURLBar',
() => window.gURLBar.value
) || attachedAny;
if (urlField) {
this._urlbarHooked = true;
}
}
for (const sb of getSearchbarCandidates()) {
let sbAttached = false;
const field = sb.inputField || sb.textbox || sb.querySelector?.('input');
if (field) {
sbAttached = hookField(field, sb.id + ':field') || sbAttached;
}
sbAttached = patchMethod(
sb,
'doSearch',
sb.id + ':doSearch',
() => sb.value || sb.textbox?.value || sb.inputField?.value || field?.value || ''
) || sbAttached;
sbAttached = patchMethod(
sb,
'handleSearchCommand',
sb.id + ':handleSearchCommand',
() => sb.value || sb.textbox?.value || sb.inputField?.value || field?.value || ''
) || sbAttached;
sbAttached = patchMethod(
sb,
'handleCommand',
sb.id + ':handleCommand',
() => sb.value || sb.textbox?.value || sb.inputField?.value || field?.value || ''
) || sbAttached;
sb.addEventListener?.('command', () => {
record(
sb.value || sb.textbox?.value || sb.inputField?.value || field?.value || '',
sb.id + ':command'
);
}, true);
sb.addEventListener?.('search', () => {
record(
sb.value || sb.textbox?.value || sb.inputField?.value || field?.value || '',
sb.id + ':search'
);
}, true);
if (sbAttached) {
this._searchbarHooked = true;
}
attachedAny = sbAttached || attachedAny;
}
const timedOut = (Date.now() - this._hookStart) > 45000;
if ((this._urlbarHooked && this._searchbarHooked) || timedOut) {
this.hooked = true;
console.log('[SHB] Hooks aktiv');
clearInterval(this._hookInterval);
this._hookInterval = null;
}
return attachedAny;
};
this._hookInterval = setInterval(tryHook, 300);
tryHook();
},
// =========================
// 🌐 SEARCH IN TAB
// =========================
openQueryInTab: async function (query) {
query = String(query || '').trim();
if (!query) return;
console.log('[SHB] openQueryInTab:', query);
try {
const engine = await lazy.SearchService.getDefault();
const submission = engine?.getSubmission(query);
const url = submission?.uri?.spec;
if (!url) {
console.warn('[SHB] Keine Such-URL erzeugt werden konnte.');
return;
}
const triggeringPrincipal = Services.scriptSecurityManager.getSystemPrincipal();
const policyContainer = window.gBrowser?.selectedBrowser?.browsingContext?.policyContainer || null;
if (lazy.SearchUIUtils && typeof lazy.SearchUIUtils.loadSearch === 'function') {
await lazy.SearchUIUtils.loadSearch({
window,
engine,
searchText: query,
where: 'tab',
triggeringPrincipal,
policyContainer,
usePrivateWindow: false,
inBackground: false,
searchUrlType: null,
sapSource: 'contextmenu',
});
console.log('[SHB] Tab geöffnet für:', query);
return;
}
if (typeof openWebLinkIn === 'function') {
openWebLinkIn(url, 'tab', {
inBackground: false,
relatedToCurrent: true,
triggeringPrincipal,
policyContainer,
postData: submission.postData || null
});
console.log('[SHB] Tab geöffnet für:', query);
return;
}
if (typeof openTrustedLinkIn === 'function') {
openTrustedLinkIn(url, 'tab', {
inBackground: false,
relatedToCurrent: true,
triggeringPrincipal,
policyContainer,
postData: submission.postData || null
});
console.log('[SHB] Tab geöffnet für:', query);
return;
}
if (typeof openLinkIn === 'function') {
openLinkIn(url, 'tab', {
inBackground: false,
relatedToCurrent: true,
triggeringPrincipal,
policyContainer,
postData: submission.postData || null
});
console.log('[SHB] Tab geöffnet für:', query);
return;
}
if (window.gBrowser && typeof gBrowser.addTrustedTab === 'function') {
gBrowser.selectedTab = gBrowser.addTrustedTab(url);
console.log('[SHB] Tab geöffnet für:', query);
return;
}
if (window.gBrowser && typeof gBrowser.loadOneTab === 'function') {
gBrowser.loadOneTab(url, { inBackground: false });
console.log('[SHB] Tab geöffnet für:', query);
return;
}
if (window.gBrowser && typeof gBrowser.addTab === 'function') {
gBrowser.selectedTab = gBrowser.addTab(url);
console.log('[SHB] Tab geöffnet für:', query);
return;
}
console.warn('[SHB] Kein passender Öffnungsweg verfügbar.');
} catch (e) {
console.error('[SHB] Tab-Öffnen fehlgeschlagen:', e);
}
},
// =========================
// ⚙️ SETTINGS
// =========================
loadMaxItems: function () {
try {
const n = Services.prefs.getIntPref(this.maxItemsPrefName, 30);
return Math.max(5, Math.min(200, n));
} catch (e) {
return 30;
}
},
saveMaxItems: function (n) {
try {
n = parseInt(n, 10);
if (!Number.isFinite(n)) return;
n = Math.max(5, Math.min(200, n));
Services.prefs.setIntPref(this.maxItemsPrefName, n);
this.maxItems = n;
const trimmed = this.loadHistory().slice(0, this.maxItems);
this.saveHistory(trimmed);
console.log('[SHB] MaxItems gesetzt auf:', n);
} catch (e) {
console.error('[SHB] MaxItems speichern fehlgeschlagen:', e);
}
},
// =========================
// 💾 STORAGE
// =========================
loadHistory: function () {
try {
const raw = Services.prefs.getStringPref(this.prefName, '[]');
const arr = JSON.parse(raw);
return Array.isArray(arr) ? arr : [];
} catch (e) {
return [];
}
},
saveHistory: function (arr) {
try {
const clean = Array.isArray(arr)
? arr.map(x => String(x).trim()).filter(x => x.length > 0)
: [];
if (!clean.length) {
Services.prefs.clearUserPref(this.prefName);
return;
}
Services.prefs.setStringPref(this.prefName, JSON.stringify(clean));
} catch (e) {
console.error('[SHB] Speichern fehlgeschlagen:', e);
}
},
recordQuery: function (query) {
const q = String(query || '').trim();
if (!q) return;
const qLower = q.toLowerCase();
let history = this.loadHistory();
history = history.filter(item =>
String(item).trim().toLowerCase() !== qLower
);
history.unshift(q);
history = history.slice(0, this.maxItems);
this.saveHistory(history);
console.log('[SHB] Gespeichert:', q);
}
};
window.SHB.init();
})();
Alles anzeigen
Teste bitte:
Ich sage danke, funktioniert wieder. ![]()
Ist das jetzt so gemeint?
Wenn ja, dann teste das folgende Script, ob es funktioniert kann ich jetzt nicht beantworten, weil ich nicht genau weiß was es nun wirklich anzeigen soll (so wie es heißt die letzten Suchergebnisse). Probiere mal, ansonsten melde dich wieder.
// ==UserScript==
// @name ShowSearchBarHistoryByClick.uc.js
// @description Zeigt den Suchverlauf per Button in der Suchleiste
// @charset UTF-8
// @include main
// @version 0.8.5 Firefox 148+
// ==/UserScript==
(function () {
"use strict";
const BTN_ID = "searchbar-history-dropmarker";
const createButton = true;
const noLimitResult = true;
const timeSeries = true;
applySearchPrefs();
if (window.gBrowserInit?.delayedStartupFinished) {
init();
} else {
const obs = {
observe(subject, topic) {
if (topic === "browser-delayed-startup-finished" && subject === window) {
Services.obs.removeObserver(obs, topic);
init();
}
},
};
Services.obs.addObserver(obs, "browser-delayed-startup-finished");
}
window.addEventListener("aftercustomization", () => {
window.setTimeout(installButton, 0);
}, false);
function init() {
installButton();
}
function getSearchBar() {
return document.getElementById("searchbar-new") || document.getElementById("searchbar");
}
function getSearchInput(bar) {
return bar?._textbox || bar?.inputField || bar;
}
function installButton() {
if (!createButton) {
return;
}
const bar = getSearchBar();
if (!bar) {
window.setTimeout(installButton, 300);
return;
}
let btn = document.getElementById(BTN_ID);
if (!btn) {
btn = document.createXULElement("toolbarbutton");
btn.setAttribute("id", BTN_ID);
btn.setAttribute("class", "toolbarbutton-1 chromeclass-toolbar-additional urlbar-page-action");
btn.setAttribute("image", "chrome://global/skin/icons/arrow-dropdown-16.svg");
btn.setAttribute("tooltiptext", "Suchverlauf anzeigen");
btn.setAttribute("removable", "true");
btn.setAttribute("cui-areatype", "toolbar");
btn.style.marginInlineStart = "4px";
btn.style.order = "9999";
btn.addEventListener("click", showHistory, false);
}
// Legacy Searchbar
const legacyGoContainer = bar.querySelector?.(".search-go-container");
if (legacyGoContainer) {
if (btn.parentNode !== legacyGoContainer) {
legacyGoContainer.appendChild(btn);
}
return;
}
// Firefox 148+ / searchbar-new:
// Button in denselben inneren Container wie der Go-Button, direkt danach.
const goButton = bar.querySelector?.(".urlbar-go-button");
if (goButton && goButton.parentNode) {
const parent = goButton.parentNode;
if (btn.parentNode !== parent) {
parent.insertBefore(btn, goButton.nextSibling);
} else if (btn.previousSibling !== goButton) {
parent.insertBefore(btn, goButton.nextSibling);
}
} else if (btn.parentNode !== bar) {
bar.appendChild(btn);
}
if (noLimitResult) {
const input = getSearchInput(bar);
if (input?.popup) {
input.popup.setAttribute("nomaxresults", "true");
}
}
}
function showHistory(e) {
if (e.button !== 0) {
return;
}
const bar = getSearchBar();
if (!bar) {
return;
}
const input = getSearchInput(bar);
if (!input) {
return;
}
const oldValue = input.value || "";
input.value = "";
try {
if (typeof input.showHistoryPopup === "function") {
input.showHistoryPopup();
} else if (typeof bar.startQuery === "function") {
bar.startQuery({
searchString: "",
event: new Event("command", { bubbles: true, cancelable: true }),
});
} else if (bar.view && typeof bar.view.autoOpen === "function") {
bar.view.autoOpen({ event: { type: "command" } });
}
} catch (ex) {
console.error("ShowSearchBarHistoryByClick error:", ex);
} finally {
input.value = oldValue;
}
}
function applySearchPrefs() {
if (timeSeries) {
setPref("browser.formfill.bucketSize", "int", -1);
setPref("browser.formfill.maxTimeGroupings", "int", -1);
setPref("browser.formfill.timeGroupingSize", "int", -1);
} else {
clearPref("browser.formfill.bucketSize");
clearPref("browser.formfill.maxTimeGroupings");
clearPref("browser.formfill.timeGroupingSize");
}
if (noLimitResult) {
setPref("browser.urlbar.recentsearches.maxResults", "int", 9999);
} else {
clearPref("browser.urlbar.recentsearches.maxResults");
}
}
function setPref(aPrefString, aPrefType, aValue) {
try {
switch (aPrefType) {
case "int":
return Services.prefs.setIntPref(aPrefString, parseInt(aValue, 10));
case "str":
return Services.prefs.setStringPref(aPrefString, String(aValue));
case "bool":
default:
return Services.prefs.setBoolPref(aPrefString, !!aValue);
}
} catch (e) {}
return null;
}
function clearPref(aPrefString) {
try {
Services.prefs.clearUserPref(aPrefString);
} catch (e) {}
}
})();
Alles anzeigen
Beim Verschieben eines Tabs kann die Marker entweder am Ende des vorherigen oder am Anfang des nächsten Tabs erscheinen. Ist das so beabsichtigt?
Nein, die Marker erscheinen mit den Settings immer innerhalb eines Tabs, entweder links oder rechts. Ein anderes Verhalten kann ich hier nicht feststellen.
Dank Ihrer Skripte ist die Mehrzeilenfunktionalität nun deutlich verbessert. Vielen Dank!
Freut mich wenn es gefällt, aber ich betone nochmals, nur mit KI ist das möglich, ich kenne mich nicht mit JavaScript aus.![]()
Hier dann nochmals das überarbeitete Script, mit dem Settings-Modul zur einfachen Auswahl der Abstände.
// ==UserScript==
// @name TabMoveOnlyMultiRow.uc.js
// @namespace local
// @description Multirow-Tabs + Styling + nur Tab-Verschieben per Drag & Drop
// @include main
// @compatibility Firefox138+
// @version 2026-03-24
// ==/UserScript==
"use strict";
TabMoveOnly();
function TabMoveOnly() {
if (!window.gBrowser || !window.gBrowser.tabContainer) return;
const TAB_DROP_TYPE = window.TAB_DROP_TYPE || "application/x-moz-tabbrowser-tab";
// =========================================================
// FEINEINSTELLUNGEN FÜR DIE MARKER
// =========================================================
// Links: Marker horizontal verschieben in px
const LEFT_MARKER_SHIFT = 0;
// Rechts: Marker horizontal verschieben in px
const RIGHT_MARKER_SHIFT = 0;
// Marker vertikal leicht nach oben/unten korrigieren in px
const MARKER_TOP = -1;
const css = `
/* =========================================================
GRUNDEINSTELLUNGEN
========================================================= */
:root{
--multirow-n-rows: 3;
--multirow-tab-min-width: 250px;
--multirow-tab-max-width: 350px;
--multirow-tab-height: 27px;
--multirow-tab-top-margin: 1px;
--multirow-tab-bottom-margin: 0px;
--multirow-row-gap: 2px;
--multirow-tab-total-height: calc(
var(--multirow-tab-height) +
var(--multirow-tab-top-margin) +
var(--multirow-tab-bottom-margin)
);
--proton-tab-radius: 0px;
--proton-tab-block-margin: 0px;
--inline-tab-padding: 5px;
--scrollbutton-display-model: none;
}
/* =========================================================
MULTIROW-TABS
========================================================= */
#tabbrowser-tabs{
min-height: unset !important;
padding-inline-start: 0 !important;
padding-inline-end: 0 !important;
margin-top: 1px !important;
margin-inline-end: 0 !important;
}
#tabbrowser-tabs[orient="horizontal"]{
min-height: calc(var(--multirow-tab-total-height)) !important;
justify-content: flex-start !important;
align-content: flex-start !important;
overflow: hidden !important;
}
#scrollbutton-up~spacer,
#scrollbutton-up,
#scrollbutton-down{
display: none !important;
}
scrollbox[part][orient="horizontal"],
scrollbox[part][orient="horizontal"] > slot{
display: flex !important;
flex-wrap: wrap !important;
align-content: flex-start !important;
justify-content: flex-start !important;
overflow-y: auto !important;
overflow-x: hidden !important;
max-height: calc(
(var(--multirow-tab-total-height) * var(--multirow-n-rows)) +
((var(--multirow-n-rows) - 1) * var(--multirow-row-gap))
) !important;
scrollbar-width: thin !important;
scrollbar-color: auto !important;
scrollbar-gutter: auto !important;
padding-inline-end: 0 !important;
margin-inline-end: 0 !important;
border-inline-end: 0 !important;
contain: none !important;
-moz-window-dragging: no-drag !important;
}
box.scrollbox-clip[orient="horizontal"]{
padding-inline-end: 0 !important;
margin-inline-end: 0 !important;
border-inline-end: 0 !important;
overflow: visible !important;
-moz-window-dragging: no-drag !important;
}
#tabbrowser-arrowscrollbox scrollbar,
#tabbrowser-arrowscrollbox scrollbar *{
-moz-window-dragging: no-drag !important;
}
#tabbrowser-arrowscrollbox{
overflow-y: auto !important;
overflow-x: hidden !important;
display: block !important;
scrollbar-width: thin !important;
scrollbar-color: auto !important;
scrollbar-gutter: auto !important;
padding-inline-end: 0 !important;
margin-inline-end: 0 !important;
border-inline-end: 0 !important;
-moz-window-dragging: no-drag !important;
}
#tabbrowser-arrowscrollbox-periphery{
margin: 0 !important;
padding: 0 !important;
inset-inline-end: 0 !important;
position: relative !important;
-moz-window-dragging: no-drag !important;
}
.tabbrowser-tab{
height: var(--multirow-tab-height) !important;
min-height: var(--multirow-tab-height) !important;
max-height: var(--multirow-tab-height) !important;
margin-top: var(--multirow-tab-top-margin) !important;
margin-bottom: var(--multirow-tab-bottom-margin) !important;
scroll-snap-align: start;
box-shadow: none !important;
}
#tabbrowser-tabs[orient="horizontal"] .tabbrowser-tab[movingtab]{
padding-bottom: 15px !important;
margin-bottom: -15px !important;
}
#tabbrowser-tabs .tabbrowser-tab[pinned]{
position: static !important;
margin-inline-start: 0 !important;
}
#tabbrowser-tabs[orient="horizontal"] .tabbrowser-tab[fadein]:not([pinned]){
flex: 1 1 var(--multirow-tab-min-width) !important;
min-width: var(--multirow-tab-min-width) !important;
max-width: var(--multirow-tab-max-width) !important;
width: auto !important;
}
.tabbrowser-tab > stack{
width: 100%;
height: 100%;
}
#alltabs-button,
:root:not([customizing]) #TabsToolbar #new-tab-button,
#tabbrowser-arrowscrollbox > spacer,
.tabbrowser-tab::after{
display: none !important;
}
.tab-background{
margin-block: unset !important;
}
box.scrollbox-clip[orient="horizontal"]{
display: inline !important;
}
.tab-label-container{
height: unset !important;
}
#tabbrowser-tabs[orient="horizontal"] .tab-background,
#tabbrowser-tabs[orient="horizontal"]{
min-height: unset !important;
}
tab-split-view-wrapper{
min-width: calc(var(--multirow-tab-min-width) * 2 + 6px) !important;
}
tab-group[collapsed] .tabbrowser-tab[fadein]:not([pinned]){
min-width: 0 !important;
}
/* =========================================================
TAB-STYLE
========================================================= */
#TabsToolbar .tabbrowser-tab .tab-background{
border-radius: unset !important;
margin-block: unset !important;
}
hbox.titlebar-spacer,
tabs tab:not([fadein]){
display: none !important;
}
#tabbrowser-arrowscrollbox tab.tabbrowser-tab stack.tab-stack vbox.tab-background[selected]{
min-height: var(--multirow-tab-height) !important;
max-height: var(--multirow-tab-height) !important;
background: linear-gradient(45deg, gold, #FFFAF0, beige, #FFFAF0, orange) !important;
margin-left: -2px !important;
margin-right: -2px !important;
border: 1px solid green !important;
outline: none !important;
}
#main-window .tabbrowser-tab[selected]:hover{
opacity: .5 !important;
}
.tabbrowser-tab:not([selected]){
background: linear-gradient(0.35turn, silver, white, silver) !important;
border: 1px solid grey !important;
}
.tabbrowser-tab:not([visuallyselected]):hover{
background: linear-gradient(8deg, lightblue, white, lightblue) !important;
border: 1px solid blue !important;
}
.tabbrowser-tab:not([visuallyselected]) img.tab-icon-image{
margin-top: 0px !important;
margin-left: -1px !important;
}
.tab-close-button{
fill: grey !important;
transform: scale(1.5, 1.5) !important;
display: block !important;
opacity: 0 !important;
margin-right: -7px !important;
}
.tabbrowser-tab:hover .tab-close-button{
opacity: 1 !important;
color: red !important;
background: none !important;
}
.tabbrowser-tab:not([visuallyselected]) .tab-close-button{
margin-top: -2px !important;
}
.tabbrowser-tab > .tab-stack > .tab-content > .tab-close-button{
flex-shrink: 0 !important;
width: 24px !important;
padding-inline-start: 7px !important;
width: unset !important;
}
.tab-label-container{
height: unset !important;
display: grid !important;
justify-items: safe center !important;
justify-content: safe center !important;
}
.tab-label{
justify-content: center !important;
overflow: hidden !important;
}
.tabbrowser-tab[visuallyselected] .tab-label{
color: blue !important;
font-weight: bold !important;
font-size: 1.25em !important;
font-family: "Verdana, Helvetica", serif !important;
font-style: italic !important;
padding-bottom: 0 !important;
}
.tabbrowser-tab:not([visuallyselected]) .tab-label{
color: #4a525f !important;
font-weight: 600 !important;
font-size: 1.1em !important;
padding-bottom: 0px !important;
}
.tabbrowser-tab:not([visuallyselected]):hover .tab-label{
color: brown !important;
font-weight: 700 !important;
font-size: 1.1em !important;
opacity: 1 !important;
}
.tabbrowser-tab[busy] .tab-label{
color: blue !important;
}
#nav-bar{
appearance: none !important;
background-image: none !important;
background-color: #C2D3ED !important;
border-top: 1px solid grey !important;
border-bottom: 1px solid grey !important;
box-shadow: none !important;
margin-top: 3px !important;
}
#PersonalToolbar{
margin-top: 3px !important;
}
#TabsToolbar{
margin-top: 2px !important;
margin-bottom: -1px !important;
padding-top: 0 !important;
}
#main-menubar{
margin-top: 3px !important;
}
#TabsToolbar :is(.tabs-newtab-button,#tabs-newtab-button){
min-width: 0px !important;
width: 22px !important;
height: 22px !important;
margin-top: 3px !important;
margin-left: 4px !important;
}
#TabsToolbar :is(.tabs-newtab-button,#tabs-newtab-button) .toolbarbutton-icon{
min-width: 0px !important;
min-height: 0px !important;
width: 14px !important;
height: 14px !important;
margin: 0px !important;
margin-bottom: 0px !important;
padding: 0px !important;
background: unset !important;
box-shadow: unset !important;
}
#TabsToolbar #tabs-newtab-button:hover{
background-color: #FFF !important;
padding: 0px !important;
}
#TabsToolbar #tabs-newtab-button > image{
min-height: 24px !important;
max-height: 24px !important;
min-width: 24px !important;
max-width: 24px !important;
margin-top: 1px !important;
margin-left: 0px !important;
padding: 2px !important;
fill: grey !important;
}
#TabsToolbar #tabs-newtab-button:hover > image{
fill: red !important;
}
/* =========================================================
TABLEISTEN-POSITION
========================================================= */
#navigator-toolbox{
display: flex !important;
flex-direction: column !important;
}
#toolbar-menubar{
order: 1 !important;
}
#nav-bar{
order: 2 !important;
}
#PersonalToolbar{
order: 3 !important;
}
#TabsToolbar{
order: 4 !important;
}
/* =========================================================
DND-MARKER
========================================================= */
.tabbrowser-tab[dnd-marker]{
position: relative !important;
}
.tab-dnd-marker{
position: absolute !important;
pointer-events: none !important;
z-index: 1000 !important;
content: "" !important;
width: 14px !important;
height: 18px !important;
border-radius: 50% !important;
background:
radial-gradient(circle at center,
#00ffff 0 35%,
#1dacd6 36% 60%,
rgba(255,255,255,0) 61%) !important;
box-shadow: 0 0 3px rgba(255, 90, 82, 0.35) !important;
}
`;
const sss = Cc["@mozilla.org/content/style-sheet-service;1"]
.getService(Ci.nsIStyleSheetService);
const uri = Services.io.newURI(
"data:text/css;charset=UTF-8," + encodeURIComponent(css)
);
if (!sss.sheetRegistered(uri, sss.USER_SHEET)) {
sss.loadAndRegisterSheet(uri, sss.USER_SHEET);
}
const tabContainer = gBrowser.tabContainer;
let listenersActive = false;
let lastKnownIndex = null;
let lastGroupStart = null;
let lastGroupEnd = null;
function clearDndMarkers() {
for (const tab of gBrowser.tabs) {
tab.removeAttribute("dnd-marker");
if (tab._dndMarkerEl) {
tab._dndMarkerEl.remove();
tab._dndMarkerEl = null;
}
}
}
function setDndMarker(tab, side) {
clearDndMarkers();
if (!tab || !side) return;
tab.setAttribute("dnd-marker", side);
const marker = tab.ownerDocument.createXULElement("box");
marker.className = "tab-dnd-marker";
marker.style.top = `${MARKER_TOP}px`;
if (side === "right") {
marker.style.right = `${-2 + RIGHT_MARKER_SHIFT}px`;
} else {
marker.style.left = `${-2 + LEFT_MARKER_SHIFT}px`;
}
tab.appendChild(marker);
tab._dndMarkerEl = marker;
}
function getTabFromEventTarget(event, ignoreTabSides = false) {
let { target } = event;
if (!target) return null;
if (target.nodeType !== Node.ELEMENT_NODE) {
target = target.parentElement;
}
let tab = target?.closest("tab") || target?.closest("tab-group");
const selectedTab = gBrowser.selectedTab;
if (tab && ignoreTabSides) {
const { width, height } = tab.getBoundingClientRect();
if (
event.screenX < tab.screenX + width * 0.25 ||
event.screenX > tab.screenX + width * 0.75 ||
((event.screenY < tab.screenY + height * 0.25 ||
event.screenY > tab.screenY + height * 0.75) &&
gBrowser.tabContainer.verticalMode)
) {
return selectedTab;
}
}
return tab;
}
gBrowser.tabContainer._getDropIndex = function (event) {
let tabToDropAt = getTabFromEventTarget(event, false);
if (tabToDropAt?.localName == "tab-group") {
tabToDropAt = tabToDropAt.previousSibling;
if (!tabToDropAt) {
tabToDropAt = gBrowser.visibleTabs[0];
}
}
if (!tabToDropAt) {
tabToDropAt = gBrowser.visibleTabs[gBrowser.visibleTabs.length - 1];
}
if (!tabToDropAt) {
return null;
}
const tabPos = gBrowser.tabContainer.getIndexOfItem(tabToDropAt);
const rect = tabToDropAt.getBoundingClientRect();
if (window.getComputedStyle(this).direction == "ltr") {
if (event.clientX < rect.x + rect.width / 2) {
return tabPos;
}
return tabPos + 1;
} else {
if (event.clientX > rect.x + rect.width / 2) {
return tabPos;
}
return tabPos + 1;
}
};
function orig_getDropEffectForTabDrag(event) {
const dt = event.dataTransfer;
let isMovingTabs = dt.mozItemCount > 0;
for (let i = 0; i < dt.mozItemCount; i++) {
const types = dt.mozTypesAt(0);
if (types[0] != TAB_DROP_TYPE) {
isMovingTabs = false;
break;
}
}
if (isMovingTabs) {
const sourceNode = dt.mozGetDataAt(TAB_DROP_TYPE, 0);
if (
XULElement.isInstance(sourceNode) &&
sourceNode.localName == "tab" &&
sourceNode.ownerGlobal.isChromeWindow &&
sourceNode.ownerDocument.documentElement.getAttribute("windowtype") == "navigator:browser" &&
sourceNode.ownerGlobal.gBrowser.tabContainer == sourceNode.container
) {
if (
PrivateBrowsingUtils.isWindowPrivate(window) !=
PrivateBrowsingUtils.isWindowPrivate(sourceNode.ownerGlobal)
) {
return "none";
}
if (window.gMultiProcessBrowser != sourceNode.ownerGlobal.gMultiProcessBrowser) {
return "none";
}
if (window.gFissionBrowser != sourceNode.ownerGlobal.gFissionBrowser) {
return "none";
}
return dt.dropEffect == "copy" ? "copy" : "move";
}
}
if (Services.droppedLinkHandler.canDropLink(event, true)) {
return "link";
}
return "none";
}
function getMarkerInfo(event) {
let tabToDropAt = getTabFromEventTarget(event, false);
if (tabToDropAt?.localName == "tab-group") {
tabToDropAt = tabToDropAt.previousSibling;
if (!tabToDropAt) {
tabToDropAt = gBrowser.visibleTabs[0];
}
}
if (!tabToDropAt) {
const lastTab = gBrowser.visibleTabs[gBrowser.visibleTabs.length - 1];
return { tab: lastTab, side: "right" };
}
const rect = tabToDropAt.getBoundingClientRect();
const ltr = window.getComputedStyle(gBrowser.tabContainer).direction == "ltr";
const side = ltr
? (event.clientX < rect.x + rect.width / 2 ? "left" : "right")
: (event.clientX > rect.x + rect.width / 2 ? "left" : "right");
return { tab: tabToDropAt, side };
}
function performTabDragOver(event) {
const effects = orig_getDropEffectForTabDrag(event);
if (effects == "none" || effects == "link") {
clearDndMarkers();
return;
}
event.preventDefault();
event.stopPropagation();
const tab = getTabFromEventTarget(event, true);
if (tab && tab.nodeName == "tab-group" && !lastGroupStart) {
const first = tab.querySelector("tab:first-of-type");
const last = tab.querySelector("tab:last-of-type");
if (first && last) {
lastGroupStart = first._tPos;
lastGroupEnd = last._tPos;
}
}
const newIndex = gBrowser.tabContainer._getDropIndex(event);
if (newIndex == null) {
clearDndMarkers();
return;
}
lastKnownIndex = newIndex;
const markerInfo = getMarkerInfo(event);
setDndMarker(markerInfo.tab, markerInfo.side);
}
function performTabDropEvent(event) {
clearDndMarkers();
const dt = event.dataTransfer;
const dropEffect = dt.dropEffect;
let draggedTab;
if (dt.mozTypesAt(0)[0] == TAB_DROP_TYPE) {
draggedTab = dt.mozGetDataAt(TAB_DROP_TYPE, 0);
if (!draggedTab) return;
}
if (draggedTab && dropEffect != "copy" && draggedTab.container == gBrowser.tabContainer) {
let newIndex = gBrowser.tabContainer._getDropIndex(event);
if (newIndex == null) return;
const selectedTabs = gBrowser.selectedTabs.length > 1 ? gBrowser.selectedTabs : [draggedTab];
let tabToMoveAt = gBrowser.tabContainer.getItemAtIndex(newIndex);
const tab = getTabFromEventTarget(event, false);
const tabgroup = tab?.closest("tab-group");
if (!tab) {
newIndex = gBrowser.tabs.length;
tabToMoveAt = null;
}
if (tabgroup && !tab.previousSibling) {
newIndex = 0;
selectedTabs.forEach(t => {
gBrowser.moveTabTo(t, { tabIndex: newIndex++, forceUngrouped: true });
});
} else if (
!tab ||
(!tabgroup && !tabToMoveAt?.group) ||
(tabgroup && tabToMoveAt?.group)
) {
selectedTabs.forEach(t => {
gBrowser.moveTabBefore(t, tabToMoveAt);
});
} else {
tabToMoveAt = gBrowser.tabContainer.getItemAtIndex(newIndex - 1);
selectedTabs.forEach(t => {
gBrowser.moveTabAfter(t, tabToMoveAt);
});
}
lastKnownIndex = null;
lastGroupStart = null;
lastGroupEnd = null;
}
}
tabContainer.addEventListener("dragstart", () => {
if (!listenersActive) {
tabContainer.on_dragover = e => performTabDragOver(e);
tabContainer._onDragOver = e => performTabDragOver(e);
tabContainer.ondrop = e => performTabDropEvent(e);
tabContainer.addEventListener("dragend", clearDndMarkers, true);
tabContainer.addEventListener("drop", clearDndMarkers, true);
listenersActive = true;
}
});
}
Alles anzeigen
Ergänzend hierzu #1118 habe ich den CSS-Code für MultiRowTabs mit dem Script für Drag&Drop vereinigt.
// ==UserScript==
// @name TabMoveOnlyMultiRow.uc.js
// @namespace local
// @description Multirow-Tabs + Styling + nur Tab-Verschieben per Drag & Drop
// @include main
// @compatibility Firefox138+
// @version 2026-03-24
// ==/UserScript==
"use strict";
TabMoveOnly();
function TabMoveOnly() {
if (!window.gBrowser || !window.gBrowser.tabContainer) return;
const TAB_DROP_TYPE = window.TAB_DROP_TYPE || "application/x-moz-tabbrowser-tab";
const RIGHT_MARKER_SHIFT = 15; // Marker 15px weiter nach links
const css = `
/* =========================================================
GRUNDEINSTELLUNGEN
========================================================= */
:root{
--multirow-n-rows: 3;
--multirow-tab-min-width: 250px;
--multirow-tab-max-width: 350px;
--multirow-tab-height: 27px;
--multirow-tab-top-margin: 1px;
--multirow-tab-bottom-margin: 0px;
--multirow-row-gap: 2px;
--multirow-tab-total-height: calc(
var(--multirow-tab-height) +
var(--multirow-tab-top-margin) +
var(--multirow-tab-bottom-margin)
);
--proton-tab-radius: 0px;
--proton-tab-block-margin: 0px;
--inline-tab-padding: 5px;
--scrollbutton-display-model: none;
}
/* =========================================================
MULTIROW-TABS
========================================================= */
#tabbrowser-tabs{
min-height: unset !important;
padding-inline-start: 0 !important;
padding-inline-end: 0 !important;
margin-top: 1px !important;
margin-inline-end: 0 !important;
}
#tabbrowser-tabs[orient="horizontal"]{
min-height: calc(var(--multirow-tab-total-height)) !important;
justify-content: flex-start !important;
align-content: flex-start !important;
overflow: hidden !important;
}
#scrollbutton-up~spacer,
#scrollbutton-up,
#scrollbutton-down{
display: none !important;
}
scrollbox[part][orient="horizontal"],
scrollbox[part][orient="horizontal"] > slot{
display: flex !important;
flex-wrap: wrap !important;
align-content: flex-start !important;
justify-content: flex-start !important;
overflow-y: auto !important;
overflow-x: hidden !important;
max-height: calc(
(var(--multirow-tab-total-height) * var(--multirow-n-rows)) +
((var(--multirow-n-rows) - 1) * var(--multirow-row-gap))
) !important;
scrollbar-width: thin !important;
scrollbar-color: auto !important;
scrollbar-gutter: auto !important;
padding-inline-end: 0 !important;
margin-inline-end: 0 !important;
border-inline-end: 0 !important;
contain: none !important;
-moz-window-dragging: no-drag !important;
}
box.scrollbox-clip[orient="horizontal"]{
padding-inline-end: 0 !important;
margin-inline-end: 0 !important;
border-inline-end: 0 !important;
overflow: visible !important;
-moz-window-dragging: no-drag !important;
}
#tabbrowser-arrowscrollbox scrollbar,
#tabbrowser-arrowscrollbox scrollbar *{
-moz-window-dragging: no-drag !important;
}
#tabbrowser-arrowscrollbox{
overflow-y: auto !important;
overflow-x: hidden !important;
display: block !important;
scrollbar-width: thin !important;
scrollbar-color: auto !important;
scrollbar-gutter: auto !important;
padding-inline-end: 0 !important;
margin-inline-end: 0 !important;
border-inline-end: 0 !important;
-moz-window-dragging: no-drag !important;
}
#tabbrowser-arrowscrollbox-periphery{
margin: 0 !important;
padding: 0 !important;
inset-inline-end: 0 !important;
position: relative !important;
-moz-window-dragging: no-drag !important;
}
.tabbrowser-tab{
height: var(--multirow-tab-height) !important;
min-height: var(--multirow-tab-height) !important;
max-height: var(--multirow-tab-height) !important;
margin-top: var(--multirow-tab-top-margin) !important;
margin-bottom: var(--multirow-tab-bottom-margin) !important;
scroll-snap-align: start;
box-shadow: none !important;
}
#tabbrowser-tabs[orient="horizontal"] .tabbrowser-tab[movingtab]{
padding-bottom: 15px !important;
margin-bottom: -15px !important;
}
#tabbrowser-tabs .tabbrowser-tab[pinned]{
position: static !important;
margin-inline-start: 0 !important;
}
#tabbrowser-tabs[orient="horizontal"] .tabbrowser-tab[fadein]:not([pinned]){
flex: 1 1 var(--multirow-tab-min-width) !important;
min-width: var(--multirow-tab-min-width) !important;
max-width: var(--multirow-tab-max-width) !important;
width: auto !important;
}
.tabbrowser-tab > stack{
width: 100%;
height: 100%;
}
#alltabs-button,
:root:not([customizing]) #TabsToolbar #new-tab-button,
#tabbrowser-arrowscrollbox > spacer,
.tabbrowser-tab::after{
display: none !important;
}
.tab-background{
margin-block: unset !important;
}
box.scrollbox-clip[orient="horizontal"]{
display: inline !important;
}
.tab-label-container{
height: unset !important;
}
#tabbrowser-tabs[orient="horizontal"] .tab-background,
#tabbrowser-tabs[orient="horizontal"]{
min-height: unset !important;
}
tab-split-view-wrapper{
min-width: calc(var(--multirow-tab-min-width) * 2 + 6px) !important;
}
tab-group[collapsed] .tabbrowser-tab[fadein]:not([pinned]){
min-width: 0 !important;
}
/* =========================================================
TAB-STYLE
========================================================= */
#TabsToolbar .tabbrowser-tab .tab-background{
border-radius: unset !important;
margin-block: unset !important;
}
hbox.titlebar-spacer,
tabs tab:not([fadein]){
display: none !important;
}
#tabbrowser-arrowscrollbox tab.tabbrowser-tab stack.tab-stack vbox.tab-background[selected]{
min-height: var(--multirow-tab-height) !important;
max-height: var(--multirow-tab-height) !important;
background: linear-gradient(45deg, gold, #FFFAF0, beige, #FFFAF0, orange) !important;
margin-left: -2px !important;
margin-right: -2px !important;
border: 1px solid green !important;
outline: none !important;
}
#main-window .tabbrowser-tab[selected]:hover{
opacity: .5 !important;
}
.tabbrowser-tab:not([selected]){
background: linear-gradient(0.35turn, silver, white, silver) !important;
border: 1px solid grey !important;
}
.tabbrowser-tab:not([visuallyselected]):hover{
background: linear-gradient(8deg, lightblue, white, lightblue) !important;
border: 1px solid blue !important;
}
.tabbrowser-tab:not([visuallyselected]) img.tab-icon-image{
margin-top: 0px !important;
margin-left: -1px !important;
}
.tab-close-button{
fill: grey !important;
transform: scale(1.5, 1.5) !important;
display: block !important;
opacity: 0 !important;
margin-right: -7px !important;
}
.tabbrowser-tab:hover .tab-close-button{
opacity: 1 !important;
color: red !important;
background: none !important;
}
.tabbrowser-tab:not([visuallyselected]) .tab-close-button{
margin-top: -2px !important;
}
.tabbrowser-tab > .tab-stack > .tab-content > .tab-close-button{
flex-shrink: 0 !important;
width: 24px !important;
padding-inline-start: 7px !important;
width: unset !important;
}
.tab-label-container{
height: unset !important;
display: grid !important;
justify-items: safe center !important;
justify-content: safe center !important;
}
.tab-label{
justify-content: center !important;
overflow: hidden !important;
}
.tabbrowser-tab[visuallyselected] .tab-label{
color: blue !important;
font-weight: bold !important;
font-size: 1.25em !important;
font-family: "Verdana, Helvetica", serif !important;
font-style: italic !important;
padding-bottom: 0 !important;
}
.tabbrowser-tab:not([visuallyselected]) .tab-label{
color: #4a525f !important;
font-weight: 600 !important;
font-size: 1.1em !important;
padding-bottom: 0px !important;
}
.tabbrowser-tab:not([visuallyselected]):hover .tab-label{
color: brown !important;
font-weight: 700 !important;
font-size: 1.1em !important;
opacity: 1 !important;
}
.tabbrowser-tab[busy] .tab-label{
color: blue !important;
}
#nav-bar{
appearance: none !important;
background-image: none !important;
background-color: #C2D3ED !important;
border-top: 1px solid grey !important;
border-bottom: 1px solid grey !important;
box-shadow: none !important;
margin-top: 3px !important;
}
#PersonalToolbar{
margin-top: 3px !important;
}
#TabsToolbar{
margin-top: 2px !important;
margin-bottom: -1px !important;
padding-top: 0 !important;
}
#main-menubar{
margin-top: 3px !important;
}
#TabsToolbar :is(.tabs-newtab-button,#tabs-newtab-button){
min-width: 0px !important;
width: 22px !important;
height: 22px !important;
margin-top: 3px !important;
margin-left: 4px !important;
}
#TabsToolbar :is(.tabs-newtab-button,#tabs-newtab-button) .toolbarbutton-icon{
min-width: 0px !important;
min-height: 0px !important;
width: 14px !important;
height: 14px !important;
margin: 0px !important;
margin-bottom: 0px !important;
padding: 0px !important;
background: unset !important;
box-shadow: unset !important;
}
#TabsToolbar #tabs-newtab-button:hover{
background-color: #FFF !important;
padding: 0px !important;
}
#TabsToolbar #tabs-newtab-button > image{
min-height: 24px !important;
max-height: 24px !important;
min-width: 24px !important;
max-width: 24px !important;
margin-top: 1px !important;
margin-left: 0px !important;
padding: 2px !important;
fill: grey !important;
}
#TabsToolbar #tabs-newtab-button:hover > image{
fill: red !important;
}
/* =========================================================
TABLEISTEN-POSITION
========================================================= */
#navigator-toolbox{
display: flex !important;
flex-direction: column !important;
}
#toolbar-menubar{
order: 1 !important;
}
#nav-bar{
order: 2 !important;
}
#PersonalToolbar{
order: 3 !important;
}
#TabsToolbar{
order: 4 !important;
}
/* =========================================================
DND-MARKER
========================================================= */
.tabbrowser-tab[dnd-marker]{
position: relative !important;
}
.tab-dnd-marker{
position: absolute !important;
top: 6px !important;
pointer-events: none !important;
z-index: 1000 !important;
content: "" !important;
width: 14px !important;
height: 18px !important;
border-radius: 50% !important;
background:
radial-gradient(circle at center,
#00ffff 0 35%,
#1dacd6 36% 60%,
rgba(255,255,255,0) 61%) !important;
box-shadow: 0 0 3px rgba(255, 90, 82, 0.35) !important;
}
.tab-dnd-marker.left{
left: 1px !important;
top: -1px !important;
}
.tab-dnd-marker.right{
right: 1px !important;
top: -1px !important;
}
`;
const sss = Cc["@mozilla.org/content/style-sheet-service;1"]
.getService(Ci.nsIStyleSheetService);
const uri = Services.io.newURI(
"data:text/css;charset=UTF-8," + encodeURIComponent(css)
);
if (!sss.sheetRegistered(uri, sss.USER_SHEET)) {
sss.loadAndRegisterSheet(uri, sss.USER_SHEET);
}
const tabContainer = gBrowser.tabContainer;
let listenersActive = false;
let lastKnownIndex = null;
let lastGroupStart = null;
let lastGroupEnd = null;
function clearDndMarkers() {
for (const tab of gBrowser.tabs) {
tab.removeAttribute("dnd-marker");
if (tab._dndMarkerEl) {
tab._dndMarkerEl.remove();
tab._dndMarkerEl = null;
}
}
}
function setDndMarker(tab, side) {
clearDndMarkers();
if (!tab || !side) return;
tab.setAttribute("dnd-marker", side);
const marker = tab.ownerDocument.createXULElement("box");
marker.className = `tab-dnd-marker ${side}`;
if (side === "right") {
marker.style.right = `${-2 + RIGHT_MARKER_SHIFT}px`;
} else {
marker.style.left = "-2px";
}
tab.appendChild(marker);
tab._dndMarkerEl = marker;
}
function getTabFromEventTarget(event, ignoreTabSides = false) {
let { target } = event;
if (!target) return null;
if (target.nodeType !== Node.ELEMENT_NODE) {
target = target.parentElement;
}
let tab = target?.closest("tab") || target?.closest("tab-group");
const selectedTab = gBrowser.selectedTab;
if (tab && ignoreTabSides) {
const { width, height } = tab.getBoundingClientRect();
if (
event.screenX < tab.screenX + width * 0.25 ||
event.screenX > tab.screenX + width * 0.75 ||
((event.screenY < tab.screenY + height * 0.25 ||
event.screenY > tab.screenY + height * 0.75) &&
gBrowser.tabContainer.verticalMode)
) {
return selectedTab;
}
}
return tab;
}
gBrowser.tabContainer._getDropIndex = function (event) {
let tabToDropAt = getTabFromEventTarget(event, false);
if (tabToDropAt?.localName == "tab-group") {
tabToDropAt = tabToDropAt.previousSibling;
if (!tabToDropAt) {
tabToDropAt = gBrowser.visibleTabs[0];
}
}
if (!tabToDropAt) {
tabToDropAt = gBrowser.visibleTabs[gBrowser.visibleTabs.length - 1];
}
if (!tabToDropAt) {
return null;
}
const tabPos = gBrowser.tabContainer.getIndexOfItem(tabToDropAt);
const rect = tabToDropAt.getBoundingClientRect();
if (window.getComputedStyle(this).direction == "ltr") {
if (event.clientX < rect.x + rect.width / 2) {
return tabPos;
}
return tabPos + 1;
} else {
if (event.clientX > rect.x + rect.width / 2) {
return tabPos;
}
return tabPos + 1;
}
};
function orig_getDropEffectForTabDrag(event) {
const dt = event.dataTransfer;
let isMovingTabs = dt.mozItemCount > 0;
for (let i = 0; i < dt.mozItemCount; i++) {
const types = dt.mozTypesAt(0);
if (types[0] != TAB_DROP_TYPE) {
isMovingTabs = false;
break;
}
}
if (isMovingTabs) {
const sourceNode = dt.mozGetDataAt(TAB_DROP_TYPE, 0);
if (
XULElement.isInstance(sourceNode) &&
sourceNode.localName == "tab" &&
sourceNode.ownerGlobal.isChromeWindow &&
sourceNode.ownerDocument.documentElement.getAttribute("windowtype") == "navigator:browser" &&
sourceNode.ownerGlobal.gBrowser.tabContainer == sourceNode.container
) {
if (
PrivateBrowsingUtils.isWindowPrivate(window) !=
PrivateBrowsingUtils.isWindowPrivate(sourceNode.ownerGlobal)
) {
return "none";
}
if (window.gMultiProcessBrowser != sourceNode.ownerGlobal.gMultiProcessBrowser) {
return "none";
}
if (window.gFissionBrowser != sourceNode.ownerGlobal.gFissionBrowser) {
return "none";
}
return dt.dropEffect == "copy" ? "copy" : "move";
}
}
if (Services.droppedLinkHandler.canDropLink(event, true)) {
return "link";
}
return "none";
}
function getMarkerInfo(event) {
let tabToDropAt = getTabFromEventTarget(event, false);
if (tabToDropAt?.localName == "tab-group") {
tabToDropAt = tabToDropAt.previousSibling;
if (!tabToDropAt) {
tabToDropAt = gBrowser.visibleTabs[0];
}
}
if (!tabToDropAt) {
const lastTab = gBrowser.visibleTabs[gBrowser.visibleTabs.length - 1];
return { tab: lastTab, side: "right" };
}
const rect = tabToDropAt.getBoundingClientRect();
const ltr = window.getComputedStyle(gBrowser.tabContainer).direction == "ltr";
const side = ltr
? (event.clientX < rect.x + rect.width / 2 ? "left" : "right")
: (event.clientX > rect.x + rect.width / 2 ? "left" : "right");
return { tab: tabToDropAt, side };
}
function performTabDragOver(event) {
const effects = orig_getDropEffectForTabDrag(event);
if (effects == "none" || effects == "link") {
clearDndMarkers();
return;
}
event.preventDefault();
event.stopPropagation();
const tab = getTabFromEventTarget(event, true);
if (tab && tab.nodeName == "tab-group" && !lastGroupStart) {
const first = tab.querySelector("tab:first-of-type");
const last = tab.querySelector("tab:last-of-type");
if (first && last) {
lastGroupStart = first._tPos;
lastGroupEnd = last._tPos;
}
}
const newIndex = gBrowser.tabContainer._getDropIndex(event);
if (newIndex == null) {
clearDndMarkers();
return;
}
lastKnownIndex = newIndex;
const markerInfo = getMarkerInfo(event);
setDndMarker(markerInfo.tab, markerInfo.side);
}
function performTabDropEvent(event) {
clearDndMarkers();
const dt = event.dataTransfer;
const dropEffect = dt.dropEffect;
let draggedTab;
if (dt.mozTypesAt(0)[0] == TAB_DROP_TYPE) {
draggedTab = dt.mozGetDataAt(TAB_DROP_TYPE, 0);
if (!draggedTab) return;
}
if (draggedTab && dropEffect != "copy" && draggedTab.container == gBrowser.tabContainer) {
let newIndex = gBrowser.tabContainer._getDropIndex(event);
if (newIndex == null) return;
const selectedTabs = gBrowser.selectedTabs.length > 1 ? gBrowser.selectedTabs : [draggedTab];
let tabToMoveAt = gBrowser.tabContainer.getItemAtIndex(newIndex);
const tab = getTabFromEventTarget(event, false);
const tabgroup = tab?.closest("tab-group");
if (!tab) {
newIndex = gBrowser.tabs.length;
tabToMoveAt = null;
}
if (tabgroup && !tab.previousSibling) {
newIndex = 0;
selectedTabs.forEach(t => {
gBrowser.moveTabTo(t, { tabIndex: newIndex++, forceUngrouped: true });
});
} else if (
!tab ||
(!tabgroup && !tabToMoveAt?.group) ||
(tabgroup && tabToMoveAt?.group)
) {
selectedTabs.forEach(t => {
gBrowser.moveTabBefore(t, tabToMoveAt);
});
} else {
tabToMoveAt = gBrowser.tabContainer.getItemAtIndex(newIndex - 1);
selectedTabs.forEach(t => {
gBrowser.moveTabAfter(t, tabToMoveAt);
});
}
lastKnownIndex = null;
lastGroupStart = null;
lastGroupEnd = null;
}
}
tabContainer.addEventListener("dragstart", () => {
if (!listenersActive) {
tabContainer.on_dragover = e => performTabDragOver(e);
tabContainer._onDragOver = e => performTabDragOver(e);
tabContainer.ondrop = e => performTabDropEvent(e);
tabContainer.addEventListener("dragend", clearDndMarkers, true);
tabContainer.addEventListener("drop", clearDndMarkers, true);
listenersActive = true;
}
});
}
Alles anzeigen
Das Script für Drag&Drop aus diesem Beitrag #1116 erhält hiermit ein Update. Es funktionierten die Abstände der Marker nicht richtig, was hiermit korrigiert wird. Im oberen Teil ist jetzt außerdem ein Settings-Modul eingebaut, von dem aus die Abstände der Marker eingestellt werden können.
....das Script für Drag&Drop (Update):
// ==UserScript==
// @name TabMoveOnly.uc.js
// @namespace local
// @description Nur das Verschieben von Tabs per Drag & Drop
// @include main
// @compatibility Firefox138+
// @version 2026-03-24
// ==/UserScript==
"use strict";
TabMoveOnly();
function TabMoveOnly() {
if (!window.gBrowser) return;
const TAB_DROP_TYPE = window.TAB_DROP_TYPE || "application/x-moz-tabbrowser-tab";
// =========================================================
// FEINEINSTELLUNGEN FÜR DIE MARKER
// =========================================================
// Links: Marker horizontal verschieben in px
const LEFT_MARKER_SHIFT = 0;
// Rechts: Marker horizontal verschieben in px
const RIGHT_MARKER_SHIFT = 0;
// Marker vertikal leicht nach oben/unten korrigieren in px
const MARKER_TOP = -1;
// =========================================================
// MARKER-CSS
// =========================================================
const css = `
.tabbrowser-tab[dnd-marker]{
position: relative !important;
}
.tab-dnd-marker{
position: absolute !important;
pointer-events: none !important;
z-index: 1000 !important;
content: "" !important;
width: 14px !important;
height: 18px !important;
border-radius: 50% !important;
background:
radial-gradient(circle at center,
#00ffff 0 35%,
#1dacd6 36% 60%,
rgba(255,255,255,0) 61%) !important;
box-shadow: 0 0 3px rgba(255, 90, 82, 0.35) !important;
}
`;
// =========================================================
// CSS EINBINDEN
// =========================================================
const sss = Cc["@mozilla.org/content/style-sheet-service;1"]
.getService(Ci.nsIStyleSheetService);
const uri = Services.io.newURI(
"data:text/css;charset=UTF-8," + encodeURIComponent(css)
);
if (!sss.sheetRegistered(uri, sss.USER_SHEET)) {
sss.loadAndRegisterSheet(uri, sss.USER_SHEET);
}
const tabContainer = gBrowser.tabContainer;
// Listener nur einmal aktivieren
let listenersActive = false;
// Reserviert für Gruppen-/Drop-Zustand
let lastGroupStart = null;
let lastGroupEnd = null;
// =========================================================
// MARKER-VERWALTUNG
// =========================================================
function clearDndMarkers() {
for (const tab of gBrowser.tabs) {
tab.removeAttribute("dnd-marker");
tab.style.removeProperty("--tab-dnd-marker-top");
if (tab._dndMarkerEl) {
tab._dndMarkerEl.remove();
tab._dndMarkerEl = null;
}
}
}
function setDndMarker(tab, side) {
clearDndMarkers();
if (!tab || !side) return;
// Nur zur Erkennung / CSS-Selektoren
tab.setAttribute("dnd-marker", side);
// Vertikale Feinkorrektur als Variable direkt am Tab
tab.style.setProperty("--tab-dnd-marker-top", `${MARKER_TOP}px`);
// Echtes Marker-Element, damit dein CSS sicher greift
const marker = tab.ownerDocument.createXULElement("box");
marker.className = `tab-dnd-marker ${side}`;
// Horizontale Feineinstellung pro Seite
if (side === "left") {
marker.style.setProperty("left", `${1 + LEFT_MARKER_SHIFT}px`, "important");
} else if (side === "right") {
marker.style.setProperty("right", `${1 + RIGHT_MARKER_SHIFT}px`, "important");
}
tab.appendChild(marker);
tab._dndMarkerEl = marker;
}
// =========================================================
// HILFSFUNKTIONEN FÜR TAB / DROP
// =========================================================
function getTabFromEventTarget(event, ignoreTabSides = false) {
let { target } = event;
if (!target) return null;
if (target.nodeType !== Node.ELEMENT_NODE) {
target = target.parentElement;
}
let tab = target?.closest("tab") || target?.closest("tab-group");
const selectedTab = gBrowser.selectedTab;
// Falls der Cursor nur im Randbereich ist, nimm den aktuell ausgewählten Tab
if (tab && ignoreTabSides) {
const { width, height } = tab.getBoundingClientRect();
if (
event.screenX < tab.screenX + width * 0.25 ||
event.screenX > tab.screenX + width * 0.75 ||
((event.screenY < tab.screenY + height * 0.25 ||
event.screenY > tab.screenY + height * 0.75) &&
gBrowser.tabContainer.verticalMode)
) {
return selectedTab;
}
}
return tab;
}
// Firefox-interne Drop-Index-Berechnung für Multirow / normales Tab-Layout
gBrowser.tabContainer._getDropIndex = function (event) {
let tabToDropAt = getTabFromEventTarget(event, false);
if (tabToDropAt?.localName == "tab-group") {
tabToDropAt = tabToDropAt.previousSibling;
if (!tabToDropAt) {
tabToDropAt = gBrowser.visibleTabs[0];
}
}
if (!tabToDropAt) {
tabToDropAt = gBrowser.visibleTabs[gBrowser.visibleTabs.length - 1];
}
if (!tabToDropAt) return null;
const tabPos = gBrowser.tabContainer.getIndexOfItem(tabToDropAt);
const rect = tabToDropAt.getBoundingClientRect();
const ltr = window.getComputedStyle(this).direction == "ltr";
if (ltr) {
return event.clientX < rect.x + rect.width / 2 ? tabPos : tabPos + 1;
}
return event.clientX > rect.x + rect.width / 2 ? tabPos : tabPos + 1;
};
// Prüft, ob der Drag wirklich ein Tab-Drag ist
function orig_getDropEffectForTabDrag(event) {
const dt = event.dataTransfer;
let isMovingTabs = dt.mozItemCount > 0;
for (let i = 0; i < dt.mozItemCount; i++) {
const types = dt.mozTypesAt(0);
if (types[0] != TAB_DROP_TYPE) {
isMovingTabs = false;
break;
}
}
if (isMovingTabs) {
const sourceNode = dt.mozGetDataAt(TAB_DROP_TYPE, 0);
if (
XULElement.isInstance(sourceNode) &&
sourceNode.localName == "tab" &&
sourceNode.ownerGlobal.isChromeWindow &&
sourceNode.ownerDocument.documentElement.getAttribute("windowtype") == "navigator:browser" &&
sourceNode.ownerGlobal.gBrowser.tabContainer == sourceNode.container
) {
if (
PrivateBrowsingUtils.isWindowPrivate(window) !=
PrivateBrowsingUtils.isWindowPrivate(sourceNode.ownerGlobal)
) {
return "none";
}
if (window.gMultiProcessBrowser != sourceNode.ownerGlobal.gMultiProcessBrowser) return "none";
if (window.gFissionBrowser != sourceNode.ownerGlobal.gFissionBrowser) return "none";
return dt.dropEffect == "copy" ? "copy" : "move";
}
}
if (Services.droppedLinkHandler.canDropLink(event, true)) return "link";
return "none";
}
function getMarkerInfo(event) {
let tabToDropAt = getTabFromEventTarget(event, false);
if (tabToDropAt?.localName == "tab-group") {
tabToDropAt = tabToDropAt.previousSibling;
if (!tabToDropAt) {
tabToDropAt = gBrowser.visibleTabs[0];
}
}
if (!tabToDropAt) {
const lastTab = gBrowser.visibleTabs[gBrowser.visibleTabs.length - 1];
return { tab: lastTab, side: "right" };
}
const rect = tabToDropAt.getBoundingClientRect();
const ltr = window.getComputedStyle(gBrowser.tabContainer).direction == "ltr";
const side = ltr
? (event.clientX < rect.x + rect.width / 2 ? "left" : "right")
: (event.clientX > rect.x + rect.width / 2 ? "left" : "right");
return { tab: tabToDropAt, side };
}
// =========================================================
// DRAG OVER
// =========================================================
function performTabDragOver(event) {
const effects = orig_getDropEffectForTabDrag(event);
// Nur echte Tab-Drags zulassen
if (effects == "none" || effects == "link") {
clearDndMarkers();
return;
}
event.preventDefault();
event.stopPropagation();
const tab = getTabFromEventTarget(event, true);
// Kleine Starthilfe für Gruppen-Merker
if (tab && tab.nodeName == "tab-group" && !lastGroupStart) {
const first = tab.querySelector("tab:first-of-type");
const last = tab.querySelector("tab:last-of-type");
if (first && last) {
lastGroupStart = first._tPos;
lastGroupEnd = last._tPos;
}
}
const newIndex = gBrowser.tabContainer._getDropIndex(event);
if (newIndex == null) {
clearDndMarkers();
return;
}
const markerInfo = getMarkerInfo(event);
setDndMarker(markerInfo.tab, markerInfo.side);
}
// =========================================================
// DROP
// =========================================================
function performTabDropEvent(event) {
clearDndMarkers();
const dt = event.dataTransfer;
const dropEffect = dt.dropEffect;
let draggedTab;
if (dt.mozTypesAt(0)[0] == TAB_DROP_TYPE) {
draggedTab = dt.mozGetDataAt(TAB_DROP_TYPE, 0);
if (!draggedTab) return;
}
if (draggedTab && dropEffect != "copy" && draggedTab.container == gBrowser.tabContainer) {
let newIndex = gBrowser.tabContainer._getDropIndex(event);
if (newIndex == null) return;
const selectedTabs = gBrowser.selectedTabs.length > 1 ? gBrowser.selectedTabs : [draggedTab];
let tabToMoveAt = gBrowser.tabContainer.getItemAtIndex(newIndex);
const tab = getTabFromEventTarget(event, false);
const tabgroup = tab?.closest("tab-group");
if (!tab) {
newIndex = gBrowser.tabs.length;
tabToMoveAt = null;
}
if (tabgroup && !tab.previousSibling) {
newIndex = 0;
selectedTabs.forEach(t => {
gBrowser.moveTabTo(t, { tabIndex: newIndex++, forceUngrouped: true });
});
} else if (
!tab ||
(!tabgroup && !tabToMoveAt?.group) ||
(tabgroup && tabToMoveAt?.group)
) {
selectedTabs.forEach(t => {
gBrowser.moveTabBefore(t, tabToMoveAt);
});
} else {
tabToMoveAt = gBrowser.tabContainer.getItemAtIndex(newIndex - 1);
selectedTabs.forEach(t => {
gBrowser.moveTabAfter(t, tabToMoveAt);
});
}
lastGroupStart = null;
lastGroupEnd = null;
}
}
// =========================================================
// EINMALIGE INITIALISIERUNG
// =========================================================
tabContainer.addEventListener("dragstart", () => {
if (listenersActive) return;
tabContainer.on_dragover = e => performTabDragOver(e);
tabContainer._onDragOver = e => performTabDragOver(e);
tabContainer.ondrop = e => performTabDropEvent(e);
tabContainer.addEventListener("dragend", clearDndMarkers, true);
tabContainer.addEventListener("drop", clearDndMarkers, true);
listenersActive = true;
});
}
Alles anzeigen
hat funktioniert - vielen Dank
Freut mich!![]()
eine Frage - wo kann ich einstellen dass wenn ich einen neuen link aufrufe entweder auf der seite wo ich bin oder von meiner lesezeichenleiste - das dieser dann am ende geöffnet wird und nicht direkt neben dem tab den ic hgerade offen habe ?
Teste mal Folgendes: In die Adressleiste about:config eingeben, mit Enter bestätigen und Sicherheitshinweis beachten. Oben dann das : browser.tabs.insertAfterCurrent , müsste dort auf true stehen. Diesen Wert auf false setzen, und speichern. Firefox dann neu starten. Merke dir die Änderung, damit du sie notfalls wieder auf den Standardwert zurück stellen kannst.
aber die Button: Schließen etc. sind damit wieder in der Tableiste dann:
Hmmm, bei mir nur New-Tab- und All-Tabs-Button.
Steht aber nicht mehr zur Debatte.
Evtl. so:
So sollte es auch gehen.
Nur mal aus Neugierde naiv gefragt: Dieses CSS von MrOtherGuy erlaubt das Verschieben von Tabs nicht, was wohl JS benötigt.
Du kannst dir das ja mal anschauen, denn den css-Code von ihm (?) habe ich auch verändert. Zum Verschieben in Verbindung mit dem Script aus #1116.
/* =========================================================
GRUNDEINSTELLUNGEN
========================================================= */
:root{
--multirow-n-rows: 2; /* Maximale Anzahl sichtbarer Reihen */
--multirow-tab-min-width: 250px; /* Kleinste Tab-Breite */
--multirow-tab-max-width: 350px; /* Größte Tab-Breite */
--multirow-tab-height: 27px; /* Sichtbare Tab-Höhe */
--multirow-tab-top-margin: 0px; /* Oberer Abstand pro Tab */
--multirow-tab-bottom-margin: 0px; /* Unterer Abstand pro Tab */
--multirow-row-gap: 2px; /* Abstand zwischen Reihen */
--multirow-tab-total-height: calc(
var(--multirow-tab-height) +
var(--multirow-tab-top-margin) +
var(--multirow-tab-bottom-margin)
);
--proton-tab-radius: 0px;
--proton-tab-block-margin: 0px;
--inline-tab-padding: 5px;
--scrollbutton-display-model: none;
}
/* =========================================================
MULTIROW-TABS
========================================================= */
#tabbrowser-tabs{
min-height: unset !important;
padding-inline-start: 0 !important;
padding-inline-end: 0 !important;
margin-top: 1px !important;
margin-inline-end: 0 !important;
}
#tabbrowser-tabs[orient="horizontal"]{
min-height: calc(var(--multirow-tab-total-height)) !important;
justify-content: flex-start !important;
align-content: flex-start !important;
overflow: hidden !important;
}
@-moz-document url(chrome://browser/content/browser.xhtml){
/* Firefox-interne Scrollbuttons ausblenden */
#scrollbutton-up~spacer,
#scrollbutton-up,
#scrollbutton-down{
display: none !important;
}
/* Entscheidender Multirow-Block */
scrollbox[part][orient="horizontal"],
scrollbox[part][orient="horizontal"] > slot{
display: flex !important;
flex-wrap: wrap !important;
align-content: flex-start !important;
justify-content: flex-start !important;
overflow-y: auto !important;
overflow-x: hidden !important;
max-height: calc(
(var(--multirow-tab-total-height) * var(--multirow-n-rows)) +
((var(--multirow-n-rows) - 1) * var(--multirow-row-gap))
) !important;
scrollbar-width: thin !important;
scrollbar-color: auto !important;
scrollbar-gutter: auto !important;
padding-inline-end: 0 !important;
margin-inline-end: 0 !important;
border-inline-end: 0 !important;
contain: none !important;
-moz-window-dragging: no-drag !important;
}
/* Clip-Wrapper ebenfalls ohne rechten Versatz */
box.scrollbox-clip[orient="horizontal"]{
padding-inline-end: 0 !important;
margin-inline-end: 0 !important;
border-inline-end: 0 !important;
overflow: visible !important;
-moz-window-dragging: no-drag !important;
}
/* Scrollbar selbst nicht als Fensterzugfläche behandeln */
#tabbrowser-arrowscrollbox scrollbar,
#tabbrowser-arrowscrollbox scrollbar *{
-moz-window-dragging: no-drag !important;
}
}
#tabbrowser-arrowscrollbox{
overflow-y: auto !important;
overflow-x: hidden !important;
display: block !important;
scrollbar-width: thin !important;
scrollbar-color: auto !important;
scrollbar-gutter: auto !important;
padding-inline-end: 0 !important;
margin-inline-end: 0 !important;
border-inline-end: 0 !important;
-moz-window-dragging: no-drag !important;
}
#tabbrowser-arrowscrollbox-periphery{
margin: 0 !important;
padding: 0 !important;
inset-inline-end: 0 !important;
position: relative !important;
-moz-window-dragging: no-drag !important;
}
.tabbrowser-tab{
height: var(--multirow-tab-height) !important;
min-height: var(--multirow-tab-height) !important;
max-height: var(--multirow-tab-height) !important;
margin-top: var(--multirow-tab-top-margin) !important;
margin-bottom: var(--multirow-tab-bottom-margin) !important;
scroll-snap-align: start;
box-shadow: none !important;
}
/* Drag-Verhalten sauber halten */
#tabbrowser-tabs[orient="horizontal"] .tabbrowser-tab[movingtab]{
padding-bottom: 15px !important;
margin-bottom: -15px !important;
}
/* Angeheftete Tabs */
#tabbrowser-tabs .tabbrowser-tab[pinned]{
position: static !important;
margin-inline-start: 0 !important;
}
/* Normale Tabs: Breite */
#tabbrowser-tabs[orient="horizontal"] .tabbrowser-tab[fadein]:not([pinned]){
flex: 1 1 var(--multirow-tab-min-width) !important;
min-width: var(--multirow-tab-min-width) !important;
max-width: var(--multirow-tab-max-width) !important;
width: auto !important;
}
/* Inhalt füllt den Tab */
.tabbrowser-tab > stack{
width: 100%;
height: 100%;
}
/* Buttons und Störer ausblenden */
#alltabs-button,
:root:not([customizing]) #TabsToolbar #new-tab-button,
#tabbrowser-arrowscrollbox > spacer,
.tabbrowser-tab::after{
display: none !important;
}
/* Allgemeine Tabflächen */
.tab-background{
margin-block: unset !important;
}
box.scrollbox-clip[orient="horizontal"]{
display: inline !important;
}
.tab-label-container{
height: unset !important;
}
#tabbrowser-tabs[orient="horizontal"] .tab-background,
#tabbrowser-tabs[orient="horizontal"]{
min-height: unset !important;
}
/* Optional: Split-View */
tab-split-view-wrapper{
min-width: calc(var(--multirow-tab-min-width) * 2 + 6px) !important;
}
/* Optional: Tab-Gruppen */
tab-group[collapsed] .tabbrowser-tab[fadein]:not([pinned]){
min-width: 0 !important;
}
/* =========================================================
TAB-STYLE
Zweck:
- Optische Gestaltung der Tabs
- Farben, Hover, Schrift und Toolbar-Abstände
========================================================= */
/* Tabs ohne Radius */
#TabsToolbar .tabbrowser-tab .tab-background{
border-radius: unset !important;
margin-block: unset !important;
}
/* Nicht sichtbare Tabs / rechter Abschluss */
hbox.titlebar-spacer,
tabs tab:not([fadein]){
display: none !important;
}
/* Aktiver Tab */
#tabbrowser-arrowscrollbox tab.tabbrowser-tab stack.tab-stack vbox.tab-background[selected]{
min-height: var(--multirow-tab-height) !important;
max-height: var(--multirow-tab-height) !important;
background: linear-gradient(45deg, gold, #FFFAF0, beige, #FFFAF0, orange) !important;
margin-left: -2px !important;
margin-right: -2px !important;
border: 1px solid green !important;
outline: none !important;
}
/* Aktiver Tab bei Hover dunkler */
#main-window .tabbrowser-tab[selected]:hover{
opacity: .5 !important;
}
/* Inaktiver Tab */
.tabbrowser-tab:not([selected]){
background: linear-gradient(0.35turn, silver, white, silver) !important;
border: 1px solid grey !important;
}
/* Inaktiver Tab bei Hover */
.tabbrowser-tab:not([visuallyselected]):hover{
background: linear-gradient(8deg, lightblue, white, lightblue) !important;
border: 1px solid blue !important;
}
/* Favicon */
.tabbrowser-tab:not([visuallyselected]) img.tab-icon-image{
margin-top: 0px !important;
margin-left: -1px !important;
}
/* Schließen-Button standardmäßig unsichtbar */
.tab-close-button{
fill: grey !important;
transform: scale(1.5, 1.5) !important;
display: block !important;
opacity: 0 !important;
margin-right: -7px !important;
}
/* Schließen-Button nur bei Hover sichtbar */
.tabbrowser-tab:hover .tab-close-button{
opacity: 1 !important;
color: red !important;
background: none !important;
}
/* Schließen-Button bei inaktiven Tabs leicht verschieben */
.tabbrowser-tab:not([visuallyselected]) .tab-close-button{
margin-top: -2px !important;
}
/* Schließen-Button Position im Tab */
.tabbrowser-tab > .tab-stack > .tab-content > .tab-close-button{
flex-shrink: 0 !important;
width: 24px !important;
padding-inline-start: 7px !important;
width: unset !important;
}
/* Tabtext zentrieren */
.tab-label-container{
height: unset !important;
display: grid !important;
justify-items: safe center !important;
justify-content: safe center !important;
}
.tab-label{
justify-content: center !important;
overflow: hidden !important;
}
/* Schrift aktiver Tab */
.tabbrowser-tab[visuallyselected] .tab-label{
color: blue !important;
font-weight: bold !important;
font-size: 1.25em !important;
font-family: "Verdana, Helvetica", serif !important;
font-style: italic !important;
padding-bottom: 0 !important;
}
/* Schrift inaktiver Tab */
.tabbrowser-tab:not([visuallyselected]) .tab-label{
color: #4a525f !important;
font-weight: 600 !important;
font-size: 1.1em !important;
padding-bottom: 0px !important;
}
/* Inaktiver Tab bei Hover */
.tabbrowser-tab:not([visuallyselected]):hover .tab-label{
color: brown !important;
font-weight: 700 !important;
font-size: 1.1em !important;
opacity: 1 !important;
}
/* Tabtext beim Laden blau */
.tabbrowser-tab[busy] .tab-label{
color: blue !important;
}
/* Nav-Bar mit Hintergrund und Rand */
#nav-bar{
appearance: none !important;
background-image: none !important;
background-color: #C2D3ED !important;
border-top: 1px solid grey !important;
border-bottom: 1px solid grey !important;
box-shadow: none !important;
margin-top: 3px !important;
}
/* Abstand Lesezeichen-Symbolleiste zur URL-Bar */
#PersonalToolbar{
margin-top: 3px !important;
}
/* Abstand TabsToolbar zur Menü-Bar / Personal-Toolbar */
#TabsToolbar{
margin-top: 2px !important;
margin-bottom: -1px !important;
padding-top: 0 !important;
}
/* Menubar-Anpassung */
#main-menubar{
margin-top: 3px !important;
}
/*===== New-Tab-Button =====*/
/* Zeilen 126 und 127 auskommentiert */
/* Weite für newtab-button */
#TabsToolbar :is(.tabs-newtab-button,#tabs-newtab-button){
min-width: 0px !important;
width: 22px !important;
height: 22px !important;
margin-top: 3px !important;
margin-left: 4px !important;
}
/* Größe des neuen Tab-Tabs „+“-Symbol */
#TabsToolbar :is(.tabs-newtab-button,#tabs-newtab-button) .toolbarbutton-icon{
min-width: 0px !important;
min-height: 0px !important;
width: 14px !important;
height: 14px !important;
margin: 0px !important;
margin-bottom: 0px !important;
padding: 0px !important;
background: unset !important;
box-shadow: unset !important;
}
#TabsToolbar #tabs-newtab-button:hover {
background-color: #FFF !important;
padding: 0px !important;
}
/* das Plus-Zeichen */
#TabsToolbar #tabs-newtab-button > image {
min-height: 24px !important;
max-height: 24px !important;
min-width: 24px !important;
max-width: 24px !important;
margin-top: 1px !important;
margin-left: 0px !important;
padding: 2px !important;
fill: grey !important;
}
#TabsToolbar #tabs-newtab-button:hover > image {
fill: red !important;
}
/*===== New-Tab-Button ** ENDE =====*/
/* ==================================================================
TABLEISTEN-POSITION
Zweck:
- order 1: oben über der Menüleiste
- order 2: unter der Menüleiste
- order 3: unter der Navigationsleiste
- order 4: unter der Personal-Symbolleiste
Hinweis:
- Immer alle vier Leisten zusammen anpassen (keine doppelte order)
================================================================= */
/* Navigator-Toolbox als Flexcontainer sicherstellen */
#navigator-toolbox {
display: flex !important;
flex-direction: column !important;
}
/* Menüleiste */
#toolbar-menubar {
order: 1 !important;
}
/* Navigationsleiste */
#nav-bar {
order: 2 !important;
}
/* Lesezeichen-Symbolleiste */
#PersonalToolbar {
order: 3 !important;
}
/* Tableiste */
#TabsToolbar {
order: 4 !important;
}
Alles anzeigen
Readme habe ich auch einen kleinen gemacht.
Habe mir Dein Bild von oben ausgeliehen.
Prima, eventuell findet es Anhänger. Es gehört hier sicherlich nicht her, aber weil wir schon mal bei der MultiRow-Thematik sind, hier eine weitere Variante. Das Script ist vom Ursprung her allgemein bekannt, ich habe einige Änderungen gemacht, den ganzen Drag&Drop-Code entfernt (funktionierte nicht mehr), sowie das Verschieben der Tabs wieder aktiviert. Für Drag&Drop habe ich mit KI ein neues Script erstellt, dass jetzt die Marker beim Verschieben der Tabs setzt. Kann also gemeinsam mit dem MultiRow-Script genutzt werden, wenn Wert darauf gelegt wird. Auch lege ich eine css-Datei bei, die auf das Script abgestimmt ist (wenn Bedarf besteht).
.....MultiRow-Script:
// ==UserScript==
// @name MultiRowNew@Fu.uc.js
// @namespace Based on Alice0775's zzzz-MultiRowTab_LiteforFx48.uc.js
// @description Mehrzeilige Tab-Leiste
// @include main
// @compatibility Firefox 148+
// @version 2026/03/14 14:45
// ==/UserScript==
"use strict";
MultiRowTabLiteForFx();
function MultiRowTabLiteForFx() {
if (!window.gBrowser) { return; }
// -- Einstellungen --
// Hinweis: Wenn du ähnliche CSS-Regeln in „userChrome.css“ definiert hast,
// haben diese dort Vorrang vor diesem Script.
const
// Mehrzeilige Tabs An/Aus und Anzahl der Tabzeilen
MultiRowTab_OnOff_and_TabBar_Rows = 3, // [-1] = Mehrzeilige Tabs an, unbegrenzte Zeilen
// 0 = Mehrzeilige Tabs aus (Standard-Einzeilig)
// 1 = Mehrzeilige Tabs an, i.d.R. 1 Zeile,
// weitere Zeilen nur bei Mausüberfahrt (Mouseover).
// Anzahl dieser Zeilen stellst du über „TabBar_Rows_on_MouseOver“ ein.
// 2+ = Mehrzeilige Tabs an, feste Anzahl Zeilen
// Wenn „MultiRowTab_OnOff_and_TabBar_Rows = 1“:
// Anzahl der Zeilen, die bei Mouseover eingeblendet werden sollen.
TabBar_Rows_on_MouseOver = 3,
// Wie lange (in Sekunden) die zusätzlichen Zeilen nach Mouseover sichtbar bleiben,
// bevor wieder auf 1 Zeile zurückgewechselt wird.
TabBar_DisplayTime_on_MouseOver = 1,
// Position der Tab-Leiste
TabBar_Position = 1, // [0] = Oberhalb der Werkzeugleisten (Standard)
// 1 = Unterhalb der Werkzeugleisten
// 2 = Unterhalb des Seiteninhalts
// Wenn „TabBar_Position = 1“:
// Reihenfolge von Tab-Leiste und Lesezeichen-Symbolleiste tauschen?
Bookmark_Toolbar_Position = true, // [true] = Menüleiste, Navigationsleiste, Lesezeichenleiste, Tab-Leiste
// false = Menüleiste, Navigationsleiste, Tab-Leiste, Lesezeichenleiste
// Tab-Höhe je nach UI-Dichte
UI_Density_Compact = 25, // Standard: 29px (Kompakt)
UI_Density_Normal = 25, // Standard: 36px (Normal)
UI_Density_Touch = 25, // Standard: 41px (Touch)
// Minimale und maximale Tab-Breite
Tab_Min_Width = 250, // Standard: 76px (Minimum)
Tab_Max_Width = 350, // Standard: 225px (Maximum)
// Wenn beide Werte identisch sind, ist die Tabbreite strikt fixiert.
// Verhalten des Tab-Schließen-Buttons
Tab_Close_Button = 3, // [0] = Firefox-Standard
// 1 = Schließen-Button ausblenden
// 2 = Auf allen Tabs anzeigen
// 3 = Nur bei Mausüberfahrt anzeigen
// 4 = Aktiver Tab: immer anzeigen,
// inaktiver Tab: nur bei Mausüberfahrt anzeigen
// (Standard im vertikalen Tab-Modus)
// Vertikale Trennerlinien zwischen Tabs
Tab_Separators = false, // [false] = Keine Trenner
// true = Trenner anzeigen (ähnlich Firefox ≤ 90)
// Titelleisten-Buttons [− □ ×] ausblenden und Platz der Tab-Leiste zuschlagen
// Vorbedingung: „TabBar_Position = 0“
TitleBar_Button_Autohide = false, // [false] = Nicht verwenden
// true = Buttons werden i.d.R. verkleinert/transparent,
// Mouseover im Trigger-Bereich zeigt sie wieder an.
// Anzeigedauer (Sekunden) der eingeblendeten Titelleisten-Buttons
TitleBar_Button_DisplayTime = 0.6,
// Tab-Leiste direkt von Anfang an auf eine bestimmte Zeilenhöhe setzen
// Vorbedingung: „MultiRowTab_OnOff_and_TabBar_Rows >= 2“
Set_the_TabBar_to_the_Specified_Height = false, // [false] = Nicht verwenden
// true = Tab-Leiste immer mit der angegebenen Zeilenanzahl
// Position der angehefteten (Pinned) Tabs
// Vorbedingung: „MultiRowTab_OnOff_and_TabBar_Rows != 0“
Separate_Tabs_and_PinnedTabs = false, // [false] = Standard (Pinned-Tabs in der gleichen Zeile)
// true = Pinned-Tabs in eine „eigene“ obere Zeile auslagern
// Breite der Pinned-Tabs anpassbar machen
// Vorbedingung: „Separate_Tabs_and_PinnedTabs = true“
PinnedTab_Width = false, // [false] = Standardbreite für Pinned-Tabs
// true = Pinned-Tabs wie normale Tabs skalierbar
PinnedTab_Min_Width = 40, // Minimalbreite Pinned-Tabs
PinnedTab_Max_Width = 40, // Maximalbreite Pinned-Tabs
// identische Werte → feste Breite
// Schließen-Button auf Pinned-Tabs
// Vorbedingung: „Separate_Tabs_and_PinnedTabs = true“
PinnedTab_Close_Button = 2, // [0] = Standard
// 1 = Auf allen Pinned-Tabs anzeigen
// 2 = Nur bei Mausüberfahrt anzeigen
// 3 = Aktiver Pinned-Tab: immer anzeigen,
// inaktive: bei Mausüberfahrt
// Drag-Bereiche links/rechts neben der Tab-Leiste
Left_Drag_Area = 0, // Standard: 40px (links)
Right_Drag_Area = 0, // Standard: 40px (rechts)
Maximize_Left_Drag_Area = false, // [false] = Standard
// true = Linker Drag-Bereich bleibt auch im maximierten Fenster sichtbar
Fullscreen_Drag_Area = false; // [false] = Standard
// true = Drag-Bereiche auch im Vollbild anzeigen
// Hinweis: Mit sichtbarer Titelleiste funktionieren
// „.titlebar-spacer“ nicht als Drag-Bereich.
// -- Einstellungen ENDE --
let css = `
#TabsToolbar:not([collapsed="true"]) {
:root[uidensity="compact"] & {
--tab-min-height: ${UI_Density_Compact}px;
}
:root:not([uidensity]) & {
--tab-min-height: ${UI_Density_Normal}px;
}
:root[uidensity="touch"] & {
--tab-min-height: ${UI_Density_Touch}px;
}
/* ‚Alle Tabs‘-Button rechts ausblenden */
#alltabs-button {
display: none !important;
}
#tabbrowser-tabs {
min-height: var(--tab-min-height);
${MultiRowTab_OnOff_and_TabBar_Rows != 0 ? `
&[overflow] {
padding-inline: 0 !important;
& > #tabbrowser-arrowscrollbox {
& > .tabbrowser-tab[pinned] {
display: flex;
margin-inline-start: 0 !important;
position: static !important;
}
&::part(scrollbox) {
padding-inline: 0;
}
}
& + #new-tab-button {
display: none;
}
}
#tabbrowser-arrowscrollbox {
&::part(scrollbox) {
& > slot {
flex-wrap: wrap;
}
${MultiRowTab_OnOff_and_TabBar_Rows != -1 ? `
${MultiRowTab_OnOff_and_TabBar_Rows == 1 ? `
${TabBar_Rows_on_MouseOver == 0 || TabBar_Rows_on_MouseOver == 1 ? `
max-height: calc(var(--tab-min-height) * 2);
` : `
max-height: calc(var(--tab-min-height) * ${TabBar_Rows_on_MouseOver});
`}
&:not(:hover) {
max-height: var(--tab-min-height) !important;
scrollbar-width: none;
transition: all 0s ease-in-out ${TabBar_DisplayTime_on_MouseOver}s;
}
` : `
${Set_the_TabBar_to_the_Specified_Height ? `
min-height: calc(var(--tab-min-height) * ${MultiRowTab_OnOff_and_TabBar_Rows});
& > slot {
max-height: var(--tab-min-height);
}
` : `
max-height: calc(var(--tab-min-height) * ${MultiRowTab_OnOff_and_TabBar_Rows});
`}
`}
overflow: hidden auto;
& scrollbar {
-moz-window-dragging: no-drag;
}
` : ``}
}
&::part(overflow-start-indicator),
&::part(overflow-end-indicator),
&::part(scrollbutton-up),
&::part(scrollbutton-down) {
display: none;
}
${Separate_Tabs_and_PinnedTabs ? `
&:has(> .tabbrowser-tab[fadein][pinned]) {
&::part(scrollbox) {
& > slot::after {
display: flow-root list-item;
content: "";
flex-basis: -moz-available;
height: 0;
overflow: hidden;
}
}
}
.tabbrowser-tab[fadein] {
&:not([pinned]) {
#tabbrowser-tabs[haspinnedtabs] & {
&, & + :not(#tabs-newtab-button) {
order: 1;
}
}
}
&[pinned] {
.tab-background:after {
content: "📌";
font-size: 11px;
right: -2px;
position: absolute;
top: -2px;
}
${PinnedTab_Width ? `
flex: 100 100;
max-width: ${PinnedTab_Max_Width}px;
min-width: ${PinnedTab_Min_Width}px;
.tab-throbber, .tab-icon-pending, .tab-icon-image, .tab-sharing-icon-overlay, .tab-icon-overlay {
margin-inline-end: 5.5px !important;
}
${PinnedTab_Close_Button == 1 ? `
.tab-close-button {
display: flex;
}
` : PinnedTab_Close_Button == 2 ? `
.tab-close-button {
display: none;
}
&:hover .tab-close-button {
display: flex;
}
` : PinnedTab_Close_Button == 3 ? `
&:not([selected]):hover,
&[selected] {
.tab-close-button {
display: flex;
}
}
` : ``}
` : ``}
}
}
` : ``}
#tabbrowser-tabs[haspinnedtabs]:not([positionpinnedtabs]):not([orient="vertical"]) > & {
& > .tabbrowser-tab:nth-child(1 of :not([pinned], [hidden])) {
margin-inline-start: 0 !important;
}
}
}
` : ``}
}
.tabbrowser-tab[fadein]:not([pinned]) {
max-width: ${Tab_Max_Width}px;
min-width: ${Tab_Min_Width}px;
${Tab_Close_Button == 1 ? `
.tab-close-button {
display: none;
}
` : Tab_Close_Button == 2 ? `
.tab-close-button {
display: flex;
}
` : Tab_Close_Button == 3 ? `
.tab-close-button {
display: none;
}
&:hover .tab-close-button {
display: flex;
}
` : Tab_Close_Button == 4 ? `
&:not([selected]):hover {
.tab-close-button {
display: flex;
}
}
` : ``}
}
${Tab_Separators ? `
.titlebar-spacer[type="pre-tabs"] {
border-inline-end: 1px solid color-mix(in srgb, currentColor 20%, transparent);
}
.tabbrowser-tab {
&::after,
&::before {
border-left: 1px solid color-mix(in srgb, currentColor 50%, transparent);
height: calc(var(--tab-min-height) - 15%);
margin-block: auto;
}
&:hover::after,
&[multiselected]::after,
#tabbrowser-tabs:not([movingtab]) &:has(+ .tabbrowser-tab:hover)::after,
#tabbrowser-tabs:not([movingtab]) &:has(+ [multiselected])::after {
height: 100%;
}
&::after,
#tabbrowser-tabs[movingtab] &[visuallyselected]::before {
display: flex;
content: "";
}
}
` : ``}
${Tab_Separators ? `` : `
.tabbrowser-tab,
.toolbarbutton-1 {
padding: 0;
}
.tabbrowser-tab,
#tabs-newtab-button {
height: var(--tab-min-height);
}
.tabbrowser-tab {
.tab-background {
box-shadow: none;
margin-block: 0;
}
.tab-label-container {
height: var(--tab-min-height);
max-height: 24px;
}
.tab-close-button {
height: 20px !important;
padding-block: 3px !important;
}
&[usercontextid] > .tab-stack > .tab-background > .tab-context-line {
margin-block-start: 1px !important;
}
}
`}
}
${TabBar_Position == 0 ? `
.titlebar-buttonbox-container {
height: var(--tab-min-height);
}
${TitleBar_Button_Autohide ? `
& > .titlebar-buttonbox-container {
background-color: color-mix(in srgb, currentColor 20%, transparent);
position: fixed;
right: 0;
&:not(:hover) {
height: 6px;
.titlebar-button {
padding: 0;
}
&,& .titlebar-button {
opacity: 0;
transition: all 0s ease-in-out ${TitleBar_Button_DisplayTime}s;
}
}
}
` : ``}
` : `
${TabBar_Position == 1 || TabBar_Position == 2 ? `
& > .titlebar-buttonbox-container {
display: none;
}
#nav-bar {
&:not(.browser-titlebar) {
:root[customtitlebar] #toolbar-menubar[autohide="true"] ~ &,
:root[inFullscreen] #toolbar-menubar ~ & {
& > .titlebar-buttonbox-container {
display: flex;
}
}
}
.titlebar-button {
padding-block: 0;
}
}
` : ``}
body:has(> #navigator-toolbox:not([tabs-hidden])) {
${TabBar_Position == 1 ? `
script, toolbar:not(#TabsToolbar ${Bookmark_Toolbar_Position ? `` : `, #PersonalToolbar`}) {
order: -1;
}
` : TabBar_Position == 2 ? `
& > #fullscr-toggler[hidden] + tabbox,
:root[inFullscreen] & > tabbox:hover {
border-top: 0.01px solid var(--chrome-content-separator-color);
}
& > tabbox > #navigator-toolbox {
border-block: none !important;
}
:root[inFullscreen] & {
& > #navigator-toolbox {
transition: none;
&:has(~ tabbox:hover) {
margin-top: 0 !important;
}
&:hover ~ tabbox > #navigator-toolbox {
display: flex;
}
}
& > tabbox:not(:hover) {
border-top: 0.01px solid transparent;
& > #navigator-toolbox {
display: none;
}
}
}
` : ``}
}
`}
toolbar[id$="bar"].browser-titlebar {
.titlebar-spacer {
&[type="pre-tabs"] {
width: ${Left_Drag_Area}px;
}
&[type="post-tabs"] {
width: ${Right_Drag_Area}px;
}
${Maximize_Left_Drag_Area ? `
:root[customtitlebar]:not([sizemode="normal"], [inFullscreen]) &[type="pre-tabs"] {
display: flex;
}
` : ``}
${Fullscreen_Drag_Area ? `
:root[customtitlebar][inFullscreen] & {
display: flex;
}
` : ``}
}
#navigator-toolbox[tabs-hidden] & {
#new-tab-button {
display: none;
}
}
}
`;
let sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService);
let uri = Services.io.newURI("data:text/css;charset=UTF=8," + encodeURIComponent(css));
["0", "2", "dragend", "SSTabRestored", "TabAttrModified"].forEach(eventType => {
if (!sss.sheetRegistered(uri, eventType)) {
sss.loadAndRegisterSheet(uri, eventType);
}
});
}
Alles anzeigen
.....das Script für Drag&Drop
// ==UserScript==
// @name TabMoveOnly.uc.js
// @namespace local
// @description Nur das Verschieben von Tabs per Drag & Drop
// @include main
// @compatibility Firefox138+
// @version 2026-03-20
// ==/UserScript==
"use strict";
TabMoveOnly();
function TabMoveOnly() {
if (!window.gBrowser) return;
// -- CSS: Einfüge-Marker beim Drag&Drop als Punkt Plus Ring --
const css = `
/********************************************
* Einfüge-Marker beim Drag&Drop als Punkt
********************************************/
.tabbrowser-tab[dnd-marker] {
position: relative;
}
.tabbrowser-tab[dnd-marker="left"]::before,
.tabbrowser-tab[dnd-marker="right"]::after {
position: absolute;
top: 50%;
transform: translateY(-50%);
pointer-events: none;
z-index: 1000;
content: "";
width: 14px;
height: 18px;
border-radius: 50%;
background:
radial-gradient(circle at center,
#00ffff 0 35%,
#1dacd6 36% 60%,
rgba(255,255,255,0) 61%);
box-shadow: 0 0 3px rgba(255, 90, 82, 0.35);
}
.tabbrowser-tab[dnd-marker="left"]::before {
left: -2px;
top: 6px;
}
.tabbrowser-tab[dnd-marker="right"]::after {
right: -2px;
top: 6px;
}
/********************************************
* Einfüge-Marker beim Drag&Drop als Strich
********************************************/
/* .tabbrowser-tab[dnd-marker] {
position: relative;
}
.tabbrowser-tab[dnd-marker="left"]::before,
.tabbrowser-tab[dnd-marker="right"]::after {
position: absolute;
top: 50%;
transform: translateY(-50%);
pointer-events: none;
z-index: 1000;
content: "";
width: 4px;
height: 24px;
background: #ff3b30;
box-shadow: 0 0 4px rgba(255, 59, 48, 0.65);
}
.tabbrowser-tab[dnd-marker="left"]::before {
left: -2px;
}
.tabbrowser-tab[dnd-marker="right"]::after {
right: -2px;
} */
`;
const sss = Cc["@mozilla.org/content/style-sheet-service;1"]
.getService(Ci.nsIStyleSheetService);
const uri = Services.io.newURI("data:text/css;charset=UTF=8," + encodeURIComponent(css));
if (!sss.sheetRegistered(uri, sss.USER_SHEET)) {
sss.loadAndRegisterSheet(uri, sss.USER_SHEET);
}
// Damit wir die Handler nur einmal setzen
let listenersActive = false;
// Merker für Drag-/Drop-Zustand
let lastKnownIndex = null;
let lastGroupStart = null;
let lastGroupEnd = null;
function clearDndMarkers() {
for (let tab of gBrowser.tabs) {
tab.removeAttribute("dnd-marker");
}
}
function setDndMarker(tab, side) {
clearDndMarkers();
if (tab && side) {
tab.setAttribute("dnd-marker", side);
}
}
function getTabFromEventTarget(event, ignoreTabSides = false) {
let { target } = event;
if (target.nodeType != Node.ELEMENT_NODE) {
target = target.parentElement;
}
let tab = target?.closest("tab") || target?.closest("tab-group");
const selectedTab = gBrowser.selectedTab;
if (tab && ignoreTabSides) {
let { width, height } = tab.getBoundingClientRect();
if (
event.screenX < tab.screenX + width * 0.25 ||
event.screenX > tab.screenX + width * 0.75 ||
((event.screenY < tab.screenY + height * 0.25 ||
event.screenY > tab.screenY + height * 0.75) &&
gBrowser.tabContainer.verticalMode)
) {
return selectedTab;
}
}
return tab;
}
// Eigene Drop-Index-Berechnung für Multirow / normales Tab-Layout
gBrowser.tabContainer._getDropIndex = function(event) {
let tabToDropAt = getTabFromEventTarget(event, false);
if (tabToDropAt?.localName == "tab-group") {
tabToDropAt = tabToDropAt.previousSibling;
if (!tabToDropAt) {
tabToDropAt = gBrowser.visibleTabs[0];
}
}
if (!tabToDropAt) {
tabToDropAt = gBrowser.visibleTabs[gBrowser.visibleTabs.length - 1];
}
if (!tabToDropAt) {
return null;
}
const tabPos = gBrowser.tabContainer.getIndexOfItem(tabToDropAt);
if (window.getComputedStyle(this).direction == "ltr") {
let rect = tabToDropAt.getBoundingClientRect();
if (event.clientX < rect.x + rect.width / 2)
return tabPos;
else
return tabPos + 1;
} else {
let rect = tabToDropAt.getBoundingClientRect();
if (event.clientX > rect.x + rect.width / 2)
return tabPos;
else
return tabPos + 1;
}
};
function orig_getDropEffectForTabDrag(event) {
let dt = event.dataTransfer;
let isMovingTabs = dt.mozItemCount > 0;
for (let i = 0; i < dt.mozItemCount; i++) {
let types = dt.mozTypesAt(0);
if (types[0] != TAB_DROP_TYPE) {
isMovingTabs = false;
break;
}
}
if (isMovingTabs) {
let sourceNode = dt.mozGetDataAt(TAB_DROP_TYPE, 0);
if (XULElement.isInstance(sourceNode) &&
sourceNode.localName == "tab" &&
sourceNode.ownerGlobal.isChromeWindow &&
sourceNode.ownerDocument.documentElement.getAttribute("windowtype") == "navigator:browser" &&
sourceNode.ownerGlobal.gBrowser.tabContainer == sourceNode.container) {
if (PrivateBrowsingUtils.isWindowPrivate(window) !=
PrivateBrowsingUtils.isWindowPrivate(sourceNode.ownerGlobal))
return "none";
if (window.gMultiProcessBrowser != sourceNode.ownerGlobal.gMultiProcessBrowser)
return "none";
if (window.gFissionBrowser != sourceNode.ownerGlobal.gFissionBrowser)
return "none";
return dt.dropEffect == "copy" ? "copy" : "move";
}
}
if (Services.droppedLinkHandler.canDropLink(event, true))
return "link";
return "none";
}
function getMarkerInfo(event) {
let tabToDropAt = getTabFromEventTarget(event, false);
if (tabToDropAt?.localName == "tab-group") {
tabToDropAt = tabToDropAt.previousSibling;
if (!tabToDropAt) {
tabToDropAt = gBrowser.visibleTabs[0];
}
}
if (!tabToDropAt) {
let lastTab = gBrowser.visibleTabs[gBrowser.visibleTabs.length - 1];
return { tab: lastTab, side: "right" };
}
const rect = tabToDropAt.getBoundingClientRect();
const ltr = (window.getComputedStyle(gBrowser.tabContainer).direction == "ltr");
const side = ltr
? (event.clientX < rect.x + rect.width / 2 ? "left" : "right")
: (event.clientX > rect.x + rect.width / 2 ? "left" : "right");
return { tab: tabToDropAt, side };
}
function performTabDragOver(event) {
const effects = orig_getDropEffectForTabDrag(event);
// Nur Tab-Dragging abfangen
if (effects == "none" || effects == "link") {
clearDndMarkers();
return;
}
event.preventDefault();
event.stopPropagation();
let tab = getTabFromEventTarget(event, true);
// Kleine Starthilfe für Gruppen-Merker
if (tab && tab.nodeName == "tab-group" && !lastGroupStart) {
let first = tab.querySelector("tab:first-of-type");
let last = tab.querySelector("tab:last-of-type");
if (first && last) {
lastGroupStart = first._tPos;
lastGroupEnd = last._tPos;
}
}
let newIndex = gBrowser.tabContainer._getDropIndex(event);
if (newIndex == null) {
clearDndMarkers();
return;
}
lastKnownIndex = newIndex;
const markerInfo = getMarkerInfo(event);
setDndMarker(markerInfo.tab, markerInfo.side);
}
function performTabDropEvent(event) {
clearDndMarkers();
let dt = event.dataTransfer;
let dropEffect = dt.dropEffect;
let draggedTab;
if (dt.mozTypesAt(0)[0] == TAB_DROP_TYPE) {
draggedTab = dt.mozGetDataAt(TAB_DROP_TYPE, 0);
if (!draggedTab) return;
}
if (draggedTab && dropEffect != "copy" && draggedTab.container == gBrowser.tabContainer) {
let newIndex = gBrowser.tabContainer._getDropIndex(event);
if (newIndex == null) return;
let selectedTabs = gBrowser.selectedTabs.length > 1 ? gBrowser.selectedTabs : [draggedTab];
let tabToMoveAt = gBrowser.tabContainer.getItemAtIndex(newIndex);
let tab = getTabFromEventTarget(event, false);
let tabgroup = tab?.closest("tab-group");
if (!tab) {
newIndex = gBrowser.tabs.length;
tabToMoveAt = null;
}
if (tabgroup && !tab.previousSibling) {
newIndex = 0;
selectedTabs.forEach(t => {
gBrowser.moveTabTo(t, { tabIndex: newIndex++, forceUngrouped: true });
});
} else if (
!tab ||
(!tabgroup && !tabToMoveAt?.group) ||
(tabgroup && tabToMoveAt?.group)
) {
selectedTabs.forEach(t => {
gBrowser.moveTabBefore(t, tabToMoveAt);
});
} else {
tabToMoveAt = gBrowser.tabContainer.getItemAtIndex(newIndex - 1);
selectedTabs.forEach(t => {
gBrowser.moveTabAfter(t, tabToMoveAt);
});
}
lastKnownIndex = null;
lastGroupStart = null;
lastGroupEnd = null;
}
}
gBrowser.tabContainer.addEventListener("dragstart", () => {
if (!listenersActive) {
gBrowser.tabContainer.on_dragover = (e) => performTabDragOver(e);
gBrowser.tabContainer._onDragOver = (e) => performTabDragOver(e);
gBrowser.tabContainer.ondrop = (e) => performTabDropEvent(e);
gBrowser.tabContainer.addEventListener("dragend", clearDndMarkers, true);
gBrowser.tabContainer.addEventListener("drop", clearDndMarkers, true);
listenersActive = true;
}
});
}
Alles anzeigen
...für userChrome.css:
/* =========================================================
Tableiste + MULTIROW-Script
========================================================= */
:root {
--toolbarbutton-border-radius: 0px !important;
--proton-tab-radius: 0px !important;
--proton-tab-block-margin: 0px !important;
--inline-tab-padding: 10px !important;
}
/* rechts bündiger Abschluss der Tableiste */
hbox.titlebar-spacer,
tabs tab:not([fadein]) {
display: none !important;
}
/* New-Tab-Button bei voller Tableiste ausgeblendet */
#new-tab-button.toolbarbutton-1.chromeclass-toolbar-additional {
display: none !important;
}
.tabbrowser-tab,
.tab-stack,
.tab-background {
border: unset !important;
margin-right: 0px !important;
box-sizing: border-box !important;
margin-bottom: 1px !important;
}
/* Start der Tabs ab linken Rand */
:is(.tabs-newtab-button,#tabs-newtab-button),
.tabbrowser-tab:not([pinned]) {
margin-inline-start: 1px !important;
}
/* =========================================================
AKTIVER TAB
========================================================= */
#TabsToolbar #firefox-view-button[open] > .toolbarbutton-icon:-moz-lwtheme,
.tab-background:is([selected],[multiselected]):-moz-lwtheme {
outline: 1px solid green !important;
}
tab.tabbrowser-tab[selected] stack.tab-stack vbox.tab-background,
.tabbrowser-tab[selected] .tab-background {
background: linear-gradient(0.35turn, #ffa700, beige, white, beige, #c19a6b) !important;
outline: 1px solid green !important;
box-shadow: none !important;
}
.tabbrowser-tab[selected]:hover .tab-background {
background: linear-gradient(0.35turn, #e69500, #f5f5dc, #f8f8f8, #f5f5dc, #b8945e) !important;
}
#tabbrowser-arrowscrollbox tab.tabbrowser-tab[selected] .tab-label,
.tabbrowser-tab[selected] .tab-label {
font-weight: bold !important;
color: blue !important;
font-size: 1.2em !important;
font-family: "Verdana, Helvetica", serif !important;
font-style: italic !important;
position: relative !important;
left: 0 !important;
transform: translateX(0) !important;
padding-bottom: 0px !important;
}
/* =========================================================
INAKTIVE TABS
========================================================= */
.tabbrowser-tab > .tab-stack > .tab-background:not([selected],[multiselected]),
.tabbrowser-tab:not([selected]) .tab-background {
background: linear-gradient(0.35turn, grey, lightblue, beige, white, beige, lightblue, grey) !important;
border: 1px solid grey !important;
filter: brightness(100%) contrast(90%) !important;
}
.tabbrowser-tab:hover > .tab-stack > .tab-background:not([selected],[multiselected]),
.tabbrowser-tab:not([selected]):hover .tab-background {
background: linear-gradient(0.30turn, blue, lightblue, beige, white, beige, lightblue, green) !important;
border: 1px solid coral !important;
filter: brightness(95%) contrast(120%) !important;
}
.tabbrowser-tab:not([selected]) .tab-label,
.tabbrowser-tab:not([visuallyselected="true"]) label.tab-text.tab-label {
color: #4a525f !important;
font-weight: 600 !important;
font-size: 1.1em !important;
padding-bottom: 0px !important;
}
.tabbrowser-tab:not([selected]):hover .tab-label,
.tabbrowser-tab:not([visuallyselected="true"]):hover label.tab-text.tab-label {
color: brown !important;
font-weight: 700 !important;
font-size: 1.1em !important;
opacity: 1 !important;
}
/* =========================================================
TAB-LADESTATUS
========================================================= */
#tabbrowser-arrowscrollbox tab.tabbrowser-tab[busy] .tab-label,
.tabbrowser-tab[busy] .tab-label {
color: tomato !important;
}
/* =========================================================
CLOSE-BUTTON
========================================================= */
.tab-close-button {
fill: white !important;
transform: scale(1.1, 1.1) !important;
display: block !important;
opacity: 0 !important;
}
.tabbrowser-tab:hover .tab-close-button {
opacity: 1 !important;
color: red !important;
display: block !important;
background: none !important;
}
/* Tabtext zentriert */
.tab-label-container {
height: unset !important;
display: grid !important;
justify-items: safe center !important;
justify-content: safe center !important;
align-items: center !important;
text-align: center !important;
}
.tab-label {
justify-content: center !important;
overflow: hidden !important;
position: relative !important;
left: 0 !important;
margin: 0 !important;
padding: 0 4px !important;
}
/* Tabtext nicht verschoben bei hover */
.tabbrowser-tab > .tab-stack > .tab-content > .tab-close-button {
padding-inline-start: 7px !important;
width: unset !important;
}
/* Favicon Position */
.tabbrowser-tab:not([pinned]):not([locked]) .tab-throbber,
.tabbrowser-tab:not([pinned]) .tab-icon-image {
margin-inline-start: -2px !important;
}
/* Pinned Tabs */
#TabsToolbar .tab-content[pinned] {
padding: 0 6px !important;
}
/* =========================================================
NEW TAB BUTTON
========================================================= */
#TabsToolbar :is(.tabs-newtab-button,#tabs-newtab-button) {
min-width: 0px !important;
width: 22px !important;
height: 22px !important;
margin-top: 1px !important;
margin-left: 3px !important;
}
#TabsToolbar :is(.tabs-newtab-button,#tabs-newtab-button) .toolbarbutton-icon {
min-width: 0px !important;
min-height: 0px !important;
width: 14px !important;
height: 14px !important;
margin: 0px !important;
padding: 0px !important;
background: unset !important;
box-shadow: unset !important;
}
#TabsToolbar #tabs-newtab-button > image {
min-height: 24px !important;
max-height: 24px !important;
min-width: 24px !important;
max-width: 24px !important;
margin-top: 1px !important;
margin-left: 0px !important;
padding: 2px !important;
fill: grey !important;
}
#TabsToolbar #tabs-newtab-button:hover > image {
fill: red !important;
}
#TabsToolbar #tabs-newtab-button:hover {
background-color: #FFF !important;
padding: 0px !important;
}
Alles anzeigen
Vielen Dank, alles hat wunderbar geklappt. Ich habe das CSS deutlich vereinfacht, um das gewohnte Aussehen der Tabs beizubehalten.
Freut mich, wenn es gefällt. Das Aussehen gemäß CSS kann jeder nach seinen Wünschen anpassen, so wie es gefällt.![]()
Für die Kompatibilität mit der Split-View-Mode müssen Sie die zweite Hälfte des Codes aus diesem Beitrag hinzufügen.
Danke, werde ich oben einfügen.
Aber jetzt gibt es eine Inkompatibilität mit Tab-Gruppen; die Gruppe befindet sich permanent im expand Modus und kann nicht zwischen expand und collapse Modus umgeschaltet werden.
Mit Tabgruppen habe ich mich noch nie befasst, deswegen sorry, war keine Absicht.
Soll ich das bei mir hoch laden?
Kein Problem, hier ist eine neue CSS-Datei dafür. Fix für Tabgruppen ist eingefügt, und am Ende sind zwei Drop-Marker eingefügt. Aktuell ist der mit dem Punkt, der zweite mit Emoji ist auskommentiert. Wenn gewünscht, kann auch wie bisher links und rechts ein Strich sein, dann bitte melden, Code liefere ich dann nach.
.....für userChrome.css:
/***********************************************************************
* MultiRowTabs – Tab- New-Tab-Button- und Close-Button - Anpassungen
* (Script selbst enthält nur Logik)
***********************************************************************/
/* Grundeinstellungen: Tabhöhe */
#tabbrowser-tabs {
--tab-min-height: 24px; /* Gesamthöhe eines Tabs */
min-height: 0 !important; /* interne Mindesthöhe der Tab-Leiste aufheben */
}
/* linker Abstand der Tabs */
#tabbrowser-tabs arrowscrollbox#tabbrowser-arrowscrollbox tab.tabbrowser-tab stack.tab-stack vbox.tab-background {
margin-left: -2px !important;
}
/* Maximal 3 Zeilen Tabs sichtbar; Rest per Scrollbar / Änderungen immer hier und im Script
(3 = nTabLines aus dem Script) */
#tabbrowser-arrowscrollbox {
max-height: calc( (var(--tab-min-height) + 2px) * 3 ) !important;
overflow-x: hidden !important;
overflow-y: auto !important;
margin-inline-start: 2px !important;
}
/* Tab-Höhe + Zeilenabstand (wirkt auf jede Zeile im MultiRow) */
.tabbrowser-tab,
.tabbrowser-tab .tab-stack,
.tabbrowser-tab .tab-background {
min-height: var(--tab-min-height) !important;
max-height: var(--tab-min-height) !important;
margin-top: 0 !important;
margin-bottom: 1px !important; /* Abstand zwischen den Tab-Zeilen */
}
/* Tab-Breite (fix) */
.tabbrowser-tab[fadein]:not([pinned]) {
min-width: 271px !important;
max-width: 350px !important; /* gleiche Werte = feste Breite */
}
/* Tabs mittig */
#tabbrowser-tabs:not([overflow], [orient="vertical"]) .tabbrowser-tab:nth-child(1 of :not([pinned], [hidden])) {
margin-left: auto !important;
}
#tabbrowser-tabs:not([overflow], [orient="vertical"]) #tabbrowser-arrowscrollbox-periphery {
margin-right: auto !important;
}
/* Tab-Gruppen einklappen */
tab-group[collapsed] .tabbrowser-tab[fadein]:not([pinned]){
min-width: 30px !important;
}
#tabbrowser-tabs tab-split-view-wrapper {
& .tabbrowser-tab {
min-width: 100px !important;
max-width: 150px !important;
}
}
/* Schrift inaktive Tabs */
.tabbrowser-tab .tab-label {
font-family: Arial, sans-serif !important;
font-size: 12px !important;
font-weight: 500 !important;
color: rgb(20,20,20) !important;
opacity: .7 !important;
}
/* Aktiver / multiselektierter Tab – Schriftfarbe */
.tabbrowser-tab[selected] .tab-label,
.tabbrowser-tab[multiselected] .tab-label {
color: rgb(0, 0, 255) !important;
font-weight: 600 !important;
opacity: 1 !important;
}
/* Tabtext zentriert */
.tab-label-container {
height: unset !important;
display: grid !important;
justify-items: safe center !important;
justify-content: safe center !important;
}
.tab-label {
justify-content: center !important;
overflow: hidden !important;
}
/* Keine abgerundeten Ecken, mit Rahmen */
#TabsToolbar .tabbrowser-tab .tab-background {
border-radius: 0 !important;
border: 1px solid grey !important;
}
/* Nicht ausgewählter Tab / Farben – Pastell-Blau-Schema */
.tabbrowser-tab:not([selected]) .tab-background {
background-image: linear-gradient(
rgba(242,246,252,1), /* oben */
rgba(225,233,246,1) /* unten */
) !important;
}
/* Ausgewählter Tab */
.tabbrowser-tab[selected] .tab-background {
background-image: linear-gradient(
rgba(225,235,255,1), /* oben */
rgba(190,210,245,1) /* unten */
) !important;
}
/* Hover auf inaktivem Tab */
.tabbrowser-tab:not([selected]):hover .tab-background {
filter: brightness(1.06) !important;
}
/* Tab-Leisten-Hintergrund */
#TabsToolbar {
background-image: linear-gradient(
rgba(235,242,255,1),
rgba(215,225,245,1)
) !important;
}
/* FavIcon-Größe (optional, kann angepasst werden) */
.tabbrowser-tab .tab-icon-image {
width: 16px !important;
height: 16px !important;
margin-left: -3px !important;
}
/*=== Tab-Close-Button ** nur zu sehen bei Mouseover ===*/
/* Tab X close buttons ( links -1 / rechts 2 ) */
.tab-close-button {
order: 2 !important;
margin-right: -8px !important;
}
/* Farbe der X-Markierung ändern */
.tab-close-button {
fill: grey !important;
transform: scale(1.3, 1.3) !important;
display: block !important;
opacity: 0 !important;
}
.tabbrowser-tab:hover .tab-close-button {
opacity: 1 !important;
color: red !important;
display: block !important;
background: none !important;
}
/*Tab schließen Button verschoben bei Tabstext mittig*/
.tabbrowser-tab > .tab-stack > .tab-content > .tab-close-button {
flex-shrink: 0 !important;
width: 24px !important;
/* display: none !important; */ /* wird total ausgeblendet */
}
/* close-button ** ENDE */
/*===== New-Tab-Button =====*/
/* Weite für newtab-button */
#TabsToolbar #tabs-newtab-button{
min-width: 0px !important;
width: 22px !important;
height: 21px !important;
margin-top: 2px !important;
margin-left: 2px !important;
}
#TabsToolbar #tabs-newtab-button:hover {
background-color: #FFF !important;
padding: 0px !important;
border: 1px solid grey !important;
}
/* das Plus-Zeichen */
#TabsToolbar :is(.tabs-newtab-button,#tabs-newtab-button) .toolbarbutton-icon {
margin-bottom: 2px !important;
background: unset !important;
box-shadow: unset !important;
fill: grey !important;
}
#TabsToolbar #tabs-newtab-button:hover > image {
fill: red !important;
}
/*===== New-Tab-Button ** ENDE =====*/
/********************************************
* Einfüge-Marker beim Drag&Drop als Punkt
********************************************/
/* Referenzrahmen für ::before/::after */
.tabbrowser-tab[dnd-marker] {
position: relative;
}
.tabbrowser-tab[dnd-marker="left"]::before,
.tabbrowser-tab[dnd-marker="right"]::after {
position: absolute;
top: 50%;
transform: translateY(-50%);
pointer-events: none;
z-index: 1000;
content: "";
width: 14px;
height: 16px;
border-radius: 50%;
background:
radial-gradient(circle at center,
#00ffff 0 35%,
#1dacd6 36% 60%,
rgba(255,255,255,0) 61%);
box-shadow: 0 0 3px rgba(255, 90, 82, 0.35);
}
.tabbrowser-tab[dnd-marker="left"]::before {
left: -2px;
top: 6px;
}
.tabbrowser-tab[dnd-marker="right"]::after {
right: -2px;
top: 6px;
}
/********************************************
* Emoji-Einfüge-Marker beim Drag&Drop
********************************************/
/* Referenzrahmen für ::before/::after */
/* .tabbrowser-tab[dnd-marker] {
position: relative;
}
.tabbrowser-tab[dnd-marker="left"]::before,
.tabbrowser-tab[dnd-marker="right"]::after {
position: absolute;
top: 50%;
transform: translateY(-50%);
font-size: 14px;
pointer-events: none;
z-index: 1000;
}
.tabbrowser-tab[dnd-marker="left"]::before {
content: "📌";
left: -8px;
}
.tabbrowser-tab[dnd-marker="right"]::after {
content: "📌️";
right: -8px;
} */
Alles anzeigen
Noch ein Nachtrag, ich habe das Script für mich angepasst, es sind alle Teile für die Scrollbar rechts entfernt. Aus Erfahrung mit dem Script von BrokenHeart kann ich sagen, dass ich diese eigentlich nie nutzte, sondern immer mit dem Mausrad die Funktion ausgeübt habe. Wenn der Wunsch besteht kann ich das Script hier einstellen.