![](https://www.camp-firefox.de/images/avatars/ad/4225-adb3c9f12af6c12ee3a3b428b77e08d4034ae691.png)
Mehrzeilige Tableiste für aktuelle Firefox-Versionen
-
BrokenHeart -
8. Dezember 2019 um 01:19 -
Erledigt
-
-
So sieht der Ordner aktuell aus:
Da fehlt z.B. der Eintrag von der mehrzeiligen Tableiste.
Wenn ich das von der 1. Seite nehme
Das ist aber das aktuelle Skript.
sieht aber der Browser nicht mehr so nice aus
Was genau meinst du damit?
Dann musst du in dem Skript die Tabs wieder so anpassen, wie du es möchtest.
Poste bitte mal den Inhalt von deinem Skript für die mehrzeilige Tableiste.
-
Hallo Andreas,
anbei die Zip Datei der userChrome.js
CSS
Alles anzeigen// ==UserScript== // @name zzzz-MultiRowTab_LiteforFx48.uc.js // @namespace http://space.geocities.yahoo.co.jp/gl/alice0775 // @description Experimentelle CSS Version für Mehrzeilige Tableiste // @include main // @compatibility Firefox 71 // @author Alice0775 // @version 2016/08/05 00:00 Firefox 48 // @version 2016/05/01 00:01 hide favicon if busy // @version 2016/03/09 00:01 Bug 1222490 - Actually remove panorama for Fx45+ // @version 2016/02/09 00:01 workaround css for lwt // @version 2016/02/09 00:00 // ==/UserScript== "use strict"; MultiRowTabLiteforFx(); function MultiRowTabLiteforFx() { var css =` tabs tab { border-left: solid 1px hsla(0,0%,0%,0) !important; border-right: solid 1px hsla(0,0%,0%,0) !important; } tabs tab:after,tabs tab:before { display: none !important; } `; var sss = Cc['@mozilla.org/content/style-sheet-service;1'].getService(Ci.nsIStyleSheetService); var uri = makeURI('data:text/css;charset=UTF=8,' + encodeURIComponent(css)); sss.loadAndRegisterSheet(uri, sss.AUTHOR_SHEET); gBrowser.tabContainer.clearDropIndicator = function() { var tabs = this.allTabs; for (let i = 0, len = tabs.length; i < len; i++) { tabs[i].style.removeProperty("border-left-color"); tabs[i].style.removeProperty("border-right-color"); } } gBrowser.tabContainer.addEventListener("dragleave", function(event) { this.clearDropIndicator(event); }, true); gBrowser.tabContainer.on_dragover = function(event) { this.clearDropIndicator(); var effects = this._getDropEffectForTabDrag(event); var ind = this._tabDropIndicator; if (effects == "" || effects == "none") { ind.hidden = true; return; } event.preventDefault(); event.stopPropagation(); var arrowScrollbox = this.arrowScrollbox; // autoscroll the tab strip if we drag over the scroll // buttons, even if we aren't dragging a tab, but then // return to avoid drawing the drop indicator var pixelsToScroll = 0; if (this.getAttribute("overflow") == "true") { switch (event.originalTarget) { case arrowScrollbox._scrollButtonUp: pixelsToScroll = arrowScrollbox.scrollIncrement * -1; break; case arrowScrollbox._scrollButtonDown: pixelsToScroll = arrowScrollbox.scrollIncrement; break; } if (pixelsToScroll) { arrowScrollbox.scrollByPixels( (RTL_UI ? -1 : 1) * pixelsToScroll, true ); } } /* let draggedTab = event.dataTransfer.mozGetDataAt(TAB_DROP_TYPE, 0); if ( (effects == "move" || effects == "copy") && this == draggedTab.container ) { ind.hidden = true; if (!this._isGroupTabsAnimationOver()) { // Wait for grouping tabs animation to finish return; } this._finishGroupSelectedTabs(draggedTab); if (effects == "move") { this._animateTabMove(event); return; } } this._finishAnimateTabMove(); */ if (effects == "link") { let tab = this._getDragTargetTab(event, true); if (tab) { if (!this._dragTime) { this._dragTime = Date.now(); } if (Date.now() >= this._dragTime + this._dragOverDelay) { this.selectedItem = tab; } ind.hidden = true; return; } } var rect = arrowScrollbox.getBoundingClientRect(); var newMargin; if (pixelsToScroll) { // if we are scrolling, put the drop indicator at the edge // so that it doesn't jump while scrolling let scrollRect = arrowScrollbox.scrollClientRect; let minMargin = scrollRect.left - rect.left; let maxMargin = Math.min( minMargin + scrollRect.width, scrollRect.right ); if (RTL_UI) { [minMargin, maxMargin] = [ this.clientWidth - maxMargin, this.clientWidth - minMargin, ]; } newMargin = pixelsToScroll > 0 ? maxMargin : minMargin; } else { let newIndex = this._getDropIndex(event, effects == "link"); let children = this.allTabs; if (newIndex == children.length) { let tabRect = children[newIndex - 1].getBoundingClientRect(); if (RTL_UI) { newMargin = rect.right - tabRect.left; } else { newMargin = tabRect.right - rect.left; } children[newIndex - 1].style.setProperty("border-right-color","red","important"); } else { let tabRect = children[newIndex].getBoundingClientRect(); if (RTL_UI) { newMargin = rect.right - tabRect.right; } else { newMargin = tabRect.left - rect.left; } children[newIndex].style.setProperty("border-left-color","red","important"); } } ind.hidden = false; newMargin += ind.clientWidth / 2; if (RTL_UI) { newMargin *= -1; } ind.style.transform = "translate(" + Math.round(newMargin) + "px)"; ind.style.marginInlineStart = -ind.clientWidth + "px"; } gBrowser.tabContainer.on_drop = function(event) { this.clearDropIndicator(); var dt = event.dataTransfer; var dropEffect = dt.dropEffect; var draggedTab; let movingTabs; if (dt.mozTypesAt(0)[0] == TAB_DROP_TYPE) { // tab copy or move draggedTab = dt.mozGetDataAt(TAB_DROP_TYPE, 0); // not our drop then if (!draggedTab) { return; } movingTabs = draggedTab._dragData.movingTabs; draggedTab.container._finishGroupSelectedTabs(draggedTab); } this._tabDropIndicator.hidden = true; event.stopPropagation(); if (draggedTab && dropEffect == "copy") { // copy the dropped tab (wherever it's from) let newIndex = this._getDropIndex(event, false); let draggedTabCopy; for (let tab of movingTabs) { let newTab = gBrowser.duplicateTab(tab); gBrowser.moveTabTo(newTab, newIndex++); if (tab == draggedTab) { draggedTabCopy = newTab; } } if (draggedTab.container != this || event.shiftKey) { this.selectedItem = draggedTabCopy; } } else if (draggedTab && draggedTab.container == this) { let oldTranslateX = Math.round(draggedTab._dragData.translateX); let tabWidth = Math.round(draggedTab._dragData.tabWidth); let translateOffset = oldTranslateX % tabWidth; let newTranslateX = oldTranslateX - translateOffset; if (oldTranslateX > 0 && translateOffset > tabWidth / 2) { newTranslateX += tabWidth; } else if (oldTranslateX < 0 && -translateOffset > tabWidth / 2) { newTranslateX -= tabWidth; } let dropIndex = this._getDropIndex(event, false); // "animDropIndex" in draggedTab._dragData && // draggedTab._dragData.animDropIndex; let incrementDropIndex = true; if (dropIndex && dropIndex > movingTabs[0]._tPos) { dropIndex--; incrementDropIndex = false; } let animate = gBrowser.animationsEnabled; if (oldTranslateX && oldTranslateX != newTranslateX && animate) { for (let tab of movingTabs) { tab.setAttribute("tabdrop-samewindow", "true"); tab.style.transform = "translateX(" + newTranslateX + "px)"; let onTransitionEnd = transitionendEvent => { if ( transitionendEvent.propertyName != "transform" || transitionendEvent.originalTarget != tab ) { return; } tab.removeEventListener("transitionend", onTransitionEnd); tab.removeAttribute("tabdrop-samewindow"); this._finishAnimateTabMove(); if (dropIndex !== false) { gBrowser.moveTabTo(tab, dropIndex); if (incrementDropIndex) { dropIndex++; } } gBrowser.syncThrobberAnimations(tab); }; tab.addEventListener("transitionend", onTransitionEnd); } } else { this._finishAnimateTabMove(); if (dropIndex !== false) { for (let tab of movingTabs) { gBrowser.moveTabTo(tab, dropIndex); if (incrementDropIndex) { dropIndex++; } } } } } else if (draggedTab) { let newIndex = this._getDropIndex(event, false); let newTabs = []; for (let tab of movingTabs) { let newTab = gBrowser.adoptTab(tab, newIndex++, tab == draggedTab); newTabs.push(newTab); } // Restore tab selection gBrowser.addRangeToMultiSelectedTabs( newTabs[0], newTabs[newTabs.length - 1] ); } else { // Pass true to disallow dropping javascript: or data: urls let links; try { links = browserDragAndDrop.dropLinks(event, true); } catch (ex) {} if (!links || links.length === 0) { return; } let inBackground = Services.prefs.getBoolPref( "browser.tabs.loadInBackground" ); if (event.shiftKey) { inBackground = !inBackground; } let targetTab = this._getDragTargetTab(event, true); let userContextId = this.selectedItem.getAttribute("usercontextid"); let replace = !!targetTab; let newIndex = this._getDropIndex(event, true); let urls = links.map(link => link.url); let csp = browserDragAndDrop.getCSP(event); let triggeringPrincipal = browserDragAndDrop.getTriggeringPrincipal( event ); (async () => { if ( urls.length >= Services.prefs.getIntPref("browser.tabs.maxOpenBeforeWarn") ) { // Sync dialog cannot be used inside drop event handler. let answer = await OpenInTabsUtils.promiseConfirmOpenInTabs( urls.length, window ); if (!answer) { return; } } gBrowser.loadTabs(urls, { inBackground, replace, allowThirdPartyFixup: true, targetTab, newIndex, userContextId, triggeringPrincipal, csp, }); })(); } if (draggedTab) { delete draggedTab._dragData; } } gBrowser.tabContainer._getDropIndex = function(event, isLink) { var tabs = this.allTabs; var tab = this._getDragTargetTab(event, isLink); if (!RTL_UI) { for (let i = tab ? tab._tPos : 0; i < tabs.length; i++) { if ( event.screenY < tabs[i].screenY + tabs[i].getBoundingClientRect().height ) { if ( event.screenX < tabs[i].screenX + tabs[i].getBoundingClientRect().width / 2 ) { return i; } if ( event.screenX > tabs[i].screenX + tabs[i].getBoundingClientRect().width / 2 && event.screenX < tabs[i].screenX + tabs[i].getBoundingClientRect().width ) { return i + 1; } } } } else { for (let i = tab ? tab._tPos : 0; i < tabs.length; i++) { if ( event.screenY < tabs[i].screenY + tabs[i].getBoundingClientRect().height ) { if ( event.screenX < tabs[i].screenX + tabs[i].getBoundingClientRect().width && event.screenX > tabs[i].screenX + tabs[i].getBoundingClientRect().width / 2 ) { return i; } if ( event.screenX < tabs[i].screenX + tabs[i].getBoundingClientRect().width / 2 ) { return i + 1; } } } } return tabs.length; } }
-
anbei die Zip Datei der userChrome.js
Die userChrome.js ist eine Datei, und kein Ordner.
Eine .zip Datei bringt gar nichts.
Wenn dann musst du eine Datei mit der Bezeichnung:
MultiRowTab_LiteforFx48.uc.js
im Ordner chrome haben.
Außerdem ist das ein altes Skript, du brauchst das von Seite 1.
Hast du denn überhaupt eine mehrzeilige Tableiste?
-
-
Ja ich habe eine mehrzeilige Taskleiste:
Die aber nicht mehr passt.
Siehe den Leerraum unter der letzten Tableiste.
das Design weg..
damit musst du leben.
Das muss dann im neuen Skript eben wieder angepasst werden.
-
anbei die Zip Datei der userChrome.js
Keine Ahnung was du da gemacht hast
Ein Skript gehört nicht in die userChrome.js
Da steht nur das drin:
Und eine .zip Datei lädt kein Skript für den Browser.
Damit hast du auf keinen Fall eine mehrzeilige Tableiste erstellt.
Was genau steht in deiner userChrome.css Datei?
Und das Skript welches du in Beitrag Nr. 343 gepostet hat, erstellt keine mehrzeilige Tableiste mehr, weil veraltet.
-
So hat der Inhalt vom Ordner chrome auszusehen, wenn du die mehrzeilige Tableiste mit einem Skript nutzt:
Und alles andere hat in dem Ordner nichts zu suchen.
Hattest du denn die ganzen Vorbereitungen zur Nutzung von Skripte überhaupt gemacht?
Da wurde doch ganz genau beschrieben, welche Dateien wohin gehören.
-
Der Screenshot deiner mehrzeiligen Tableiste von hier:
BeitragRE: Mehrzeilige Tableiste für aktuelle Firefox-Versionen
Hallo zusammen,
auf meinem neuen Rechner musste ich nun erst mal wieder Firefox anpassen. Nun ist das ganze ja etwas anders gelöst (MultiRowTabs.uc.js) aber es geht alles, nur das Design gefällt mir noch nicht so.
Anbei ein Bild von mir:
camp-firefox.de/attachment/39422/
Kann man die Tabs etwas dunkler bekommen?
Die sehen so blaß aus.
Desweiteren werden einige Icons neben dem Profil icon korrekt dagestellt.
Viele Grüße
DerGiftzwerg
Edit/
auf meinem alten PC sieht es noch so aus:
…DerGiftzwerg19. November 2022 um 21:26 entspricht aber nicht dieser mehrzeiligen Tableiste laut dem Screenshot:
DerGiftzwerg28. November 2022 um 16:21 -
Hallo zusammen,
Ich bin gerade von alice0775 Multirow Skript zu dem von BrokenHeart aus dem ersten Post gewechselt.
Mir ist zu einem folgender Fehler aufgefallen:
Wenn man die Menüleiste ausblendet und nicht das MoveMinMaxCloseButton Skript nutzt, kann man, mit betätigen der "Alt"-Taste auf der Tastatur, die Menüleiste einblenden. Das funktioniert auch wie gehabt, nur sind die Buttons MinMaxClose ohne Funktion. Bei eingeblendeter Menüleiste funktionieren diese tadellos.
Außerdem habe ich zwei Fragen:
Besteht die Möglichkeit die Tab Breite variabel zu definieren? Mit dem alten Skript habe ich die Standardbreite auf 240px gehabt, sobald mehrere Tabs in der Zeile waren, ist die Breite auf bis zu 160px geschrumpft.
Solange man nur eine Tab Zeile hat, ist der Abstand zum Fensterinhalt relativ groß und schrumpft, sobald man zwei oder mehr Zeilen hat. Kann man diesen Abstand bereits für nur eine Zeile verringern?
-
Solange man nur eine Tab Zeile hat, ist der Abstand zum Fensterinhalt relativ groß
Sieht hier so aus
-
Besteht die Möglichkeit die Tab Breite variabel zu definieren?
Ohne das Script verwende ich den Code (gehört in die userChrome.css) zur Anpassung der Breite. Kannst ja mal probieren, Werte musst Du selbst auswählen.
-
-
Sieht hier so aus
Schätze der Abstand tritt nur auf, wenn man die Tableiste unterhalb der Symbolleiste setzt (Option 2).
Und im Script gibt es doch die Möglichkeit die Breite anzupassen.
Das habe ich auch gemacht. Ich würde mir nur wünschen, dass man die Breite variabel hat. Bei wenigen Tabs in einer Zeile, sollen die Tabs sehr breit sein (um quasi die Leerfläche gut zu nutzen), aber mit zunehmenden Tabs schmaler werden, bis zu einem gewissen Minimum.
-
Ich würde mir nur wünschen, dass man die Breite variabel hat.
Das habe ich im Script übersehen, es ist dort nur die tatsächliche Breite einstellbar. Da kann Dir sicherlich nur der Ersteller des Scripts weiter helfen.
-
Wenn man die Menüleiste ausblendet und nicht das MoveMinMaxCloseButton Skript nutzt, kann man, mit betätigen der "Alt"-Taste auf der Tastatur, die Menüleiste einblenden. Das funktioniert auch wie gehabt, nur sind die Buttons MinMaxClose ohne Funktion. Bei eingeblendeter Menüleiste funktionieren diese tadellos.
Kann ich bestätigen, muss ich mir mal anschauen...
Außerdem habe ich zwei Fragen:
Besteht die Möglichkeit die Tab Breite variabel zu definieren? Mit dem alten Skript habe ich die Standardbreite auf 240px gehabt, sobald mehrere Tabs in der Zeile waren, ist die Breite auf bis zu 160px geschrumpft.
Das ist auch so vorgegeben. Für eine variable Breite der Tabs müsste ich das Skript nochmal anpassen und testen. Mal schauen...
Solange man nur eine Tab Zeile hat, ist der Abstand zum Fensterinhalt relativ groß und schrumpft, sobald man zwei oder mehr Zeilen hat. Kann man diesen Abstand bereits für nur eine Zeile verringern?
Das sollte auf jeden Fall nicht so aussehen wie auf deinen Screenshots. Hast du noch eigene Anpassungen (an der Tableiste?) in der userChrome.css gemacht?
Momentan hat dieses Skript nicht die allerhöchste Priorität für mich, weil ich seit langer Zeit schon an einer gänzlich umgestalteten Version arbeite und die vorliegende Version nur soweit anpassen möchte, dass sie auch mit den neuesten FF-Versionen funktioniert und keine allzu großen Bugs enthält.
-
Das sollte auf jeden Fall nicht so aussehen wie auf deinen Screenshots. Hast du noch eigene Anpassungen (an der Tableiste?) in der userChrome.css gemacht?
Gerade getestet indem ich alle weiteren Skripts/CSS in den Papierkorb verschoben hatte. Liegt also an dem Skript selbst.
Wie dem auch sei, dass ist ja nur eine Kleinigkeit. Dafür brauchst du dann keine Zeit verschwenden, insbesondere wenn du mit dem neu schreiben des Skripts beschäftigt bist.
-
-
Mit Wert auf 2:
Hab mal weiter getestet. Der Fehler scheint bei mir aufzutreten, sobald die Tabhöhe unter 30 liegt. Ist das Eventuell eine Mindesthöhe für die Tableiste?
-
-