cssfirefoxfirefox-quantum

Conditional CSS rule targeting Firefox Quantum


We are having issues targeting Firefox Quantum when it comes to CSS. We know that the following:

@-moz-document url-prefix() { 
    .my-style{
    }
}

...will target all Firefox browsers, but we just want to target Firefox Quantum, since there are some differences between Firefox Quantum and older versions of Firefox when it comes to CSS interpretation. Does anyone know how to do that?


Solution

  • Perusing the release notes for Fx Quantum 57, specifically Quantum CSS notes, a number of differences between Gecko and Stylo are listed, and a few hacks come to mind.

    Here's one:

    You can use @supports with a calc(0s) expression in conjunction with @-moz-document to test for Stylo — Gecko does not support <time> values in calc() expressions but Stylo does:

    @-moz-document url-prefix() {
      @supports (animation: calc(0s)) {
        /* Stylo */
      }
    }
    

    Here's a proof-of-concept:

    body::before {
      content: 'Not Fx';
    }
    
    @-moz-document url-prefix() {
      body::before {
        content: 'Fx legacy';
      }
    
      @supports (animation: calc(0s)) {
        body::before {
          content: 'Fx Quantum';
        }
      }
    }

    Note that Fx Quantum 59 and 60 disallowed the use of @-moz-document in public-facing documents, but version 61 restores functionality for the @-moz-document url-prefix() hack, allowing this to work as intended. Version 60 is an ESR release, however, so if you need to target that version, you'll need to change the @-moz-document at-rule to a media query:

    @media (-moz-device-pixel-ratio) {
      @supports (animation: calc(0s)) {
        /* Stylo */
      }
    }
    

    Targeting only legacy versions of Firefox is a little tricky — if you're only interested in versions that support @supports, which is Fx 22 and up, @supports not (animation: calc(0s)) is all you need:

    @-moz-document url-prefix() {
      @supports not (animation: calc(0s)) {
        /* Gecko */
      }
    }
    

    ... but if you need to support even older versions, you'll need to make use of the cascade, as demonstrated in the proof-of-concept above.