<link href="https://fonts.googleapis.com/css2?family=Balsamiq+Sans&display=swap" rel="stylesheet">

<body>
    <div class="bunny-container">
        <div class="text"></div>
        <div class="grass"></div>
        <div class="bunny">
            <div class="bunny__ears">
                <div class="bunny__ear bunny__ear--left"></div>
                <div class="bunny__ear bunny__ear--right"></div>
            </div>
            <div class="bunny__feet">
                <div class="bunny__foot bunny__foot--left"></div>
                <div class="bunny__foot bunny__foot--right"></div>
            </div>
            <div class="bunny__tail"></div>
            <div class="bunny__paw"></div>
            <div class="bunny__body">
                <div class="bunny__eyes"></div>
                <div class="bunny__nose"></div>
                <div class="bunny__cheeks"></div>
                <div class="bunny__mouth"></div>
            </div>
        </div>
    </div>
    <div class="bubbles">
        <div class="bubble"></div>
        <div class="bubble"></div>
        <div class="bubble"></div>
        <div class="bubble"></div>
        <div class="bubble"></div>
        <div class="bubble"></div>
        <div class="bubble"></div>
        <div class="bubble"></div>
        <div class="bubble"></div>
        <div class="bubble"></div>
        <div class="bubble"></div>
        <div class="bubble"></div>
        <div class="bubble"></div>
        <div class="bubble"></div>
        <div class="bubble"></div>
        <div class="bubble"></div>
        <div class="bubble"></div>
        <div class="bubble"></div>
    </div>
</body>
:root {
    --bunny-size: 300px;
    --bunny-color: pink;
    --bunny-color-2: #f0a4cb;
    --bunny-eye-color: #473929;
    --bunny-cheek-color: red;
    --bunny-tongue-color: red;
    --bunny-mouth-color: #473929;
    --bunny-nose-color: #473929;
    
    --stick-color: #ff8819;
    --stick-bubble-color-1: #9e9eff;
    --stick-bubble-color-2: white;
    
    --text-color: #473929;
    --grass-color: #84cc84;
    --grass-color-2: lightgreen;

    --breathe-duration: 10s;

    --bubble-color-1: #4fd5e7;
    --bubble-color-2: #829fff;
    --bubble-color-3: #76e0cf;
    --bubble-color-4: #86befd;
    --bubble-color-5: #91f1d9;
}

body {
    margin: 0;
    background: linen;
    display: flex;
    justify-content: center;
    align-items: center;
    height: 100vh;
    font-family: 'Balsamiq Sans', cursive;
}

.bunny-container {
    width: var(--bunny-size);
    height: var(--bunny-size);
}

.bunny {
    width: 230px;
    height: 300px;
    transform: translateX(70px);
}

.bunny * {
    position: absolute;
}

.bunny__body {
    width: 200px;
    height: 200px;
    background: var(--bunny-color);
    border-radius: 100px 100px 30px 0px;
    transform: translateY(80px);
}

@keyframes eyesAnim {
    0%, 15%, 17%,    79%, 81% { transform: translate(40px, 40px) rotateZ(6deg) }
        16%,            80% { transform: translate(40px, 40px) rotateZ(6deg) scaleY(0.3) }
    60% { transform: translate(40px, 30px) rotateZ(6deg) }
    10%, 70%, 100% { transform: translate(40px, 40px) rotateZ(6deg) }
}

.bunny__eyes {
    padding: 6px;
    background: var(--bunny-eye-color);
    border-radius: 50%;
    box-shadow: 80px 0 var(--bunny-eye-color);
    transform: translate(40px, 40px) rotateZ(6deg);
    animation: eyesAnim var(--breathe-duration) linear infinite;
}

@keyframes noseAnim {
    60% { transform: translate(70px, 40px) }
    10%, 70%, 100% { transform: translate(70px, 50px) }
}

.bunny__nose {
    padding: 5px 8px;
    background: var(--bunny-nose-color);
    border-radius: 50%;
    transform: translate(70px, 50px);
    animation: noseAnim var(--breathe-duration) linear infinite;
}

.bunny__nose::after {
    content: '|';
    text-shadow: 1px 0px, -1px 0;
    color: var(--bunny-nose-color);
    position: absolute;
    font-size: 20px;
    font-weight: bolder;
    transform: translateX(-2px);
}

