🇯🇵 日本語版紹介
💡🐞 You're welcome to post your suggestions and bug reports here.
Make Firefox support multiple rows of tabs.
🗂️ Tab Groups Support | Fully supports mouse operations for tab groups, delivering a smoother and more graceful experience. |
🎞️ Enhanced Animations | Adds fluid transitions for various tab-related actions. |
📐 Optimized Space Usage | Makes full use of available UI space, including the area beneath window control buttons. |
🖱️ Smooth Dragging | Supports animated tab dragging even in multi-row mode. |
📌 Pinned Tabs Grid Layout | Pinned tabs remain neatly compact when the Tabs bar is scrollable, minimizing space usage. |
🛠️ Customizable Preferences | Offers a rich set of options and features to tailor the experience precisely to your liking. |
🔄 Auto-Update Checking | Ensures you're always equipped with the newest enhancements and compatibility. |
- Firefox 115, 143 to 145 (excluding ESR versions), for Windows 7 to 11.
- Supports general script loaders, like xiaoxiaoflood's userChromeJS (Firefox Scripts).
🚨 Please read the following notes carefully before using this script:
- ❗ **Since this script contains many sensitive layout calculations designed for native Firefox, any tab-related legacy extensions (e.g. Tab Mix Plus), user scripts (
userChrome.js
) or CSS styles (userChrome.css
) can cause weird glitches and bugs. Please follow the installation steps below carefully. - This is an unofficial (and complicated) script maintained solely by me. This script may contain unforeseen bugs and is not guaranteed to keep compatible with the latest versions of Firefox. If an unexpected issue occurs, restarting Firefox may be necessary. In extreme cases — especially when using an outdated version of the script with a newly updated Firefox — the browser may become unusable, potentially resulting in the permanent loss of your previous browsing session. You may need to disable the script in such situations. Please use this script only if you are capable of and prepared to handle these risks.
- This script is developed for Windows and probably does not work on Ubuntu (Linux) and macOS.
- This script needs to override some functions of Firefox and requires
security.allow_unsafe_dangerous_privileged_evil_eval
to be enabled on Firefox 139+ for this purpose. The said setting is enabled automatically once you are applying this script, and it requires a manual disabling throughabout:config
after disabling or removing the script. Please note that and use this script with understanding.
- Follow the instructions in the 📘 Tab Mix Plus - Docs to install the script loader (Firefox Scripts) if you are not using any scripts. Skip this step if some scripts are already in use.
- Make sure that no other tab-related scripts and CSS styles are currently in use. Just in case, temporarily move all other
.js
(excludinguserChrome.js
, if any) and.css
files out ofchrome
. There are many reports of issues caused by conflicts with customized styles. - Download the 📥 script file and place it into
chrome
. - Restart Firefox to apply.
- If you moved some files out of
chrome
in step 2, please confirm that this script works as expected. Once verified, you can move the files back. If any conflicts arise, modify the scripts and style rules accordingly. If you need help, please provide the information here.
Important
If the script loader stops working after updating Firefox, please visit the page above and reinstall the latest version of the script loader.
Open about:config
and search for the prefix userChromeJS.multiTabRows@Merci.chao.
. Settings shown in gray are disabled due to other preferences.
If configuring via user.js
(not recommended), be sure to include the prefix userChromeJS.multiTabRows@Merci.chao.
. Example:
user_pref("userChromeJS.multiTabRows@Merci.chao.maxTabRows", 5);
Note
Many of these settings may not take effect due to dependencies with other preferences. It is strongly recommended to configure them via about:config
rather than using user.js
.
Name (w/ prefix) | Description |
---|---|
animateTabMoveMaxCount |
When the number of dragged tabs exceeds this value, drag animations are disabled and a drop indicator is shown instead. The minimum value is 0 . If dragging too many tabs causes lag, consider lowering this value.📝 Note: Some tab grouping operations may be unavailable, and the final drop position is determined by Firefox's native behavior, which may not behave as expected in certain scenarios (Firefox bug #1985434, #1988159, #1988162, #1988194). |
animationDuration |
Duration of animations in milliseconds (valid range: 0 - 1000 ). Note: Lengthy animations could strain system performance. |
disableDragToPinOrUnpin |
Disable tab pinning/unpinning via drag-and-drop in the same window. Not available on Firefox 115. |
dragToGroupTabs |
Enable tab grouping when dragging tabs over another. Disabling this setting results in behavior that differs from when browser.tabs.dragDrop.moveOverThresholdPercent is set to 50 or below: the disabled state allows tabs to be added to or removed from a group without altering their order. Not available on Firefox 115 or browser.tabs.groups.enabled is false . |
dynamicMoveOverThreshold |
Make tab-dragging movement smoother in certain scenarios, e.g. dragging pinned or grouped tabs. Not available on Firefox 115, or either dragToGroupTabs or browser.tabs.groups.enabled is false . |
hideDragPreview |
Hide the drag preview during a drag interaction:
|
hidePinnedDropIndicator |
Hide the indicator that appears when dragging a tab to pin it, if there are no existing pinned tabs. Not available on Firefox 115. |
hideScrollButtonsWhenDragging |
Visually hide the up/down scroll buttons when dragging. |
linesToDragScroll |
How many rows to scroll when dragging tabs to top/bottom edge. The minimum value is 1 . |
linesToScroll |
How many rows to scroll when using the mouse wheel. The minimum value is 1 . |
scrollButtonsSize |
The size (in pixels) of the scroll buttons during dragging. The minimum value is 0 , but it will be rendered as at least 2 device pixels in height; the maximum is limited to half the tab height. |
Name (w/ prefix) | Description |
---|---|
dynamicThemeImageSize |
When using themes, the size of the background image changes with the current number of rows. |
floatingBackdropBlurriness |
How blurry the background of items covering the tabs is when Tabs Bar is scrollable, available when tabsUnderControlButtons is 2 and both floatingBackdropClip & nativeWindowStyle are false . The minimum value is 0 . Not available on Firefox 115. |
floatingBackdropClip |
Clip the area covered by items on the Tabs Bar when it is scrollable, available when tabsUnderControlButtons is 2 . |
floatingBackdropOpacity |
How opaque the background of items covering the tab is when Tabs Bar is scrollable, available when tabsUnderControlButtons is 2 and floatingBackdropClip is false . The value should be from 0 to 100 . |
nativeWindowStyle |
Display the system-native theme style (e.g. effects from tools like DWMBlurGlass) on Tabs Bar. To achieve the full visual effect on Windows 11, you may also need to enable widget.windows.mica . This behaves similarly to browser.theme.windows.accent-color-in-tabs.enabled when DWM tools are not used on Windows 10. Not available on Firefox 115, or using any Firefox theme with background image. |
scrollbarThumbColor |
Color of the scrollbar thumb, must be a valid CSS color, variable, or the keyword auto . |
scrollbarTrackColor |
Color of the scrollbar track, must be a valid CSS color, variable, or the keyword auto . |
Name (w/ prefix) | Description |
---|---|
checkUpdate |
Check for a new version of this script when Firefox starts up or opens new windows. Set it to 1 or larger to enable, or 0 to disable. The value will be updated with the last checking time (e.g. 1759911972 ).💡 Enabling it is strongly recommended, as outdated scripts are unlikely to function properly on newer versions of Firefox. 📝 Note: Updates for this script will not be notified when using older versions of Firefox (except 115). |
checkUpdateAutoApply |
Update the script file automatically when there is a new version:
|
checkUpdateFrequency |
How often to check for new versions (days). The minimum value is 1 . |
debugMode |
⛔ Mode for debugging, not for general use. |
You can use userChrome.css
to tweak the following parameters to control tab size and spacing. The values shown below are default settings.
Note
Avoid using decimal values or units other than pixels (px
).
:root {
/* Horizontal space between tabs */
--tab-overflow-clip-margin: 2px !important;
/* Horizontal padding of tabs */
--tab-inline-padding: 8px !important;
/* Height of tab content: compact - 29px, normal - 36px, touch - 41px, should not small than 24px */
--tab-min-height: 36px !important;
/* Vertical space between tabs */
--tab-block-margin: 4px !important;
}
/*
This rule is necessary when: var(--tab-min-height) + var(--tab-block-margin) * 2 < 33px
Why 33px? The default height of .tab-label-container is 2.7em,
which is 32.4px when the font size is 12px,
and the tab should be taller than the .tab-label-container inside.
Otherwise the tab height will contain decimal and cause issues.
Example:
- --tab-min-height = 29px
- --tab-block-margin = 1px
→ Total: 29 + 1×2 = 31px
Since 31px < 33px, then this rule needs to apply to prevent layout issues.
*/
.tab-label-container {
height: auto !important;
}
.tab-content[pinned] {
/* Horizontal padding of pinned tabs */
padding-inline: 10px !important;
}
#tabbrowser-tabs {
/* Horizontal padding in tab groups */
--group-line-padding: 3px !important;
/* Max width of the labels of tab groups. It's OK to use other units */
--group-label-max-width: 10em !important;
}
There also few settings in about:config
for the layout of tabs:
Name (w/o prefix) | Description |
---|---|
browser.tabs.tabClipWidth |
Close button will show on the tabs that are wider than this size. |
browser.tabs.tabMinWidth |
Minimum width of normal tabs, including the white space around. |
widget.windows.mica |
Apply the native system style on Tabs Bar (Windows 11). |
widget.windows.mica.toplevel-backdrop |
Choose the effect of backdrop (Windows 11).
|
browser.theme.windows.accent-color-in-tabs.enabled |
Apply the system accent color on Tabs Bar (Windows 10). |
📥 Download the Lastest Version
Version 3.5.2
- Bug fix: dragged tabs might not be moved to the intended position if it is pressed against to the edge.
Version 3.5.1
- Add
disableDragToPinOrUnpin
: Disable tab pinning/unpinning via drag-and-drop in the same window (not available on Firefox 115). This setting will be removed if an official one is introduced. - Prevent window dragging during tab drop animation.
Version 3.5
- Update for Firefox 145.
- Add animation when tabs are moved to another window.
- Themes without background images can now use
nativeWindowStyle
. - Adjust CSS variables: add
--group-label-max-width
and--group-line-padding
on#tabbrowser-tabs
to control the size of group label (See: Advanced Tweaks). - Always close the menu when dragging an item from it onto the tab strip, if the menu overlaps the tab strip.
- Bug fix: background image issues when using
tabsAtBottom
. - Bug fix: certain settings were unexpectedly disabled under specific conditions.
- Bug fix: issue occured after dragging tabs to pin or unpin them.
- Bug fix: issue occured after dragging tabs to copy them to another window.
- Bug fix: issue occured after dragging a tab group out of the window so fast.
- Minor bug fixes.
- Refine code style for better readability.
Old Versions
Version 3.4.2
- Bug fix: Could not drag and drop tabs when enabling
hidePinnedDropIndicator
. - Bug fix: Tabs might have a weird jump on a newly opened window
- Bug fix: Tab close buttons did not always display or hide correctly.
- Bug fix: Layout issues with
tabsUnderControlButtons
in special cases. - Updates for this script will no longer be notified when using older versions of Firefox (except 115).
Minor Updates
Version 3.4.1.3
- Drag-and-drop with a drop indicator now animate.
Version 3.4.1.1
- Bug fix: Drop indicator is positioned incorrectly when dragging non-tab items onto the pinned tabs.
Version 3.4.1
- Bug fix: Dropping non‑tab items onto Tabs Bar causes issues.
- Bug fix:
hideEmptyPlaceholderWhenScrolling
may not work on private windows. - With
checkUpdateAutoApply
set to3
, it will now also receive updates for minor changes and fixes that do not trigger notifications.
Version 3.4
- Add
animateTabMoveMaxCount
: When the number of dragged tabs exceeds this value, drag animations are disabled and a drop indicator is shown instead. The minimum value is0
. If dragging too many tabs causes lag, consider lowering this value. Note: Some tab grouping operations may be unavailable, and the final drop position is determined by Firefox's native behavior, which may not behave as expected in certain scenarios. - Add
hidePinnedDropIndicator
: Hide the indicator that appears when dragging a tab to pin it, if there are no existing pinned tabs (not available on Firefox 115). - Streamline and improve the animation logic.
- The Tabs Bar will appear below the Bookmarks Toolbar when
tabsAtBottom
is set to2
, even if Bookmarks Toolbar is set as "Only Show on New Tab". - Improve
autoCollapse
: the tab strip now remains open while a context menu is displayed. - Increase the default values for two delay settings for
autoCollapse
. - Bug fix: When tab group spans multiple rows, collapsing or dragging it could be buggy in certain cases.
- Bug fix: Pressing the Esc key while dragging could cause issue.
- Bug fix: Copying multiple tabs with Ctrl key does not work reliably (Firefox bug #1987160).
- Bug fix: Tabs may scroll up when closing the last tab with keyboard shortcut.
- The script will never apply on popup windows.
- Update for Firefox 143 and 144.
- Multiple minor bug fixes.
Version 3.3
- Add
pinnedTabsFlexWidth
: Make pinned tab sizing behave like normal tabs. Pinned tabs will no longer be fixed in position when Tabs Bar is scrollable (experimental). - Add
checkUpdateAutoApply
: Update the script file automatically when there is a new version.0
- never,1
- ask,2
- always,3
- always and slient. - Fix a bug where reopening a closed pinned tab causes tab functions to not work normally on Firefox 142.
- Fix minor bugs related to full screen.
nativeWindowStyle
will also apply on full screen.- Refine the behavior for locking the size of the Tabs Bar.
- Minor bug fix.
Version 3.2.1
- Bug fix: Tabs occasionally exhibit strange jittering during animation.
- Bug fix: "Drag to create group" sometimes doesn't behave smoothly.
- Bug fix: Dragging an open group doesn't behave smoothly since the previous version.
- Update for Firefox 143.
Version 3.2
- Add
justifyCenter
: Justify tabs to the center horizontally:0
- never,1
- when there is only one row,2
- always. Behaviors such as closing tabs and collapsing tab groups may differ slightly when tabs are centered. - Add
scrollButtonsSize
: The size (in pixels) of the scroll buttons during dragging. The minimum value is2
; the maximum is limited to half the tab height. - Update for Firefox 143.
- Fix the problem that cannot drag tabs onto the Bookmarks Toolbar in some cases.
- Bug fixes.
Version 3.1
- Add
autoCollapse
and related settings: tabs will collapse to a single row when the cursor is not hovering. On Firefox 115,layout.css.has-selector.enabled
is required. (experimental) - Add
tabsAtBottom
: position the Tabs Bar beneath1
- Navigation Toolbar,2
- Bookmarks Toolbar. Not available on Firefox 115. - Add
hideDragPreview
: hide the drag preview during a drag interaction. Valid values are:0
(never),1
(tab groups only),2
(tabs only),3
(both). - Add
animationDuration
: duration in milliseconds (valid range:0
-1000
). Note: Lengthy animations could strain system performance. - Add
tabMaxWidth
: max width of tabs. Please usebrowser.tabs.tabMinWidth
for the min width. - Display the scroll up/down buttons when dragging, set
hideScrollButtonsWhenDragging
totrue
to hide it. - When all tabs in a tab group are dragged, the group now remains until the tabs are dropped.
- Update for Firefox 142.
- Fix a glich when dragging tab to the top/bottom edge to scroll.
- Fix display issue with some themes.
compactControlButtons
is always available on Windows 11 now.- Minor bug-fixes.
Version 3.0
- Add full support for tab groups.
- Introduce animations for various tab-related actions.
- Add the
dragToGroupTabs
option to enable or disable tab grouping when dragging tabs over another. - Add the
dynamicMoveOverThreshold
option to make tab-dragging movement smoother in certain scenarios. - Add the
nativeWindowStyle
option to display the system-native theme style on Tabs Bar (e.g. effects from DWM tools). - Update for Firefox 141.
- Bug fixes and improvements.
Version 2.6
- Fix layout problem when there are some audio playing/blocked/muted tabs.
- Fix layout problem when UI density is
Touch
.
Version 2.5.1
- Fix a bug that can't drop non-tab things onto Tabs Bar since the previous version.
Version 2.5
- Improve the experience of dragging non-adjacent tabs.
- Add check-update feature. Change
checkUpdateFrequency
to how often (days) you want, disable it by settingcheckUpdate
to0
.
Version 2.4
- Update for Firefox 138.
- Improvements and bug-fixings for tab dragging animation.
Version 2.3.5.1
- Bug fix: not working on Firefox 115
Version 2.3.5
- Update for Firefox 137.
Version 2.3.4.2
- Bug fix: tabs cannot be dragged to the first row in a special case.
Version 2.3.3
- Fix several bugs that occur when the window is too narrow and only one scrolling row is allowed to show.
Version 2.3.2.3
- Update for Firefox 136.
Version 2.3.1
- Update for the native tab groups feature.
- Fix a visual glitch when moving the selected pinned tabs together and Tabs Bar is scrollable.
Version 2.2
- Update the appearance of the scrollbar on Windows 11.
- Bug fix: layout may break when the display scaling is not 100%.
- Bug fix: tabs keep bouncing in some circumstances.
Version 2.1.3.1
- Bug fix: tabs keep bouncing in some spacial cases, typically happens when there are many pinned tabs.
tabsUnderControlButtons
is forced to be0
now when tab groups is enabled (browser.tabs.groups.enabled
istrue
).
Version 2.1.2
- Fix a bug since version 2.1: buttons before tabs cannot be clicked when there is only one row.
Version 2.1.1
- Fixed a bug where tabs kept bouncing in some cases.
Version 2.1
- Improve the behavior when closing tabs.
Version 2.0.1
- Bug fix: Changing settings or theme when there are multiple windows could cause Firefox to lag or freeze.
Version 2.0
- Implement
tabsUnderControlButtons = 2
(default). - Add new settings:
floatingBackdropClip
,floatingBackdropBlurriness
,floatingBackdropOpacity
,hideEmptyPlaceholderWhenScrolling
. - Change
scrollbarTrackColor
andscrollbarThumbColor
default value toauto
. - Settings are applied immediately.
- Better scrolling experience on tabs.
- Support Firefox 134.
- Various improvements and bug fixes.
Version 1.0
- First release.
- Other tab related user scripts, styles, and legacy extensions (e.g. Tab Mix Plus)
- Firefox Nightly
- Firefox 116 to the previous versions of latest released
- Touch operations
- macOS and Ubuntu (Linux)
- Vertical tabs, obviously
Add sub-menus to History Menu for previous days' history. Add-on Page (web archive)
There is no setting panel and you need to open about:config
and search for the prefix extensions.HistorySubmenus2@Merci.chao.
.
Note
Settings will apply to new windows.
Name | Description |
---|---|
checkUpdate |
Check for a new version of this script when Firefox starts up or opens new windows. Set it to 1 or larger to enable or 0 to disable. The value will be updated with the last checking time. 💡 Enabling it is strongly recommended, as outdated scripts are unlikely to function properly on newer versions of Firefox. |
checkUpdateFrequency |
How often to check for new versions (days). The minimum value is 1 . |
dateFormat |
The format of the name of sub-menus. |
submenuCount |
Count of sub-menus. |
historyCount |
Count of items listing directly in the History menu. |
Version 2025-08-14
- Update for Firefox 143.
- Add check upate feature.
Show page title in URL Bar. Add-on Page (web archive)
Open about:config
and search for the prefix extensions.PageTitle@Merci.chao.
.
Note
Settings will apply to new windows.
Name | Description |
---|---|
showDomain |
Display the domain nearby the lock icon. |
showSubTitle |
Display the url path after the page title. |
showUriOnHover |
Display the url temporarily when mouse hovering. |
decodeHashAndSearch |
Decode the hash and the query part, e.g. /index.html#hello%20world to /index.html#hello world . |
hideWww |
Hide the www sub-domain. |
highlightIdentityBox |
Add a backgrond for identity box (only when showDomain is true ). |
formattingEnabled |
Highlight the domain (only when showDomain is false ). |
checkUpdate |
Check for a new version of this script when Firefox starts up or opens new windows. Set it to 1 or larger to enable or 0 to disable. The value will be updated with the last checking time. 💡 Enabling it is strongly recommended, as outdated scripts are unlikely to function properly on newer versions of Firefox. |
checkUpdateFrequency |
How often to check for new versions (days). The minimum value is 1 . |
Version 2025-09-09
- Add check upate feature.
Full screen with keeping your task bar visible, or hide the toolbars when not maximized (picture-in-picture). Add-on Page (web archive)
Warning
This version of Semi-Full Screen is not tested on Mac OS and Ubuntu (Linux). It is probably glitchy or simply doesn't work at all.
Hotkey | Function |
---|---|
F11 or Full Screen Button |
Hide the toolbars and enter picture-in-picture mode. |
Ctrl + F11 or Ctrl + Full Screen Button |
Mazimize the window and enter semi-full screen mode, taskbar and sidebar (if any) will keep visible. |
Shift + F11 or Shift + Full Screen Button |
Enter normal full screen mode. |
Open about:config
and search for the prefix extensions.SemiFullScreen@Merci.chao.
.
Note
Settings will apply to new windows.
Name | Description |
---|---|
autoHideToolbarDelay |
The delay (in milliseconds) before auto-hiding the toolbar when the mouse has left the window edge and hasn't re-entered. |
checkUpdate |
Check for a new version of this script when Firefox starts up or opens new windows. Set it to 1 or larger to enable or 0 to disable. The value will be updated with the last checking time. 💡 Enabling it is strongly recommended, as outdated scripts are unlikely to function properly on newer versions of Firefox. |
checkUpdateFrequency |
How often to check for new versions (days). The minimum value is 1 . |
reverse |
Use F11 for semi-full screen and Ctrl + F11 for picture-in-picture. |
Version 2025-08-24
- Restore missing window border on Windows 7 and 8.
- Add
autoHideToolbarDelay
: The delay (in milliseconds) before auto-hiding the toolbar when the mouse has left the window edge and hasn't re-entered.
Version 2025-08-20
- Not hiding the dragging spaces on no-Tabs Bar mode.
Version 2025-08-16
- Fix unintentional space on Tabs Bar.
- Add check upate feature.
Float the toolbars over the page in full screen mode, instead of making the web page jumpy when the toolbars showing / hiding. Add-on Page (web achive)
CAUTION: This version of Float Toolbars in Full Screen is not tested on Mac OS and Ubuntu (Linux). It is probably glitchy or simply doesn't work at all.
Open about:config
and search for the prefix FloatToolbarsInFullScreen@Merci.chao.
.
Note
Settings will apply to new windows.
Name | Description |
---|---|
checkUpdate |
Check for a new version of this script when Firefox starts up or opens new windows. Set it to 1 or larger to enable or 0 to disable. The value will be updated with the last checking time. 💡 Enabling it is strongly recommended, as outdated scripts are unlikely to function properly on newer versions of Firefox. |
checkUpdateFrequency |
How often to check for new versions (days). The minimum value is 1 . |
Version 2025-08-16
- Now the Tabs Bar will show the native window style in full screen.
- Add check upate feature.
Display the Undo Close Tabs, Recently Closed Tabs, Recently Closed Windows and Restore Previous Session at the Tabs Bar right-click menu.
Restart Firefox by middle-clicking on the Exit button in Application menu.
Display the title bar on mouseover at the top edge; hide it when hovering over page content.
Display scrollbar for long menus (Bookmarks menu, for instance), instead of arrows at the top and bottom.