Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using css mix-blend-mode with a child of a position fixed element

Tags:

css

I would like to set the mix blend mode of an anchor inside of a position:fixed element but it is not applied.

If I apply the mix blend mode to the parent element it works or if I set the parent element to position:absolute it also works but neither of these are what I'm wanting to achieve.

Codepen with the three examples, I'd like #nav to look like #nav2 and #nav3 with the existing html.

http://codepen.io/wesdeboer/pen/QjawYv

HTML

<body>
  <div id="nav">
    <a href="">fixed</a>
  </div>
  <div id="nav2">
    <a href="">absolute</a>
  </div>
  <div id="nav3">
    <a href="">parent</a>
  </div>
</body>

CSS

body { background: url(http://lorempixel.com/400/200)}
#nav {
  position: fixed;
  top:0;
  left: 0;
}
#nav2 {
  position: absolute;
  top:0;
  left: 100px;
}
#nav3 {
  position: fixed;
  top: 0;
  left: 250px;
  mix-blend-mode: difference;
}
a {
  color: white;
  font-weight: bold;
  font-size: 32px;
  mix-blend-mode: difference;
}

Tested in Chrome 45

like image 668
wesdeboer Avatar asked Oct 19 '15 20:10

wesdeboer


People also ask

Why does mix blend-mode not work?

The reason why it doesn't work is that the white sections don't really have a white background. They have no background-color set, so they fall back to the default value of transparent . Visually this is manifested as a white color, but to the compositor it will still be transparent .

What is mix blend-mode in CSS?

The mix-blend-mode CSS property sets how an element's content should blend with the content of the element's parent and the element's background.

What is the difference between Mix blend-mode difference and mix blend-mode exclusion?

difference : this subtracts the darker of the two colors from the lightest color. exclusion : similar to difference but with lower contrast. hue : creates a color with the hue of the content combined with the saturation and luminosity of the background.


1 Answers

The reason position: fixed; on a parent element prevents mix-blend-mode from behaving as you expect is that position: fixed; creates a new stacking context, isolating the child element from the rest of the document.

I verified that this is indeed the issue by forking your example and creating a new nav item which creates a new stacking context in a different way: by positioning it absolutely and setting z-index. This new stacking context prevents the child element from blending with the background image outside the stacking context, just as we observed with the position: fixed; element.

Demo Screenshot

position: fixed; and position: absolute; z-index: 3; are just two of many ways to create a new stacking context, all of which should create this issue:

  • Element with a position value absolute or relative and z-index value other than auto.
  • Element with a position value fixed or sticky (sticky for all mobile browsers, but not older desktop).
  • Element that is a child of a flex (flexbox) container, with z-index value other than auto.
  • Element that is a child of a grid (grid) container, with z-index value other than auto.
  • Element with a opacity value less than 1 (See the specification for opacity).
  • Element with a mix-blend-mode value other than normal.
  • Element with any of the following properties with value other than none:
    • transform
    • filter
    • perspective
    • clip-path
    • mask / mask-image / mask-border
  • Element with a isolation value isolate.
  • Element with a -webkit-overflow-scrolling value touch.
  • Element with a will-change value specifying any property that would create a stacking context on non-initial value (see this post).
  • Element with a contain value of layout, or paint, or a composite value that includes either of them (i.e. contain: strict, contain: content).

Your options for getting around this limitation include:

  • Finding a way to position / style the parent that doesn't result in a new stacking context.
  • Applying the problematic styling / positioning to the children instead of the parent; ie, positioning the individual children using fixed.
  • Applying mix-blend-mode to the parent that has created the new stacking context rather than a child of that stacking context.
  • Applying the background image to the parent that has created the new stacking context and sizing / positioning it to align with the existing background image.
like image 104
Nathan Arthur Avatar answered Sep 16 '22 16:09

Nathan Arthur