I recently revisited some old Sass code and needed to fix it to compile with the latest version of Compass. After I cleaned out the CSS3Pie bits (yes it was that old) I ran into the dreaded You may not @extend an outer selector from within @media. error message.
It took me a bit of work to track down since the issue was several nestings deep in an @include stack but I finally traced it back to an image sprite call inside a media query. Apparently the version of Compass that was used before generated image sprites differently and didn’t use @extend.
I worked out a solution based largely on this gist and we’ll be exploring it today.
When I use image sprites, I like to setup a helper _sprites.scss file.
This makes it easy to simply call show-icon-sprite('sprite-name') to get the image replacement, sprite details and width/height. The problem was that I had a button mixin that was using the show-icon-sprite mixin, but the button mixin was sometimes being called from within a media query.
I did some research and found the gist linked above which documented a replacement get-sprite mixin that would work within media queries and added that into my _sprites.scss file.
Now I’ve got an alternative means of adding icon sprites, but I didn’t want to use it everywhere. I wanted to keep as much the same as I could and only change the bits that had to be changed so that Compass would run without error.
After I identified the issue with the button mixin, I added support for an additional parameter to specify if the mixin was being called from within a media query.
This let me use the “media-query-safe” image sprite mixin if the button mixin was being called from within a media query.
Now all that was left was to update the Sass where the button mixin was being called.
I decided to use the map form of Sass arguments to avoid any kind of a “magic true” in the parameter list.
Now, any existing includes of the button mixin that aren’t in a media query will continue to work correctly and it is easy to update an include that is a media query.