Angus Grant
Angus Grant

Reputation: 312

bootstrap 3 collapse menu sliding down too far then jumping up

Hi I am creating a navigation menu using bootstrap's "collapse" javascript component plugin.

The menu height will vary depending on how many menu items are listed so I don't want to set a fixed height.

If possible i want to keep the slide down collapse effect but, i want to resolve the fact that the menu appears to over slide the height of its contents and then jump up to the correct height. Please click on the burger menu to see the issue that i am experiencing.

https://codepen.io/angusgrant/pen/djoXJj

html:

<div class="main-navigation-menu">
<button type="button" class="main-navigation-menu__button" data-toggle="collapse" data-target="#collapse-main-nav" aria-haspopup="true" aria-expanded="false">
                            <span class="icon-bar bar-one"></span>
                            <span class="icon-bar bar-two"></span>
                            <span class="icon-bar bar-three"></span>
                          </button>
                       <div class="collapse main-navigation-menu__dropdown 
                        main-navigation-dropdown" id="collapse-main-nav">
                        <ul class="main-navigation-dropdown__menu" >
                            <li class="main-navigation-dropdown__item">
                                <a href="#" class="main-navigation-dropdown__link">link 1</a>
                                <span class="main-navigation-dropdown__toggle-expand js-link-toggle-main-sub-menu">
                                    <span class="glyphicon glyphicon-chevron-down main-navigation-dropdown__chevron js-toggle-main-menu-item"></span>
                                </span>
                                <ul class="main-navigation-dropdown__submenu js-toggle-display-sub-menu">
                                    <li class="main-navigation-dropdown__submenu-item">
                                        <a href="#" class="main-navigation-dropdown__submenu-link ">sub menu item 1</a>
                                    </li>
                                    <li class="main-navigation-dropdown__submenu-item">
                                        <a href="#" class="main-navigation-dropdown__submenu-link ">sub menu item 2</a>
                                    </li>
                                    <li class="main-navigation-dropdown__submenu-item" >
                                        <a href="#" class="main-navigation-dropdown__submenu-link ">sub menu item 3</a>
                                    </li>
                                    <li class="main-navigation-dropdown__submenu-item">
                                        <a href="#" class="main-navigation-dropdown__submenu-link ">sub menu item 4</a>
                                    </li>
                                    <li class="main-navigation-dropdown__submenu-item">
                                        <a href="#" class="main-navigation-dropdown__submenu-link ">sub menu item 5</a>
                                    </li>
                                </ul>
                            </li>
                            <li class="main-navigation-dropdown__item">
                                <a href="#" class="main-navigation-dropdown__link">link 2</a>
                                <span class="main-navigation-dropdown__toggle-expand js-link-toggle-main-sub-menu">
                                    <span class="glyphicon glyphicon-chevron-down main-navigation-dropdown__chevron"></span>
                                </span>
                                <ul class="main-navigation-dropdown__submenu js-toggle-display-sub-menu">
                                    <li class="main-navigation-dropdown__submenu-item">
                                        <a href="#" class="main-navigation-dropdown__submenu-link ">sub menu item 1</a>
                                    </li>
                                    <li class="main-navigation-dropdown__submenu-item">
                                        <a href="#" class="main-navigation-dropdown__submenu-link ">sub menu item 2</a>
                                    </li>
                                    <li class="main-navigation-dropdown__submenu-item" >
                                        <a href="#" class="main-navigation-dropdown__submenu-link ">sub menu item 3</a>
                                    </li>
                                    <li class="main-navigation-dropdown__submenu-item">
                                        <a href="#" class="main-navigation-dropdown__submenu-link ">sub menu item 4</a>
                                    </li>
                                    <li class="main-navigation-dropdown__submenu-item">
                                        <a href="#" class="main-navigation-dropdown__submenu-link ">sub menu item 5</a>
                                    </li>
                                </ul>
                            </li>
                            <li class="main-navigation-dropdown__item">
                                <a href="#" class="main-navigation-dropdown__link">link 3</a>
                                <span class="main-navigation-dropdown__toggle-expand js-link-toggle-main-sub-menu">
                                    <span class="glyphicon glyphicon-chevron-down main-navigation-dropdown__chevron"></span>
                                </span>
                                 <ul class="main-navigation-dropdown__submenu js-toggle-display-sub-menu">
                                    <li class="main-navigation-dropdown__submenu-item">
                                        <a href="#" class="main-navigation-dropdown__submenu-link ">sub menu item 1</a>
                                    </li>
                                    <li class="main-navigation-dropdown__submenu-item">
                                        <a href="#" class="main-navigation-dropdown__submenu-link ">sub menu item 2</a>
                                    </li>
                                    <li class="main-navigation-dropdown__submenu-item" >
                                        <a href="#" class="main-navigation-dropdown__submenu-link ">sub menu item 3</a>
                                    </li>
                                    <li class="main-navigation-dropdown__submenu-item">
                                        <a href="#" class="main-navigation-dropdown__submenu-link ">sub menu item 4</a>
                                    </li>
                                    <li class="main-navigation-dropdown__submenu-item">
                                        <a href="#" class="main-navigation-dropdown__submenu-link ">sub menu item 5</a>
                                    </li>
                                </ul>
                            </li>
                            <li class="main-navigation-dropdown__item">
                                <a href="#" class="main-navigation-dropdown__link">link 4</a>
                                <span class="main-navigation-dropdown__toggle-expand js-link-toggle-main-sub-menu">
                                    <span class="glyphicon glyphicon-chevron-down main-navigation-dropdown__chevron"></span>
                                </span>
                                  <ul class="main-navigation-dropdown__submenu js-toggle-display-sub-menu">
                                    <li class="main-navigation-dropdown__submenu-item">
                                        <a href="#" class="main-navigation-dropdown__submenu-link ">sub menu item 1</a>
                                    </li>
                                    <li class="main-navigation-dropdown__submenu-item">
                                        <a href="#" class="main-navigation-dropdown__submenu-link ">sub menu item 2</a>
                                    </li>
                                    <li class="main-navigation-dropdown__submenu-item" >
                                        <a href="#" class="main-navigation-dropdown__submenu-link ">sub menu item 3</a>
                                    </li>
                                    <li class="main-navigation-dropdown__submenu-item">
                                        <a href="#" class="main-navigation-dropdown__submenu-link ">sub menu item 4</a>
                                    </li>
                                    <li class="main-navigation-dropdown__submenu-item">
                                        <a href="#" class="main-navigation-dropdown__submenu-link ">sub menu item 5</a>
                                    </li>
                                </ul>
                            </li>
                            <li class="main-navigation-dropdown__item">
                                <a href="#" class="main-navigation-dropdown__link">link 5</a>
                                <span class="main-navigation-dropdown__toggle-expand js-link-toggle-main-sub-menu">
                                    <span class="glyphicon glyphicon-chevron-down main-navigation-dropdown__chevron"></span>
                                </span>
                                 <ul class="main-navigation-dropdown__submenu js-toggle-display-sub-menu">
                                    <li class="main-navigation-dropdown__submenu-item">
                                        <a href="#" class="main-navigation-dropdown__submenu-link ">sub menu item 1</a>
                                    </li>
                                    <li class="main-navigation-dropdown__submenu-item">
                                        <a href="#" class="main-navigation-dropdown__submenu-link ">sub menu item 2</a>
                                    </li>
                                    <li class="main-navigation-dropdown__submenu-item" >
                                        <a href="#" class="main-navigation-dropdown__submenu-link ">sub menu item 3</a>
                                    </li>
                                    <li class="main-navigation-dropdown__submenu-item">
                                        <a href="#" class="main-navigation-dropdown__submenu-link ">sub menu item 4</a>
                                    </li>
                                    <li class="main-navigation-dropdown__submenu-item">
                                        <a href="#" class="main-navigation-dropdown__submenu-link ">sub menu item 5</a>
                                    </li>
                                </ul>
                            </li>
                        </ul>
                        </div>
                </li>
</div>

less css:

@link-color: #333;
.main-navigation-menu {
    margin-top: 7px;
        margin-left: 5px;
      position: relative;
     .main-navigation-menu__button {
        padding: 2px 8px;
        border: none;
        display: block;
        background-color: #fff;
              &:focus {
                  outline: none;
              }
            span.icon-bar {
                background: @link-color;
                margin: 1px 0 7px;
                display: block;
                width: 28px;
                height: 2px;
                border-radius: 1px;
                }
        }
     .main-navigation-menu__button[aria-expanded="true"] {
        span.icon-bar {
            background: @link-color;
            width: 28px;
            margin: 5px 0;
            -webkit-transition: all .3s ease;
            -moz-transition: all .3s ease;
            -ms-transition: all .3s ease;
            transition: all .3s ease;
        }
        span.icon-bar.bar-one {
            -webkit-transform: rotate(45deg);
            -moz-transform: rotate(45deg);
            -ms-transform: rotate(45deg);
            transform: rotate(45deg);
            position: relative;
            top: 6px;
        }
        span.icon-bar.bar-two {
            display: none;
        }
        span.icon-bar.bar-three {
            -webkit-transform: rotate(-45deg);
            -moz-transform: rotate(-45deg);
            -ms-transform: rotate(-45deg);
            transform: rotate(-45deg);
            position: relative;
        }

    }
    .main-navigation-menu__dropdown {
        position: absolute;
        top:34px;
        left:0;

    }
}

