找回密码
 立即注册
楼主: pgain2004

[软件] Firefox更新推荐楼[12/6 扩展小更]

 火.. [复制链接]
     
发表于 2024-12-1 23:09 | 显示全部楼层
本帖最后由 暁美ほむら 于 2024-12-1 23:10 编辑

主楼的拖曳预览改名了:新的名字叫 Peek Pop

新增了多个触发模式以及其它功能

回复

使用道具 举报

头像被屏蔽
     
发表于 2024-12-2 06:44 来自手机 | 显示全部楼层
循此苦旅 发表于 2024-12-1 08:57
Nightly Android版的菜单改得挺蛋疼,还好可以连按关于页开隐藏设置改回去。

我们移动版也要定制工具栏
回复

使用道具 举报

发表于 2024-12-2 12:44 来自手机 | 显示全部楼层
再买自检星剁手 发表于 2024-12-2 06:44
我们移动版也要定制工具栏

我早看那个 home 键不爽了

评分

参与人数 1战斗力 +2 收起 理由
再买自检星剁手 + 2 好评加鹅

查看全部评分

回复

使用道具 举报

     
发表于 2024-12-4 09:03 | 显示全部楼层
最近又出现一个新问题,B站评论的图片这类网页的弹出界面会自动飞到页面的最顶端,求大佬解惑
回复

使用道具 举报

头像被屏蔽
     
发表于 2024-12-5 21:59 来自手机 | 显示全部楼层
现在的播放指示器(静音按钮)变成了在favicon右上角的样式,有办法让它回到替代favicon的样式吗?
回复

使用道具 举报

发表于 2024-12-11 17:10 | 显示全部楼层
Android版Firefox最近的良心更新,终于可以在平板设备默认访问桌面版网站,一个小版本更新又改回去了。
回复

使用道具 举报

     
发表于 2024-12-20 10:42 | 显示全部楼层
GALLADE 发表于 2024-12-4 09:03
最近又出现一个新问题,B站评论的图片这类网页的弹出界面会自动飞到页面的最顶端,求大佬解惑 ...

发现问题了,基本就是为了干活把公司的便携版拷贝到家里电脑上导致的

公司是1080的屏幕,家里是4k,我又忘记备份家里的便携版了,导致打开这个公司版本的便携版后,profile里的一些东西可能被公司的dpi设置覆盖了,于是现在所有弹出窗口位置都不正常

不知道大佬们知不知道应该如何修复?
回复

使用道具 举报

     
发表于 2024-12-21 22:55 | 显示全部楼层
GALLADE 发表于 2024-12-20 10:42
发现问题了,基本就是为了干活把公司的便携版拷贝到家里电脑上导致的

公司是1080的屏幕,家里是4k,我又 ...

删除 xulstore.json 可能有效
备份一下然后删除试试
回复

使用道具 举报

     
发表于 2024-12-22 00:36 | 显示全部楼层
fatjing 发表于 2024-12-21 22:55
删除 xulstore.json 可能有效
备份一下然后删除试试

感谢建议,但是没有改善233

现在就是例如B站评论的图片不会在当前浏览的中心弹出,一些其他网站的填表选项等弹出窗口也会位置不正确导致看不到或者无法下拉到底部等等,目前只能一边尝试,一边慢慢把使用习惯迁移到另一个移动版

题外话,好像前面哪位大佬的对书签右键菜单添加“替换为当前网页”脚本在某个版本后也失效了
回复

使用道具 举报

     
发表于 2024-12-22 01:09 | 显示全部楼层
GALLADE 发表于 2024-12-22 00:36
感谢建议,但是没有改善233

现在就是例如B站评论的图片不会在当前浏览的中心弹出,一些其他网站的填表选 ...

