Stripe.com style dropdown, that measures the dropdown content size, and makes a backdrop follower accordingly.
A Pen by Rune Sejer Hoffmann on CodePen.
Stripe.com style dropdown, that measures the dropdown content size, and makes a backdrop follower accordingly.
A Pen by Rune Sejer Hoffmann on CodePen.
| .content | |
| nav.navigation | |
| div.navigation__backdrop | |
| div.navigation__container | |
| ul.navigation__list | |
| li.navigation__item Home | |
| .navigation__item-content | |
| span.fontelico-emo-coffee | |
| p This menu is aware of it's own content | |
| p ... Kinda the JS measures the content and | |
| p makes a backdrop accordingly | |
| li.navigation__item Portfolio | |
| .navigation__item-content | |
| span.fontelico-emo-thumbsup | |
| p Have you ever visited stripe.com? | |
| p There you can see same type, just full fledged | |
| li.navigation__item Services | |
| .navigation__item-content | |
| span.fontelico-emo-beer | |
| p Just pop your content into this menu, and let the JS handle the rest. | |
| p Feel free to use it on your own project | |
| p Have a look at my other pens | |
| a(class='navigation__item-button' href='https://codepen.io/RSH87/' target='_blank') here | |
| .content__main | |
| h2.content__main-headline Content aware dropdown | |
| h6.content__main-signoff By RSH87 |
| class sizeable_dropdown { | |
| constructor(){ | |
| this.x; | |
| this.nav_items = document.querySelectorAll('.navigation__item'); | |
| this.backdrop = document.querySelector('.navigation__backdrop'); | |
| this.nav_items.forEach(trigger => trigger.addEventListener('mouseenter', cn => this.handle_enter(cn))); | |
| this.nav_items.forEach(trigger => trigger.addEventListener('mouseleave', cn => this.handle_leave(cn))); | |
| } | |
| handle_enter(e) { | |
| e.target.classList.add('navigation__item-enter'); | |
| setTimeout(() => e.target.classList.add('navigation__item-active'),100); | |
| let item_content = e.target.querySelector(".navigation__item-content"); | |
| let w = item_content.offsetWidth; | |
| let h = item_content.offsetHeight; | |
| this.x = e.target.offsetLeft + e.target.offsetWidth / 2 - w / 2; | |
| this.handle_backdrop(w, h); | |
| } | |
| handle_backdrop(w, h) { | |
| setTimeout(() => this.backdrop.classList.add('navigation__backdrop_active'),100); | |
| Object.assign(this.backdrop.style, { | |
| transform : "translateX(" + this.x +"px)", | |
| height : h + "px", | |
| width : w + "px" | |
| }); | |
| } | |
| handle_leave(e) { | |
| e.target.classList.remove('navigation__item-enter', 'navigation__item-active'); | |
| setTimeout(() => this.backdrop.classList.remove('navigation__backdrop_active'),100); | |
| } | |
| } | |
| new sizeable_dropdown(); |
| @import url(http://weloveiconfonts.com/api/?family=fontelico); | |
| //Setup | |
| $font-color-primary: #ffffff; | |
| $font-color-secondary: rgba(0, 0, 0, 0.6); | |
| $color-primary: #1f0743; | |
| $color-secondary: #58E1E9; | |
| $t: .3s cubic-bezier(0.22, 0.61, 0.36, 1); | |
| [class*="fontelico-"]:before { | |
| font-family: 'fontelico', sans-serif; | |
| color: $color-secondary; | |
| font-size: 28px; | |
| opacity: .8; | |
| } | |
| @mixin triangle($color) { | |
| &:before{ | |
| content: ''; | |
| position: absolute; | |
| top: -8px; | |
| left: 0; | |
| right: 0; | |
| margin: auto; | |
| background: $color; | |
| height: 20px; | |
| width: 20px; | |
| border-radius: 3px; | |
| transform: rotate(45deg); | |
| } | |
| } | |
| *{ | |
| -webkit-font-smoothing: antialiased !important; | |
| text-shadow: 1px 1px 1px rgba(0,0,0,0.004); | |
| } | |
| body{ | |
| background-color: $color-primary; | |
| background-image: url("data:image/svg+xml,%3Csvg width='250' height='150' viewBox='0 0 52 26' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='none' fill-rule='evenodd'%3E%3Cg fill='%237352a7' fill-opacity='0.10'%3E%3Cpath d='M10 10c0-2.21-1.79-4-4-4-3.314 0-6-2.686-6-6h2c0 2.21 1.79 4 4 4 3.314 0 6 2.686 6 6 0 2.21 1.79 4 4 4 3.314 0 6 2.686 6 6 0 2.21 1.79 4 4 4v2c-3.314 0-6-2.686-6-6 0-2.21-1.79-4-4-4-3.314 0-6-2.686-6-6zm25.464-1.95l8.486 8.486-1.414 1.414-8.486-8.486 1.414-1.414z' /%3E%3C/g%3E%3C/g%3E%3C/svg%3E"); | |
| font-family: 'Nunito', sans-serif; | |
| height: 100vh; | |
| display: flex; | |
| box-sizing: border-box; | |
| overflow: hidden; | |
| } | |
| .content{ | |
| max-width: 1070px; | |
| margin-left: auto; | |
| margin-right: auto; | |
| } | |
| //Nav must have starts here | |
| .navigation{ | |
| height: 70px; | |
| &__backdrop{ | |
| background: #f8f8f8; | |
| position: absolute; | |
| top: 90px; | |
| left: 0; | |
| right: 0; | |
| opacity: 0; | |
| border-radius: 3px; | |
| z-index: 0; | |
| @include triangle(#f8f8f8); | |
| } | |
| &__backdrop_active{ | |
| opacity: 1; | |
| transition: all $t, opacity $t; | |
| } | |
| &__container{ | |
| max-width: 1040px; | |
| margin-left: auto; | |
| margin-right: auto; | |
| } | |
| &__list{ | |
| display: flex; | |
| justify-content: center; | |
| align-items: center; | |
| } | |
| &__item{ | |
| position: relative; | |
| list-style: none; | |
| padding: 40px; | |
| display: flex; | |
| justify-content: center; | |
| cursor: pointer; | |
| font-weight: 200; | |
| font-size: 20px; | |
| color: $font-color-primary; | |
| } | |
| &__item-content{ | |
| position: absolute; | |
| padding: 40px; | |
| font-size: 14px; | |
| top: 80px; | |
| left: 50%; | |
| color: $font-color-secondary; | |
| transform:translateX(-50%); | |
| text-align: center; | |
| opacity: 0; | |
| transition: opacity $t; | |
| display: none; | |
| } | |
| &__item-button{ | |
| padding: 12px 35px 12px 35px; | |
| margin-top: 15px; | |
| display: inline-block; | |
| border-radius: 50px; | |
| background: $color-secondary; | |
| color: #fff; | |
| text-decoration: none; | |
| } | |
| &__item-enter{ | |
| .navigation__item-content{ | |
| display: block; | |
| } | |
| } | |
| &__item-active{ | |
| .navigation__item-content{ | |
| opacity: 1; | |
| } | |
| } | |
| } | |
| //Just prettyfying things here | |
| .content{ | |
| flex-grow: 1; | |
| display: flex; | |
| flex-direction: column; | |
| &__main{ | |
| display: flex; | |
| flex-direction: column; | |
| flex-grow: 1; | |
| align-items: center; | |
| justify-content: center; | |
| } | |
| &__main-headline{ | |
| font-size: calc(2vw + 26px); | |
| color: $color-secondary; | |
| align-self: center; | |
| font-weight: bold; | |
| } | |
| &__main-signoff{ | |
| margin-top: 10px; | |
| font-size: 12px; | |
| color: $font-color-primary; | |
| } | |
| } | |
| //Faking some content here | |
| p{ | |
| min-width: 150px; | |
| margin-top: 10px; | |
| white-space: nowrap; | |
| } |