<select data-menu>
    <option>Easy</option>
    <option selected>Normal</option>
    <option>Hard</option>
    <option>Expert</option>
</select>

<!-- dribbble -->
<a class="dribbble" href="https://dribbble.com/shots/7018412-Dropdown-menu-interaction" target="_blank"><img src="https://cdn.dribbble.com/assets/dribbble-ball-mark-2bd45f09c2fb58dbbfb44766d5d1d07c5a12972d602ef8b32204d28fa3dda554.svg" alt=""></a>
.select-menu {
    --background: #242836;
    --text: #fff;
    --icon: #fff;
    --icon-active: #3F4656;
    --list: #1C212E;
    --list-text: rgba(255, 255, 255, .2);
    --list-text-hover: rgba(255, 255, 255, .5);
    position: relative;
    z-index: 1;
    font-weight: 500;
    font-size: 14px;
    line-height: 25px;
    select,
    .button {
        font-family: inherit;
        margin: 0;
        border: 0;
        text-align: left;
        text-transform: none;
        -webkit-appearance: none;
    }
    select {
        pointer-events: none;
        user-select: none;
        opacity: 0;
        padding: 8px 36px 8px 12px;
        visibility: hidden;
        font-weight: 500;
        font-size: 14px;
        line-height: 25px;
    }
    ul {
        margin: 0;
        padding: 0;
        list-style: none;
        position: absolute;
        left: 0;
        top: 0;
        right: 0;
        transform: translateY(var(--t));
        transition: opacity .3s ease, transform .4s cubic-bezier(.2, .9, .4, 1.1);
        li {
            padding: 8px 36px 8px 12px;
            cursor: pointer;
        }
    }
    & > ul {
        background: var(--list);
        color: var(--list-text);
        border-radius: 6px;
        li {
            transition: color .3s ease;
            &:hover {
                color: var(--list-text-hover);
            }
        }
    }
    .button {
        position: absolute;
        left: 0;
        top: 0;
        right: 0;
        bottom: 0;
        padding: 0;
        z-index: 1;
        width: 100%;
        display: block;
        overflow: hidden;
        border-radius: 6px;
        color: var(--text);
        background: var(--background);
        em {
            --r: 45deg;
            display: block;
            position: absolute;
            right: 12px;
            top: 0;
            width: 7px;
            height: 7px;
            margin-top: 13px;
            -webkit-backface-visibility: hidden;
            &:before,
            &:after {
                --o: .4;
                content: '';
                width: 7px;
                height: 7px;
                opacity: var(--o);
                display: block;
                position: relative;
                transition: opacity .2s ease;
                transform: rotate(var(--r)) scale(.75);
            }
            &:before {
                border-left: 2px solid var(--icon);
                border-top: 2px solid var(--icon);
                top: 1px;
            }
            &:after {
                border-right: 2px solid var(--icon);
                border-bottom: 2px solid var(--icon);
                bottom: 1px;
            }
        }
    }
    &:not(.open) {
        & > ul {
            opacity: 0;
            pointer-events: none;
        }
    }
    &.open {
        &.tilt-up {
            animation: tilt-up .4s linear forwards;
            .button {
                em {
                    &:before {
                        --o: 1;
                    }
                }
            }
        }
        &.tilt-down {
            animation: tilt-down .4s linear forwards;
            .button {
                em {
                    &:after {
                        --o: 1;
                    }
                }
            }
        }
    }
}

@keyframes tilt-up {
    40%,
    60% {
        transform: perspective(500px) rotateX(8deg);
    }
}

@keyframes tilt-down {
    40%,
    60% {
        transform: perspective(500px) rotateX(-8deg);
    }
}

html {
    box-sizing: border-box;
    -webkit-font-smoothing: antialiased;
}

* {
    box-sizing: inherit;
    &:before,
    &:after {
        box-sizing: inherit;
    }
}

// Center & dribbble
body {
    min-height: 100vh;
    display: flex;
    justify-content: center;
    align-items: center;
    font-family: 'Roboto', Arial;
    background: #171C28;
    .dribbble {
        position: fixed;
        display: block;
        right: 20px;
        bottom: 20px;
        img {
            display: block;
            height: 28px;
        }
    }
}
View Compiled
$('select[data-menu]').each(function() {

    let select = $(this),
        options = select.find('option'),
        menu = $('<div />').addClass('select-menu'),
        button = $('<div />').addClass('button'),
        list = $('<ul />'),
        arrow = $('<em />').prependTo(button);

    options.each(function(i) {
        let option = $(this);
        list.append($('<li />').text(option.text()));
    });

    menu.css('--t', select.find(':selected').index() * -41 + 'px');

    select.wrap(menu);

    button.append(list).insertAfter(select);

    list.clone().insertAfter(button);

});

$(document).on('click', '.select-menu', function(e) {

    let menu = $(this);

    if(!menu.hasClass('open')) {
        menu.addClass('open');
    }

});

$(document).on('click', '.select-menu > ul > li', function(e) {

    let li = $(this),
        menu = li.parent().parent(),
        select = menu.children('select'),
        selected = select.find('option:selected'),
        index = li.index();

    menu.css('--t', index * -41 + 'px');
    selected.attr('selected', false);
    select.find('option').eq(index).attr('selected', true);

    menu.addClass(index > selected.index() ? 'tilt-down' : 'tilt-up');

    setTimeout(() => {
        menu.removeClass('open tilt-up tilt-down');
    }, 500);

});

$(document).click(e => {
    e.stopPropagation();
    if($('.select-menu').has(e.target).length === 0) {
        $('.select-menu').removeClass('open');
    }
})

External CSS

  1. https://fonts.googleapis.com/css?family=Roboto:400,500,700&amp;display=swap

External JavaScript

  1. https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min.js