@keyframes cheeksAnim {
    60% { transform: translate(10px, 50px) rotateZ(5deg); opacity: 0.5 }
    10%, 70%, 100%, 0% { transform: translate(10px, 55px) rotateZ(5deg); opacity: 0.2 }
}

.bunny__cheeks {
    padding: 18px;
    background: var(--bunny-cheek-color);
    border-radius: 50%;
    transform: translate(10px, 55px) rotateZ(5deg);
    box-shadow: 110px 0 var(--bunny-cheek-color);
    animation: cheeksAnim var(--breathe-duration) linear infinite;
}

@keyframes breatheMouthAnim {
    0%, 10%, 75%,
    78%, 82%, 86%, 90%, 94%, 98%, 100%, 4%, 8%
    { transform: translate(68px, 70px) }
    60% { transform: translate(70px, 70px) scale(3, 2.5) }
    76%, 80%, 84%, 88%, 92%, 96%, 2%, 6% { transform: translate(66px, 70px) }
}

.bunny__mouth {
    padding: 8px 10px;
    background: var(--bunny-tongue-color);
    border-radius: 50%;
    transform: translate(66px, 70px);
    box-shadow: inset 5px 8px var(--bunny-mouth-color);
    animation: breatheMouthAnim  var(--breathe-duration) linear infinite;
}

.bunny__ears {
    width: 200px;
    height: 100px;
}

@keyframes earLeftAnim {
    0%, 10%, 75% { transform: var(--transform-3) }
    15%, 17%, 65% { transform: var(--transform-1) }
    16% { transform: var(--transform-2) }

    25%, 29%,       42%, 46%,       56%, 60% { transform: var(--transform-4) }
    23%, 27%, 31%,  40%, 44%, 48%,  54%, 58%, 62% { transform: var(--transform-1) }
}

@keyframes earRightAnim {
    0%, 10%, 75% { transform: var(--transform-3) }
    13%, 15%, 65% { transform: var(--transform-1) }
    14% { transform: var(--transform-2) }

    28%, 32%,       44%, 48%,       55%, 59% { transform: var(--transform-4) }
    26%, 30%, 34%,  42%, 46%, 50%,  53%, 57%, 61% { transform: var(--transform-1) }
}

.bunny__ear {
    width: 50px;
    height: 100px;
    border-radius: 50% 50% 0%;
    background: var(--bunny-color);
    transform-origin: bottom left;
    box-shadow: inset 0px 15px var(--bunny-color-2);
    transform: var(--transform-3);
}

.bunny__ear--left {
    --transform-1: translateX(50px) rotate(10deg);
    --transform-2: translateX(50px) rotate(5deg);
    --transform-3: translateX(50px) rotate(30deg);
    --transform-4: translateX(50px) rotate(8deg);
    animation: earLeftAnim var(--breathe-duration) linear infinite;
}

.bunny__ear--right {
    --transform-1: translateX(125px) rotate(25deg);
    --transform-2: translateX(125px) rotate(20deg);
    --transform-3: translateX(125px) rotate(45deg);
    --transform-4: translateX(125px) rotate(23deg);
    animation: earRightAnim var(--breathe-duration) linear infinite;
}

.bunny__feet {
    height: 35px;
    width: 200px;
    transform: translateY(265px);
}

.bunny__foot {
    height: 35px;
    width: 65px;
    background: var(--bunny-color-2);
    border-radius: 0 0 25px 50%;
}

.bunny__foot--left {
    transform: rotate(10deg) skewY(-20deg);
}

.bunny__foot--right {
    transform: translateX(110px) rotate(10deg) skewY(-20deg);
}

@keyframes tailAnim {
    0%, 15%, 25%,   75%, 85%, 95% { transform: translate(190px, 200px) rotate(8deg) }
        20%,        80%, 90% { transform: translate(190px, 198px) rotate(-8deg) }
}

.bunny__tail {
    height: 50px;
    width: 40px;
    background: var(--bunny-color-2);
    border-radius: 50% 50% 50%;
    transform: translate(190px, 200px) rotate(8deg);
    animation: tailAnim 3s linear infinite;
}

.bunny__arm {
    width: 80px;
    height: 100px;
    transform: translate(-70px, 140px);
}

@keyframes pawAnim {
    0%, 75%, 100% { transform: translate(-47px, 197px) rotate(-2deg) }
    65% { transform: translate(-47px, 197px) rotate(10deg) }
}

