sky0hjh 发表于 2024-11-29 01:29

不懂就问,目前用的7900xt网页看b站4k会卡顿,开了全屏没问题。
最开始以为是Firefox的特定问题,后来换了Edge发现一个卵样子
随便摸了张3060怼上发现啥毛病没有
是因为A卡视频解码8行吗

—— 来自 samsung SM-S9180, Android 14上的 S1Next-鹅版 v2.5.4

暁美ほむら 发表于 2024-11-29 02:01

空彦秋 发表于 2024-11-28 22:09
感谢,待会试下,之前试过一个自动隐藏地址栏和标签页的css,感觉不够跟手,就没想着搞这些了。
但为了这 ...

根据自己需求,下面这部分自己改一下就行

-uc-sidebar-width: 40px;
--uc-sidebar-hover-width: 210px;
--uc-autohide-sidebar-delay: 600ms; /* Wait 0.6s before hiding sidebar */
--uc-autohide-transition-duration: 115ms;
--uc-autohide-transition-type: linear;
--browser-area-z-index-sidebar: 3;

pgain2004 发表于 2024-11-29 02:51

sky0hjh 发表于 2024-11-29 01:29
不懂就问,目前用的7900xt网页看b站4k会卡顿,开了全屏没问题。
最开始以为是Firefox的特定问题,后来换了E ...

如果怀疑是解码问题,我记得B站播放器的设置里可以在三种格式之间切换?

sky0hjh 发表于 2024-11-29 08:22

pgain2004 发表于 2024-11-29 02:51
如果怀疑是解码问题,我记得B站播放器的设置里可以在三种格式之间切换? ...

都切过了该卡还是卡

—— 来自 samsung SM-S9180, Android 14上的 S1Next-鹅版 v2.5.4

scikirbypoke 发表于 2024-11-29 11:02

scikirbypoke 发表于 2024-11-28 15:22
133能开了,但是Linux版火狐垂直标签页下一个group收拢不了,加进去吊用没有 ...

才发现水平标签页收拢也不太行,默认行为是留着每个标签的图标,对于有几百个标签的来说还是没用,还是留着tst吧

暁美ほむら 发表于 2024-11-29 13:34

scikirbypoke 发表于 2024-11-29 11:02
才发现水平标签页收拢也不太行,默认行为是留着每个标签的图标,对于有几百个标签的来说还是没用,还是留 ...

用我上面的去替代官方的就行

passgan 发表于 2024-11-30 18:05

有没有一个管理右键菜单的扩展,我的太乱了。。。

暁美ほむら 发表于 2024-11-30 20:37

passgan 发表于 2024-11-30 18:05
有没有一个管理右键菜单的扩展,我的太乱了。。。

自己参考

https://v2ex.com/t/600186

空彦秋 发表于 2024-12-1 08:46

才发现Firefox for Android更新到133后,在平板上是,默认以“桌面版网站”打开网站了,简直是史诗级更新
虽然网页缩放或者说适配还有点问题,但已经算很好了

循此苦旅 发表于 2024-12-1 08:57

Nightly Android版的菜单改得挺蛋疼,还好可以连按关于页开隐藏设置改回去。

暁美ほむら 发表于 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 键不爽了

GALLADE 发表于 2024-12-4 09:03

最近又出现一个新问题,B站评论的图片这类网页的弹出界面会自动飞到页面的最顶端,求大佬解惑

再买自检星剁手 发表于 2024-12-5 21:59

现在的播放指示器(静音按钮)变成了在favicon右上角的样式,有办法让它回到替代favicon的样式吗?

chaos7 发表于 2024-12-11 17:10

Android版Firefox最近的良心更新,终于可以在平板设备默认访问桌面版网站,一个小版本更新又改回去了。

GALLADE 发表于 2024-12-20 10:42

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

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

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

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

fatjing 发表于 2024-12-21 22:55

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

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

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

GALLADE 发表于 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站评论的图片不会在当前浏览的中心弹出,一些其他网站的填表选 ...
这个版本可以正常使用,你自己复制保存