这个版本可以正常使用,你自己复制保存


  1. // ==UserScript==
  2. // @name            BookmarkOpt.uc.js
  3. // @long-description
  4. // @description
  5. /*
  6. 书签操作增强

  7. 添加书签到此处/更新书签,复制标题,复制Markdown格式链接,增加显示/隐藏书签工具栏按钮,中按点击书签工具栏文件夹收藏当前页面到该文件夹下,书签工具栏更多菜单自动适应弹出位置,Shift+右键可复制查看内部 ID

  8. 开关:
  9. userChromeJS.BookmarkOpt.enableToggleButton: 显示/隐藏书签工具栏按钮
  10. userChromeJS.BookmarkOpt.doubleClickToShow: 双击地址栏切换书签工具栏
  11. userChromeJS.BookmarkOpt.insertBookmarkByMiddleClickIconOnly: 中键点击书签工具栏的图标(书签,文件夹均可)添加书签
  12. */
  13. // @author          Ryan
  14. // @
  15. // @include         main
  16. // @include         chrome://browser/content/places/places.xhtml
  17. // @include         chrome://browser/content/places/places.xul
  18. // @include         chrome://browser/content/places/bookmarksSidebar.xhtml
  19. // @include         chrome://browser/content/bookmarks/bookmarksPanel.xul
  20. // @include         chrome://browser/content/places/historySidebar.xhtml
  21. // @include         chrome://browser/content/history/history-panel.xul
  22. // @version         1.4.2
  23. // @compatibility   Firefox 74
  24. // @shutdown        window.BookmarkOpt.destroy();
  25. // @homepageURL     https://github.com/benzBrake/FirefoxCustomize/tree/master/userChromeJS
  26. // @note            1.4.2 Bug 1904909
  27. // @note            1.4.1 修复中键添加书签任何位置也会添加书签的 BUG,修复快速点击中键两次导致图标无法回复的 BUG
  28. // @note            1.4.0 重写,中键点击图标添加书签后当前书签图标显示为成功图标,1s后自动恢复,移除无用的 userChromeJS.BookmarkOpt.insertBookmarkByMiddleClick 开关,增加 userChromeJS.BookmarkOpt.enableToggleButton 开关(用于控制 显示/隐藏书签工具栏按钮),去除中键单击地址栏复制当前地址
  29. // @note            1.3.8 添加书签到此处支持 PlacesChevron
  30. // @note            1.3.7 中键单击地址栏复制当前地址,修改切换书签栏按钮图标
  31. // @note            1.3.6 书签工具栏更多菜单自动适应弹出位置
  32. // @note            1.3.5 新增中建点击图标才添加书签的功能(userChromeJS.BookmarkOpt.insertBookmarkByMiddleClickIconOnly,默认不启用)
  33. // @note            1.3.4 新增中建点击添加书签功能(userChromeJS.BookmarkOpt.insertBookmarkByMiddleClick,默认不启用)
  34. // @note            1.3.3 还原显示隐藏书签工具栏按钮
  35. // @note            1.3.2 增加双击地址栏显示/隐藏书签工具栏的开关(userChromeJS.BookmarkOpt.doubleClickToShow)
  36. // @note            1.3.1 去除显示隐藏书签工具栏按钮
  37. // @note            1.3 尝试兼容 Firefox 57+
  38. // @note            1.2.2 修改界面语言读取方式
  39. // @note            1.2.1 新增显示隐藏书签工具栏按钮
  40. // @note            1.2 修复黑夜模式更新书签图标不变色,增加获取 GUID
  41. // @note            1.1 修复无法热插拔,添加书签使用新 API、修复部分情况无法添加,复制标题和复制链接支持书签文件夹和历史分类,临时移除双击地址栏 显示/隐藏书签工具栏
  42. // @note            1.0 初始化版本
  43. // ==/UserScript==
  44. (async function (css, imp, ucfirst, add_style, copy_text, $, create_el, add_events, remove_events) {
  45.     const Services = imp("Services");
  46.     const PlacesUIUtils = imp("PlacesUIUtils");
  47.     const PlacesUtils = imp("PlacesUtils");
  48.     // Bug 1904909 PlacesUtils::GatherDataText and GatherDataHtml should not recurse into queries
  49.     if (typeof PlacesUtils.nodeIsFolder === "undefined") PlacesUtils.nodeIsFolder = PlacesUtils.nodeIsFolderOrShortcut;
  50.     const LANG = {
  51.         'zh-CN': {
  52.             "add bookmark here": "添加书签到此处",
  53.             "add bookmark here tooltip": "左键:添加到最后\nShift+左键:添加到最前",
  54.             "update current bookmark": "替换为当前网址",
  55.             "update current bookmark tooltip": "左键:替换当前网址\n中键:替换当前地址和标题\n右键:替换当前网址和自定义当前标题",
  56.             "update current bookmark prompt": "更新当前书签标题,原标题为:\n %s",
  57.             "copy bookmark title": "复制标题",
  58.             "copy bookmark link": "复制链接 [MARKDOWN]",
  59.             "show node type": "节点类型",
  60.             "show node guid": "节点 ID",
  61.             "toggle personalToolbar": "显示/隐藏书签工具栏",
  62.             "auto hide": "自动隐藏"
  63.         },
  64.         'en-US': {
  65.             "add bookmark here": "Add Bookmark Here",
  66.             "add bookmark here tooltip": "Left click: add bookmark to the end.\nShift + Left click: add bookmark to the first.",
  67.             "update current bookmark tooltip": "Left click:replace with current url\nMiddle click:replace with current title and bookmark\nRight click:replace with current url and custom title.",
  68.             "update current bookmark prompt": "Update current bookmark's title, original title is \n %s",
  69.             "copy bookmark title": "Copy Title",
  70.             "copy bookmark link": "Copy URL [MARKDOWN]",
  71.             "show node type": "Node type",
  72.             "show node guid": "Node guid",
  73.             "toggle personalToolbar": "Toggle PersonalToolbar",
  74.             "auto hide": "Auto hide"
  75.         }
  76.     }

  77.     let _LOCALE = Services.prefs.getCharPref("general.useragent.locale", "zh-CN");
  78.     const LOCALE = LANG.hasOwnProperty(_LOCALE) ? _LOCALE : 'zh-CN'

  79.     // 右键菜单
  80.     const PLACES_CONTEXT_ITEMS = [{
  81.         id: 'placesContext_add:bookmark',
  82.         label: $L("add bookmark here"),
  83.         tooltiptext: $L("add bookmark here tooltip"),
  84.         accesskey: "h",
  85.         insertBefore: "placesContext_show_bookmark:info",
  86.         condition: "toolbar folder bookmark",
  87.         oncommand: "window.BookmarkOpt.operate(event, 'add', this.parentNode.triggerNode)"
  88.     }, {
  89.         id: "placesContext_update_bookmark:info",
  90.         label: $L("update current bookmark"),
  91.         tooltiptext: $L("update current bookmark tooltip"),
  92.         accesskey: "u",
  93.         insertBefore: "placesContext_show_bookmark:info",
  94.         condition: "bookmark",
  95.         oncommand: "window.BookmarkOpt.operate(event, 'update', this.parentNode.triggerNode)",
  96.     }, {
  97.         id: "placesContext_copyTitle",
  98.         label: $L("copy bookmark title"),
  99.         insertBefore: "placesContext_paste_group",
  100.         condition: "container uri",
  101.         accesskey: "A",
  102.         oncommand: "window.BookmarkOpt.operate(event, 'copyTitle', this.parentNode.triggerNode)",
  103.     }, {
  104.         id: "placesContext_copyLink",
  105.         label: $L("copy bookmark link"),
  106.         insertBefore: "placesContext_paste_group",
  107.         condition: "container uri",
  108.         accesskey: "L",
  109.         text: "[%TITLE%](%URL%)",
  110.         oncommand: "window.BookmarkOpt.operate(event, 'copyUrl', this.parentNode.triggerNode)",
  111.         accesskey: "L"
  112.     }, {
  113.         class: 'placesContext_showNodeInfo',
  114.         label: $L("show node type"),
  115.         condition: 'shift',
  116.         oncommand: 'window.BookmarkOpt.operate(event, "nodeType")',
  117.         insertBefore: 'placesContext_openSeparator',
  118.         style: 'list-style-image: url(chrome://global/skin/icons/info.svg)',
  119.     }, {
  120.         class: 'placesContext_showNodeInfo',
  121.         label: $L("show node guid"),
  122.         condition: 'shift',
  123.         oncommand: 'window.BookmarkOpt.operate(event, "nodeGuid")',
  124.         insertBefore: 'placesContext_openSeparator',
  125.         style: 'list-style-image: url(chrome://global/skin/icons/info.svg)',
  126.     }];

  127.     // 书签弹出面板菜单
  128.     const PLACES_POPUP_ITEMS = [{
  129.         'label': $L("add bookmark here"),
  130.         'tooltiptext': $L("add bookmark here tooltip"),
  131.         'image': "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAxNiAxNiIgZmlsbD0iY29udGV4dC1maWxsIiBmaWxsLW9wYWNpdHk9ImNvbnRleHQtZmlsbC1vcGFjaXR5IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8cGF0aCBkPSJNOC44MDgwMiAyLjEwMTc5QzguNDc3ODkgMS40MzI4NyA3LjUyNDAzIDEuNDMyODcgNy4xOTM5IDIuMTAxNzlMNS42NzI4MSA1LjE4Mzg0TDIuMjcxNTYgNS42NzgwN0MxLjUzMzM2IDUuNzg1MzQgMS4yMzg2MSA2LjY5MjUxIDEuNzcyNzcgNy4yMTMyTDQuMjMzOTQgOS42MTIyNEwzLjY1Mjk0IDEyLjk5OTdDMy41MjY4NCAxMy43MzUgNC4yOTg1MyAxNC4yOTU2IDQuOTU4NzkgMTMuOTQ4NUw4LjAwMDk2IDEyLjM0OTFMOC40ODI5IDEyLjYwMjVDOC4xODU5NyAxMi4zMjg0IDggMTEuOTM1OSA4IDExLjVDOCAxMS40NDQ2IDguMDAzIDExLjM5IDguMDA4ODQgMTEuMzM2MkM3Ljg2MjM2IDExLjMzNDkgNy43MTU2NCAxMS4zNjk0IDcuNTgyMTUgMTEuNDM5NUw0LjY3MjggMTIuOTY5MUw1LjIyODQzIDkuNzI5NDdDNS4yNzg1MSA5LjQzNzUxIDUuMTgxNzEgOS4xMzk2MSA0Ljk2OTYgOC45MzI4NUwyLjYxNTg4IDYuNjM4NTRMNS44Njg2NCA2LjE2NTg5QzYuMTYxNzggNi4xMjMyOSA2LjQxNTE5IDUuOTM5MTggNi41NDYyOCA1LjY3MzU1TDguMDAwOTYgMi43MjYwNUw4LjczMzUxIDQuMjEwMzZDOC45NTc4MiA0LjA3Njc1IDkuMjE5OTUgNCA5LjUgNEg5Ljc0NDg1TDguODA4MDIgMi4xMDE3O**OS41IDVDOS4yMjM4NiA1IDkgNS4yMjM4NiA5IDUuNUM5IDUuNzc2MTQgOS4yMjM4NiA2IDkuNSA2SDE0LjVDMTQuNzc2MSA2IDE1IDUuNzc2MTQgMTUgNS41QzE1IDUuMjIzODYgMTQuNzc2MSA1IDE0LjUgNUg5LjVaTTkuNSA4QzkuMjIzODYgOCA5IDguMjIzODYgOSA4LjVDOSA4Ljc3NjE0IDkuMjIzODYgOSA5LjUgOUgxNC41QzE0Ljc3NjEgOSAxNSA4Ljc3NjE0IDE1IDguNUMxNSA4LjIyMzg2IDE0Ljc3NjEgOCAxNC41IDhIOS41Wk05LjUgMTFDOS4yMjM4NiAxMSA5IDExLjIyMzkgOSAxMS41QzkgMTEuNzc2MSA5LjIyMzg2IDEyIDkuNSAxMkgxNC41QzE0Ljc3NjEgMTIgMTUgMTEuNzc2MSAxNSAxMS41QzE1IDExLjIyMzkgMTQuNzc2MSAxMSAxNC41IDExSDkuNVoiLz4KPC9zdmc+Cg==",
  132.         oncommand: "window.BookmarkOpt.operate(event, 'panelAdd', this.parentNode)"
  133.     }, {

  134.     }];

  135.     if (window.BookmarkOpt) {
  136.         window.BookmarkOpt.destroy();
  137.         delete window.BookmarkOpt;
  138.     }

  139.     var isMouseDown = false;

  140.     window.BookmarkOpt = {
  141.         items: [],
  142.         get topWin () {
  143.             return Services.wm.getMostRecentWindow("navigator:browser");
  144.         },
  145.         X_MAIN: 'chrome://browser/content/browser.xhtml',
  146.         X_PLACES: 'chrome://browser/content/places/places.xhtml',
  147.         XUL_PLACES: 'chrome://browser/content/places/places.xul',
  148.         X_BOOKMARK_SB: 'chrome://browser/content/places/bookmarksSidebar.xhtml',
  149.         XUL_BOOKMARK_SB: 'chrome://browser/content/bookmarks/bookmarksPanel.xul',
  150.         X_HISTORY_SB: 'chrome://browser/content/places/historySidebar.xhtml',
  151.         XUL_HISTORY_SB: 'chrome://browser/content/history/history-panel.xul',
  152.         init () {
  153.             let he = "(?:_HTML(?:IFIED)?|_ENCODE)?";
  154.             let rTITLE = "%TITLE" + he + "%|%t\\b";
  155.             let rURL = "%URL" + he + "%|%u\\b";
  156.             let rHOST = "%HOST" + he + "%|%h\\b";
  157.             this.rTITLE = new RegExp(rTITLE, "i");
  158.             this.rURL = new RegExp(rURL, "i");
  159.             this.rHOST = new RegExp(rHOST, "i");
  160.             this.regexp = new RegExp(
  161.                 [rTITLE, rURL, rHOST].join("|"), "ig");

  162.             if (!this.style) {
  163.                 this.style = add_style(css);
  164.             }
  165.             switch (location.href) {
  166.                 case this.X_MAIN:
  167.                     if (!$("urlbar").getAttribute("bmopt-inited")) {
  168.                         add_events($('urlbar'), ['dblclick'], this, false);
  169.                         $('urlbar').setAttribute('bmopt-inited', true);
  170.                     }
  171.                     if (!$("PlacesToolbar").getAttribute("bmopt-inited")) {
  172.                         add_events($('PlacesToolbar'), ['popupshowing', 'popuphidden'], this, false);
  173.                         $('PlacesToolbar').setAttribute('bmopt-inited', true);
  174.                         this.PlacesChevronObserver = new MutationObserver(mutations => {
  175.                             mutations.forEach(mutation => {
  176.                                 if (mutation.type === 'attributes' && mutation.attributeName === 'collapsed') {
  177.                                     if (mutation.target.getAttribute("collapsed") === "true") {
  178.                                         this.isObservingPlacesChevron = false;
  179.                                         remove_events(mutation.target, ['mouseover'], this, false);
  180.                                     } else {
  181.                                         this.isObservingPlacesChevron = true;
  182.                                         add_events(mutation.target, ['mouseover'], this, false);
  183.                                     }
  184.                                 }
  185.                             })
  186.                         });
  187.                         this.PlacesChevronObserver.observe(document.getElementById("PlacesChevron"), { attributes: true });
  188.                         add_events($('PlacesChevronPopup'), ['popuphidden'], this, false);
  189.                     }
  190.                     if ($('PlacesToolbarItems')) {
  191.                         add_events($('PlacesToolbarItems'), ['mousedown', 'click'], this, false);
  192.                         add_events(document, ['mouseup'], this, false);
  193.                     }
  194.                     if (Services.prefs.getBoolPref("userChromeJS.BookmarkOpt.enableToggleButton", false)) {
  195.                         if (!(CustomizableUI.getWidget('BookmarkOpt-Toggle-PersonalToolbar') && CustomizableUI.getWidget('BookmarkOpt-Toggle-PersonalToolbar').forWindow(window)?.node)) {
  196.                             CustomizableUI.createWidget({
  197.                                 id: 'BookmarkOpt-Toggle-PersonalToolbar',
  198.                                 removable: true,
  199.                                 defaultArea: CustomizableUI.AREA_NAVBAR,
  200.                                 type: "custom",
  201.                                 onBuild: (doc) => {
  202.                                     let btn = create_el('toolbarbutton', {
  203.                                         id: 'BookmarkOpt-Toggle-PersonalToolbar',
  204.                                         label: $L("toggle personalToolbar"),
  205.                                         tooltiptext: $L("toggle personalToolbar"),
  206.                                         style: 'list-style-image: url("chrome://browser/skin/bookmarks-toolbar.svg");',
  207.                                         class: 'toolbarbutton-1 chromeclass-toolbar-additional',
  208.                                     }, doc);
  209.                                     add_events(btn, ['click'], this, false);
  210.                                     return btn;
  211.                                 }
  212.                             })
  213.                         }
  214.                     }
  215.                 case this.X_PLACES:
  216.                 case this.XUL_PLACES:
  217.                 case this.X_BOOKMARK_SB:
  218.                 case this.XUL_BOOKMARK_SB:
  219.                 case this.X_HISTORY_SB:
  220.                 case this.XUL_HISTORY_SB:
  221.                     if (!$("placesContext").getAttribute("bmopt-inited")) {
  222.                         const ins = $("placesContext_createBookmark");
  223.                         PLACES_CONTEXT_ITEMS.forEach(prop => {
  224.                             let item = create_el('menuitem', prop, document);
  225.                             if (!prop.condition) item.setAttribute('condition', 'normal');
  226.                             this.items.push(item);
  227.                             var refNode = ($(prop.insertBefore) || ins || $('#placesContext').firstChild);
  228.                             if (!refNode.classList.contains('menuitem-iconic')) {
  229.                                 item.classList.remove('menuitem-iconic');
  230.                             }
  231.                             refNode.before(item);
  232.                         });
  233.                         add_events($("placesContext"), ['popupshowing', 'popuphidden'], this, false);
  234.                     }
  235.                     break;
  236.             }
  237.         },
  238.         destroy () {
  239.             if (this.style && this.style.parentNode) {
  240.                 this.style.parentNode.removeChild(this.style);
  241.                 this.style = null;
  242.             }
  243.             switch (location.href) {
  244.                 case this.X_MAIN:
  245.                     remove_events($('urlbar'), ['dblclick'], this, false);
  246.                     $('urlbar').removeAttribute('bmopt-inited');
  247.                     this.items.forEach(item => {
  248.                         item.parentNode.removeChild(item);
  249.                     })
  250.                     remove_events($('PlacesToolbar'), ['popupshowing', 'popuphidden'], this, false);
  251.                     if ($('PlacesToolbar')) {
  252.                         $('PlacesToolbar').removeAttribute('bmopt-inited');
  253.                         remove_events($('PlacesChevronPopup'), ['popuphidden'], this, false);
  254.                         try {
  255.                             CustomizableUI.destroyWidget("BookmarkOpt-Toggle-PersonalToolbar");
  256.                         } catch (ex) { }
  257.                     }
  258.                     if ($('PlacesToolbarItems')) {
  259.                         remove_events($('PlacesToolbarItems'), ['mousedown', 'click', this]);
  260.                         remove_events(document, ['mouseup'], this, false);
  261.                     }
  262.                     if (this.PlacesChevronObserver) {
  263.                         this.PlacesChevronObserver.disconnect();
  264.                     }
  265.                 case this.X_PLACES:
  266.                 case this.XUL_PLACES:
  267.                 case this.X_BOOKMARK_SB:
  268.                 case this.XUL_BOOKMARK_SB:
  269.                 case this.X_HISTORY_SB:
  270.                 case this.XUL_HISTORY_SB:
  271.                     remove_events($("placesContext"), ['popupshowing', 'popuphidden'], this, false);
  272.                     $('placesContext').removeAttribute('bmopt-inited');
  273.                     this.clearPanelItems(document);
  274.                     break;
  275.             }
  276.         },
  277.         handleEvent (event) {
  278.             const { target, button, type } = event;
  279.             const { document: doc, setToolbarVisibility } = target.ownerGlobal;
  280.             switch (type) {
  281.                 case 'click':
  282.                     if (button == 1 && isMouseDown) {
  283.                         let addBookmark = true;
  284.                         if (Services.prefs.getBoolPref("userChromeJS.BookmarkOpt.insertBookmarkByMiddleClickIconOnly", false)
  285.                             && !target.hasAttribute("query") /* 排除最近访问 */
  286.                         ) {
  287.                             let targetRect = target.getBoundingClientRect();
  288.                             let x = event.clientX - target.getBoundingClientRect().left; // 鼠标点击位置相对于当前书签
  289.                             let icon = target.tagName.toLowerCase() === "toolbarbutton" ? target.querySelector(":scope>image") : target.firstChild;
  290.                             let iconRect = icon.getBoundingClientRect();
  291.                             let paddingLeft = iconRect.left - targetRect.left;
  292.                             if (x > paddingLeft + iconRect.width) {
  293.                                 // 点击的是标签,不覆盖默认的功能:打开全部
  294.                                 addBookmark = false;
  295.                             }
  296.                         }
  297.                         if (addBookmark) {
  298.                             event.preventDefault();
  299.                             event.stopPropagation();
  300.                             this.operate(event, 'add', target, (...args) => {
  301.                                 let icon = target.tagName === "toolbarbutton" ? target.querySelector(":scope>image") : target.firstChild.firstChild;
  302.                                 if (icon.hasAttribute('src') && !icon.getAttribute('src').endsWith('N3oiLz48L3N2Zz4=')) {
  303.                                     icon.setAttribute('original-src', icon.getAttribute('src'));
  304.                                 }
  305.                                 icon.setAttribute('src', 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0OCA0OCIgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2IiB0cmFuc2Zvcm09InNjYWxlKDEuMSkiPjxsaW5lYXJHcmFkaWVudCBpZD0iNXp6TUdWUW5OX1F5UllXR21KVXNRYSIgeDE9IjkuODU4IiB4Mj0iMzguMTQyIiB5MT0iOS44NTgiIHkyPSIzOC4xNDIiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj48c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiMyMWFkNjQiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiMwODgyNDIiLz48L2xpbmVhckdyYWRpZW50PjxwYXRoIGZpbGw9InVybCgjNXp6TUdWUW5OX1F5UllXR21KVXNRYSkiIGQ9Ik00NCwyNGMwLDExLjA0NS04Ljk1NSwyMC0yMCwyMFM0LDM1LjA0NSw0LDI0UzEyLjk1NSw0LDI0LDRTNDQsMTIuOTU1LDQ0LDI0eiIvPjxwYXRoIGQ9Ik0zMi4xNzIsMTYuMTcyTDIyLDI2LjM0NGwtNS4xNzItNS4xNzJjLTAuNzgxLTAuNzgxLTIuMDQ3LTAuNzgxLTIuODI4LDBsLTEuNDE0LDEuNDE0Yy0wLjc4MSwwLjc4MS0wLjc4MSwyLjA0NywwLDIuODI4bDgsOGMwLjc4MSwwLjc4MSwyLjA0NywwLjc4MSwyLjgyOCwwbDEzLTEzYzAuNzgxLTAuNzgxLDAuNzgxLTIuMDQ3LDAtMi44MjhMMzUsMTYuMTcyQzM0LjIxOSwxNS4zOTEsMzIuOTUzLDE1LjM5MSwzMi4xNzIsMTYuMTcyeiIgb3BhY2l0eT0iLjA1Ii8+PHBhdGggZD0iTTIwLjkzOSwzMy4wNjFsLTgtOGMtMC41ODYtMC41ODYtMC41ODYtMS41MzYsMC0yLjEyMWwxLjQxNC0xLjQxNGMwLjU4Ni0wLjU4NiwxLjUzNi0wLjU4NiwyLjEyMSwwTDIyLDI3LjA1MWwxMC41MjUtMTAuNTI1YzAuNTg2LTAuNTg2LDEuNTM2LTAuNTg2LDIuMTIxLDBsMS40MTQsMS40MTRjMC41ODYsMC41ODYsMC41ODYsMS41MzYsMCwyLjEyMWwtMTMsMTNDMjIuNDc1LDMzLjY0NiwyMS41MjUsMzMuNjQ2LDIwLjkzOSwzMy4wNjF6IiBvcGFjaXR5PSIuMDciLz48cGF0aCBmaWxsPSI**ZmIiBkPSJNMjEuMjkzLDMyLjcwN2wtOC04Yy0wLjM5MS0wLjM5MS0wLjM5MS0xLjAyNCwwLTEuNDE0bDEuNDE0LTEuNDE0YzAuMzkxLTAuMzkxLDEuMDI0LTAuMzkxLDEuNDE0LDBMMjIsMjcuNzU4bDEwLjg3OS0xMC44NzljMC4zOTEtMC4zOTEsMS4wMjQtMC4zOTEsMS40MTQsMGwxLjQxNCwxLjQxNGMwLjM5MSwwLjM5MSwwLjM5MSwxLjAyNCwwLDEuNDE0bC0xMywxM0MyMi4zMTcsMzMuMDk4LDIxLjY4MywzMy4wOTgsMjEuMjkzLDMyLjcwN3oiLz48L3N2Zz4=');
  306.                                 setTimeout(() => {
  307.                                     Array.from(target.querySelectorAll('image[src$="LjcwN3oiLz48L3N2Zz4="]')).forEach(function (aImage) {
  308.                                         if (aImage.hasAttribute('original-src')) {
  309.                                             aImage.setAttribute('src', aImage.getAttribute('original-src'));
  310.                                             aImage.removeAttribute('original-src');
  311.                                         } else {
  312.                                             aImage.removeAttribute('src');
  313.                                         }
  314.                                     });
  315.                                 }, 1000);
  316.                             });
  317.                         }
  318.                     }
  319.                     if (target.id !== "BookmarkOpt-Toggle-PersonalToolbar") break;
  320.                 case 'dblclick':
  321.                     if (Services.prefs.getBoolPref('userChromeJS.BookmarkOpt.doubleClickToShow', true) || target.id === "BookmarkOpt-Toggle-PersonalToolbar") {
  322.                         target.diabled = true;
  323.                         setTimeout(function () {
  324.                             var bar = $("PersonalToolbar", doc);
  325.                             setToolbarVisibility(bar, !!bar.collapsed);
  326.                             target.disabled = false;
  327.                         }, 50);
  328.                         break;
  329.                     }
  330.                     break;
  331.                 case 'popupshowing':
  332.                     if (target.id === 'placesContext') {
  333.                         let state = [],
  334.                             triggerNode = event.currentTarget.triggerNode,
  335.                             view = PlacesUIUtils.getViewForNode(triggerNode),
  336.                             aNode = view ? view.selectedNode : {};

  337.                         if (aNode) {
  338.                             ['bookmark', 'container', 'day', 'folder', 'historyContainer', 'host', 'query', 'separator', 'tagQuery'].forEach(condition => {
  339.                                 eval("if (PlacesUtils.nodeIs" + ucfirst(condition) + "(aNode)) state.push(condition)");
  340.                             });
  341.                             if (PlacesUtils.nodeIsURI(aNode)) state.push("uri");
  342.                         }
  343.                         if (event.shiftKey) state.push('shift');
  344.                         target.setAttribute('bmopt', state.join(" "));
  345.                     } else {
  346.                         let firstItem = target.firstChild;
  347.                         if (firstItem && firstItem.classList.contains('bmopt')) return;
  348.                         let last;
  349.                         PLACES_POPUP_ITEMS.forEach(c => {
  350.                             let item;
  351.                             if (c.label) {
  352.                                 item = create_el('menuitem', c, doc);
  353.                                 item.classList.add('bmopt-panel');
  354.                             } else {
  355.                                 item = create_el('menuseparator', {
  356.                                     'class': 'bmopt-separator'
  357.                                 }, event.target.ownerDocument);
  358.                             }
  359.                             if (last) {
  360.                                 last.after(item);
  361.                             } else if (firstItem) {
  362.                                 firstItem.parentNode.insertBefore(item, firstItem);
  363.                             } else {
  364.                                 target.appendChild(item);
  365.                             }
  366.                             last = item;
  367.                         });
  368.                     }
  369.                     break;
  370.                 case 'popuphidden':
  371.                     if (target.id === "placesContext") {
  372.                         target.setAttribute('bmopt', '');
  373.                     } else {
  374.                         this.clearPanelItems(target, true);
  375.                     }
  376.                     break;
  377.                 case 'mousedown':
  378.                     if (button === 1) {
  379.                         if (target.id === "PlacesToolbar" || target.id === "PlacesToolbarItems" || target.id === "PlacesChevron" || (target.classList.contains('bookmark-item') && !target.hasAttribute("query"))) {
  380.                             isMouseDown = true;
  381.                         }
  382.                         !Services.prefs.getBoolPref("browser.bookmarks.openInTabClosesMenu", true) && target.setAttribute("closemenu", "none");
  383.                     }
  384.                     break;
  385.                 case 'mouseup':
  386.                     setTimeout(() => {
  387.                         isMouseDown = false;
  388.                     }, 50);
  389.                     break;
  390.                 case 'mouseover':
  391.                     if (target.id === "PlacesChevron") {
  392.                         if (target.getAttribute("open") == "true") return;
  393.                         const menupopup = target.querySelector(":scope>menupopup");
  394.                         if (event.clientX > (target.ownerGlobal.innerWidth / 2) && event.clientY < (target.ownerGlobal.innerHeight / 2)) {
  395.                             menupopup.setAttribute("position", "after_end");
  396.                         } else if (event.clientX < (target.ownerGlobal.innerWidth / 2) && event.clientY > (target.ownerGlobal.innerHeight / 2)) {
  397.                             menupopup.setAttribute("position", "before_start");
  398.                         } else if (event.clientX > (target.ownerGlobal.innerWidth / 2) && event.clientY > (target.ownerGlobal.innerHeight / 2)) {
  399.                             menupopup.setAttribute("position", "before_start");
  400.                         } else {
  401.                             menupopup.removeAttribute("position", "after_end");
  402.                         }
  403.                     }
  404.                     break;
  405.             }
  406.         },
  407.         clearPanelItems: function (target, do_not_recursive = false) {
  408.             var menuitems = (target || document).querySelectorAll((do_not_recursive ? ":scope>" : "") + "[class*='bmopt']");
  409.             for (let menuitem of menuitems) {
  410.                 menuitem.parentNode.removeChild(menuitem);
  411.             }
  412.         },
  413.         operate (event, aMethod, aTriggerNode, callback) {
  414.             let popupNode = aTriggerNode || PlacesUIUtils.lastContextMenuTriggerNode || document.popupNode;
  415.             if (!popupNode) return;
  416.             let view = PlacesUIUtils.getViewForNode(popupNode),
  417.                 aNode;

  418.             if (view && view.selectedNode) {
  419.                 aNode = view.selectedNode;
  420.             } else {
  421.                 aNode = popupNode._placesNode;
  422.             }

  423.             let aWin = this.topWin,
  424.                 currentTitle = aWin.gBrowser.contentTitle,
  425.                 currentUrl = aWin.gBrowser.currentURI.spec,
  426.                 nodeIsFolder = PlacesUtils.nodeIsFolder(aNode),
  427.                 nodeIsHistoryFolder = PlacesUtils.nodeIsHistoryContainer(aNode),
  428.                 panelTriggered = false;

  429.             switch (aMethod) {
  430.                 case 'panelAdd':
  431.                     // 清除新增的添加到到此处菜单,有可能会影响添加顺序
  432.                     this.clearPanelItems(aTriggerNode);
  433.                     panelTriggered = true;
  434.                 case 'add':
  435.                     var info = {
  436.                         title: currentTitle,
  437.                         url: currentUrl,
  438.                         index: nodeIsFolder ? (event.shiftKey ? 0 : PlacesUtils.bookmarks.DEFAULT_INDEX) : (event.shiftKey ? aNode.bookmarkIndex : aNode.bookmarkIndex + 1),
  439.                         parentGuid: nodeIsFolder ? aNode.targetFolderGuid || aNode.bookmarkGuid : aNode.parent.targetFolderGuid || aNode.parent.bookmarkGuid
  440.                     };
  441.                     try {
  442.                         PlacesUtils.bookmarks.insert(info).then((...args) => {
  443.                             if (callback) {
  444.                                 callback(...args);
  445.                             }
  446.                         });
  447.                     } catch (e) {
  448.                         aWin.console.error(e);
  449.                     }
  450.                     if (Services.prefs.getBoolPref("browser.bookmarks.openInTabClosesMenu") || panelTriggered) {
  451.                         closeMenus(aTriggerNode);
  452.                     }
  453.                     break;
  454.                 case 'update':
  455.                     if (!aNode.bookmarkGuid) return;
  456.                     var info = {
  457.                         guid: aNode.bookmarkGuid,
  458.                         title: aNode.title,
  459.                         url: currentUrl,
  460.                     }
  461.                     if (event.button === 1) {
  462.                         info.title = currentTitle;
  463.                     } else if (event.button === 2) {
  464.                         const title = window.prompt($L("update current bookmark prompt", aNode.title), currentTitle);
  465.                         if (title === null) return;
  466.                         if (title !== aNode.title)
  467.                             info.title = title;
  468.                     }
  469.                     try {
  470.                         PlacesUtils.bookmarks.update(info).then((...args) => {
  471.                             if (callback) {
  472.                                 callback(...args);
  473.                             }
  474.                         });
  475.                     } catch (e) {
  476.                         aWin.console.error(e);
  477.                     }
  478.                     break;
  479.                 case 'copyTitle':
  480.                     var format = "%TITLE%"
  481.                 case 'copyUrl':
  482.                 case 'copy':
  483.                     format || (format = event.target.getAttribute("text") || "%URL%")
  484.                     let strs = [];
  485.                     if (aNode.hasChildren) {
  486.                         let folder = nodeIsHistoryFolder ? aNode : PlacesUtils.getFolderContents(aNode.targetFolderGuid).root;
  487.                         for (let i = 0; i < folder.childCount; i++) {
  488.                             let child = folder.getChild(i);

  489.                             if (PlacesUtils.nodeIsFolder(child)) continue; // 跳过书签文件夹
  490.                             strs.push(convertText(child, format));
  491.                         }
  492.                     } else {
  493.                         strs.push(convertText(aNode, format));
  494.                     }
  495.                     copy_text(strs.join("\n"));
  496.                     if (callback) {
  497.                         callback(...args);
  498.                     }
  499.                     function convertText (node, text) {
  500.                         return text.replace(BookmarkOpt.regexp, function (str) {
  501.                             str = str.toUpperCase().replace("%LINK", "%RLINK");
  502.                             if (str.indexOf("_HTMLIFIED") >= 0)
  503.                                 return htmlEscape(convert(str.replace("_HTMLIFIED", "")));
  504.                             if (str.indexOf("_HTML") >= 0)
  505.                                 return htmlEscape(convert(str.replace("_HTML", "")));
  506.                             if (str.indexOf("_ENCODE") >= 0)
  507.                                 return encodeURIComponent(convert(str.replace("_ENCODE", "")));
  508.                             return convert(str);
  509.                         });
  510.                         function convert (str) {
  511.                             switch (str) {
  512.                                 case "%T":
  513.                                 case "%TITLE%":
  514.                                     return node.title.replaceAll(/\[/g, "【").replaceAll(/\]/g, "】");
  515.                                 case "%U":
  516.                                 case "%URL%":
  517.                                     return node.uri;
  518.                                 case "%H":
  519.                                 case "%HOST%":
  520.                                     return Services.io.newURI(node.uri, null, null).host;
  521.                                 default:
  522.                                     return '';
  523.                             }
  524.                         }
  525.                     }
  526.                     break;
  527.                 case 'nodeType':
  528.                     let state = [];
  529.                     ['bookmark', 'container', 'day', 'folder', 'historyContainer', 'host', 'query', 'separator', 'tagQuery'].forEach(condition => {
  530.                         eval("if (PlacesUtils.nodeIs" + firstUpperCase(condition) + "(aNode)) state.push(condition)");
  531.                     });
  532.                     if (PlacesUtils.nodeIsURI(aNode)) state.push('uri');
  533.                     alert(state.join(" "));
  534.                     break;
  535.                 case 'nodeGuid':
  536.                     alert(aNode.bookmarkGuid);
  537.                     break;
  538.             }
  539.         }
  540.     }

  541.     window.BookmarkOpt.init();
  542.     function $L (key, replace) {
  543.         let str = LANG[LOCALE].hasOwnProperty(key) ? LANG[LOCALE][key] : (LANG['en-US'].hasOwnProperty(key) ? LANG['en-US'][key] : "undefined");
  544.         if (typeof str === "undefined") {
  545.             str = firstUpperCase(key);
  546.         }
  547.         if (typeof replace !== "undefined") {
  548.             str = str.replace("%s", replace);
  549.         }
  550.         return str;
  551.     }
  552. })(`
  553. .bmopt-separator+menuseparator{
  554.     display: none;
  555. }
  556. #placesContext .bmopt[condition] {
  557.     visibility: collapse;
  558. }
  559. #placesContext[bmopt~="bookmark"] .bmopt[condition~="bookmark"],
  560. #placesContext[bmopt~="container"] .bmopt[condition~="container"],
  561. #placesContext[bmopt~="day"] .bmopt[condition~="day"],
  562. #placesContext[bmopt~="folder"] .bmopt[condition~="folder"],
  563. #placesContext[bmopt~="historyContainer"] .bmopt[condition~="historyContainer"],
  564. #placesContext[bmopt~="host"] .bmopt[condition~="host"],
  565. #placesContext[bmopt~="query"] .bmopt[condition~="query"],
  566. #placesContext[bmopt~="separator"] .bmopt[condition~="separator"],
  567. #placesContext[bmopt~="tagQuery"] .bmopt[condition~="tagQuery"],
  568. #placesContext[bmopt~="uri"] .bmopt[condition~="uri"],
  569. #placesContext[bmopt~="toolbar"] .bmopt[condition~="toolbar"],
  570. #placesContext[bmopt~="shift"] .bmopt[condition~="shift"] {
  571.     visibility: visible;
  572. }
  573.     `, function imp (name) {
  574.     if (name in globalThis) return globalThis[name];
  575.     var url = `resource:///modules/${name}.`;
  576.     try { var exp = ChromeUtils.importESModule(url + "sys.mjs"); }
  577.     catch { exp = ChromeUtils.import(url + "jsm"); }
  578.     return exp[name];
  579. }, ([first, ...rest]) => first ? first.toUpperCase() + rest.join('') : '', (css) => {
  580.     const pi = document.createProcessingInstruction(
  581.         'xml-stylesheet',
  582.         'type="text/css" href="data:text/css;utf-8,' + encodeURIComponent(css) + '"'
  583.     );
  584.     return document.insertBefore(pi, document.documentElement);
  585. }, (aText) => {
  586.     const cHelper = Cc["@mozilla.org/widget/clipboardhelper;1"].getService(Ci.nsIClipboardHelper);
  587.     cHelper.copyString(aText);
  588. }, (id, aDoc) => {
  589.     id = id || "";
  590.     let doc = aDoc || document;
  591.     if (id.includes("[" || id.includes("."))) {
  592.         return doc.querySelector(id);
  593.     }
  594.     return doc.getElementById(id.startsWith("#") ? id.substring(1) : id);
  595. }, (type, props = {}, aDoc) => {
  596.     const el = aDoc.createXULElement(type);
  597.     for (let [key, value] of Object.entries(props)) {
  598.         el.setAttribute(key, value);
  599.     }
  600.     el.classList.add('bmopt');
  601.     if (type === "menu" || type === "menuitem") {
  602.         el.classList.add(type + "-iconic");
  603.     }
  604.     return el;
  605. }, (target, types = [], ...args) => Array.isArray(types) && types.forEach(t => target.addEventListener(t, ...args)),
  606.     (target, types = [], ...args) => Array.isArray(types) && types.forEach(t => target.removeEventListener(t, ...args)));
复制代码


回复

使用道具 举报

     
发表于 2024-12-22 10:16 | 显示全部楼层
暁美ほむら 发表于 2024-12-22 01:09
这个版本可以正常使用,你自己复制保存

就是这个,感谢
回复

使用道具 举报

     
发表于 2025-2-4 01:45 | 显示全部楼层
以前火狐有个插件可以在拷贝的时候更改url内容,现在找不到,不知道有**记得吗?
如某图片原始网址是www.xxxx.com/0001.500x500.jpg,复制或者加载的时候自动替换成www.xxxx.com/0001.1200x1200.jpg
回复

使用道具 举报

     
 楼主| 发表于 2025-2-4 10:43 | 显示全部楼层
ballantines 发表于 2025-2-4 01:45
以前火狐有个插件可以在拷贝的时候更改url内容,现在找不到,不知道有**记得吗?
如某图片原始网址是www.xx ...

https://addons.mozilla.org/zh-CN/firefox/addon/copy-plaintext/
虽然不知道是不是你记忆中那款,但这个也有自定义替换功能

评分

参与人数 1战斗力 +1 收起 理由
ballantines + 1 好评加鹅

查看全部评分

回复

使用道具 举报

     
发表于 2025-2-5 16:51 | 显示全部楼层
终于来了

Firefox Translations now supports more languages than ever! Pages in Simplified Chinese, Japanese, and Korean can now be translated and Russian is now available as a target language for translating into.
回复

使用道具 举报

     
发表于 2025-2-10 11:11 | 显示全部楼层
更新到135后似乎那个合并菜单栏和导航栏的css不是很正常,最小化和关闭窗口等按钮飞到了左上角另起一行,不知道应该怎么修改
回复

使用道具 举报

     
发表于 2025-2-19 17:16 | 显示全部楼层
暁美ほむら 发表于 2025-2-5 16:51
终于来了

Firefox Translations now supports more languages than ever! Pages in Simplified Chinese, J ...

更新了还是没找到中文啊,这个怎么用?
回复

使用道具 举报

     
发表于 2025-2-20 00:21 来自手机 | 显示全部楼层
都135了也没看到侧边标签栏功能啊
回复

使用道具 举报

     
发表于 2025-2-20 00:29 来自手机 | 显示全部楼层
暁美ほむら 发表于 2025-2-5 16:51
终于来了

Firefox Translations now supports more languages than ever! Pages in Simplified Chinese, J ...

这个出处是哪里,我这个稳定版提示不支持
回复

使用道具 举报

     
发表于 2025-2-20 10:57 | 显示全部楼层
https://www.mozilla.org/en-US/firefox/135.0/releasenotes/

这句话的意思是,简中日韩的页面可以翻译。俄语成为了翻译语言
回复

使用道具 举报

     
发表于 2025-2-20 17:25 | 显示全部楼层
lawsherman 发表于 2025-2-20 10:57
https://www.mozilla.org/en-US/firefox/135.0/releasenotes/

这句话的意思是,简中日韩的页面可以被翻译 ...

最新每夜版支持把其它语言翻译成中文
回复

使用道具 举报

     
发表于 2025-3-2 14:58 | 显示全部楼层
本帖最后由 暁美ほむら 于 2025-3-2 15:19 编辑

类vivaldi侧边工具栏搞定,用这玩意刷论坛什么的要比侧边栏以及悬浮弹窗要舒服很多。








本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

     
发表于 2025-3-3 17:22 | 显示全部楼层
暁美ほむら 发表于 2025-3-2 14:58
类vivaldi侧边工具栏搞定,用这玩意刷论坛什么的要比侧边栏以及悬浮弹窗要舒服很多。

这个是什么插件
回复

使用道具 举报

     
 楼主| 发表于 2025-3-3 17:43 来自手机 | 显示全部楼层
patema 发表于 2025-3-3 17:22
这个是什么插件

应该是折腾css+js脚本折腾出来的,你只看他发言就能看到相关链接了
回复

使用道具 举报

     
发表于 2025-3-3 19:22 | 显示全部楼层
patema 发表于 2025-3-3 17:22
这个是什么插件

uc脚本


以下地址下载最新版本
https://github.com/aminought/firefox-second-sidebar

打开解压后把src文件夹下的文件全部复制,复制到chrome文件夹下。



以下代码保存为second_sidebar.uc.js 保存到chrome文件夹下
  1. // ==UserScript==
  2. // @name            Firefox Second Sidebar
  3. // @author          aminought
  4. // @include         main
  5. // @homepageURL     https://github.com/aminought/firefox-second-sidebar/tree/master
  6. // @description     A Firefox userChrome.js script for adding a second sidebar with web panels like in Vivaldi/Floorp/Zen.
  7. // ==/UserScript==

  8. if (location.href.startsWith("chrome://browser/content/browser.x")) {
  9.         (async url => {
  10.                 (await ChromeUtils.compileScript(`data:,"use strict";import("${url}").catch(console.error)`)).executeInGlobal(window);
  11.         })(Services.io.newURI(Components.stack.filename).resolve("second_sidebar.uc.mjs"));
  12. }
复制代码

=======================================


如何安装uc脚本环境参考这里


https://github.com/benzBrake/Fir ... rChromeJS/README.md
回复

使用道具 举报

     
发表于 2025-3-4 16:20 | 显示全部楼层
本帖最后由 暁美ほむら 于 2025-3-4 16:30 编辑

firefox 136 版本 官方垂直标签正式上线


请配合自动隐藏css



  1. /* Source file https://github.com/MrOtherGuy/firefox-csshacks/tree/master/chrome/autohide_tabstoolbar_v2.css made available under Mozilla Public License v. 2.0
  2. See the above repository for updates as well as full license text. */

  3. /* Requires Firefox 133 */

  4. :root{
  5.   --uc-tabs-hide-animation-duration: 48ms;
  6.   --uc-tabs-hide-animation-delay: 200ms;
  7. }

  8. @media (-moz-bool-pref: "sidebar.verticalTabs"){
  9.   #sidebar-main{
  10.     overflow: visible !important;
  11.     max-width: var(--tab-collapsed-width) !important;
  12.     z-index: var(--browser-area-z-index-toolbox-while-animating);
  13.     transition: z-index 0s linear var(--uc-tabs-hide-duration);
  14.     background: inherit;
  15.   }
  16.   sidebar-main{
  17.     --tab-pinned-horizontal-count: 5; /* This needs to match whatever is used in sidebar-main.css - currently 5 */
  18.     background: inherit;
  19.     overflow: hidden;
  20.     min-width: var(--tab-collapsed-width);
  21.     transition: min-width var(--uc-tabs-hide-animation-duration) ease-out var(--uc-tabs-hide-animation-delay);
  22.     border-inline: 0.01px solid var(--chrome-content-separator-color);
  23.     border-inline-width: 0 0.01px;
  24.     &[positionend]{
  25.       transition-property: min-width, transform;
  26.       border-inline-width: 0.01px 0;
  27.     }
  28.   }
  29.   sidebar-main:hover{
  30.     min-width: calc(var(--tab-pinned-horizontal-count) * var(--tab-pinned-min-width-expanded) + 2 * var(--tab-pinned-container-margin-inline-expanded) + 1px);
  31.     transition-delay: 0ms !important;
  32.     &[positionend]{
  33.       transform: translateX(calc(var(--tab-collapsed-width) - 100%));
  34.     }
  35.   }
  36. }
  37. @media not (-moz-bool-pref: "sidebar.verticalTabs"){
  38.   :root:not([customizing],[chromehidden~="menubar"]) #navigator-toolbox:hover,
  39.   :root:not([customizing],[chromehidden~="menubar"]) #TabsToolbar{
  40.     margin-bottom: calc(0px - 2 * var(--tab-block-margin) - var(--tab-min-height));
  41.   }
  42.   #navigator-toolbox{
  43.     transition: margin-bottom var(--uc-tabs-hide-animation-duration) ease-out var(--uc-tabs-hide-animation-delay) !important;
  44.     --browser-area-z-index-toolbox: 3;
  45.   }
  46.   #TabsToolbar:not([customizing]){
  47.     visibility: hidden;
  48.     transition: visibility 0ms linear var(--uc-tabs-hide-animation-delay),
  49.                 margin-bottom var(--uc-tabs-hide-animation-duration) ease-out var(--uc-tabs-hide-animation-delay) !important;
  50.   }
  51.   #navigator-toolbox:hover{
  52.     transition-delay: 0s !important;
  53.     > #TabsToolbar{
  54.       visibility: visible;
  55.       margin-bottom: 0px;
  56.       transition-delay: 18ms, 0ms !important;
  57.     }
  58.   }
  59.   @media (-moz-bool-pref: "userchrome.autohidetabs.show-while-inactive.enabled"){
  60.     #navigator-toolbox:-moz-window-inactive{
  61.       margin-bottom: calc(0px - 2 * var(--tab-block-margin) - var(--tab-min-height));
  62.       > #TabsToolbar{
  63.         visibility: visible;
  64.         margin-bottom: 0px;
  65.       }
  66.     }
  67.   }
  68.   /* These rules make sure that height of tabs toolbar doesn't exceed tab-min-height */
  69.   #tabbrowser-tabs:not([secondarytext-unsupported]) .tab-label-container{
  70.     max-height: var(--tab-min-height);
  71.   }
  72.   .tab-label{ line-height: 20px !important; }
  73.   :root[uidensity="compact"] .tab-label{ line-height: 18px !important; }
  74. }