.bunny__paw {
    width: 50px;
    height: 50px;
    background: var(--bunny-color);
    border-radius: 50px 0 0 50px;
    transform-origin: bottom right;
    transform: translate(-47px, 197px) rotate(-2deg);
    transform: translate(-47px, 197px) rotate(10deg);
    animation: pawAnim var(--breathe-duration) linear infinite;
}

.bunny__paw::before {
    content: '';
    position: absolute;
    width: 10px;
    height: 45px;
    border-radius: 0 0 20px 20px;
    background: var(--stick-color);
    transform: translate(8px, -5px);
}

.bunny__paw::after {
    content: '';
    position: absolute;
    width: 19px;
    height: 35px;
    background: linear-gradient(-45deg,
        var(--stick-bubble-color-1) 0% 30%,
        var(--stick-bubble-color-2) 30% 40%,
        var(--stick-bubble-color-1) 40% 55%,
        var(--stick-bubble-color-2) 55% 60%,
        var(--stick-bubble-color-1) 60% 100%);
    border-radius: 50%;
    box-shadow: 0 0 0 8px var(--stick-color);
    transform: translate(2px, -45px);
}

.grass {
    width: 300px;
    height: 70px;
    background: var(--grass-color);
    position: absolute;
    border-radius: 50%;
    transform: translateY(260px);
    box-shadow: 0 6px 0 16px var(--grass-color-2);
}

.text {
    text-align: center;
    position: absolute;
    width: 300px;
    transform: translateY(-45px);
}

@keyframes breatheTextAnim {
    60%, 100% { content: "breathe out" }
    0%, 59% { content: "breathe in" }
    100%, 0%, 12%, 50%, 62% { opacity: 0 }
    15%, 40%, 65%, 90% { opacity: 1 }
}

.text::before {
    content: "breathe in";
    text-transform: uppercase;
    font-weight: 900;
    font-size: 1.2rem;
    letter-spacing: 8px;
    color: var(--text-color);
    animation: breatheTextAnim var(--breathe-duration) linear infinite;
}

.bubbles {
    position: absolute;
    transform: translate(-130px, 15px);
}

@keyframes bubbleAnim {
    40% { offset-distance: 0% }
    60% { offset-distance: 100%; }
    42%, 58% { opacity: 1 }
    0%, 40%, 60%, 100% { opacity: 0 }
}

.bubble {
    position: absolute;
    border-radius: 50%;
    opacity: 0;
    animation: bubbleAnim var(--breathe-duration) linear infinite;
    --bubble-base-delay: 3s;
    --bubble-delay: 0.2s;
}
.bubble:nth-child(n) {
    background: var(--bubble-color-1);
    padding: 12px;
    transform: rotate(10deg);
    offset-path: path('m0,0 l -500, -35');
}
.bubble:nth-child(2n) {
    background: var(--bubble-color-2);
    padding: 8px;
    offset-path: path('m0,0 l -500, -25');
}
.bubble:nth-child(3n) {
    background: var(--bubble-color-3);
    padding: 15px;
    offset-path: path('m0,0 l -500, 10');
}
.bubble:nth-child(4n) {
    background: var(--bubble-color-4);
    padding: 10px;
    offset-path: path('m0,0 l -500, 30');
}
.bubble:nth-child(5n) {
    background: var(--bubble-color-5);
    padding: 17px;
    offset-path: path('m0,0 l -500, 20');
}