// ==UserScript==
// @name            BookmarkOpt.uc.js
// @long-description
// @description
/*
书签操作增强

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

开关:
userChromeJS.BookmarkOpt.enableToggleButton: 显示/隐藏书签工具栏按钮
userChromeJS.BookmarkOpt.doubleClickToShow: 双击地址栏切换书签工具栏
userChromeJS.BookmarkOpt.insertBookmarkByMiddleClickIconOnly: 中键点击书签工具栏的图标(书签,文件夹均可)添加书签
*/
// @author          Ryan
// @
// @include         main
// @include         chrome://browser/content/places/places.xhtml
// @include         chrome://browser/content/places/places.xul
// @include         chrome://browser/content/places/bookmarksSidebar.xhtml
// @include         chrome://browser/content/bookmarks/bookmarksPanel.xul
// @include         chrome://browser/content/places/historySidebar.xhtml
// @include         chrome://browser/content/history/history-panel.xul
// @version         1.4.2
// @compatibility   Firefox 74
// @shutdown      window.BookmarkOpt.destroy();
// @homepageURL   https://github.com/benzBrake/FirefoxCustomize/tree/master/userChromeJS
// @note            1.4.2 Bug 1904909
// @note            1.4.1 修复中键添加书签任何位置也会添加书签的 BUG,修复快速点击中键两次导致图标无法回复的 BUG
// @note            1.4.0 重写,中键点击图标添加书签后当前书签图标显示为成功图标,1s后自动恢复,移除无用的 userChromeJS.BookmarkOpt.insertBookmarkByMiddleClick 开关,增加 userChromeJS.BookmarkOpt.enableToggleButton 开关(用于控制 显示/隐藏书签工具栏按钮),去除中键单击地址栏复制当前地址
// @note            1.3.8 添加书签到此处支持 PlacesChevron
// @note            1.3.7 中键单击地址栏复制当前地址,修改切换书签栏按钮图标
// @note            1.3.6 书签工具栏更多菜单自动适应弹出位置
// @note            1.3.5 新增中建点击图标才添加书签的功能(userChromeJS.BookmarkOpt.insertBookmarkByMiddleClickIconOnly,默认不启用)
// @note            1.3.4 新增中建点击添加书签功能(userChromeJS.BookmarkOpt.insertBookmarkByMiddleClick,默认不启用)
// @note            1.3.3 还原显示隐藏书签工具栏按钮
// @note            1.3.2 增加双击地址栏显示/隐藏书签工具栏的开关(userChromeJS.BookmarkOpt.doubleClickToShow)
// @note            1.3.1 去除显示隐藏书签工具栏按钮
// @note            1.3 尝试兼容 Firefox 57+
// @note            1.2.2 修改界面语言读取方式
// @note            1.2.1 新增显示隐藏书签工具栏按钮
// @note            1.2 修复黑夜模式更新书签图标不变色,增加获取 GUID
// @note            1.1 修复无法热插拔,添加书签使用新 API、修复部分情况无法添加,复制标题和复制链接支持书签文件夹和历史分类,临时移除双击地址栏 显示/隐藏书签工具栏
// @note            1.0 初始化版本
// ==/UserScript==
(async function (css, imp, ucfirst, add_style, copy_text, $, create_el, add_events, remove_events) {
    const Services = imp("Services");
    const PlacesUIUtils = imp("PlacesUIUtils");
    const PlacesUtils = imp("PlacesUtils");
    // Bug 1904909 PlacesUtils::GatherDataText and GatherDataHtml should not recurse into queries
    if (typeof PlacesUtils.nodeIsFolder === "undefined") PlacesUtils.nodeIsFolder = PlacesUtils.nodeIsFolderOrShortcut;
    const LANG = {
      'zh-CN': {
            "add bookmark here": "添加书签到此处",
            "add bookmark here tooltip": "左键:添加到最后\nShift+左键:添加到最前",
            "update current bookmark": "替换为当前网址",
            "update current bookmark tooltip": "左键:替换当前网址\n中键:替换当前地址和标题\n右键:替换当前网址和自定义当前标题",
            "update current bookmark prompt": "更新当前书签标题,原标题为:\n %s",
            "copy bookmark title": "复制标题",
            "copy bookmark link": "复制链接 ",
            "show node type": "节点类型",
            "show node guid": "节点 ID",
            "toggle personalToolbar": "显示/隐藏书签工具栏",
            "auto hide": "自动隐藏"
      },
      'en-US': {
            "add bookmark here": "Add Bookmark Here",
            "add bookmark here tooltip": "Left click: add bookmark to the end.\nShift + Left click: add bookmark to the first.",
            "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.",
            "update current bookmark prompt": "Update current bookmark's title, original title is \n %s",
            "copy bookmark title": "Copy Title",
            "copy bookmark link": "Copy URL ",
            "show node type": "Node type",
            "show node guid": "Node guid",
            "toggle personalToolbar": "Toggle PersonalToolbar",
            "auto hide": "Auto hide"
      }
    }

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

    // 右键菜单
    const PLACES_CONTEXT_ITEMS = [{
      id: 'placesContext_add:bookmark',
      label: $L("add bookmark here"),
      tooltiptext: $L("add bookmark here tooltip"),
      accesskey: "h",
      insertBefore: "placesContext_show_bookmark:info",
      condition: "toolbar folder bookmark",
      oncommand: "window.BookmarkOpt.operate(event, 'add', this.parentNode.triggerNode)"
    }, {
      id: "placesContext_update_bookmark:info",
      label: $L("update current bookmark"),
      tooltiptext: $L("update current bookmark tooltip"),
      accesskey: "u",
      insertBefore: "placesContext_show_bookmark:info",
      condition: "bookmark",
      oncommand: "window.BookmarkOpt.operate(event, 'update', this.parentNode.triggerNode)",
    }, {
      id: "placesContext_copyTitle",
      label: $L("copy bookmark title"),
      insertBefore: "placesContext_paste_group",
      condition: "container uri",
      accesskey: "A",
      oncommand: "window.BookmarkOpt.operate(event, 'copyTitle', this.parentNode.triggerNode)",
    }, {
      id: "placesContext_copyLink",
      label: $L("copy bookmark link"),
      insertBefore: "placesContext_paste_group",
      condition: "container uri",
      accesskey: "L",
      text: "[%TITLE%](%URL%)",
      oncommand: "window.BookmarkOpt.operate(event, 'copyUrl', this.parentNode.triggerNode)",
      accesskey: "L"
    }, {
      class: 'placesContext_showNodeInfo',
      label: $L("show node type"),
      condition: 'shift',
      oncommand: 'window.BookmarkOpt.operate(event, "nodeType")',
      insertBefore: 'placesContext_openSeparator',
      style: 'list-style-image: url(chrome://global/skin/icons/info.svg)',
    }, {
      class: 'placesContext_showNodeInfo',
      label: $L("show node guid"),
      condition: 'shift',
      oncommand: 'window.BookmarkOpt.operate(event, "nodeGuid")',
      insertBefore: 'placesContext_openSeparator',
      style: 'list-style-image: url(chrome://global/skin/icons/info.svg)',
    }];

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

    }];

    if (window.BookmarkOpt) {
      window.BookmarkOpt.destroy();
      delete window.BookmarkOpt;
    }

    var isMouseDown = false;

    window.BookmarkOpt = {
      items: [],
      get topWin () {
            return Services.wm.getMostRecentWindow("navigator:browser");
      },
      X_MAIN: 'chrome://browser/content/browser.xhtml',
      X_PLACES: 'chrome://browser/content/places/places.xhtml',
      XUL_PLACES: 'chrome://browser/content/places/places.xul',
      X_BOOKMARK_SB: 'chrome://browser/content/places/bookmarksSidebar.xhtml',
      XUL_BOOKMARK_SB: 'chrome://browser/content/bookmarks/bookmarksPanel.xul',
      X_HISTORY_SB: 'chrome://browser/content/places/historySidebar.xhtml',
      XUL_HISTORY_SB: 'chrome://browser/content/history/history-panel.xul',
      init () {
            let he = "(?:_HTML(?:IFIED)?|_ENCODE)?";
            let rTITLE = "%TITLE" + he + "%|%t\\b";
            let rURL = "%URL" + he + "%|%u\\b";
            let rHOST = "%HOST" + he + "%|%h\\b";
            this.rTITLE = new RegExp(rTITLE, "i");
            this.rURL = new RegExp(rURL, "i");
            this.rHOST = new RegExp(rHOST, "i");
            this.regexp = new RegExp(
                .join("|"), "ig");

            if (!this.style) {
                this.style = add_style(css);
            }
            switch (location.href) {
                case this.X_MAIN:
                  if (!$("urlbar").getAttribute("bmopt-inited")) {
                        add_events($('urlbar'), ['dblclick'], this, false);
                        $('urlbar').setAttribute('bmopt-inited', true);
                  }
                  if (!$("PlacesToolbar").getAttribute("bmopt-inited")) {
                        add_events($('PlacesToolbar'), ['popupshowing', 'popuphidden'], this, false);
                        $('PlacesToolbar').setAttribute('bmopt-inited', true);
                        this.PlacesChevronObserver = new MutationObserver(mutations => {
                            mutations.forEach(mutation => {
                              if (mutation.type === 'attributes' && mutation.attributeName === 'collapsed') {
                                    if (mutation.target.getAttribute("collapsed") === "true") {
                                        this.isObservingPlacesChevron = false;
                                        remove_events(mutation.target, ['mouseover'], this, false);
                                    } else {
                                        this.isObservingPlacesChevron = true;
                                        add_events(mutation.target, ['mouseover'], this, false);
                                    }
                              }
                            })
                        });
                        this.PlacesChevronObserver.observe(document.getElementById("PlacesChevron"), { attributes: true });
                        add_events($('PlacesChevronPopup'), ['popuphidden'], this, false);
                  }
                  if ($('PlacesToolbarItems')) {
                        add_events($('PlacesToolbarItems'), ['mousedown', 'click'], this, false);
                        add_events(document, ['mouseup'], this, false);
                  }
                  if (Services.prefs.getBoolPref("userChromeJS.BookmarkOpt.enableToggleButton", false)) {
                        if (!(CustomizableUI.getWidget('BookmarkOpt-Toggle-PersonalToolbar') && CustomizableUI.getWidget('BookmarkOpt-Toggle-PersonalToolbar').forWindow(window)?.node)) {
                            CustomizableUI.createWidget({
                              id: 'BookmarkOpt-Toggle-PersonalToolbar',
                              removable: true,
                              defaultArea: CustomizableUI.AREA_NAVBAR,
                              type: "custom",
                              onBuild: (doc) => {
                                    let btn = create_el('toolbarbutton', {
                                        id: 'BookmarkOpt-Toggle-PersonalToolbar',
                                        label: $L("toggle personalToolbar"),
                                        tooltiptext: $L("toggle personalToolbar"),
                                        style: 'list-style-image: url("chrome://browser/skin/bookmarks-toolbar.svg");',
                                        class: 'toolbarbutton-1 chromeclass-toolbar-additional',
                                    }, doc);
                                    add_events(btn, ['click'], this, false);
                                    return btn;
                              }
                            })
                        }
                  }
                case this.X_PLACES:
                case this.XUL_PLACES:
                case this.X_BOOKMARK_SB:
                case this.XUL_BOOKMARK_SB:
                case this.X_HISTORY_SB:
                case this.XUL_HISTORY_SB:
                  if (!$("placesContext").getAttribute("bmopt-inited")) {
                        const ins = $("placesContext_createBookmark");
                        PLACES_CONTEXT_ITEMS.forEach(prop => {
                            let item = create_el('menuitem', prop, document);
                            if (!prop.condition) item.setAttribute('condition', 'normal');
                            this.items.push(item);
                            var refNode = ($(prop.insertBefore) || ins || $('#placesContext').firstChild);
                            if (!refNode.classList.contains('menuitem-iconic')) {
                              item.classList.remove('menuitem-iconic');
                            }
                            refNode.before(item);
                        });
                        add_events($("placesContext"), ['popupshowing', 'popuphidden'], this, false);
                  }
                  break;
            }
      },
      destroy () {
            if (this.style && this.style.parentNode) {
                this.style.parentNode.removeChild(this.style);
                this.style = null;
            }
            switch (location.href) {
                case this.X_MAIN:
                  remove_events($('urlbar'), ['dblclick'], this, false);
                  $('urlbar').removeAttribute('bmopt-inited');
                  this.items.forEach(item => {
                        item.parentNode.removeChild(item);
                  })
                  remove_events($('PlacesToolbar'), ['popupshowing', 'popuphidden'], this, false);
                  if ($('PlacesToolbar')) {
                        $('PlacesToolbar').removeAttribute('bmopt-inited');
                        remove_events($('PlacesChevronPopup'), ['popuphidden'], this, false);
                        try {
                            CustomizableUI.destroyWidget("BookmarkOpt-Toggle-PersonalToolbar");
                        } catch (ex) { }
                  }
                  if ($('PlacesToolbarItems')) {
                        remove_events($('PlacesToolbarItems'), ['mousedown', 'click', this]);
                        remove_events(document, ['mouseup'], this, false);
                  }
                  if (this.PlacesChevronObserver) {
                        this.PlacesChevronObserver.disconnect();
                  }
                case this.X_PLACES:
                case this.XUL_PLACES:
                case this.X_BOOKMARK_SB:
                case this.XUL_BOOKMARK_SB:
                case this.X_HISTORY_SB:
                case this.XUL_HISTORY_SB:
                  remove_events($("placesContext"), ['popupshowing', 'popuphidden'], this, false);
                  $('placesContext').removeAttribute('bmopt-inited');
                  this.clearPanelItems(document);
                  break;
            }
      },
      handleEvent (event) {
            const { target, button, type } = event;
            const { document: doc, setToolbarVisibility } = target.ownerGlobal;
            switch (type) {
                case 'click':
                  if (button == 1 && isMouseDown) {
                        let addBookmark = true;
                        if (Services.prefs.getBoolPref("userChromeJS.BookmarkOpt.insertBookmarkByMiddleClickIconOnly", false)
                            && !target.hasAttribute("query") /* 排除最近访问 */
                        ) {
                            let targetRect = target.getBoundingClientRect();
                            let x = event.clientX - target.getBoundingClientRect().left; // 鼠标点击位置相对于当前书签
                            let icon = target.tagName.toLowerCase() === "toolbarbutton" ? target.querySelector(":scope>image") : target.firstChild;
                            let iconRect = icon.getBoundingClientRect();
                            let paddingLeft = iconRect.left - targetRect.left;
                            if (x > paddingLeft + iconRect.width) {
                              // 点击的是标签,不覆盖默认的功能:打开全部
                              addBookmark = false;
                            }
                        }
                        if (addBookmark) {
                            event.preventDefault();
                            event.stopPropagation();
                            this.operate(event, 'add', target, (...args) => {
                              let icon = target.tagName === "toolbarbutton" ? target.querySelector(":scope>image") : target.firstChild.firstChild;
                              if (icon.hasAttribute('src') && !icon.getAttribute('src').endsWith('N3oiLz48L3N2Zz4=')) {
                                    icon.setAttribute('original-src', icon.getAttribute('src'));
                              }
                              icon.setAttribute('src', 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0OCA0OCIgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2IiB0cmFuc2Zvcm09InNjYWxlKDEuMSkiPjxsaW5lYXJHcmFkaWVudCBpZD0iNXp6TUdWUW5OX1F5UllXR21KVXNRYSIgeDE9IjkuODU4IiB4Mj0iMzguMTQyIiB5MT0iOS44NTgiIHkyPSIzOC4xNDIiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj48c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiMyMWFkNjQiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiMwODgyNDIiLz48L2xpbmVhckdyYWRpZW50PjxwYXRoIGZpbGw9InVybCgjNXp6TUdWUW5OX1F5UllXR21KVXNRYSkiIGQ9Ik00NCwyNGMwLDExLjA0NS04Ljk1NSwyMC0yMCwyMFM0LDM1LjA0NSw0LDI0UzEyLjk1NSw0LDI0LDRTNDQsMTIuOTU1LDQ0LDI0eiIvPjxwYXRoIGQ9Ik0zMi4xNzIsMTYuMTcyTDIyLDI2LjM0NGwtNS4xNzItNS4xNzJjLTAuNzgxLTAuNzgxLTIuMDQ3LTAuNzgxLTIuODI4LDBsLTEuNDE0LDEuNDE0Yy0wLjc4MSwwLjc4MS0wLjc4MSwyLjA0NywwLDIuODI4bDgsOGMwLjc4MSwwLjc4MSwyLjA0NywwLjc4MSwyLjgyOCwwbDEzLTEzYzAuNzgxLTAuNzgxLDAuNzgxLTIuMDQ3LDAtMi44MjhMMzUsMTYuMTcyQzM0LjIxOSwxNS4zOTEsMzIuOTUzLDE1LjM5MSwzMi4xNzIsMTYuMTcyeiIgb3BhY2l0eT0iLjA1Ii8+PHBhdGggZD0iTTIwLjkzOSwzMy4wNjFsLTgtOGMtMC41ODYtMC41ODYtMC41ODYtMS41MzYsMC0yLjEyMWwxLjQxNC0xLjQxNGMwLjU4Ni0wLjU4NiwxLjUzNi0wLjU4NiwyLjEyMSwwTDIyLDI3LjA1MWwxMC41MjUtMTAuNTI1YzAuNTg2LTAuNTg2LDEuNTM2LTAuNTg2LDIuMTIxLDBsMS40MTQsMS40MTRjMC41ODYsMC41ODYsMC41ODYsMS41MzYsMCwyLjEyMWwtMTMsMTNDMjIuNDc1LDMzLjY0NiwyMS41MjUsMzMuNjQ2LDIwLjkzOSwzMy4wNjF6IiBvcGFjaXR5PSIuMDciLz48cGF0aCBmaWxsPSI**ZmIiBkPSJNMjEuMjkzLDMyLjcwN2wtOC04Yy0wLjM5MS0wLjM5MS0wLjM5MS0xLjAyNCwwLTEuNDE0bDEuNDE0LTEuNDE0YzAuMzkxLTAuMzkxLDEuMDI0LTAuMzkxLDEuNDE0LDBMMjIsMjcuNzU4bDEwLjg3OS0xMC44NzljMC4zOTEtMC4zOTEsMS4wMjQtMC4zOTEsMS40MTQsMGwxLjQxNCwxLjQxNGMwLjM5MSwwLjM5MSwwLjM5MSwxLjAyNCwwLDEuNDE0bC0xMywxM0MyMi4zMTcsMzMuMDk4LDIxLjY4MywzMy4wOTgsMjEuMjkzLDMyLjcwN3oiLz48L3N2Zz4=');
                              setTimeout(() => {
                                    Array.from(target.querySelectorAll('image')).forEach(function (aImage) {
                                        if (aImage.hasAttribute('original-src')) {
                                          aImage.setAttribute('src', aImage.getAttribute('original-src'));
                                          aImage.removeAttribute('original-src');
                                        } else {
                                          aImage.removeAttribute('src');
                                        }
                                    });
                              }, 1000);
                            });
                        }
                  }
                  if (target.id !== "BookmarkOpt-Toggle-PersonalToolbar") break;
                case 'dblclick':
                  if (Services.prefs.getBoolPref('userChromeJS.BookmarkOpt.doubleClickToShow', true) || target.id === "BookmarkOpt-Toggle-PersonalToolbar") {
                        target.diabled = true;
                        setTimeout(function () {
                            var bar = $("PersonalToolbar", doc);
                            setToolbarVisibility(bar, !!bar.collapsed);
                            target.disabled = false;
                        }, 50);
                        break;
                  }
                  break;
                case 'popupshowing':
                  if (target.id === 'placesContext') {
                        let state = [],
                            triggerNode = event.currentTarget.triggerNode,
                            view = PlacesUIUtils.getViewForNode(triggerNode),
                            aNode = view ? view.selectedNode : {};

                        if (aNode) {
                            ['bookmark', 'container', 'day', 'folder', 'historyContainer', 'host', 'query', 'separator', 'tagQuery'].forEach(condition => {
                              eval("if (PlacesUtils.nodeIs" + ucfirst(condition) + "(aNode)) state.push(condition)");
                            });
                            if (PlacesUtils.nodeIsURI(aNode)) state.push("uri");
                        }
                        if (event.shiftKey) state.push('shift');
                        target.setAttribute('bmopt', state.join(" "));
                  } else {
                        let firstItem = target.firstChild;
                        if (firstItem && firstItem.classList.contains('bmopt')) return;
                        let last;
                        PLACES_POPUP_ITEMS.forEach(c => {
                            let item;
                            if (c.label) {
                              item = create_el('menuitem', c, doc);
                              item.classList.add('bmopt-panel');
                            } else {
                              item = create_el('menuseparator', {
                                    'class': 'bmopt-separator'
                              }, event.target.ownerDocument);
                            }
                            if (last) {
                              last.after(item);
                            } else if (firstItem) {
                              firstItem.parentNode.insertBefore(item, firstItem);
                            } else {
                              target.appendChild(item);
                            }
                            last = item;
                        });
                  }
                  break;
                case 'popuphidden':
                  if (target.id === "placesContext") {
                        target.setAttribute('bmopt', '');
                  } else {
                        this.clearPanelItems(target, true);
                  }
                  break;
                case 'mousedown':
                  if (button === 1) {
                        if (target.id === "PlacesToolbar" || target.id === "PlacesToolbarItems" || target.id === "PlacesChevron" || (target.classList.contains('bookmark-item') && !target.hasAttribute("query"))) {
                            isMouseDown = true;
                        }
                        !Services.prefs.getBoolPref("browser.bookmarks.openInTabClosesMenu", true) && target.setAttribute("closemenu", "none");
                  }
                  break;
                case 'mouseup':
                  setTimeout(() => {
                        isMouseDown = false;
                  }, 50);
                  break;
                case 'mouseover':
                  if (target.id === "PlacesChevron") {
                        if (target.getAttribute("open") == "true") return;
                        const menupopup = target.querySelector(":scope>menupopup");
                        if (event.clientX > (target.ownerGlobal.innerWidth / 2) && event.clientY < (target.ownerGlobal.innerHeight / 2)) {
                            menupopup.setAttribute("position", "after_end");
                        } else if (event.clientX < (target.ownerGlobal.innerWidth / 2) && event.clientY > (target.ownerGlobal.innerHeight / 2)) {
                            menupopup.setAttribute("position", "before_start");
                        } else if (event.clientX > (target.ownerGlobal.innerWidth / 2) && event.clientY > (target.ownerGlobal.innerHeight / 2)) {
                            menupopup.setAttribute("position", "before_start");
                        } else {
                            menupopup.removeAttribute("position", "after_end");
                        }
                  }
                  break;
            }
      },
      clearPanelItems: function (target, do_not_recursive = false) {
            var menuitems = (target || document).querySelectorAll((do_not_recursive ? ":scope>" : "") + "");
            for (let menuitem of menuitems) {
                menuitem.parentNode.removeChild(menuitem);
            }
      },
      operate (event, aMethod, aTriggerNode, callback) {
            let popupNode = aTriggerNode || PlacesUIUtils.lastContextMenuTriggerNode || document.popupNode;
            if (!popupNode) return;
            let view = PlacesUIUtils.getViewForNode(popupNode),
                aNode;

            if (view && view.selectedNode) {
                aNode = view.selectedNode;
            } else {
                aNode = popupNode._placesNode;
            }

            let aWin = this.topWin,
                currentTitle = aWin.gBrowser.contentTitle,
                currentUrl = aWin.gBrowser.currentURI.spec,
                nodeIsFolder = PlacesUtils.nodeIsFolder(aNode),
                nodeIsHistoryFolder = PlacesUtils.nodeIsHistoryContainer(aNode),
                panelTriggered = false;

            switch (aMethod) {
                case 'panelAdd':
                  // 清除新增的添加到到此处菜单,有可能会影响添加顺序
                  this.clearPanelItems(aTriggerNode);
                  panelTriggered = true;
                case 'add':
                  var info = {
                        title: currentTitle,
                        url: currentUrl,
                        index: nodeIsFolder ? (event.shiftKey ? 0 : PlacesUtils.bookmarks.DEFAULT_INDEX) : (event.shiftKey ? aNode.bookmarkIndex : aNode.bookmarkIndex + 1),
                        parentGuid: nodeIsFolder ? aNode.targetFolderGuid || aNode.bookmarkGuid : aNode.parent.targetFolderGuid || aNode.parent.bookmarkGuid
                  };
                  try {
                        PlacesUtils.bookmarks.insert(info).then((...args) => {
                            if (callback) {
                              callback(...args);
                            }
                        });
                  } catch (e) {
                        aWin.console.error(e);
                  }
                  if (Services.prefs.getBoolPref("browser.bookmarks.openInTabClosesMenu") || panelTriggered) {
                        closeMenus(aTriggerNode);
                  }
                  break;
                case 'update':
                  if (!aNode.bookmarkGuid) return;
                  var info = {
                        guid: aNode.bookmarkGuid,
                        title: aNode.title,
                        url: currentUrl,
                  }
                  if (event.button === 1) {
                        info.title = currentTitle;
                  } else if (event.button === 2) {
                        const title = window.prompt($L("update current bookmark prompt", aNode.title), currentTitle);
                        if (title === null) return;
                        if (title !== aNode.title)
                            info.title = title;
                  }
                  try {
                        PlacesUtils.bookmarks.update(info).then((...args) => {
                            if (callback) {
                              callback(...args);
                            }
                        });
                  } catch (e) {
                        aWin.console.error(e);
                  }
                  break;
                case 'copyTitle':
                  var format = "%TITLE%"
                case 'copyUrl':
                case 'copy':
                  format || (format = event.target.getAttribute("text") || "%URL%")
                  let strs = [];
                  if (aNode.hasChildren) {
                        let folder = nodeIsHistoryFolder ? aNode : PlacesUtils.getFolderContents(aNode.targetFolderGuid).root;
                        for (let i = 0; i < folder.childCount; i++) {
                            let child = folder.getChild(i);

                            if (PlacesUtils.nodeIsFolder(child)) continue; // 跳过书签文件夹
                            strs.push(convertText(child, format));
                        }
                  } else {
                        strs.push(convertText(aNode, format));
                  }
                  copy_text(strs.join("\n"));
                  if (callback) {
                        callback(...args);
                  }
                  function convertText (node, text) {
                        return text.replace(BookmarkOpt.regexp, function (str) {
                            str = str.toUpperCase().replace("%LINK", "%RLINK");
                            if (str.indexOf("_HTMLIFIED") >= 0)
                              return htmlEscape(convert(str.replace("_HTMLIFIED", "")));
                            if (str.indexOf("_HTML") >= 0)
                              return htmlEscape(convert(str.replace("_HTML", "")));
                            if (str.indexOf("_ENCODE") >= 0)
                              return encodeURIComponent(convert(str.replace("_ENCODE", "")));
                            return convert(str);
                        });
                        function convert (str) {
                            switch (str) {
                              case "%T":
                              case "%TITLE%":
                                    return node.title.replaceAll(/\/g, "】");
                              case "%U":
                              case "%URL%":
                                    return node.uri;
                              case "%H":
                              case "%HOST%":
                                    return Services.io.newURI(node.uri, null, null).host;
                              default:
                                    return '';
                            }
                        }
                  }
                  break;
                case 'nodeType':
                  let state = [];
                  ['bookmark', 'container', 'day', 'folder', 'historyContainer', 'host', 'query', 'separator', 'tagQuery'].forEach(condition => {
                        eval("if (PlacesUtils.nodeIs" + firstUpperCase(condition) + "(aNode)) state.push(condition)");
                  });
                  if (PlacesUtils.nodeIsURI(aNode)) state.push('uri');
                  alert(state.join(" "));
                  break;
                case 'nodeGuid':
                  alert(aNode.bookmarkGuid);
                  break;
            }
      }
    }

    window.BookmarkOpt.init();
    function $L (key, replace) {
      let str = LANG.hasOwnProperty(key) ? LANG : (LANG['en-US'].hasOwnProperty(key) ? LANG['en-US'] : "undefined");
      if (typeof str === "undefined") {
            str = firstUpperCase(key);
      }
      if (typeof replace !== "undefined") {
            str = str.replace("%s", replace);
      }
      return str;
    }
})(`
.bmopt-separator+menuseparator{
    display: none;
}
#placesContext .bmopt {
    visibility: collapse;
}
#placesContext .bmopt,
#placesContext .bmopt,
#placesContext .bmopt,
#placesContext .bmopt,
#placesContext .bmopt,
#placesContext .bmopt,
#placesContext .bmopt,
#placesContext .bmopt,
#placesContext .bmopt,
#placesContext .bmopt,
#placesContext .bmopt,
#placesContext .bmopt {
    visibility: visible;
}
    `, function imp (name) {
    if (name in globalThis) return globalThis;
    var url = `resource:///modules/${name}.`;
    try { var exp = ChromeUtils.importESModule(url + "sys.mjs"); }
    catch { exp = ChromeUtils.import(url + "jsm"); }
    return exp;
}, () => first ? first.toUpperCase() + rest.join('') : '', (css) => {
    const pi = document.createProcessingInstruction(
      'xml-stylesheet',
      'type="text/css" href="data:text/css;utf-8,' + encodeURIComponent(css) + '"'
    );
    return document.insertBefore(pi, document.documentElement);
}, (aText) => {
    const cHelper = Cc["@mozilla.org/widget/clipboardhelper;1"].getService(Ci.nsIClipboardHelper);
    cHelper.copyString(aText);
}, (id, aDoc) => {
    id = id || "";
    let doc = aDoc || document;
    if (id.includes("[" || id.includes("."))) {
      return doc.querySelector(id);
    }
    return doc.getElementById(id.startsWith("#") ? id.substring(1) : id);
}, (type, props = {}, aDoc) => {
    const el = aDoc.createXULElement(type);
    for (let of Object.entries(props)) {
      el.setAttribute(key, value);
    }
    el.classList.add('bmopt');
    if (type === "menu" || type === "menuitem") {
      el.classList.add(type + "-iconic");
    }
    return el;
}, (target, types = [], ...args) => Array.isArray(types) && types.forEach(t => target.addEventListener(t, ...args)),
    (target, types = [], ...args) => Array.isArray(types) && types.forEach(t => target.removeEventListener(t, ...args)));