复制代码

以上代码也可以用于横向标签页,会有意想不到的效果。

回复

使用道具 举报

     
发表于 2025-3-4 17:14 | 显示全部楼层
暁美ほむら 发表于 2025-3-4 16:20
firefox 136 版本 官方垂直标签正式上线

136版本用上了,体验基本上和sidebar+css自动隐藏的效果没有区别

不过有个问题是目前按ESC会再出现一个三大金刚键的层在最上方
回复

使用道具 举报

     
发表于 2025-3-4 17:30 | 显示全部楼层
GALLADE 发表于 2025-3-4 17:14
136版本用上了,体验基本上和sidebar+css自动隐藏的效果没有区别

不过有个问题是目前按ESC会再出现一个 ...

去掉css看一下
回复

使用道具 举报

     
发表于 2025-3-5 09:54 | 显示全部楼层
怎么 136 才正式支持 macOS 的 HEVC
也支持 Linux 上 AMD GPU 硬件解码了
回复

使用道具 举报

     
发表于 2025-3-5 10:55 来自手机 | 显示全部楼层
Midnight.Coup 发表于 2025-3-5 09:54
怎么 136 才正式支持 macOS 的 HEVC
也支持 Linux 上 AMD GPU 硬件解码了

估计找到了一个不需要授权费就能使用的方法,跟以前的h264一样
回复

