<div class="container">
    <button class="button button-close">
        <span class="outer-bars">
            <span class="bar"></span>
            <span class="bar"></span>
        </span>
        <span class="squares">
            <span class="line top"></span>
            <span class="line right"></span>
            <span class="icon icon-close"></span>
            <span class="line bottom"></span>
            <span class="line left"></span>
        </span>
    </button>
    
    
    <button class="button button-close small">
        <span class="outer-bars">
            <span class="bar"></span>
            <span class="bar"></span>
        </span>
        <span class="squares">
            <span class="line top"></span>
            <span class="line right"></span>
            <span class="icon icon-close"></span>
            <span class="line bottom"></span>
            <span class="line left"></span>
        </span>        
    </button>
    
</div>
$colorCopyHighlight: #10dcb2;

@function ease($easeName) {

  $easeMap: (
    linear:     '0.250, 0.250, 0.750, 0.750',
    ease:       '0.250, 0.100, 0.250, 1.000',
    easeIn:     '0.420, 0.000, 1.000, 1.000',
    easeOut:    '0.000, 0.000, 0.580, 1.000',
    easeInOut:    '0.420, 0.000, 0.580, 1.000',
    easeInQuad:   '0.550, 0.085, 0.680, 0.530',
    easeOutQuad:  '0.250, 0.460, 0.450, 0.940',
    easeInCubic:  '0.550, 0.055, 0.675, 0.190',
    easeOutCubic: '0.215, 0.610, 0.355, 1.000',
    easeInQuart:  '0.895, 0.030, 0.685, 0.220',
    easeOutQuart: '0.165, 0.840, 0.440, 1.000',
    easeInQuint:  '0.755, 0.050, 0.855, 0.060',
    easeOutQuint: '0.230, 1.000, 0.320, 1.000',
    easeInSine:   '0.470, 0.000, 0.745, 0.715',
    easeOutSine:  '0.390, 0.575, 0.565, 1.000',
    easeInExpo:   '0.950, 0.050, 0.795, 0.035',
    easeOutExpo:  '0.190, 1.000, 0.220, 1.000',
    easeInCirc:   '0.600, 0.040, 0.980, 0.335',
    easeOutCirc:  '0.075, 0.820, 0.165, 1.000',
    easeInBack:   '0.600, -0.280, 0.735, 0.045',
    easeOutBack:  '0.175, 0.885, 0.320, 1.275',
    easeInOutQuad:  '0.455, 0.030, 0.515, 0.955',
    easeInOutCubic: '0.645, 0.045, 0.355, 1.000',
    easeInOutQuart: '0.770, 0.000, 0.175, 1.000',
    easeInOutQuint: '0.860, 0.000, 0.070, 1.000',
    easeInOutSine:  '0.445, 0.050, 0.550, 0.950',
    easeInOutExpo:  '1.000, 0.000, 0.000, 1.000',
    easeInOutCirc:  '0.785, 0.135, 0.150, 0.860',
    easeInOutBack:  '0.680, -0.550, 0.265, 1.550'
  );

  @if map-has-key($easeMap, $easeName) {
    @return cubic-bezier(#{map-get($easeMap, $easeName)})
  } @else {
    @warn "The easing value '#{$easeName}' isn't available. "
        + "Please make sure it is defined in '$easeMap' map.";
    @return null;
  }
}

@mixin pos($top: 0, $right: $top, $bottom: $top, $left: $right) {
  top: $top;
  bottom: $bottom;
  left: $left;
  right: $right;
}

@mixin pulsate-animation($name, $min-opacity: 0, $duration: 1000, $loop: infinite, $ease: 'ease-in-out') {
  animation: #{$duration}ms #{$name} $loop #{$ease};

  @keyframes #{$name} {
    0% { opacity: 1; }
    50% { opacity: $min-opacity; }
    100% { opacity: 1; }
  }
}

html {
    background: #121212;
}

button {
    background: transparent;
    border: 0;
    margin: 40px;
}

.button {
  position: relative;
  padding: 0;
  border: 0;
  background: none;
  pointer-events: auto;
  box-sizing: content-box;
    
    &:focus,
  &:active {
    outline: none;
  }
}

.container {
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    padding: 30px;
    text-align: center;
}

