<div class="container">
    <div class="menu">
        <h3>Your Settings</h3>
        <ul>
            <li>
                <a href="#">
                    <svg><use xlink:href="#cog"></svg>
                    <span>Edit Personal Info</span>
                </a>
            </li>
            <li>
                <a href="#">
                    <svg><use xlink:href="#picture"></svg>
                    <span>Set Profile Picture</span>
                </a>
            </li>
            <li>
                <a href="#">
                    <svg><use xlink:href="#lock"></svg>
                    <span>Change Password</span>
                </a>
            </li>
        </ul>
    </div>
    <div class="menu-btn-container">
        <button aria-pressed="false" aria-label="Open Menu" class="menu-btn"></button>
        <span class="menu-btn-pulse"></span>
        <span class="menu-btn-pulse"></span>
    </div>
    <svg>
    <symbol id="cog" viewBox="0 0 1024 1024">
        <path d="M390.71 1008.755c-2.109 0-4.248-0.262-6.378-0.81-45.976-11.803-90.149-30.042-131.291-54.21-11.923-7.003-16.13-22.21-9.501-34.344 
            8.15-14.925 12.459-31.866 12.459-48.992 0-56.464-45.936-102.4-102.4-102.4-17.125 0-34.066 4.309-48.992 12.459-12.133 6.627-27.339 
            2.421-34.342-9.501-24.17-41.142-42.408-85.315-54.211-131.293-3.333-12.989 3.92-26.349 16.629-30.629 41.699-14.037 69.717-53.034 
            69.717-97.037s-28.018-83-69.718-97.040c-12.707-4.278-19.962-17.638-16.627-30.627 11.803-45.976 30.042-90.149 54.211-131.291 7.003-11.923 22.21-16.13
            34.344-9.501 14.923 8.15 31.864 12.459 48.99 12.459 56.464 0 102.4-45.936 102.4-102.4 0-17.126-4.309-34.067-12.459-48.99-6.629-12.134-2.422-27.341 
            9.501-34.344 41.141-24.168 85.314-42.408 131.291-54.211 12.994-3.334 26.349 3.92 30.627 16.627 14.040 41.701 53.037 69.718 97.040 69.718s83-28.018 
            97.038-69.717c4.28-12.71 17.645-19.965 30.629-16.629 45.976 11.802 90.15 30.042 131.293 54.211 11.922 7.003 16.128 22.208 9.501 34.342-8.152 
            14.926-12.461 31.867-12.461 48.992 0 56.464 45.936 102.4 102.4 102.4 17.126 0 34.067-4.309 48.992-12.459 12.138-6.629 27.341-2.421 34.344 9.501 
            24.166 41.141 42.406 85.314 54.21 131.291 3.334 12.989-3.918 26.349-16.627 30.627-41.701 14.040-69.718 53.037-69.718 97.040s28.018 
            83 69.718 97.038c12.707 4.28 19.962 17.638 16.627 30.629-11.803 45.976-30.042 90.15-54.21 131.291-7.005 11.925-22.208 16.128-34.344 
            9.502-14.926-8.152-31.867-12.461-48.992-12.461-56.464 0-102.4 45.936-102.4 102.4 0 17.125 4.309 34.066 12.461 48.992 6.627 12.136 2.421
            27.341-9.502 34.344-41.141 24.166-85.314 42.406-131.291 54.21-12.992 3.336-26.349-3.918-30.629-16.627-14.038-41.701-53.035-69.718-97.038-69.718s-83
            28.018-97.040 69.718c-3.578 10.624-13.502 17.437-24.25 17.437zM512 870.4c57.715 0 109.693 32.138 135.917 82.029 26.637-8.218 52.507-18.875 
            77.299-31.846-5.541-16.077-8.416-33.075-8.416-50.182 0-84.696 68.904-153.6 153.6-153.6 17.107 0 34.106 2.875 50.181 8.418 12.971-24.792 23.63-50.662
            31.846-77.299-49.89-26.226-82.027-78.203-82.027-135.918s32.138-109.691 82.029-135.918c-8.218-26.637-18.875-52.506-31.846-77.299-16.077 5.542-33.074 
            8.418-50.182 8.418-84.696 0-153.6-68.904-153.6-153.6 0-17.107 2.875-34.106 8.418-50.181-24.792-12.971-50.662-23.63-77.299-31.846-26.226 49.89-78.203 
            82.027-135.918 82.027s-109.691-32.138-135.917-82.027c-26.637 8.216-52.507 18.874-77.299 31.846 5.542 16.075 8.416 33.072 8.416 50.181 0 84.696-68.904 
            153.6-153.6 153.6-17.109 0-34.106-2.874-50.181-8.418-12.973 24.794-23.63 50.662-31.846 77.299 49.89 26.227 82.027 78.203 82.027 135.918s-32.138 
            109.693-82.027 135.917c8.216 26.637 18.875 52.507 31.846 77.299 16.075-5.541 33.074-8.416 50.181-8.416 84.696 0 153.6 68.904 153.6 153.6 0 17.109-2.875
            34.106-8.418 50.181 24.794 12.971 50.662 23.63 77.299 31.846 26.227-49.89 78.203-82.027 135.918-82.027z"></path>
        <path d="M512 665.6c-84.696 0-153.6-68.904-153.6-153.6s68.904-153.6 153.6-153.6 153.6 68.904 153.6 153.6-68.904 153.6-153.6 153.6zM512 409.6c-56.464 0-102.4
             45.936-102.4 102.4s45.936 102.4 102.4 102.4c56.464 0 102.4-45.936 102.4-102.4s-45.936-102.4-102.4-102.4z"></path>
        </symbol>
        <symbol id="picture" viewBox="0 0 1024 1024">
        <path d="M947.2 1024h-870.4c-42.347 0-76.8-34.451-76.8-76.8v-870.4c0-42.347 34.453-76.8 76.8-76.8h870.4c42.349 0 76.8 34.453 76.8 76.8v870.4c0 42.349-34.451
        76.8-76.8 76.8zM76.8 51.2c-14.115 0-25.6 11.485-25.6 25.6v870.4c0 14.115 11.485 25.6 25.6 25.6h870.4c14.115 0 25.6-11.485 25.6-25.6v-870.4c0-14.115-11.485-25.6-25.6-25.6h-870.4z"></path>
        <path d="M665.6 460.8c-56.464 0-102.4-45.936-102.4-102.4s45.936-102.4 102.4-102.4 102.4 45.936 102.4 102.4-45.936 102.4-102.4 102.4zM665.6 307.2c-28.232 0-51.2
        22.968-51.2 51.2s22.968 51.2 51.2 51.2 51.2-22.968 51.2-51.2-22.968-51.2-51.2-51.2z"></path>
        <path d="M896 102.4h-768c-14.138 0-25.6 11.462-25.6 25.6v614.4c0 14.139 11.462 25.6 25.6 25.6h768c14.139 0 25.6-11.461 25.6-25.6v-614.4c0-14.138-11.461-25.6-25.6-25.6zM153.6
        598.533l164.318-184.858c4.203-4.728 9.694-7.371 15.462-7.44 5.725-0.090 11.322 2.438 15.638 7.062l283.27 303.502h-478.69v-118.267zM870.4 
        716.8h-168.075l-315.875-338.437c-14.269-15.288-33.312-23.605-53.691-23.325-20.354 0.246-39.214 8.992-53.107 24.621l-126.051 141.808v-367.867h716.8v563.2z"></path>
        </symbol>
        <symbol id="lock" viewBox="0 0 1024 1024">
        <path d="M813.412,360.894h-30.141v-90.424C783.271,120.891,661.579-0.8,512-0.8S240.729,120.891,240.729,270.471v90.423h-30.141
        c-49.859,0-90.424,40.565-90.424,90.424v482.259c0,49.859,40.565,90.424,90.424,90.424h602.823
        c49.859,0,90.424-40.565,90.424-90.424V451.318C903.835,401.459,863.271,360.894,813.412,360.894L813.412,360.894z M301.012,270.471
        c0-116.339,94.649-210.988,210.988-210.988s210.988,94.649,210.988,210.988v90.423H301.012L301.012,270.471L301.012,270.471z
            M843.553,933.576c0,16.619-13.522,30.141-30.141,30.141H210.588c-16.619,0-30.141-13.522-30.141-30.141V451.318
        c0-16.619,13.522-30.141,30.141-30.141h602.823c16.619,0,30.141,13.522,30.141,30.141V933.576z"/>
        </symbol>
    </svg>
</div>
@import url("https://fonts.googleapis.com/css?family=Montserrat&display=swap");
html,
body {
  height: 100%;
}
body {
  display: flex;
  align-items: center;
  justify-content: center;
  color: white;
  font-family: "Montserrat";
  overflow:hidden;
}
ul,
li {
  list-style-type: none;
}
ul {
  padding-left: 0;
  font-size: 0.875em;
}
li {
  margin: 15px auto;
  padding: 15px 0px;
  border-bottom: 1px solid rgba(175, 175, 175, 0.25);
}
li:last-child {
  border: none;
}
a {
  display: inline-block;
  text-decoration: none;
  color: white;
  display: flex;
  align-items: center;
}
h3 {
  font-size: 20px;
}
.container {
  text-align: center;
}
.menu-btn {
  border: none;
  background: linear-gradient(120deg, #f829ab 25%, #f42977 75%, #f41f5f 100%);
  border-radius: 25px;
  transform: rotate(-45deg) translateZ(0);
  width: 70px;
  height: 70px;
  position: relative;
  cursor: pointer;
  box-shadow: 0px 2px 20px rgba(244, 31, 95, 0.25);
  margin: 15px auto;
}
.menu-btn:focus {
  outline: none;
}
.menu-btn:before,
.menu-btn:after {
  content: "";
  position: absolute;
  top: calc(50% - 1px);
  left: calc(50% - 17px);
  width: 34px;
  height: 2px;
  background: white;
  transition: 0.3s ease all;
  transform: rotate(-45deg) translateZ(0);
}
.menu-btn:after {
  transform: rotate(45deg) translateZ(0);
}
.menu-btn.open:before {
  transform: rotate(0deg);
}
.menu-btn.open:after {
  transform: rotate(90deg);
}
.menu {
  position: relative;
  min-height: 250px;
  min-width: 300px;
  margin: 15px auto;
  border-radius: 24px 24px 24px 4px;
  text-align: left;
  padding: 15px 20px;
  transform: scale(0);
  transform-origin: 50% 50%;
  transition: 0.35s ease all;
  overflow: hidden;
}
.menu > h3 {
  opacity: 0;
}
.menu > ul > li {
  opacity: 0;
}
.menu:before {
  content: "";
  position: absolute;
  top: 0;
  left: 0;
  height: 100%;
  width: 100%;
  background: #28334b;
  z-index: -1;
  border-radius: 50%;
  transform: scale(0.5);
}
.menu.active:before {
  animation: 0.2s menuIn 0.15s normal forwards;
  animation-timing-function: ease-in;
}
.active {
  transform: scale(1);
}
.menu.active > h3 {
  transition: 0.2s ease-in 0.2s;
  opacity: 1;
}
.menu.active > ul > li {
  transition: 0.2s ease-in 0.2s;
  opacity: 1;
}
@keyframes menuIn {
  0% {
    transform: scale(0.5);
    border-radius: 50%;
  }
  45% {
    transform: scale(1.25);
    border-radius: 50%;
  }
  100% {
    transform: scale(1);
    border-radius: 24px 24px 24px 4px;
  }
}
@keyframes menuOut {
  from {
    transform: scale(1);
    border-radius: 24px 24px 24px 4px;
  }
  to {
    transform: scale(0.5);
    border-radius: 50%;
  }
}
svg {
  width: 26px;
  height: 26px;
  fill: white;
  margin-right: 10px;
}
.menu-btn-container {
  position: relative;
}
.menu-btn-pulse {
  position: absolute;
  left: 50%;
  top: 50%;
  transform: translate(-50%, -50%) scale(0);
  z-index: -1;
  width: 80px;
  height: 80px;
  border-radius: 50%;
  border: 1px solid rgba(248, 41, 171, 0.28);
  filter: blur(3px);
}
.menu-btn-particle {
  width: 6px;
  height: 6px;
  position: absolute;
  display: inline-block;
  border-radius: 50%;
  top: 50%;
  left: 50%;
  z-index: -1;
}
const randomMinMax = (min,max) => {
    return min + Math.random() * (max-min);
}
const button = document.querySelector('.menu-btn');
const menu = document.querySelector('.menu');
const buttonPulse = document.querySelectorAll('.menu-btn-pulse')

const btnHoverTl = new TimelineMax({
    repeat:-1,
    paused:true
}); 
btnHoverTl.fromTo(button,0.8,{
        scale:1
    },{
        scale:1.05
    })
    .to(button,0.6,{
        scale:1
    });

const pulseTl = new TimelineMax({
    repeat:-1,
    onRepeat:() => {
        TweenMax.set(buttonPulse,{scale:0.5})
    }
});

pulseTl.staggerTo(buttonPulse,2,{
        scale:2.5,
        transformOrigin:"center center"
    },0.25,'in')
.staggerTo(buttonPulse,2,{
        opacity:0,
        scale:3.5
    },0.25,'in+=0.25');

button.addEventListener('click',() => {
    menu.classList.toggle('active');
    button.classList.toggle('open');
    // play particles on click
    button.classList.contains('open') ? playParticles()  : null;

    if (button.classList.contains('open')) {
        pulseTl.eventCallback("onRepeat", () => {
            pulseTl.pause();
        })
        btnHoverTl.eventCallback('onRepeat',() => {
            btnHoverTl.pause();
        })
    }
    else {
        pulseTl.eventCallback("onRepeat", null);
        pulseTl.restart();
        btnHoverTl.eventCallback('onRepeat',null)
        btnHoverTl.restart();
    }  
});

button.addEventListener('mouseover',() => { 
    btnHoverTl.play();   
    btnHoverTl.eventCallback("onRepeat", null);
});

button.addEventListener('mouseleave',()=> {
    btnHoverTl.eventCallback("onRepeat", () => {
        btnHoverTl.pause();
    });
});

const colors = ["#F829AB","#F42977","#F41F5F"];
const particleCount = 8;
const btnContainer = document.querySelector('.menu-btn-container');

// create a few span elements
const createParticles = () => {    
    for (let i = 0; i < particleCount; i++) {   
        // create element
        const particle = document.createElement('span');
        // assign class to element
        particle.setAttribute('class','menu-btn-particle')
        btnContainer.appendChild(particle);
    }
};

createParticles();

const particle = document.querySelectorAll('.menu-btn-particle');

randomizeParticles = () => {
    let color = colors[(Math.random() * colors.length) | 0];
    TweenMax.set(particle,{x:0,y:0,backgroundColor:() => color });
    TweenMax.set(particle,{scale:() => randomMinMax(0.35,1)});
    TweenMax.set(particle,{opacity:() => randomMinMax(0.25,1)});
}

randomizeParticles();


playParticles = () => {
  const particleTl = new TimelineMax();
  particleTl.staggerTo(particle,0.5,{ cycle: {
    physics2D: () => {
      return {
        velocity:randomMinMax(145,165),
        angle:randomMinMax(180,325),
        gravity:randomMinMax(215,225)        
      }   
    }
  }},'in')
    .to(particle,0.4,{scale:0,opacity:0,onComplete:() => {
      randomizeParticles();
    }},'in')
};
View Compiled

External CSS

This Pen doesn't use any external CSS resources.

External JavaScript

  1. https://cdnjs.cloudflare.com/ajax/libs/gsap/2.1.3/TweenMax.min.js
  2. https://s3-us-west-2.amazonaws.com/s.cdpn.io/16327/Physics2DPlugin.min.js