使用道具 举报

     
发表于 2025-3-5 12:26 | 显示全部楼层
暁美ほむら 发表于 2025-3-5 10:55
估计找到了一个不需要授权费就能使用的方法,跟以前的h264一样

和 Chrome 一样的,VideoToolBox Decoder
主要是 v100 就支持 macOS 上的 HDR 了现在才支持 HEVC,难绷
不过 Firefox 自己也说过是 Win 先行
回复

使用道具 举报

     
发表于 2025-3-5 13:09 来自手机 | 显示全部楼层
Midnight.Coup 发表于 2025-3-5 12:26
和 Chrome 一样的,VideoToolBox Decoder
主要是 v100 就支持 macOS 上的 HDR 了现在才支持 HEVC,难绷
不 ...

其实很多时候早就支持了,只是默认不开启而已。就比如win上的hevc说是134版本才支持实际上1年半前就已经支持了。火狐很多功能就是这样,明明早就支持非要拖个1年多才默认启用。
回复

使用道具 举报

     
发表于 2025-3-7 03:34 | 显示全部楼层
browser.tabs.groups.enabled 设置true可以开启火狐自带的标签分组功能

回复

使用道具 举报

     
发表于 2025-3-7 04:30 | 显示全部楼层
傻逼玩意更没了超级推拽和撤销关闭窗口按键