GALLADE 发表于 2024-12-22 10:16

暁美ほむら 发表于 2024-12-22 01:09
这个版本可以正常使用,你自己复制保存

就是这个,感谢

ballantines 发表于 2025-2-4 01:45

以前火狐有个插件可以在拷贝的时候更改url内容,现在找不到,不知道有**记得吗?
如某图片原始网址是www.xxxx.com/0001.500x500.jpg,复制或者加载的时候自动替换成www.xxxx.com/0001.1200x1200.jpg

pgain2004 发表于 2025-2-4 10:43

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

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

暁美ほむら 发表于 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.

GALLADE 发表于 2025-2-10 11:11

更新到135后似乎那个合并菜单栏和导航栏的css不是很正常,最小化和关闭窗口等按钮飞到了左上角另起一行,不知道应该怎么修改

herostratus 发表于 2025-2-19 17:16

暁美ほむら 发表于 2025-2-5 16:51
终于来了

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

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

rmzxe 发表于 2025-2-20 00:21

都135了也没看到侧边标签栏功能啊

conanlm 发表于 2025-2-20 00:29

暁美ほむら 发表于 2025-2-5 16:51
终于来了

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

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

lawsherman 发表于 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侧边工具栏搞定,用这玩意刷论坛什么的要比侧边栏以及悬浮弹窗要舒服很多。