.main-navigation-dropdown {
    min-width: 450px;
    max-width: 600px;
    width:auto;
    @media (max-width: 600px) {
        min-width: none;
        max-width: none;
        width: 100vw;
    }
    padding: 20px;
    -webkit-box-shadow: 0px 0px 7px 0px rgba(51,51,51,1);
    -moz-box-shadow: 0px 0px 7px 0px rgba(51,51,51,1);
    box-shadow: 0px 0px 7px 0px rgba(51,51,51,1);
    background-color: #fff;
        .main-navigation-dropdown__menu,
        .main-navigation-dropdown__submenu {
            padding-left:0;
            list-style: none;
        }
        .main-navigation-dropdown__item {
            border-bottom: 1px solid @link-color;
            position:relative;
            clear: both;
            float: left;
            width: 100%;
            &:last-child {
                border: none;
            }
        }
        .main-navigation-dropdown__link {
            padding: 16px 22px 16px 0; 
            display: block;
            white-space: nowrap;
        }
        .main-navigation-dropdown__toggle-expand {
            position:absolute;
            right: 0;
            width:40%;
            text-align:right;
            cursor: pointer;
            top: 0px;
        }
        .main-navigation-dropdown__chevron {
            line-height: 56px;
            -webkit-transition-duration: 0.5s;
            -moz-transition-duration: 0.5s;
            -o-transition-duration: 0.5s;
            transition-duration: 0.5s;
            -webkit-transition-property: -webkit-transform;
            -moz-transition-property: -moz-transform;
            -o-transition-property: -o-transform;
            transition-property: transform;
            outline: 0;
                 &:focus, &:active, &:hover {
                color: red;
            }
            &.is-active {
                -webkit-transform: rotate(180deg);
                -moz-transform: rotate(180deg);
                -ms-transform: rotate(180deg);
                -o-transform: rotate(180deg);
                transform: rotate(180deg);
           }
         }
        .main-navigation-dropdown__submenu {
            display:none;
        }

        .main-navigation-dropdown__submenu-item {
            width:50%;
            float: left;
        }

        .main-navigation-dropdown__submenu-link  {
            width:100%;
            text-align:left;
            display:block;
            padding: 10px 0;
            font-size: 14px;
            &:first-child {
                padding-top: 0px;
            }
            &:last-child {
                padding-bottom: 15px;
            }
        }



 }

Upvotes: 0

Views: 402

Answers (1)

WizardCoder
WizardCoder

Reputation: 3461

The issue is that the #collapse-main-nav element had padding on it. I am not certain but it is likely that the bootstrap Javascript is trying to get the innerHeight, which doesn't include the padding so it expands to the wrong height. At the end of the transition the inline height is removed and the dropdown reverts to it's actual height, which was causing the jump. All I did was remove the padding from #collapse-main-nav and added margin to main-navigation-dropdown__menu instead.

There was still a bit of jumping which was being caused by the floated li causing the .main-navigation-dropdown__menu ul to collapse, which likely was effecting the javascript ability to get the actual height of the dropdown as well. To fix that I just added a pseudo element :after the .main-navigation-dropdown__menu ul and applied clear:both and display:block.

https://codepen.io/anijack/pen/ejNreK

Upvotes: 1

Related Questions