推荐一个闪耀拖拽和Undo Close Tab Button代替
回复

使用道具 举报

     
发表于 2025-3-7 12:31 来自手机 | 显示全部楼层
本帖最后由 暁美ほむら 于 2025-3-7 13:13 编辑
afer 发表于 2025-3-7 04:30
傻逼玩意更没了超级推拽和撤销关闭窗口按键

推荐一个闪耀拖拽和Undo Close Tab Button代替 ...

扩展设置当中自己改快捷键



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

     
发表于 2025-3-7 16:39 | 显示全部楼层
Windows 的 HDR 还不支持吗,Chrome 都支持好久了
回复

使用道具 举报

     
发表于 2025-3-7 16:47 | 显示全部楼层
bolitao 发表于 2025-3-7 16:39
Windows 的 HDR 还不支持吗,Chrome 都支持好久了

正在开发当中
回复

使用道具 举报

     
发表于 2025-3-7 16:53 来自手机 | 显示全部楼层
暁美ほむら 发表于 2025-3-7 12:31
扩展设置当中自己改快捷键

不喜欢快捷键,喜欢斜躺着椅子一只手点

那个拖拽插件真不错,往上拖新窗口,往右拖直接搜索,过去一些不好复制的链接上的字都能快搜,比过去官方的好用,因祸得福了
回复

使用道具 举报

     
发表于 2025-3-7 18:14 | 显示全部楼层
bilibili 去广告的作者也有一个深色模式的脚本,全网页通用,自行设置一下就好

深色模式
https://greasyfork.org/zh-CN/scr ... 2%E6%A8%A1%E5%BC%8F
回复

使用道具 举报

     
发表于 2025-3-8 03:05 | 显示全部楼层
回复

使用道具 举报

     
发表于 2025-3-8 08:15 来自手机 | 显示全部楼层
弱弱的问一下,移动版Firefox有什么方便的下载和更新的方法
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|上海互联网违法和不良信息举报中心|网上有害信息举报专区|962110 反电信诈骗|举报电话 021-62035905|Stage1st ( 沪ICP备13020230号-1|沪公网安备 31010702007642号 )

GMT+8, 2025-4-21 01:43 , Processed in 0.124926 second(s), 5 queries , Gzip On, Redis On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表