patema 发表于 2025-3-3 17:22

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




这个是什么插件

pgain2004 发表于 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文件夹下
// ==UserScript==
// @name            Firefox Second Sidebar
// @author          aminought
// @include         main
// @homepageURL   https://github.com/aminought/firefox-second-sidebar/tree/master
// @description   A Firefox userChrome.js script for adding a second sidebar with web panels like in Vivaldi/Floorp/Zen.
// ==/UserScript==

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


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


https://github.com/benzBrake/FirefoxCustomize/blob/master/userChromeJS/README.md

暁美ほむら 发表于 2025-3-4 16:20

本帖最后由 暁美ほむら 于 2025-3-4 16:30 编辑

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


请配合自动隐藏css



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

/* Requires Firefox 133 */

:root{
--uc-tabs-hide-animation-duration: 48ms;
--uc-tabs-hide-animation-delay: 200ms;
}

@media (-moz-bool-pref: "sidebar.verticalTabs"){
#sidebar-main{
    overflow: visible !important;
    max-width: var(--tab-collapsed-width) !important;
    z-index: var(--browser-area-z-index-toolbox-while-animating);
    transition: z-index 0s linear var(--uc-tabs-hide-duration);
    background: inherit;
}
sidebar-main{
    --tab-pinned-horizontal-count: 5; /* This needs to match whatever is used in sidebar-main.css - currently 5 */
    background: inherit;
    overflow: hidden;
    min-width: var(--tab-collapsed-width);
    transition: min-width var(--uc-tabs-hide-animation-duration) ease-out var(--uc-tabs-hide-animation-delay);
    border-inline: 0.01px solid var(--chrome-content-separator-color);
    border-inline-width: 0 0.01px;
    &{
      transition-property: min-width, transform;
      border-inline-width: 0.01px 0;
    }
}
sidebar-main:hover{
    min-width: calc(var(--tab-pinned-horizontal-count) * var(--tab-pinned-min-width-expanded) + 2 * var(--tab-pinned-container-margin-inline-expanded) + 1px);
    transition-delay: 0ms !important;
    &{
      transform: translateX(calc(var(--tab-collapsed-width) - 100%));
    }
}
}
@media not (-moz-bool-pref: "sidebar.verticalTabs"){
:root:not(,) #navigator-toolbox:hover,
:root:not(,) #TabsToolbar{
    margin-bottom: calc(0px - 2 * var(--tab-block-margin) - var(--tab-min-height));
}
#navigator-toolbox{
    transition: margin-bottom var(--uc-tabs-hide-animation-duration) ease-out var(--uc-tabs-hide-animation-delay) !important;
    --browser-area-z-index-toolbox: 3;
}
#TabsToolbar:not(){
    visibility: hidden;
    transition: visibility 0ms linear var(--uc-tabs-hide-animation-delay),
                margin-bottom var(--uc-tabs-hide-animation-duration) ease-out var(--uc-tabs-hide-animation-delay) !important;
}
#navigator-toolbox:hover{
    transition-delay: 0s !important;
    > #TabsToolbar{
      visibility: visible;
      margin-bottom: 0px;
      transition-delay: 18ms, 0ms !important;
    }
}
@media (-moz-bool-pref: "userchrome.autohidetabs.show-while-inactive.enabled"){
    #navigator-toolbox:-moz-window-inactive{
      margin-bottom: calc(0px - 2 * var(--tab-block-margin) - var(--tab-min-height));
      > #TabsToolbar{
      visibility: visible;
      margin-bottom: 0px;
      }
    }
}
/* These rules make sure that height of tabs toolbar doesn't exceed tab-min-height */
#tabbrowser-tabs:not() .tab-label-container{
    max-height: var(--tab-min-height);
}
.tab-label{ line-height: 20px !important; }
:root .tab-label{ line-height: 18px !important; }
}


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

GALLADE 发表于 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看一下

Midnight.Coup 发表于 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一样

Midnight.Coup 发表于 2025-3-5 12:26

暁美ほむら 发表于 2025-3-5 10:55
估计找到了一个不需要授权费就能使用的方法,跟以前的h264一样
和 Chrome 一样的,VideoToolBox Decoder
主要是 v100 就支持 macOS 上的 HDR 了现在才支持 HEVC,难绷
不过 Firefox 自己也说过是 Win 先行
页: 36 37 38 39 40 41 42 43 44 45 [46] 47
查看完整版本: Firefox更新推荐楼[12/6 扩展小更]