blub Эффект или гладкое слияние обьектов между собой css html
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
#main {
display: flex;
align-items: center;
justify-content: center;
width: 100%;
height: 100vh;
background-color: black;
position: relative;
}
.circle {
width: 100px;
height: 100px;
border-radius: 50%;
background-color: #fff;
position: absolute;
transition: transform 0.5s ease;
mix-blend-mode: screen;
/* Эффект слияния */
}
.circle+.circle {
animation: 3s anim alternate infinite;
}
@keyframes anim {
0% {
transform: translateX(100px);
}
100% {
transform: translateX(-100px);
}
}
#main {
position: relative;
}
#main::before {
content: "";
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: radial-gradient(circle, rgba(255, 255, 255, 0.1), rgba(255, 255, 255, 0.4));
pointer-events: none;
}
<main id="main">
<div class="circle" id="a"></div>
<div class="circle" id="b"></div>
</main>
Вот такой эффект я хочу получить
Ответы (2 шт):
Помню было подобное решение с использование filter
и неким хаком на основе blur()
и чего-то ещё.
Нашёл похожее, эти "что-то ещё" оказался contrast()
.
Точно не знаю за счёт чего происходит данный эффект, предполагаю, что blur()
'ом создаются участи "соприкосновения", которые contrast()
'ом "усиливаются" до такого, что визуально это выглядит как "цельная" фигура.
В общем вот схожая анимация, на основе данного хака:
body {
display: flex;
justify-content: center;
align-items: center;
width: 100%;
height: 100vh;
background-color: #000;
overflow: hidden;
}
.circles {
display: flex;
background-color: #000;
filter: blur(10px) contrast(20);
padding: 50px;
}
.circle {
display: block;
width: 100px;
height: 100px;
border-radius: 50%;
background-color: #fff;
animation: circle 3s cubic-bezier(.75,0,.25,1) infinite;
}
.circle--left {
animation-name: circleLeft;
}
.circle--right {
animation-name: circleRight;
}
@keyframes circleLeft {
0%, 100% {
transform: translateX(-35%);
}
35% {
transform: translateX(10%);
}
}
@keyframes circleRight {
0%, 100% {
transform: translateX(35%);
}
35% {
transform: translateX(-10%);
}
}
<div class="circles">
<div class="circle circle--left"></div>
<div class="circle circle--right"></div>
</div>
Такое решение имеет существенную проблему:
- Не выйдет адекватно использовать какие-то "пёстрые цвета" на фоне или фигуре, в идеале только контрастные цвета.
Но как будто бы, это каким-нибидь образом можно использовать как маску, например ?
P.s. интересно было бы посмотреть на другие решения этой задачи.
Если никто ничего не подкинет и подойдёт время, назначу конкурс на этот вопрос :)
В статье The Gooey Effect есть пример реализации с использованием svg фильтра, он более практичен, чем пример с контрастом.
body {
background: white no-repeat;
background-image: url(https://i.imgur.com/d47ZIU3.jpg);
background-size: cover;
}
.blobs {
filter: url("#goo");
position: absolute;
top: 0;
left: 0;
bottom: 0;
right: 0;
}
@keyframes blob-left-top-anim {
0% {
transform: scale(1.1) translate(0, 0);
}
33% {
transform: scale(0.9) translate(-65px, 0);
}
62% {
transform: scale(0.7) translate(-65px, -65px);
}
94% {
transform: scale(1.1) translate(0, 0);
}
}
@keyframes blob-right-top-anim {
0% {
transform: scale(1.1) translate(0, 0);
}
33% {
transform: scale(0.9) translate(65px, 0);
}
64% {
transform: scale(0.7) translate(65px, -65px);
}
96% {
transform: scale(1.1) translate(0, 0);
}
}
@keyframes blob-left-bottom-anim {
0% {
transform: scale(1.1) translate(0, 0);
}
33% {
transform: scale(0.9) translate(-65px, 0);
}
66% {
transform: scale(0.7) translate(-65px, 65px);
}
98% {
transform: scale(1.1) translate(0, 0);
}
}
@keyframes blob-right-bottom-anim {
0% {
transform: scale(1.1) translate(0, 0);
}
33% {
transform: scale(0.9) translate(65px, 0);
}
68% {
transform: scale(0.7) translate(65px, 65px);
}
100% {
transform: scale(1.1) translate(0, 0);
}
}
.blob {
position: absolute;
background: #e97b7a;
left: 50%;
top: 50%;
width: 100px;
height: 100px;
line-height: 100px;
text-align: center;
color: white;
font-size: 40px;
border-radius: 100%;
margin-top: -50px;
margin-left: -50px;
animation: blob-left-top-anim cubic-bezier(0.77, 0, 0.175, 1) 4s infinite;
}
.blob:nth-child(2) {
animation-name: blob-right-top-anim;
}
.blob:nth-child(3) {
animation-name: blob-left-bottom-anim;
}
.blob:nth-child(4) {
animation-name: blob-right-bottom-anim;
}
<div class="blobs">
<div class="blob">4</div>
<div class="blob">3</div>
<div class="blob">2</div>
<div class="blob">1</div>
</div>
<svg xmlns="http://www.w3.org/2000/svg" version="1.1">
<defs>
<filter id="goo">
<feGaussianBlur in="SourceGraphic" stdDeviation="10" result="blur" />
<feColorMatrix in="blur" mode="matrix" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 18 -7" result="goo" />
<feBlend in="SourceGraphic" in2="goo" />
</filter>
</defs>
</svg>