Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use mix-blend-mode, but not have it affect child elements?

Tags:

html

css

blending

Okay, so I'm building a WordPress site and the page in question can be seen here: http://test.pr-tech.com/power-line-markers/

The issue I am having is that I am using mix-blend-mode for one of my div containers to make use a 'lighten' blend on the background.

It works perfectly, but the issue I am having is that unfortunately the child elements inside the container (i.e. the text) are also inheriting the blend mode, and therefore it's making my text 'blend' as well, which isn't what I want (I want the text to have NO blend mode).

Anyways, you can see the code I am using below:

#category-intro-text {
    padding: 0.625em 0.938em;
    mix-blend-mode: lighten;
    background-color: rgba(220, 235, 255, 0.8); repeat;
}

I tried applying something like 'mix-blend-mode: none;' to the text, but that doesn't work.

I've searched Google for an answer to this pretty extensively, but alas, there isn't much on this topic (if anything at all).

like image 583
DigitalSky Avatar asked Sep 17 '15 23:09

DigitalSky


People also ask

How do you remove Mix blend-mode from a child?

The solution on how to avoid mix-blend-mode affects children: Make child element position relative, give it a width and height; Create some real or pseudo element inside the child with absolute position, and apply mix-blend-mode to it; Create inner element inside the child for your content.

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.

What does mix blend-mode screen do?

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.

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 .


2 Answers

I realise you asked this a while ago but I've been playing with the same issue today and managed to fix it like this.

Wrap the content inside the #category-intro-text div with another div that is positioned relatively. Ultimately, you'll want to add the style to your css and not inline as I've done here.

<div id="category-intro-text">
    <div style="position: relative;">   
        <h1>Power Line Markers</h1>
        Etc. Etc.
    </div>
</div>

Then remove the background colour and blending information you've got in the stylesheet for the #category-intro-text div. You should end up with...

#category-intro-text {
  padding: 0.625em 0.938em;
  position: relative;
}

Finally, use a ::before pseudo element to add the blended layer.

#category-intro-text::before {
  content: "";
  display: block;
  height: 100%;
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  background-color: rgba(220, 235, 255,0.8);
  mix-blend-mode: lighten;
}

Hopefully that will do it. It is working perfectly for me with a multiply layer.

EDIT: Here is a Fiddle forked from the previous answer.

like image 166
shanem Avatar answered Sep 20 '22 00:09

shanem


I thought I had it worked out with the isolation property, but no. I didn't have much luck researching a solution for this issue either.

I suppose you could use this old trick: http://jsfiddle.net/cwdtqma7/

HTML:

<div class="intro-wrap">
    <div class="intro-background"></div>
    <div class="intro-content">
        <h1>Hello</h1>
        <p>Welcome to the thing.</p>
    </div>
</div>

CSS:

body {
    background: url('http://test.pr-tech.com/wp-content/themes/prtech/images/power-line-markers-bg.jpg') top left no-repeat;
    background-size: 800px;
    font-family: sans-serif;
}
.intro-wrap {
    position: relative;
}
.intro-background {
    background: url('http://test.pr-tech.com/wp-content/themes/prtech/images/category-intro-bg.png');
    mix-blend-mode: lighten;
    padding: 32px;
    width: 300px;
    height: 300px;
}
.intro-content {
    position: absolute;
    top: 0;
    left: 32px;
}
like image 32
Bitwise Creative Avatar answered Sep 20 '22 00:09

Bitwise Creative