Search code examples
javascripttwitter-bootstrapdropdownbootstrap-5popper.js

How can I add animation to Bootstrap dropdowns?


How can I add animation to the dropdown? I assume by modifying popperConfig, but how?

At the moment dropdown-menu has a generated inline style, e.g. position: absolute; inset: 0px auto auto 0px; margin: 0px; transform: translate3d(0px, 40px, 0px);

Of course I can just add transition: translate .3s ease to it, but what if I want to change the direction or something more complex?


Solution

  • In the current example, the dm-example will be the dropdown menu that shows up.
    HTML will not differ much from its Bootstrap5 examples:

        <div class="dropdown">
            <button class="btn btn-secondary dropdown-toggle" type="button" id="dropdownMenuButton1" data-bs-toggle="dropdown" aria-expanded="false">
              Dropdown button
            </button>
            <ul id="dm-example" class="dropdown-menu " aria-labelledby="dropdownMenuButton1 ">
                <li><a class="dropdown-item " href="# ">Action</a></li>
                <li><a class="dropdown-item " href="# ">Another action</a></li>
                <li><a class="dropdown-item " href="# ">Something else here</a></li>
            </ul>
        </div>
    

    For CSS animation rules handling:
    #dm-example.show - describes initial styles for the block;
    #dm-example.show .dropdown-item - describes initial styles for inner items;
    dm-animation - is the animation on block;
    item-animation - is the animation on items.

        <!-- Animate dropdown -->
         <style>
            #dm-example.show {
                position: fixed;
                animation-name: dm-animation;
                animation-duration: 2s;
            }
            
            #dm-example.show .dropdown-item {
                margin-bottom: 0;
                animation-name: item-animation;
                animation-duration: 2s;
            }
            
            @keyframes dm-animation {
                0% {
                    margin-top: 0px;
                }
                50% {
                    margin-top: 25px;
                }
                75% {
                    margin-top: 5px;
                }
                100% {
                    margin-top: 0px;
                }
            }
            
            @keyframes item-animation {
                0% {
                    margin-bottom: 0px;
                }
                50% {
                    margin-bottom: 25px;
                }
                75% {
                    margin-bottom: 5px;
                }
                100% {
                    margin-bottom: 0px;
                }
            }
        </style>