Skip to content

Instantly share code, notes, and snippets.

@MedRedha
Created June 6, 2020 10:39
Show Gist options
  • Save MedRedha/fbcbfad4778c10673756704d4c366fcf to your computer and use it in GitHub Desktop.
Save MedRedha/fbcbfad4778c10673756704d4c366fcf to your computer and use it in GitHub Desktop.
Offcanvas sidebar menu with a twist
<div class="page">
<span class="menu_toggle">
<i class="menu_open fa fa-bars fa-lg"></i>
<i class="menu_close fa fa-times fa-lg"></i>
</span>
<ul class="menu_items">
<li><a href="#"><i class="icon fa fa-signal fa-2x"></i> Moar</a></li>
<li><a href="#"><i class="icon fa fa-coffee fa-2x"></i> Coffee</a></li>
<li><a href="#"><i class="icon fa fa-heart fa-2x"></i> Please</a></li>
</ul>
<main class="content">
<div class="content_inner">
<h1>The mysterious red button of doom</h1>
<p>Do <strong>not</strong> push that big, red button in the corner. People will die. You have been warned. Do&hellip; not do it.</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Vel dolorem, ducimus laudantium, earum eos natus sint voluptatum dolores fuga quibusdam consectetur dicta. Laudantium enim inventore iusto ducimus est velit aperiam tempora quibusdam id dolore natus perferendis, debitis distinctio optio repellendus, repellat molestias delectus harum eius, reiciendis dicta ipsum architecto! Eligendi expedita in beatae, placeat unde voluptatibus voluptates consectetur explicabo laudantium, officiis ad nihil. Beatae similique voluptate sequi voluptatem delectus iure in omnis, fuga ipsam nulla ipsum architecto, iste debitis nisi labore quisquam odio accusantium corporis sint perspiciatis. Excepturi earum nobis soluta, doloremque nihil dolorum illum quaerat magnam nemo non sed!</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Vel dolorem, ducimus laudantium, earum eos natus sint voluptatum dolores fuga quibusdam consectetur dicta. Laudantium enim inventore iusto ducimus est velit aperiam tempora quibusdam id dolore natus perferendis, debitis distinctio optio repellendus, repellat molestias delectus harum eius, reiciendis dicta ipsum architecto! Eligendi expedita in beatae, placeat unde voluptatibus voluptates consectetur explicabo laudantium, officiis ad nihil. Beatae similique voluptate sequi voluptatem delectus iure in omnis, fuga ipsam nulla ipsum architecto, iste debitis nisi labore quisquam odio accusantium corporis sint perspiciatis. Excepturi earum nobis soluta, doloremque nihil dolorum illum quaerat magnam nemo non sed!</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Vel dolorem, ducimus laudantium, earum eos natus sint voluptatum dolores fuga quibusdam consectetur dicta. Laudantium enim inventore iusto ducimus est velit aperiam tempora quibusdam id dolore natus perferendis, debitis distinctio optio repellendus, repellat molestias delectus harum eius, reiciendis dicta ipsum architecto! Eligendi expedita in beatae, placeat unde voluptatibus voluptates consectetur explicabo laudantium, officiis ad nihil. Beatae similique voluptate sequi voluptatem delectus iure in omnis, fuga ipsam nulla ipsum architecto, iste debitis nisi labore quisquam odio accusantium corporis sint perspiciatis. Excepturi earum nobis soluta, doloremque nihil dolorum illum quaerat magnam nemo non sed!</p>
</div>
</main>
</div>

Offcanvas sidebar menu with a twist

Idea and inspiration: https://dribbble.com/shots/1719325-GIF-Sticker-App

Developed in Chrome, not tested elsewhere, not production ready.

Known issue: content overflow is cut when rotated. Tried different pure-CSS solutions and none worked for me. Will give credit for a non-JS solution.

Menu items will flow out of container given window height below roughly 700px. Solved by media queries, can't be bothered to implement it here.

A Pen by Devilish Alchemist on CodePen.

License.

// elements
var $page = $('.page');
$('.menu_toggle').on('click', function(){
$page.toggleClass('shazam');
});
$('.content').on('click', function(){
$page.removeClass('shazam');
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
$red: #F37272;
$brown: #584E4A;
$whitey: #f0f0f0;
$snap: cubic-bezier(1.000, 0.005, 0.240, 1.000);
$bounce: cubic-bezier(0.175, 0.885, 0.320, 1.275);
* {
box-sizing: border-box;
}
html,
body {
height: 100%;
overflow: hidden;
}
.page {
height: 100%;
background-color: $brown;
}
.content {
// essential
height: 200%; // make higher or you'll see background when rotated
transform-origin: top left;
transition: transform .7s $snap;
// styling
background-color: $whitey;
}
.content_inner {
// essential
height: 50%; // compensate for higher .content
overflow-y: auto; // set expected overflow
// styling
padding: 50px 20%;
}
/* basically all styling from now on */
.menu_toggle {
z-index: 900;
position: fixed;
top: 0;
left: 0;
display: block;
cursor: pointer;
width: 100px;
height: 80px;
background-color: $red;
border-bottom-right-radius: 100%;
&:active {
i {
opacity: 0.8
}
}
i {
color: $whitey;
}
.menu_open,
.menu_close {
position: absolute;
top: 50%;
left: 50%;
margin-top: -15px;
margin-left: -12px;
transition: transform .7s $snap;
}
.menu_open {
transform-origin: -100px -100px;
}
.menu_close {
transform: rotate(20deg);
transform-origin: -100px -160px;
}
}
.menu_items {
position: fixed;
bottom: 0;
left: 50px;
list-style-type: none;
margin: 0;
padding: 0;
li {
height: 60px;
margin-bottom: 30px;
transform: translateX(-300px);
transition: transform .7s 0s $snap;
&:nth-child(2){
margin-left: 40px;
}
&:nth-child(3){
margin-left: 80px;
}
}
a {
display: block;
text-decoration: none;
text-transform: uppercase;
letter-spacing: 2px;
color: darken($whitey, 30%);
transition: color .2s;
.icon {
position: relative;
display: inline-block;
margin-right: 25px;
color: $whitey;
&:after {
position: absolute;
top: 50%;
left: 50%;
content: '';
display: block;
width: 60px;
height: 60px;
margin-left: -33px;
margin-top: -32px;
border-radius: 100%;
border: 2px solid $whitey;
transition: border-color .2s;
}
}
&:hover {
color: $whitey;
.icon {
&:after {
border-color: $red;
}
}
}
&:active {
.icon {
color: $red;
}
}
}
}
/* Let's open up the menu */
.shazam {
.content {
transform: rotate(-30deg);
}
// this will show hidden content overflow when rotated,
// but will result in a jump, if you've already scrolled down the content
// plus, you will lose your current reading position
// fixable with JS, not gonna bother
/*.content_inner {
height: 100%;
}*/
.menu_open {
transform: rotate(-20deg);
}
.menu_close {
transform: rotate(0);
}
.menu_items {
li {
transform: translateX(0);
transition: transform .35s .45s $bounce;
&:nth-child(2){
transition-delay: .47s;
}
&:nth-child(3){
transition-delay: .48s;
}
}
}
}
// misc
h1 {
padding-bottom: 15px;
border-bottom: 1px solid #ddd;
}
body {
color: $brown;
}
<link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.2.0/css/font-awesome.min.css" rel="stylesheet" />
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment