Is there a way to do this with user CSS on Firefox?

The content has to have full opacity. So setting opacity through the compositor or the opacity CSS property does not count.

Setting a background-color with some alpha on userContent.css technically works but because the browser itself is fully opaque, doesn’t show the background. Trying to set background-related properties on #browser on userChrome.css doesn’t have an effect. If I can make only the background of #browser transparent, this’ll work. But I don’t know if that’s possible.

edit: it is possible, with lots of caveats. Site-specific fixes will be required, popups are hard to read. If you have dark wallpapers enable dark reader to make site content readable on a dark background.

1- set browser.tabs.allow_transparent_browser to true

2- in userChrome.css add #main-window, #tabbrowser-tabpanels{ background: transparent !important; }

3- userContent.css:

*{
  background-color: transparent !important;
}
/* if you don't want full transparency */
html:root{
  background-color: #00000080 !important;
}
  • Quail4789@lemmy.mlOP
    link
    fedilink
    English
    arrow-up
    1
    ·
    edit-2
    20 days ago

    I want the entire background of any webpage to be transparent. Like this user had here..

    For me, inheritance doesn’t work as you described. Inner level rules don’t always inherit from outer levels (I think if an inner background-color is set equal to a variable, it doesn’t inherit it’s parent’s background). Setting root background doesn’t affect body, setting body background doesn’t effect elements further down the tree (e.g. a lemmy post will still have a background color while it’s surroundings are transparent).

    I can achieve what I want by setting the rule globally with:

    * {
    	background: transparent !important;
    	background-color: transparent !important;
    }
    

    The problem with this approach is I don’t actually want 100% transparency. I want at least above 75% to keep the content readable. However, with something like this:

    * {
    	background: #00000080 !important;
    	background-color: #00000080 !important;
    }
    

    overlapping elements’ transparency stack and create regions with different opacities all over the page.

    edit: writing this game me an idea and combining the two works:

    * {
    	background: transparent !important;
    	background-color: transparent !important;
    }
    
    body {
    	background: #00000080 !important;
    	background-color: #00000080 !important;
    }
    
    • MrOtherGuy@lemmy.world
      link
      fedilink
      arrow-up
      1
      ·
      20 days ago

      Right, background-color is not an inherited property (compared to for example color (color of text) which is). But even if it were, inheritance is not “enforced” so if website css sets a backround-color specifically for that element then the inherited value would be lost anyway.

      But the way you now describe it doesn’t seem possible. There is not syntax to apply style rule to “just the innermost element”. I think the closest would be to have everything else have fully transparent background, but the html root element have only partial transparency:

      *{
        background: transparent !important;
      }
      html:root{
        background: #00000080 !important;
      }
      

      However, you will still face a problem; many websites draw graphics or images as a background-image so if you use the background shorthand property then those graphics will be effectively removed. On the other hand, if you instead set just background-color then parts might get opaque again because a website could be drawing even opaque backgrounds as background-image instead of background-color.

      • Quail4789@lemmy.mlOP
        link
        fedilink
        English
        arrow-up
        1
        ·
        20 days ago

        You’re right about the background. That was me going catch-all while testing. I’ll set background-color only for a while and observe how that works.

        I assumed background-color would be inherited when marked !important since I haven’t seen that noted anywhere on MDN or similar.

        • MrOtherGuy@lemmy.world
          link
          fedilink
          arrow-up
          1
          ·
          edit-2
          20 days ago

          Yeah, !important doesn’t affect inheritance in any way. It only means that this particular rule is to be used if there are multiple rules that would set that particular property for the element in question (unless there’s some other more specific rule with !important tag as well). MDN lists property inheritance in the formal definition section. You can totally make background-color inherited though - like *{ background-color: inherit } (and then set the property to something else on the root element from which you would want to inherit from) but it would then either not apply if website set it to anything else for an element or override any other set value if you used !important tag.

          One other thing worth noting is that I would not recommend the rules mentioned for userChrome.css to be used as is - at least on Windows they completely break Firefox startup - it fails to display any window if you do that. Instead you should add a [sessionrestored] selector to wait a bit before those rules are applied to main-window:

          #main-window[sessionrestored], #tabbrowser-tabpanels{ background: transparent !important; }