//todo: delete
.button {
    vertical-align: middle;
}

.button-close {
    width: 48px;
  height: 48px;
  display: inline-block;
  color: #fff;
    position: relative;
  transform: rotate(45deg);
    
    &.small {
           width: 40px;
           height: 40px;
    }
    
    .icon-close {
        width: 24px;
    height: 24px;
    display: block;
    margin: auto;
    position: relative;
        
    &:before,
    &:after {
      position: absolute;
      content: '';
      background: $colorCopyHighlight;
    }

    &:before {
      top: 0;
      bottom: 0;
      left: 50%;
      width: 3px;
      height: 100%;
      transform: translate(-50%, 0);
    }

    &:after {
      top: 50%;
      left: 0;
      height: 3px;
      width: 100%;
      transform: translate(0, -50%);
    }

  }
    
    .outer-bars {
        $initBorderWidth: 10px;
        @include pos(-10px);
        position: absolute;
      transform: rotate(-45deg);
        
        .bar {
            @include pos(50%, 0, auto, 0);
            transform: translateY(-50%);
            position: absolute;
            border: 1px solid currentColor;
            box-sizing: border-box;
            border-top: 0;
            border-bottom: 0;
            height: $initBorderWidth;
            width: 100%;
            box-sizing: border-box;
            
            &:last-child {
                transform: translateY(-50%) rotate(90deg);
            }
        }
    }
    
    .line {
    @include pulsate-animation('close-button', .5, 400);
    height: 50%;
    width: 50%;
    position: absolute;
    transition: all .1s ease(easeOutQuart);

    &:after,
    &:before {
      content: '';
      position: absolute;
      background: currentColor;
    }

    &:before {
      width: 1px;
    }

    &:after {
      height: 1px;
    }

    &.top {
      top: 0;
      left: 0;

      &:before {
        @include pos(0, auto, 2px, 0);
      }

      &:after {
        @include pos(0, 2px, auto, 0);
      }
    }

    &.bottom {
      bottom: 0;
      right: 0;
      animation-delay: 200ms;

      &:before {
        @include pos(2px, 0, 0, auto);
      }

      &:after {
        @include pos(auto, 0, 0, 2px);
      }
    }

    &.left {
      bottom: 0;
      left: 0;
      animation-delay: 300ms;

      &:before {
        @include pos(2px, auto, 0, 0);
      }

      &:after {
        @include pos(auto, 2px, 0, 0);
      }
    }

    &.right {
      top: 0;
      right: 0;
      animation-delay: 100ms;

      &:before {
        @include pos(0, 0, 2px, auto);
      }

      &:after {
        @include pos(0, 0, auto, 2px);
      }
    }
  }
}

audio {
    display: none;
}
View Compiled
let outline = document.querySelectorAll('.outer-bars');
let outlineBars = document.querySelectorAll('.outer-bars .bar');
let squares = document.querySelectorAll('.squares .line');
let icon = document.querySelectorAll('.icon-close');
let timeline = new TimelineMax({ repeat: -1, repeatDelay: 3 });

timeline
    .delay(1)
    .add('init', 0)
    .add('rotate', .6)
    //.add(flicker(icon), 'init')
    .add(flicker(outline), 'init')
    .add(rotate(icon, -90), 'rotate')
    .add(rotate(outline, 45), 'rotate')
    .to(outlineBars, .2, { height: 0 })
    .from(squares, .2, { height: 0, width: 0 })
    //.to(squares, .05, { opacity: 0, repeat: 3, repeatDelay: .05, ease: SteppedEase.config(2) })
    //.add(flicker(outline))
;


function flicker(element)
{
    // let tween = new TweenMax;
    // return tween.fromTo(element, 1, { opacity: 0}, {opacity: 1});
    let tl = new TimelineMax;
    return tl.from(element, .15,
                   { opacity: 0, repeat: 3, repeatDelay: 0, ease: SteppedEase.config(0) });
}

function rotate(element, direction)
{
    let tl = new TimelineMax;
    return tl.to(element, .5, { rotation: direction, ease: Power2.easeOut });
}

External CSS

This Pen doesn't use any external CSS resources.

External JavaScript

  1. https://cdnjs.cloudflare.com/ajax/libs/gsap/1.14.2/TweenMax.min.js