Разница между <img> и background-image в режиме mix-blend-mode

Я пытаюсь создать эффект дуотона, похожий на тот, что показан на этой ручке: https://codepen.io/meowwwls/pen/zoRjdK

Моя попытка здесь и работает именно так, как я хочу для простого тега img: https://codepen.io/sunnywz/pen/zPyYYR

$dark_blue: #080c29;
$white_blue: #dbe6ec;

.duotone {

display: inline-block;
position: relative;
vertical-align: top;
width: auto;

&:before,
&:after {
    content: "";
    opacity: 1;
    pointer-events: none;
    position: absolute;
        top: 0;
        right: 0;
        bottom: 0;
        left: 0;
    transition: 0.5s;
        -webkit-transition: 0.5s;
}

&:before {
    background: $dark_blue;
    mix-blend-mode: color;
    z-index: 1;
}

&:after {
    background: $white_blue;
    mix-blend-mode: color;
    z-index: 2;
}

img {
    filter: grayscale(1) contrast(1) brightness(1);
        -webkit-filter: grayscale(1) contrast(1) brightness(1);
    vertical-align: middle;
}

&:hover {
    &:before,
    &:after {
        opacity: 0;
        transition: 0.5s;
            -webkit-transition: 0.5s;
    }
    img {
        filter: none;
            -webkit-filter: none;
    }
}

}

.duotone-background {

background-size: cover;
display: inline-block;
filter: grayscale(1) contrast(1) brightness(1);
    -webkit-filter: grayscale(1) contrast(1) brightness(1);
height: 386px;
position: relative;
width: 640px;
vertical-align: top;

&:before,
&:after {
    content: "";
    opacity: 1;
    pointer-events: none;
    position: absolute;
        top: 0;
        right: 0;
        bottom: 0;
        left: 0;
    transition: 0.5s;
        -webkit-transition: 0.5s;
}

&:before {
    background: $dark_blue;
    mix-blend-mode: color;
    z-index: 1;
}

&:after {
    background: $white_blue;
    mix-blend-mode: color;
    z-index: 2;
}

&:hover {
    filter: none;
        -webkit-filter: none;
    &:before,
    &:after {
        opacity: 0;
        transition: 0.5s;
            -webkit-transition: 0.5s;
    }
}

}

Но когда я применяю те же стили и псевдоэлементы к элементу div с фоновым изображением, это дает совершенно другой эффект, который вы можете видеть на втором изображении.

Я попытался использовать цвет $dark_blue на элементе div с режимом background-blend-mode, но это, похоже, не сработало вообще.

Как я могу добиться того же эффекта на фоновом изображении?

1 ответ

Решение

Одна вещь, которую вы могли бы сделать, это просто заменить <img /> с <div style="background-image: url(...)"></div> и настроить стили соответственно (заменить img с div по существу - также дает div размеры width: 100%; height: 100%;). Таким образом, его "слоистый" то же самое.

поэтому ваша разметка будет:

<div class="duotone-background" >
  <div style="background-image: url('http://dlvec.btmcdev.com/wp-content/uploads/2017/11/Screen-Shot-2017-11-21-at-10.07.07-AM-1024x617.jpg')"></div>
</div> 

стили:

.duotone-background {
    display: inline-block;
    height: 386px;
    position: relative;
    width: 640px;
  vertical-align: top;

    &:before,
    &:after {
        content: "";
        opacity: 1;
        pointer-events: none;
        position: absolute;
            top: 0;
            right: 0;
            bottom: 0;
            left: 0;
        transition: 0.5s;
            -webkit-transition: 0.5s;
    }

    &:before {
        background: $dark_blue;
        mix-blend-mode: color;
        z-index: 1;
    }

    &:after {
        background: $white_blue;
        mix-blend-mode: color;
        z-index: 2;
    }

    &:hover {
        filter: none;
            -webkit-filter: none;
        &:before,
        &:after {
            opacity: 0;
            transition: 0.5s;
                -webkit-transition: 0.5s;
        }

    div {
      filter: none;
            -webkit-filter: none;
    }
    }

  div {
    width: 100%;
    height: 100%;
    background-size: cover;
    filter: grayscale(1) contrast(1) brightness(1);
        -webkit-filter: grayscale(1) contrast(1) brightness(1);
  }
}

Смотрите этот обновленный CodePen

Другие вопросы по тегам