.bubble:nth-child(1) { animation-delay: var(--bubble-base-delay) }
.bubble:nth-child(2) { animation-delay: calc(var(--bubble-base-delay) + var(--bubble-delay)) }
.bubble:nth-child(3) { animation-delay: calc(var(--bubble-base-delay) + var(--bubble-delay) * 2) }
.bubble:nth-child(4) { animation-delay: calc(var(--bubble-base-delay) + var(--bubble-delay) * 3) }
.bubble:nth-child(5) { animation-delay: calc(var(--bubble-base-delay) + var(--bubble-delay) * 4) }
.bubble:nth-child(6) { animation-delay: calc(var(--bubble-base-delay) + var(--bubble-delay) * 5) }
.bubble:nth-child(7) { animation-delay: calc(var(--bubble-base-delay) + var(--bubble-delay) * 6) }
.bubble:nth-child(8) { animation-delay: calc(var(--bubble-base-delay) + var(--bubble-delay) * 7) }
.bubble:nth-child(9) { animation-delay: calc(var(--bubble-base-delay) + var(--bubble-delay) * 8) }
.bubble:nth-child(10) { animation-delay: calc(var(--bubble-base-delay) + var(--bubble-delay) * 9) }
.bubble:nth-child(11) { animation-delay: calc(var(--bubble-base-delay) + var(--bubble-delay) * 10) }
.bubble:nth-child(12) { animation-delay: calc(var(--bubble-base-delay) + var(--bubble-delay) * 11) }
.bubble:nth-child(13) { animation-delay: calc(var(--bubble-base-delay) + var(--bubble-delay) * 12) }
.bubble:nth-child(14) { animation-delay: calc(var(--bubble-base-delay) + var(--bubble-delay) * 13) }
.bubble:nth-child(15) { animation-delay: calc(var(--bubble-base-delay) + var(--bubble-delay) * 14) }
.bubble:nth-child(16) { animation-delay: calc(var(--bubble-base-delay) + var(--bubble-delay) * 15) }
.bubble:nth-child(17) { animation-delay: calc(var(--bubble-base-delay) + var(--bubble-delay) * 16) }
.bubble:nth-child(18) { animation-delay: calc(var(--bubble-base-delay) + var(--bubble-delay) * 17) }

.bubble::before, .bubble::after {
    content: '';
    position: absolute;
    border-radius: 50%;
    background: white;
}

.bubble::after {
    padding: 15%;
    opacity: 0.6;
}

.bubble::before {
    padding: 10%;
    opacity: 0.7;
    transform: translate(-6px, -1px);
}

External CSS

This Pen doesn't use any external CSS resources.

External JavaScript

  1. https://cdnjs.cloudflare.com/ajax/libs/gsap/3.3.1/gsap.min.js
  2. https://cdnjs.cloudflare.com/ajax/libs/gsap/3.3.1/CSSRulePlugin.min.js
  3. https://s3-us-west-2.amazonaws.com/s.cdpn.io/16327/CustomBounce3.min.js
  4. https://s3-us-west-2.amazonaws.com/s.cdpn.io/16327/CustomEase3.min.js
  5. https://s3-us-west-2.amazonaws.com/s.cdpn.io/16327/CustomWiggle3.min.js
  6. https://s3-us-west-2.amazonaws.com/s.cdpn.io/16327/DrawSVGPlugin3.min.js
  7. https://cdnjs.cloudflare.com/ajax/libs/gsap/3.3.1/Draggable.min.js
  8. https://cdnjs.cloudflare.com/ajax/libs/gsap/3.3.1/EaselPlugin.min.js
  9. https://cdnjs.cloudflare.com/ajax/libs/gsap/3.3.1/EasePack.min.js
  10. https://s3-us-west-2.amazonaws.com/s.cdpn.io/16327/GSDevTools3.min.js
  11. https://s3-us-west-2.amazonaws.com/s.cdpn.io/16327/InertiaPlugin.min.js
  12. https://s3-us-west-2.amazonaws.com/s.cdpn.io/16327/MorphSVGPlugin3.min.js
  13. https://s3-us-west-2.amazonaws.com/s.cdpn.io/16327/MotionPathHelper.min.js
  14. https://cdnjs.cloudflare.com/ajax/libs/gsap/3.3.1/MotionPathPlugin.min.js
  15. https://s3-us-west-2.amazonaws.com/s.cdpn.io/16327/Physics2DPlugin3.min.js
  16. https://s3-us-west-2.amazonaws.com/s.cdpn.io/16327/PhysicsPropsPlugin3.min.js
  17. https://cdnjs.cloudflare.com/ajax/libs/gsap/3.3.1/PixiPlugin.min.js
  18. https://s3-us-west-2.amazonaws.com/s.cdpn.io/16327/ScrambleTextPlugin3.min.js
  19. https://cdnjs.cloudflare.com/ajax/libs/gsap/3.3.1/ScrollToPlugin.min.js
  20. https://s3-us-west-2.amazonaws.com/s.cdpn.io/16327/SplitText3.min.js
  21. https://cdnjs.cloudflare.com/ajax/libs/gsap/3.3.1/TextPlugin.min.js