Ahh, das geht jetzt Firefox-Intern. Ja dann habe ich das so gemacht... Danke!
Beiträge von Platos
-
-
Das Stimmt wohl
FuchsFan Du weisst nicht zufällig, wie ich in diesem (neuen) Skript diesen Pfeil rechts bei der Tableiste wegmache (der nach unten schauende Pfeil, der alle Tabs auflistet, wenn man drauf klickt). Ich finde die Einstellung dazu im neuen Skript nicht.
-
Und wie sieht es mit dem aktuellem Skript aus?
Hä, ich habe gerade (anscheinend erfolglos) versucht von Endor8 das aktuellste Skript herunterzuladen und es sieht inhaltlich so aus, wie gepostet. Das von BrokenHeart ist 3x so lang gefühlt und es macht mir extrem viel Kosmetisches.
Aber ich habe jetzt das hier heruntergeladen: https://github.com/Endor8/userChr…LiteforFx.uc.js
(Für die Zukunft: Hier kann man sich die neueste Version raussuchen von Endor8 (nicht BrokenHeart) :https://github.com/Endor8/userChr…er/Multirowtabs)
Jetzt geht es. Komisch...Und Danke FuchsFan Es scheint so, als hätte ich die falsche "neuste" Version heruntergeladen
Naja, manchmal hilft ein kleiner Input um festzustellen, dass irgendwas schief gelaufen ist bei mir -
Seit ner Weile funktioniert bei mir mit dem Script für Mehrzeilige Tableisten die Tableiste nicht mehr richtig. Also d.h es hat nun immer ein leerer Bereich unter den Tabs. Dieser verschwindet, wenn ich die 2. Tabreihe mit Tabs auffülle. Also dieser Leere Bereich (sieht aus wie eine leere Tabreihe) ist nur da, solange ich nicht genug Tabs für mehrere Zeilen offen habe.
Ich finde einfach nicht heraus, an was das liegt. Ich habe die userChrome.css gelöscht, es liegt nicht an der.
Hat jemand eine Ahnung, wie man das beheben kann? Ich nutze folgenden Code:
CSS
Alles anzeigen// ==UserScript== // @name zzzz-MultiRowTab_LiteforFx48.uc.js // @namespace http://space.geocities.yahoo.co.jp/gl/alice0775 // @description Mehrzeilige Tableiste - Experimentelle CSS Version // @include main // @compatibility Firefox 128esr Firefox 131+ // @author Alice0775 // @version 2024/09/30 12:00 Firefox 131+ // @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() { if (!window.gBrowser) { return; } // -- Config -- // Vergleichbarer CSS Code in userChrome.css Datei wird vorrangig behandelt! const // Tab-Leistenzeilen Anzahl TabBar_Rows = false ,// [false] = unbegrenzt // true = Begrenzte Tabzeilen - Anzahl der Zeilen Max_Rows = 3 ,// Tabzeilen angeben (Standard: 3 Zeilen) // Anzahl der Tab-Leistenzeilen für „true“ Normalerweise auf 1 Zeile eingestellt und // die zweite und die folgenden Zeilen werden bis zur angegebenen Anzahl von Zeilen // angezeigt, wenn der Mauszeiger über die Tab-Leiste bewegt wird. MultiRowTab_on_MouseOver = false ,// [false] = Standard // true = Standard 1 Zeile TabBar_MouseOver_DisplayTime = 1 ,// Sie können die Anzeigezeit (Sekunden) festlegen, nachdem die zweite und die folgenden // Zeilen beim Mouseover angezeigt werden. Das Display zeigt den eingestellten Wert // (Sekunden) an und kehrt dann zur ersten Zeile zurück. // ProtonUI Erscheinungsbild der Tabs ändern Proton_Margins = false ,// [true] = Darstellung ProtonUI // Die Höhe der Tab-Leiste entspricht der Höhe derUI-Dichte plus dem Leerraum darüber // und darunter. // false = Darstellung wie bei browser.proton.enabled auf false, was man vor Firefox 90 // noch einstellen konnte. // Wenn der Leerraum um die Registerkarte auf 0 und die Höhe auf die UI-Dichte eingestellt // ist, ist sie 4 Pixel breiter und 8 Pixel niedriger als die Standardeinstellung. // Ränder auf der linken und rechten Seite der Tabs Tab_Separators = false ,// [false] = Nicht anzeigen // true = Anzeigen // Rahmen CSS wurde extrahiert und angepasst, an Aussehen wie bei browser.proton.enabled // auf false, was man vor Firefox 90 noch einstellen konnte. // Position der Tab-Leiste. TabBar_Position = 0 ,// [0] = Standard // 1 = unter der Symbolleiste // 2 = unter dem Fenster // Standardposition der Tableiste Blenden Sie die Titelleistenschaltfläche [-□×] // aus und verwenden Sie die Breite der Tableiste entsprechend TitleBar_Button_Autohide = false ,// [false] = Aktiviert // true = Deaktiviert // Äußeren Rahmen der Titelleistenschaltfläche [-□×] reduzieren und transparent machen. // Obere rechte Ecke der Tab-Leiste auf ihre ursprüngliche Größe zurücksetzen und // Transparenz aufheben. TitleBar_Button_DisplayTime = 0.6 ,// Dauer der Anzeige in Sekunden, nach der Rückkehr zur Originalgröße und dem Aufheben // der Transparenz per Mouseover angeben. // Tab-Höhe „UI-Dichte“ UI_Density_Compact = 16 ,// Standard = 29 Pixelbei Kompakt UI_Density_Normal = 16 ,// Standard = 36 Pixel bei Normal UI_Density_Touch = 16 ,// Standard = 41 Pixel bei Touch // Entsprechender CSS Code in UserChrome.css wird vorrangig behandelt! // Tab-Breite // Bei gleichen Werten bei Min und Max, wird Tabbreite fixiert! Tab_Min_Width = 129 ,// Standard - Mindestwert = 76px Tab_Max_Width = 129 ,// Standard - Maxwert = 225px // Entsprechender CSS Code in UserChrome.css wird vorrangig behandelt! // „Tab schließen“ Schaltfläche Tab_Close_Button = 2 ,// [0] = Standard // 1 = Ausgeblendet // 2 = Auf allen Tabs anzeigen // 3 = Nur bei Mausberührung anzeigen // .Tab-Drop-Indikator-Icon-Ersetzung. Tab_Drop_Indicator = false ,// [false] = Stecknadel Symbol 📍 // true = Rote Linie (2px × 29px) als Symbol // Angeheftete Tabs neu positionieren Separate_Tabs_and_PinnedTabs = false ,// [false] = Standard // true = Angeheftete Tabs von der Tab-Leiste lösen und in die darüber liegende // Zeile verschieben. Breite der angehefteten Tabs für die Position der // angehefteten Tabs „true“ anpassen. PinnedTab_Width = false ,// [false] = Kein Standard // true = Breite angehefteter Tabs anpassen, z. B. „Tab-Breite“. PinnedTab_Min_Width = 129 ,// Standard Mindestbreite = 76 Pixel PinnedTab_Max_Width = 129 ,// Standard Maximalbreite = 225 Pixel // Bei gleichen Werten ist die Breite fixiert. // Tab-Leisten-Ziehbereich Left_Drag_Area = 0 ,// Linker Ziehbereich Breite: Standard 40 Pixel Right_Drag_Area = 0 ,// Rechter Ziehbereich Breite: Standard 40 Pixel Maximize_Left_Drag_Area = false ,// true = Linken Ziehbereich bei maximiertem Fenster anzeigen. Standard ausgeblendet. Fullscreen_Drag_Area = false ,// true = Linken und rechten Ziehbereich bei Vollbild anzeigen. Standard ausgeblendet. // Alle Tabs Schaltfläche All_Tabs_Button = false ,// [false] = ausblenden // true = anzeigen // Firefox132 oder höher? // Breite beim Öffnen/schließen, beim fahren mit der Maus über die vertikale Tab-Leiste VerticalTabs_MouseOver_OpenClose = false ,// [false] Kein Standard. Drücken Sie im vertikalen Tab-Modus die Seitenleistentaste, // um die Breite zu vergrößern oder zu verkleinern. // true Unabhängig davon, welche Seitenleistenschaltfläche Sie im vertikalen Tab-Modus // auswählen, können Sie die Breite vergrößern oder verkleinern, indem Sie mit der Maus // darüber fahren. // -- Config End -- css = ` #TabsToolbar:has([orient="horizontal"]) { :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; } ${Tab_Drop_Indicator ? ` #tabbrowser-tabs > .tab-drop-indicator { background: url( data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAAdCAIAAAAPVCo9AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAASSURBVBhXY3growJEQ5+SUQEAOb1EM8kwskcAAAAASUVORK5CYII= ) no-repeat center !important; } ` : ``} .titlebar-spacer[type="pre-tabs"] { width: ${Left_Drag_Area}px; } .titlebar-spacer[type="post-tabs"] { width: ${Right_Drag_Area}px; } ${Maximize_Left_Drag_Area ? ` .titlebar-spacer { :root[tabsintitlebar]:not([sizemode="normal"], [inFullscreen]) &[type="pre-tabs"] { display: block !important; } } ` : ``} ${Fullscreen_Drag_Area ? ` .titlebar-spacer { :root[tabsintitlebar][inFullscreen] & { display: block !important; } } ` : ``} ${All_Tabs_Button ? `` : ` #alltabs-button { display: none; } `} ${Separate_Tabs_and_PinnedTabs ? ` #tabbrowser-tabs { padding: 0 !important; & + #new-tab-button { display: none !important; } #tabbrowser-arrowscrollbox { &:has(> .tabbrowser-tab[fadein][pinned]) { &::part(scrollbox) { &:has(+ spacer) > slot::after, .scrollbox-clip > &::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-loading-burst:after { content: "📌"; font-size: 11px; right: -2px; position: absolute; top: -2px; } } ${PinnedTab_Width ? ` &[pinned] { 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 { &[pinned] { margin-inline-end: 5.5px !important; } } ` : ``} } } } ` : ``} #tabbrowser-arrowscrollbox { &::part(scrollbox) { &:has(+ spacer) > slot, .scrollbox-clip > & { flex-wrap: wrap; } ${TabBar_Rows ? ` ${MultiRowTab_on_MouseOver ? ` max-height: calc(var(--tab-min-height) + ${Proton_Margins ? 8 : 0}px); scrollbar-width: none; transition: all 0s ease-in-out ${TabBar_MouseOver_DisplayTime}s; &:hover { max-height: calc((var(--tab-min-height) + ${Proton_Margins ? 8 : 0}px) * ${Max_Rows}) !important; scrollbar-width: auto !important; transition: none 0s !important; } ` : ` max-height: calc((var(--tab-min-height) + ${Proton_Margins ? 8 : 0}px) * ${Max_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; } .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 !important; } ` : Tab_Close_Button == 2 ? ` .tab-close-button { display: block !important; } ` : Tab_Close_Button == 3 ? ` .tab-close-button { opacity: 0; } &:hover .tab-close-button { display: block !important; opacity: 1; } ` : Tab_Close_Button == 4 ? ` .tab-close-button { opacity: 0; } &:hover .tab-close-button, .tab-close-button[selected] { display: block !important; opacity: 1; } ` : ``} } #tabbrowser-tabs[haspinnedtabs]:not([positionpinnedtabs]):not([orient="vertical"]) > & { & > .tabbrowser-tab:nth-child(1 of :not([pinned], [hidden])) { margin-inline-start: 0 !important; } } } ${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: block; content: ""; } } ` : ``} ${Proton_Margins ? `` : ` .tabbrowser-tab, .toolbarbutton-1 { padding: 0 !important; } .tabbrowser-tab, #tabs-newtab-button { height: var(--tab-min-height) !important; } .tab-background { box-shadow: none !important; margin-block: 0 !important; } .tabbrowser-tab[usercontextid] > .tab-stack > .tab-background > .tab-context-line { margin-block-start: 1px !important; } `} ${TabBar_Position == 0 ? ` .titlebar-buttonbox-container { height: calc(var(--tab-min-height) + ${Proton_Margins ? 8 : 0}px); } ${TitleBar_Button_Autohide ? ` .titlebar-buttonbox-container { background-color: color-mix(in srgb, currentColor 20%, transparent); height: 6px !important; opacity: 0; position: fixed; right: 0; transition: all 0s ease-in-out ${TitleBarButton_DisplayTime}s; z-index: 2147483647; .titlebar-button { opacity: 0; padding: 0; transition: all 0s ease-in-out ${TitleBarButton_DisplayTime}s; } &:hover { height: calc(var(--tab-min-height) + ${Proton_Margins ? 8 : 0}px) !important; opacity: 1; transition: none 0s; .titlebar-button { opacity: 1; padding: 8px 17px; transition: none 0s; } } } ` : ``} }` : `} #nav-bar { :root:not([inFullscreen]) #toolbar-menubar:not([inactive]) + & { & > .titlebar-buttonbox-container { display: none; } } .titlebar-button { padding-block: 0; } } ${TabBar_Position == 2 ? ` body { & > #fullscr-toggler[hidden] + tabbox, :root[inFullscreen] & > tabbox:hover { border-top: 0.5px solid var(--toolbar-bgcolor); } & > tabbox > #navigator-toolbox { border-block: none !important; } :root[inFullscreen] & { & > #navigator-toolbox { transition: none; &:has(~ tabbox:hover) { margin-top: 0 !important; } &:hover ~ tabbox > #navigator-toolbox { max-height: 100%; }} & > tabbox:not(:hover) { border-top: 0.5px solid transparent; & > #navigator-toolbox { max-height: 0; } } } } ` : ``} `} ${VerticalTabs_MouseOver_OpenClose ? ` #sidebar-main:has(sidebar-main > [collapsed="false"]) { sidebar-main { #tabbrowser-arrowscrollbox { &[overflowing]:not([scrolledtoend]) { mask-image: none !important; } } &[expanded] { #tabbrowser-tabs[haspinnedtabs] { #vertical-pinned-tabs-container-separator { display: block !important; } } } } &:hover { sidebar-main { &[expanded] { #vertical-pinned-tabs-container-separator { width: 226px !important; } #tabbrowser-arrowscrollbox { .tabbrowser-tab { .tab-close-button { padding-inline-start: 4px !important; } } } } &:not([expanded]) { #tabbrowser-tabs[haspinnedtabs] { #vertical-pinned-tabs-container { display: flex !important; flex-direction: column !important; } } .tabbrowser-tab { #vertical-pinned-tabs-container &, #tabbrowser-arrowscrollbox & { width: 234px !important; transition: none; max-width: 234px !important; .tab-background { width: 226px !important; max-width: 226px !important; } &:hover .tab-close-button, .tab-close-button[selected], .tab-label-container { display: block !important; } } #vertical-pinned-tabs-container & { .tab-close-button { padding-inline-start: 0px !important; } } #tabbrowser-arrowscrollbox { .tabbrowser-tab { .tab-close-button { padding-inline-end: 2px !important; } } } #tabbrowser-arrowscrollbox & { #tabbrowser-tabs[overflow] & { .tab-background { width: 218px !important; } } } .tab-icon-image { #vertical-pinned-tabs-container & { margin-inline: 7px !important; } #tabbrowser-arrowscrollbox & { padding-inline-end: 7.5px !important; } } } [id*="tabs-newtab-button"] { width: 226px !important; .toolbarbutton-icon { margin-inline-end: 2px !important; } .toolbarbutton-text { display: block !important; } } } } } &:not(:hover) { * { font-size: 0 !important; } sidebar-main { width: 55px !important; #tabbrowser-arrowscrollbox::part(scrollbox), #vertical-pinned-tabs-container { scrollbar-width: none !important; } &[expanded] { #vertical-pinned-tabs-container { .tabbrowser-tab { width: 38px !important; } } #vertical-pinned-tabs-container-separator { #tabbrowser-tabs[haspinnedtabs] & { width: 36px !important; } } #tabbrowser-arrowscrollbox { .tabbrowser-tab { width: 56px !important; .tab-close-button { display: none !important; } } } } } } } #sidebar-main:has(sidebar-main:not([hidden]) > [collapsed="true"]) { &:not([expanded]) { width: 165px; } } .wrapper { :not(:hover) button-group:not(.bottom-actions) { moz-button { width: 55px !important; } } &:has(.bottom-actions) { moz-button { width: 170px !important; } } } button > span { &.button-background { width: 226px !important; &.labelled { & > img { margin-inline-start: 2px; } } &:not(.labelled) { width: 226px !important; max-width: 100%; & > img { margin-inline-start: 7px; & + label { text-align: start; width: 226px !important; & > slot:after { font-size: var(--font-size-large); font-weight: var(--font-weight); margin-inline-start: 7px; } } &[src*="view-syncedtabs"] + label > slot:after { content: "他の端末からのタブ"; } &[src*="view-history"] + label > slot:after { content: "履歴"; } &[src*="bookmark-hollow"] + label > slot:after { content: "ブックマーク"; } &[src*="category-general"] + label > slot:after { content: "サイドバーをカスタマイズ"; } } } } } ` : ``} `, sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService), uri = Services.io.newURI("data:text/css;charset=UTF=8," + encodeURIComponent(css)); ["0", "2", "dragend", "SSTabRestored", "TabAttrModified"].find(eventType => { if(!sss.sheetRegistered(uri, eventType)) sss.loadAndRegisterSheet(uri, eventType); if (TabBar_Rows == true) { gBrowser.tabContainer.addEventListener(eventType, (e) => { e.target.scrollIntoView({ behavior: "instant", block: "nearest" }) }) } }) if (TabBar_Position == 1 || TabBar_Position == 2) { document.getElementById("nav-bar").appendChild( document.querySelector("#TabsToolbar > .titlebar-buttonbox-container") ) document.getElementById("navigator-toolbox").prepend( document.getElementById("toolbar-menubar"), document.getElementById("nav-bar"), document.getElementById("PersonalToolbar"), document.adoptNode(document.getElementById("titlebar")), ) } if (TabBar_Position == 2) { document.body.appendChild( document.createXULElement("tabbox") ).appendChild( document.importNode(document.getElementById("navigator-toolbox")) ).appendChild( document.adoptNode(document.getElementById("titlebar")) ) } gBrowser.tabContainer.addEventListener("dragover", function(event) { this._on_dragover(event); }, false) gBrowser.tabContainer.addEventListener("drop", function(event) { this._on_drop(event); }, false) gBrowser.tabContainer.on_dragover = function(event) { return false; } gBrowser.tabContainer.on_drop = function(event) { return false; } gBrowser.tabContainer._on_dragover = function(event) { 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.overflowing) { 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 ); } } if (this.verticalMode) { let draggedTab = event.dataTransfer.mozGetDataAt(TAB_DROP_TYPE, 0); if ( (effects == "move" || effects == "copy") && this == draggedTab.container && !draggedTab._dragData.fromTabList ) { ind.hidden = true; if (!this._isGroupTabsAnimationOver()) { // Wait for grouping tabs animation to finish return; } this._finishGroupSelectedTabs(draggedTab); if (effects == "move") { // Pinned tabs in expanded vertical mode are on a grid format and require // different logic to drag and drop if (this._isContainerVerticalPinnedExpanded(draggedTab)) { this._animateExpandedPinnedTabMove(event); return; } this._animateTabMove(event); return; } } this._finishAnimateTabMove(); } if (effects == "link") { let tab = this._getDragTargetTab(event, { ignoreTabSides: 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, newMarginY; 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 = this.verticalMode ? scrollRect.top - rect.top : scrollRect.left - rect.left; let maxMargin = this.verticalMode ? Math.min(minMargin + scrollRect.height, scrollRect.bottom) : 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); let children = this.allTabs; if (newIndex == children.length) { let tabRect = this._getVisibleTabs().at(-1).getBoundingClientRect(); if (this.verticalMode) { newMargin = tabRect.bottom - rect.top; } else if (RTL_UI) { newMargin = rect.right - tabRect.left; } else { newMargin = tabRect.right - rect.left; } newMarginY = tabRect.top - rect.top + tabRect.height / 2 - rect.height / 2; } else { let tabRect = children[newIndex].getBoundingClientRect(); if (this.verticalMode) { newMargin = rect.top - tabRect.bottom; } else if (RTL_UI) { newMargin = rect.right - tabRect.right; } else { newMargin = tabRect.left - rect.left; } newMarginY = tabRect.top - rect.top + tabRect.height / 2 - rect.height / 2; } } ind.hidden = false; newMargin += this.verticalMode ? ind.clientHeight : ind.clientWidth / 2; if (RTL_UI) { newMargin *= -1; } ind.style.transform = this.verticalMode ? "translateY(" + Math.round(newMargin) + "px)" : "translate(" + Math.round(newMargin) + "px, " + Math.round(newMarginY) + "px)"; } gBrowser.tabContainer._on_drop = function(event) { 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); 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 oldTranslateY = Math.round(draggedTab._dragData.translateY); let tabWidth = Math.round(draggedTab._dragData.tabWidth); let tabHeight = Math.round(draggedTab._dragData.tabHeight); let translateOffsetX = oldTranslateX % tabWidth; let translateOffsetY = oldTranslateY % tabHeight; let newTranslateX = oldTranslateX - translateOffsetX; let newTranslateY = oldTranslateY - translateOffsetY; // Update both translate axis for pinned vertical expanded tabs if (oldTranslateX > 0 && translateOffsetX > tabWidth / 2) { newTranslateX += tabWidth; } else if (oldTranslateX < 0 && -translateOffsetX > tabWidth / 2) { newTranslateX -= tabWidth; } if (oldTranslateY > 0 && translateOffsetY > tabHeight / 2) { newTranslateY += tabHeight; } else if (oldTranslateY < 0 && -translateOffsetY > tabHeight / 2) { newTranslateY -= tabHeight; } let dropIndex; if (draggedTab._dragData.fromTabList) { dropIndex = this._getDropIndex(event); } else { dropIndex = this.verticalMode ? "animDropIndex" in draggedTab._dragData && draggedTab._dragData.animDropIndex : this._getDropIndex(event); } let incrementDropIndex = true; if (dropIndex && dropIndex > movingTabs[0]._tPos) { dropIndex--; incrementDropIndex = false; } let shouldTranslate; if (this._isContainerVerticalPinnedExpanded(draggedTab)) { shouldTranslate = ((oldTranslateX && oldTranslateX != newTranslateX) || (oldTranslateY && oldTranslateY != newTranslateY)) && !gReduceMotion; } else if (this.verticalMode) { shouldTranslate = oldTranslateY && oldTranslateY != newTranslateY && !gReduceMotion; } else { shouldTranslate = oldTranslateX && oldTranslateX != newTranslateX && !gReduceMotion; } if (shouldTranslate) { for (let tab of movingTabs) { tab.toggleAttribute("tabdrop-samewindow", true); tab.style.transform = `translate(${newTranslateX}px, ${newTranslateY}px)`; let postTransitionCleanup = () => { tab.removeAttribute("tabdrop-samewindow"); this._finishAnimateTabMove(); if (dropIndex !== false) { gBrowser.moveTabTo(tab, dropIndex); if (incrementDropIndex) { dropIndex++; } } gBrowser.syncThrobberAnimations(tab); }; if (gReduceMotion) { postTransitionCleanup(); } else { let onTransitionEnd = transitionendEvent => { if ( transitionendEvent.propertyName != "transform" || transitionendEvent.originalTarget != tab ) { return; } tab.removeEventListener("transitionend", onTransitionEnd); postTransitionCleanup(); }; 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) { // Move the tabs. To avoid multiple tab-switches in the original window, // the selected tab should be adopted last. const dropIndex = this._getDropIndex(event); let newIndex = dropIndex; let selectedTab; let indexForSelectedTab; for (let i = 0; i < movingTabs.length; ++i) { const tab = movingTabs[i]; if (tab.selected) { selectedTab = tab; indexForSelectedTab = newIndex; } else { const newTab = gBrowser.adoptTab(tab, newIndex, tab == draggedTab); if (newTab) { ++newIndex; } } } if (selectedTab) { const newTab = gBrowser.adoptTab( selectedTab, indexForSelectedTab, selectedTab == draggedTab ); if (newTab) { ++newIndex; } } // Restore tab selection gBrowser.addRangeToMultiSelectedTabs( gBrowser.tabs[dropIndex], gBrowser.tabs[newIndex - 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, { ignoreTabSides: true }); let userContextId = this.selectedItem.getAttribute("usercontextid"); let replace = !!targetTab; let newIndex = this._getDropIndex(event); 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._isContainerVerticalPinnedExpanded = function(tab) { return ( this.verticalMode && tab.hasAttribute("pinned") && this.hasAttribute("expanded") ); } gBrowser.tabContainer._animateExpandedPinnedTabMove = function(event) { let draggedTab = event.dataTransfer.mozGetDataAt(TAB_DROP_TYPE, 0); let movingTabs = draggedTab._dragData.movingTabs; if (!this.hasAttribute("movingtab")) { this.toggleAttribute("movingtab", true); gNavToolbox.toggleAttribute("movingtab", true); if (!draggedTab.multiselected) { this.selectedItem = draggedTab; } } if (!("animLastScreenX" in draggedTab._dragData)) { draggedTab._dragData.animLastScreenX = draggedTab._dragData.screenX; } if (!("animLastScreenY" in draggedTab._dragData)) { draggedTab._dragData.animLastScreenY = draggedTab._dragData.screenY; } let screenX = event.screenX; let screenY = event.screenY; if ( screenY == draggedTab._dragData.animLastScreenY && screenX == draggedTab._dragData.animLastScreenX ) { return; } let tabs = this._getVisibleTabs().slice(0, gBrowser._numPinnedTabs); let directionX = screenX > draggedTab._dragData.animLastScreenX; let directionY = screenY > draggedTab._dragData.animLastScreenY; draggedTab._dragData.animLastScreenY = screenY; draggedTab._dragData.animLastScreenX = screenX; let tabWidth = draggedTab.getBoundingClientRect().width; let tabHeight = draggedTab.getBoundingClientRect().height; let shiftSizeX = tabWidth * movingTabs.length; let shiftSizeY = tabHeight; draggedTab._dragData.tabWidth = tabWidth; draggedTab._dragData.tabHeight = tabHeight; // In expanded vertical mode, 6 is the max number of pinned tabs per row const maxTabsPerRow = 6; // Move the dragged tab based on the mouse position. let firstTabInRow; let lastTabInRow; if (RTL_UI) { firstTabInRow = tabs.length >= maxTabsPerRow ? tabs[maxTabsPerRow - 1] : tabs.at(-1); lastTabInRow = tabs[0]; } else { firstTabInRow = tabs[0]; lastTabInRow = tabs.length >= maxTabsPerRow ? tabs[maxTabsPerRow - 1] : tabs.at(-1); } let firstMovingTabScreenX = movingTabs.at(-1).screenX; let firstMovingTabScreenY = movingTabs.at(-1).screenY; let lastMovingTabScreenX = movingTabs[0].screenX; let lastMovingTabScreenY = movingTabs[0].screenY; let translateX = screenX - draggedTab._dragData.screenX; let translateY = screenY - draggedTab._dragData.screenY; let firstBoundX = firstTabInRow.screenX - lastMovingTabScreenX; let firstBoundY = firstTabInRow.screenY - lastMovingTabScreenY; let lastBoundX = lastTabInRow.screenX + lastTabInRow.getBoundingClientRect().width - (firstMovingTabScreenX + tabWidth); let lastBoundY = tabs.at(-1).screenY + lastTabInRow.getBoundingClientRect().height - (firstMovingTabScreenY + tabHeight); translateX = Math.min(Math.max(translateX, firstBoundX), lastBoundX); translateY = Math.min(Math.max(translateY, firstBoundY), lastBoundY); for (let tab of movingTabs) { tab.style.transform = `translate(${translateX}px, ${translateY}px)`; } draggedTab._dragData.translateX = translateX; draggedTab._dragData.translateY = translateY; // Determine what tab we're dragging over. // * Single tab dragging: Point of reference is the center of the dragged tab. If that // point touches a background tab, the dragged tab would take that // tab's position when dropped. // * Multiple tabs dragging: All dragged tabs are one "giant" tab with two // points of reference (center of tabs on the extremities). When // mouse is moving from top to bottom, the bottom reference gets activated, // otherwise the top reference will be used. Everything else works the same // as single tab dragging. // * We're doing a binary search in order to reduce the amount of // tabs we need to check. tabs = tabs.filter(t => !movingTabs.includes(t) || t == draggedTab); let firstTabCenterX = lastMovingTabScreenX + translateX + tabWidth / 2; let lastTabCenterX = firstMovingTabScreenX + translateX + tabWidth / 2; let tabCenterX = directionX ? lastTabCenterX : firstTabCenterX; let firstTabCenterY = lastMovingTabScreenY + translateY + tabWidth / 2; let lastTabCenterY = firstMovingTabScreenY + translateY + tabWidth / 2; let tabCenterY = directionY ? lastTabCenterY : firstTabCenterY; let newIndex = -1; let oldIndex = "animDropIndex" in draggedTab._dragData ? draggedTab._dragData.animDropIndex : movingTabs[0]._tPos; let low = 0; let high = tabs.length - 1; let shiftNumber = maxTabsPerRow - movingTabs.length; let getTabShift = (tab, dropIndex) => { if (tab._tPos < draggedTab._tPos && tab._tPos >= dropIndex) { // If tab is at the end of a row, shift back and down let tabRow = Math.ceil((tab._tPos + 1) / maxTabsPerRow); let shiftedTabRow = Math.ceil( (tab._tPos + 1 + movingTabs.length) / maxTabsPerRow ); if (tab._tPos && tabRow != shiftedTabRow) { return [ RTL_UI ? tabWidth * shiftNumber + tabWidth / 2 : -tabWidth * shiftNumber - tabWidth / 2, shiftSizeY, ]; } return [RTL_UI ? -shiftSizeX : shiftSizeX, 0]; } if (tab._tPos > draggedTab._tPos && tab._tPos < dropIndex) { // If tab is not index 0 and at the start of a row, shift across and up let tabRow = Math.floor(tab._tPos / maxTabsPerRow); let shiftedTabRow = Math.floor( (tab._tPos - movingTabs.length) / maxTabsPerRow ); if (tab._tPos && tabRow != shiftedTabRow) { return [ RTL_UI ? -tabWidth * shiftNumber - tabWidth / 2 : tabWidth * shiftNumber + tabWidth / 2, -shiftSizeY, ]; } return [RTL_UI ? shiftSizeX : -shiftSizeX, 0]; } return [0, 0]; }; while (low <= high) { let mid = Math.floor((low + high) / 2); if (tabs[mid] == draggedTab && ++mid > high) { break; } let shift = getTabShift(tabs[mid], oldIndex); screenX = tabs[mid].screenX + shift[0]; screenY = tabs[mid].screenY + shift[1]; if (screenY + tabHeight < tabCenterY) { low = mid + 1; } else if (screenY > tabCenterY) { high = mid - 1; } else if (screenX > tabCenterX) { high = mid - 1; } else if (screenX + tabWidth < tabCenterX) { low = mid + 1; } else { newIndex = tabs[mid]._tPos; break; } } if (newIndex >= oldIndex) { newIndex++; } if (newIndex < 0 || newIndex == oldIndex) { return; } draggedTab._dragData.animDropIndex = newIndex; // Shift background tabs to leave a gap where the dragged tab // would currently be dropped. for (let tab of tabs) { if (tab != draggedTab) { let [shiftX, shiftY] = getTabShift(tab, newIndex); tab.style.transform = shiftX || shiftY ? `translate(${shiftX}px, ${shiftY}px)` : ""; } } } }
-
Danke, jetzt geht das mit der blauen Linie.
Somit geht es jetzt wieder so, wie früher
Danke für eure Hilfe! -
Ok danke, das Einschleusen von CSS Code hat funktioniert.
Das mit dem Tabverschieben ist halt eben so: Ich muss einen Tab nehmen und ihn rechts oder links von einem anderen Tab hinziehen und dort ablegen. Das ist eig. das Problem. Ich hätte gerne, dass ich den Tab nach unten ziehen kann in die mitte des unteren Tabs und er dann auch genau an dessen Stelle landet. Aber ich glaube, das hat noch nie funktioniert mit diesem Skript. Ich nutze die Funktion "tab verschieben" anscheinend gar nicht so oft. Weiss auch nicht, warum mir das jetzt wieder so negativ auffällt. Muss mich wohl daran gewöhnen.
Ich merke gerade, dass ein CSS Code von mir nicht mehr funktioniert:CSS.tabbrowser-tab[visuallyselected="true"] > .tab-stack > .tab-background { border-top: 2px solid #429CE3 !important; }
Das sollte eig. eine blaue Linie über dem aktiven Tab machen. Das funktioniert aber nicht. Weisst du, warum das nicht geht?
Das würde ich nicht machen, sondern das Script wirklich nur für die Tableiste nutzen. Für weitere Anpassungen nutze lieber die userCrome.css.
Ja ok, das habe ich nun gemacht, denn ich hatte irgendwie ein Problem, dass ein gewisser Teil des CSS Codes nicht immer geladen hat. Jetzt in der userChrome.css geht es bisher immer.
-
Ok danke, das funktioniert soweit. Das ist als Basis sogar viel besser, da ich nun ein Grossteil meines CSS codes nicht mehr brauche, da dieser schon implementiert ist. Ich habe allerdings noch 2 Probleme:
1. Wenn ich einen Tab eine Tabzeile nach unten ziehe, ist er nicht direkt darunter, sondern links neben dem Tab direkt darunter. Also im Grunde ist es so: Ich ziehe einen Tab nach unten und positioniere ihn über dem Tab darunter (also schon mittig). Jetzt wird der Tab nicht da positioniert. Das Script funktioniert folgender massen: Wenn ich den Tab nach unten ziehe, geht er links von diesem tab hin, wenn ich meine Maus auf der linken Seite dieses tabs halte (also alles ab der hälfte vom Tab links davon).
Vlt. war das bei mir auch schon vorher so, aber ich erinnere mich nicht daran. Kann man das nicht irgendwie ändern, so dass ich den Tab grad nach unten ziehen kann (mittig über den anderen) und er dann auch dort hingeht ?
2. Die Leiste, auf der die Adressleiste, Addon-Icon usw sind, ist mir noch zu hoch. Die würde ich also gerne wieder mit CSS anpassen. Kann man bei diesem Skript auch einfach wieder eigenen CSS code einschleusen? Oder wie mache ich das ? -
Ich nutze ein .js script, dass ich hier mal mit hilfe von einem Nutzer hier erstellet/abgeändert habe. Weiss gar nicht mehr, auf was es basiert. Es funktioniert nun aber nicht mehr. Im anderen Thread für mehrzeilige Tableisten habe ich dazu nichts gefunden, daher mache ich eine frage auf.
Das Problem ist, dass es keine Zeilen mehr gibt, es gibt nur noch eine Zeile. Diesen code nutze ich:Spoiler anzeigen
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 113 // @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 =` /* USER_SHEET */ @-moz-document url-prefix("chrome://browser/content/browser.xhtml") { /* Anpassung der Symbolleisten */ #titlebar,#tabbrowser-tabs { appearance: none !important; } /* Anpassen der Titelleistenschaltfläche [- x] der Tableiste */ #TabsToolbar > .titlebar-buttonbox-container { margin: 0 !important; } #TabsToolbar > .titlebar-buttonbox-container .titlebar-button { height: calc(8px + var(--tab-min-height)); padding: 0 !important; width: 46px; } #toolbar-menubar:not([inactive]) ~ #TabsToolbar:not([inFullscreen]) > .titlebar-buttonbox-container { display: none !important; } /* Mehrzeilige Tableiste */ box.scrollbox-clip[orient="horizontal"] > scrollbox { flex-wrap: wrap !important; max-height: calc(calc(8px + var(--tab-min-height)) * 3); /* Anzahl der Tabzeilen(Standard = 3 Zeilen)*/ overflow-x: hidden !important; overflow-y: auto !important; } /* Ausblenden */ .tabbrowser-tab:not([fadein]), #alltabs-button { display: none !important; } .tabbrowser-tab:not([pinned]) .tab-close-button { display: inline-flex !important } /* --- Ziehbereich der Tab-Leiste --- */ /* Anpassung */ hbox.titlebar-spacer[type="pre-tabs"] { width: 0px !important; } /* Linker Ziehbereich: Standard 40px */ hbox.titlebar-spacer[type="post-tabs"] { width: 0px !important; } /* Rechter Ziehbereich: Standard 40px */ /* ↓ Wenn Sie die linke und rechte Seite des CSS-Codes auskommentieren und den CSS-Code aktivieren, können Sie den Ziehbereich links einblenden, der beim Maximieren des Fensters ausgeblendet wird. */ /* :root:not([sizemode="normal"]) hbox.titlebar-spacer[type="pre-tabs"] { display: block !important; } */ /* ↓Wenn Sie die Auskommentierung links und rechts von unten stehenden CSS-Code entfernen und den CSS-Code aktivieren, können Sie den linken und rechten Ziehbereich einblenden, der im Vollbildmodus ausgeblendet wird. */ /* :root[inFullscreen] hbox.titlebar-spacer { display: block !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.USER_SHEET); var css =` /* AGENT_SHEET */ @-moz-document url-prefix("chrome://browser/content/browser.xhtml") { /* Bei Überschreitung der angegebenen Zeilenanzahl, mit der Maus, über die dann eingeblendetet Scrolleiste zur gewünschten Zeile wechselnる */ box.scrollbox-clip > scrollbox[orient="horizontal"] > scrollbar { -moz-window-dragging: no-drag !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.AGENT_SHEET); var css =` /* AUTHOR_SHEET */ /* #tabbrowser-arrowscrollbox::part(scrollbox) { flex-wrap: wrap !important; max-height: calc(calc(8px + var(--tab-min-height)) * 3); overflow-x: hidden !important; overflow-y: auto !important; } */ /* Bildlaufschaltfläche und Abstandshalter in der Schattenwurzel der Tab-Leiste ausblenden */ #tabbrowser-arrowscrollbox[scrolledtostart]::part(overflow-start-indicator), #tabbrowser-arrowscrollbox[scrolledtoend]::part(overflow-end-indicator), #tabbrowser-arrowscrollbox::part(scrollbutton-up), #tabbrowser-arrowscrollbox::part(scrollbutton-down) { display: none !important; } .tabbrowser-tab:not([pinned]) { flex-grow: 0 !important; min-width: 128px !important; /*Feste Breite für die Tabs, kann geändert werden*/ } *|*:root { --tab-toolbar-navbar-overlap: 0 !important; --tab-min-height: 21px !important; } /*Keine Abstände um den Tab rum, die durch neuere Firefoxversionen enstanden sind*/ .tab-background { margin-block: 0px !important; } #urlbar { margin-top: -2px !important; --urlbar-toolbar-height: 25px !imporant; --urlbar-height: 22px !important; } .tabbrowser-tab { min-height: 21px !important; max-height: 21px !important; padding: 0 0px !important; } #nav-bar { min-height: 22px !important; max-height: 22px !important; margin-top: -0px !important; } .tabbrowser-tab[visuallyselected="true"] > .tab-stack > .tab-background { border-top: 2px solid #429CE3 !important; } `; var sss = Components.classes['@mozilla.org/content/style-sheet-service;1'].getService(Components.interfaces.nsIStyleSheetService); var uri = makeURI('data:text/css;charset=UTF=8,' + encodeURIComponent(css)); sss.loadAndRegisterSheet(uri, sss.AUTHOR_SHEET); if(location.href !== 'chrome://browser/content/browser.xhtml') return; // Tabbar scrollIntoView gBrowser.tabContainer.addEventListener("SSTabRestoring", function(event) {event.target.scrollIntoView({behavior: "instant", block: "nearest", inline: "nearest"})}, true); gBrowser.tabContainer.addEventListener("TabAttrModified", function(event) {event.target.scrollIntoView({behavior: "instant", block: "nearest", inline: "nearest"})}, true); gBrowser.tabContainer.addEventListener("TabMove", function(event) {event.target.scrollIntoView({behavior: "instant", block: "nearest", inline: "nearest"})}, true); // drag & drop & DropIndicator gBrowser.tabContainer.on_dragover = function(event) { 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; if (effects == "link") { let tab = this._getDragTargetTab(event, { ignoreTabSides: 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 newMarginX, newMarginY; let newIndex = this._getDropIndex(event); let children = this.allTabs; if (newIndex == children.length) { let tabRect = this._getVisibleTabs().at(-1).getBoundingClientRect(); if (RTL_UI) { newMarginX = rect.right - tabRect.left; } else { newMarginX = tabRect.right - rect.left; } newMarginY = tabRect.top - rect.top + tabRect.height / 2 - rect.height / 2; } else { let tabRect = children[newIndex].getBoundingClientRect(); if (RTL_UI) { newMarginX = rect.right - tabRect.right; } else { newMarginX = tabRect.left - rect.left; } newMarginY = tabRect.top - rect.top + tabRect.height / 2 - rect.height / 2; } ind.hidden = false; newMarginX += ind.clientWidth / 2; if (RTL_UI) { newMarginX *= -1; } ind.style.transform = "translate(" + Math.round(newMarginX) + "px," + Math.round(newMarginY) + "px)"; } gBrowser.tabContainer.on_drop = function(event) { 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); 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; if (draggedTab._dragData.fromTabList) { dropIndex = this._getDropIndex(event); } else { dropIndex = this._getDropIndex(event); // "animDropIndex" in draggedTab._dragData && // draggedTab._dragData.animDropIndex; } let incrementDropIndex = true; if (dropIndex && dropIndex > movingTabs[0]._tPos) { dropIndex--; incrementDropIndex = false; } if (oldTranslateX && oldTranslateX != newTranslateX && !gReduceMotion) { for (let tab of movingTabs) { tab.setAttribute("tabdrop-samewindow", "true"); tab.style.transform = "translateX(" + newTranslateX + "px)"; let postTransitionCleanup = () => { tab.removeAttribute("tabdrop-samewindow"); this._finishAnimateTabMove(); if (dropIndex !== false) { gBrowser.moveTabTo(tab, dropIndex); if (incrementDropIndex) { dropIndex++; } } gBrowser.syncThrobberAnimations(tab); }; if (gReduceMotion) { postTransitionCleanup(); } else { let onTransitionEnd = transitionendEvent => { if ( transitionendEvent.propertyName != "transform" || transitionendEvent.originalTarget != tab ) { return; } tab.removeEventListener("transitionend", onTransitionEnd); postTransitionCleanup(); }; 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) { // Move the tabs. To avoid multiple tab-switches in the original window, // the selected tab should be adopted last. const dropIndex = this._getDropIndex(event); let newIndex = dropIndex; let selectedTab; let indexForSelectedTab; for (let i = 0; i < movingTabs.length; ++i) { const tab = movingTabs[i]; if (tab.selected) { selectedTab = tab; indexForSelectedTab = newIndex; } else { const newTab = gBrowser.adoptTab(tab, newIndex, tab == draggedTab); if (newTab) { ++newIndex; } } } if (selectedTab) { const newTab = gBrowser.adoptTab( selectedTab, indexForSelectedTab, selectedTab == draggedTab ); if (newTab) { ++newIndex; } } // Restore tab selection gBrowser.addRangeToMultiSelectedTabs( gBrowser.tabs[dropIndex], gBrowser.tabs[newIndex - 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, { ignoreTabSides: true }); let userContextId = this.selectedItem.getAttribute("usercontextid"); let replace = !!targetTab; let newIndex = this._getDropIndex(event); 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; } } }
Ich habe den CSS Teil von mir auch schon raus gelöscht, aber das hilft nicht. Hat jemand eine Ahnung, warum das auf einmal nicht mehr funktioniert? Es funktioniert seitdem ich Firefox neugestartet habe nicht mehr (also wurde wahrscheinlich dann auf eine neuere Version upgedatet).
Btw: Ich nutze diese Version und nicht die von BrokenHeart, weil diese hier schlanker ist und das normale Design der Tabs von Firefox erhaltet(e). -
Edit: Und ich habe nun mal in Firefox den Inhalt der userchrome.css gelöscht, bei about:config unter "browser.newtabpage.activity-stream.topSitesRows " 4 reihen eingestellt und dann kommt das so raus:
Das obere stellt den Grundzustand dar, wenn ich Firefox öffne. Wenn ich dann anfange Webseiten zu besuchen (hier Camp firefox), schiebt sich das irgendwo dazwischen und verschiebt mir die gaze Ordnung (wobei eigentlich gar keine Ordnung mehr herrscht, da ich nun dank dem fehlen leerer Kacheln gar keine Separierung mehr vornehmen kann und alles einfach auf einem Haufen ist).
Alle Webseiten bis auf camp firefox sind angepinnt im Bild. -
Ich verstehe nicht, warum sich bei dir nichts verschiebt. Gerade weil es keine leeren Kacheln mehr gibt, muss sich doch ständig etwas verschieben? Spätestens dann, wenn du mal eine neue Webseite anpinnst irgendwo, dann wird sie ja alles verschieben (ausser du pinnst immer nur alle am Ende an). Das selbe gilt für den Fall, dass die zuletzt/oft besuchten Webseiten als Kacheln dargestellt werden. Die müssen ja auch irgendwo hin.
Aber ok, keine Leere Kacheln bedeutet, ich habe immer alles auf dem selben haufen. Keine Ahnung, was daran gut sein soll. Ich finde, das hat keine Übersicht, wenn alles auf dem selben Haufen ist.
Aber gut, zurück zu meiner Frage: Kann ich irgendwie hinkriegen, dass es so wie vorher ist? Also fixe Kachel-Positionen (bei den angepinnten) mit leeren Kacheln dazwischen und keine "Verknüpfung Hinzufügen" Kachel (letzteres dürfte ich vermutlich selbst hinkriegen) ?
Ich nutze hald mehr als 4 Zeilen, ich nutze 15 und den obigen code. -
Vor ein paar Wochen (oder vlt. sinds mittlerweile auch schon Monate) hat sich die new-tab (about:home) Seite verändert. Also das Kachelsystem mit den angepinnten Webseiten.
Vorher war das eine fest fixierte Struktur an Kacheln, jetzt ändert sich das irgendwie dynamisch und dadurch ändert sich ständig die Position der angepinnten Kacheln. Mich nervte es bisher sowieso, dass dort (früher) nicht NUR die angepinnten Webseiten zu sehen waren und der Rest der Kacheln einfach leer geblieben ist. Jetzt ist es aber so, dass für die nicht angepinnten Webseiten "neue" Kacheln erstellt werden, die dann hinzukommen, so dass sich die angepinnten (wie gesagt) verschieben. Dazu kommt noch, dass da die neue Kachel "neue Verknüpfung hinzufügen" ist, die mich auch stört. Zumal die bei mir immer irgendwo anders ist...
Kann mir da jemand weiter helfen? Gibt es vlt. sogar eine Einstellung in about:config oder kann ich das über css lösen? Am liebsten hätte ich einfach gerne ein Kachelsystem mit einer bestimmten Anzahl reihen und Zeilen, dass nur angepinnte Webseiten zeigt und den Rest der Kacheln leer lässt (also leere Kacheln, nicht gelöschte/verbergte). Da das aber vermutlich nicht geht, habe ich einfach die Frage, wie ich wieder das alte Design bekommen kann.
Hat jemand eine Ahnung, wie ich das lösen kann?
Ich nutze mometan diesen code:Spoiler anzeigen
CSS
Alles anzeigen@-moz-document url(about:home), url(about:newtab) { /*Wichtige Seiten Abstand zwischen Zeile 3 und 4 (Abstand einer Zeile bei 9, 17, 25 usw)*/ /*Damit das alles funktioniert muss die Bookmark-Bar weg sein (rechtsklick auf irgendeine Firefoxleiste)*/ /*Diese Zeile löscht die Kacheln, die zu viel sind*/ li.top-site-outer:nth-child(118), li.top-site-outer:nth-child(119), li.top-site-outer:nth-child(120) { display: none !important; } /*Textbeschreibung der Kacheln mehrzeilig machen*/ .top-site-outer .title span { white-space: unset !important; height: 40px !important; } /*Das löscht/verkleinert/vergrössert den Abstand zwischen der Kachel und der Beschreibung(Schrift)*/ .top-site-outer .title { padding-top: 4px !important; } .top-site-outer .top-site-inner > a { padding: 0px 0px 0px !important; margin-block-end: 0px !important; } /*Das verbreitert/verkleinert den Platz, den die Kacheln bekommen (vergrössert man sie, entstehen Spälte zwischen den Kacheln, so dass man die Umrandung grösser machen kann*/ /* Macht man die Umrandung der Kacheln kleiner, kann man den Platz auch verkleinern, so haben dann pro Zeile mehr Kacheln platz).*/ .top-site-outer { margin-block-end: 0px !important; width: 87px !important; } /*Diese Zeilen machen die Abstände zwischen den Zeilen, so dass es z.B 4 2-er Reihen oder 3 3-er Reihen gibt*/ li.top-site-outer:nth-child(40) > div:nth-child(1) { margin-top: 50px !important; } li.top-site-outer:nth-child(79) > div:nth-child(1) { margin-top: 50px !important; } /*Das verbreitert den Platz für die Kacheln in der Breite, so dass z.B 9 anstatt 8 Kacheln pro Zeile platz haben*/ .ds-outer-wrapper-breakpoint-override main { width: 1182px !important; } /*Das minimiert die Abstände oben/unten zwischen den Kacheln (obwohl da was von Schriftgrösse steht)*/ body { font-size: 1px !important; } /*Rückt die Kacheln näher zusammen*/ .top-site-outer { padding: 0 !important; } /*Folgende Zeilen löschen oder verkleinern abstände unten und oben*/ .outer-wrapper { padding: 0px 0px 0px !important; } .outer-wrapper a { color: var(--newtab-primary-action-background); } main { margin: auto; width: 274px; padding: 0; } main section { margin-bottom: 0px !important; position: relative; } /*Folgende Zeile ändert Abstände über der 1. Kachelzeile (Margin-top) und den Abstand links (padding, zweite Pixelzahl).*/ .collapsible-section { padding: 0px 23px !important; margin-bottom: -10px !important; } /*Folgende Zeile vergrössern/verkleiner die Umrandung der Kacheln*/ .top-site-outer .tile { height: 80px !important; width: 80px !important; padding-top: 0px !important; border-radius: 6px !important; } /*Folgende Zeile vergrössern/verkleiner die eigentliche Kachel (also das "Bildchen"*/ .top-site-outer .tile .icon-wrapper { width: 66px !important; height: 66px !important; } }
-
Dann ist es ja toll, dass du soviel dazu beiträgst...
-
Dumm gefragt, aber was genau kann jemand mit meiner IP-Adresse anfangen? Also bezogen auf Sören Hentzschel's Antwort.
Dass Daten gezapft werden können, ist klar. Deswegen war die Idee, dass ich es a) nur im 2.-Browser nutze, wo ich niemals "heikle" Dinge tue (e-banking oder so) und b) immer in Firefox selbst deaktiviere, wenn ich es nicht mehr brauche (nicht deinstallieren).
Aber was kann man mit der ip so alles anstellen ? Ist die nicht sowieso dynamsich oder sowas? Kenne mich da nicht so aus.Edit: Und so free war dann windscribe auch nicht. 10GB mit anmeldung (natürlich fake email).
-
Windscribe - Free VPN and Ad Blocker – Holen Sie sich diese Erweiterung für 🦊 Firefox (de)Laden Sie Windscribe - Free VPN and Ad Blocker für Firefox herunter. Windscribe helps you circumvent censorship, block ads, beacons and trackers on websites…addons.mozilla.org
Habe mir jetzt mal das da geholt. Werde zur Sicherheit aber das nur in einem Browser installieren, in dem ich keine wichtigen Dingem mache. -
klar geht das, such dir eines aus https://addons.mozilla.org/de/firefox/search/?q=vpn
Kannst du denn einer davon empfehlen (der gratis ist) ?
-
Nein, ich will ja eine andere IP
-
Hallo,
Ich nutze hier 2 Firefoxbrowser mit 2 verschiedenen Profilen (einmal beta, einmal developer edition).
Ich suche nach einer Möglichkeit, im einen Browser mit meiner normalen IP und im anderen mit einer vpn-IP zu surfen.
Geht das irgendwie? z.B mit einem Add-on.
Wichtig: Es soll nicht Systemweit gelten, also nur im Browser und auch nur in genau diesem Browser. -
Ich muss diesen Thread nochmals aufmachen:
Ich habe das nun probiert und es funktioniert bei mir gar nicht. Wenn ich eines dieser Icons (also die URL) da einfüge und auf "vorschau" klicke, funktioniert es. Wenn ich dann aber auf speichern klicke, ist das Zeichen weg. Also komplett, es ist nichtmal mehr das Platzhalterzeichen dort.
Man kann aber drauf rein fliegen und denken, es funktioniert. Wenn man nämlich die Webseite besucht, kommt wieder das favicon. Man braucht also eine frische Chronik und muss nach dem Hinzufügen den Browser schliessen, um zu prüfen, ob es dann noch geht. Und das tut es bei mir nicht.
Kann das hier jemand reproduzieren? -
2002Andreas : Jap, ich blende es nun aus. Danke für euren eigentlich völlig einfachen Tipp
Ich werde dann aber 13 in einer Reihe und 9 Reihen und dann ausblenden (bei mir sollen alle 3 Reihen ohne Scrolling platz haben, aber das ist ein Kinderspiel, jetzt wo ich danke euch drauf gekommen bin, einfach die paar letzten auszublenden. Ich habe hier die ganze Zeit gemeinsame Vielfache ausgerechnet, damit es mit Reihenanzahl, Kachelnanzahl pro Reihe und der Zahl 8 übereinstimmt xD )
Danke!Generell ist das alles viel zu kompliziert gedacht. Es ist die Option bekannt, um die Anzahl der Reihen zu konfigurieren. Es ist bekannt, wie mittels CSS mehr Kacheln in einer Reihe dargestellt werden können. Am Ende muss man doch einfach nur noch die Kacheln via CSS ausblenden, die zu viel sind, um auf die gewünschte Anzahl Reihen zu kommen.
Danke
Du hast völlig recht. Manchmal braucht man jemand, der einem die eigentlich völlig banale Lösung präsentiert, während dem man selbst viel zu kompliziert plant -
Ich mache diese Frage mal nochmals auf:
Ich habe eine Idee, wie ich einzelne Kacheln hinzufügen kann, weiss aber nicht, wie ich es in der userContent.csss umsetzen kann. Aber meine Idee:
Wenn ich auf der Startseite (about:home) F12 drücke, damit sich der Inspektor öffnet, und ich dann eine der leeren Webseiten-Kacheln auswähle, kann ich links einen Rechtsklick machen und "knoten Klonen" auswählen. Dann habe ich genau eine (leere) Kachel mehr.
Wie setze ich das in css (also in der userContent.ccs) um? Also wie formuliert man in der userContent.css, dass man einen Knoten klonen will?