Originally made for controlling a mindstorms robot through a browser.
A Pen by Dennis Johnsen on CodePen.
Originally made for controlling a mindstorms robot through a browser.
A Pen by Dennis Johnsen on CodePen.
| <div class="control"> | |
| <div class="row"> | |
| <div class="col col--6"> | |
| <a class="control__btn control__btn--up-left" href="#up-left"> | |
| <i class="fa fa-chevron-up"></i> | |
| </a> | |
| </div> | |
| <div class="col col--3"> | |
| <a class="control__btn control__btn--up" href="#up"> | |
| <i class="fa fa-chevron-up"></i> | |
| </a> | |
| </div> | |
| <div class="col col--6"> | |
| <a class="control__btn control__btn--up-right" href="#up-right"> | |
| <i class="fa fa-chevron-up"></i> | |
| </a> | |
| </div> | |
| <div class="col col--2"> | |
| <a class="control__btn control__btn--turn-left" href="#turn-left"> | |
| <i class="fa fa-undo"></i> | |
| </a> | |
| </div> | |
| <div class="col col--4"> | |
| <a class="control__btn control__btn--left" href="#left"> | |
| <i class="fa fa-chevron-left"></i> | |
| </a> | |
| </div> | |
| <div class="col col--3"> | |
| <a class="control__btn control__btn--fire" href="#fire"> | |
| <i class="fa fa-crosshairs"></i> | |
| </a> | |
| </div> | |
| <div class="col col--4"> | |
| <a class="control__btn control__btn--right" href="#right"> | |
| <i class="fa fa-chevron-right"></i> | |
| </a> | |
| </div> | |
| <div class="col col--2"> | |
| <a class="control__btn control__btn--turn-right" href="#turn-right"> | |
| <i class="fa fa-repeat"></i> | |
| </a> | |
| </div> | |
| <div class="col col--6"> | |
| <a class="control__btn control__btn--down-left" href="#down-left"> | |
| <i class="fa fa-chevron-down"></i> | |
| </a> | |
| </div> | |
| <div class="col col--3"> | |
| <a class="control__btn control__btn--down" href="#down"> | |
| <i class="fa fa-chevron-down"></i> | |
| </a> | |
| </div> | |
| <div class="col col--6"> | |
| <a class="control__btn control__btn--down-right" href="#down-right"> | |
| <i class="fa fa-chevron-down"></i> | |
| </a> | |
| </div> | |
| </div> | |
| </div> |
| <script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script> |
| @import "lesshat"; | |
| @btn-color: #95A5A6; | |
| @btn-color--hover: lighten(@btn-color, 5%); | |
| @btn-color--active: darken(@btn-color, 2.5%); | |
| @fire-color: #E74C3C; | |
| @fire-color--hover: lighten(@fire-color, 4%); | |
| @border--color: darken(@btn-color, 5%); | |
| @border--width: .5vw; | |
| @skew--up-down: 35; | |
| @skew--left-right: 5.5; | |
| @skew--turn-spacing: -13%; | |
| .control { | |
| .border-radius(10vw); | |
| box-shadow: 0 3vw 0vw darken(@border--color, 6%); | |
| border: @border--width solid @border--color; | |
| overflow: hidden; | |
| &__btn { | |
| position: absolute; | |
| top: 0; | |
| left: 0; | |
| right: 0; | |
| bottom: 0; | |
| .fa { | |
| position: absolute; | |
| z-index: 5; | |
| color: white; | |
| left: 50%; | |
| top: 50%; | |
| text-align: center; | |
| height: 10vw; | |
| width: 10vw; | |
| margin: -5vw 0 0 -5vw; | |
| font-size: 0; | |
| &:before { | |
| font-size: 5vw; | |
| display: inline-block; | |
| vertical-align: middle; | |
| } | |
| &:after { | |
| content: ''; | |
| display: inline-block; | |
| vertical-align: middle; | |
| height: 100%; | |
| width: 0.001vw; | |
| } | |
| } | |
| &--fire { | |
| @btn--size: -25%; | |
| .border-radius(50%); | |
| .transition(all .1s ease); | |
| .translate3d(0, 0, 0); | |
| box-shadow: 0 1.5vw 0 darken(@fire-color, 15%), 0 3vw 0vw fadeOut(darken(@btn-color, 30%), 60%); | |
| top: @btn--size; | |
| left: @btn--size; | |
| right: @btn--size; | |
| bottom: @btn--size; | |
| z-index: 4; | |
| border: .3vw solid darken(@fire-color, 8%); | |
| background: @fire-color; | |
| &:hover { | |
| border: .3vw solid darken(@fire-color--hover, 5%); | |
| background: @fire-color--hover; | |
| } | |
| &:active { | |
| .translate3d(0, 1vw, 0); | |
| box-shadow: 0 .5vw 0 darken(@fire-color, 15%), 0 1.5vw 0vw fadeOut(darken(@btn-color, 30%), 60%); | |
| } | |
| .fa { | |
| color: mix(@fire-color, white, 30%); | |
| &:before { | |
| font-size: 10vw; | |
| } | |
| } | |
| } | |
| &--up, | |
| &--down { | |
| .btn-color; | |
| &:before, | |
| &:after { | |
| content: ''; | |
| position: absolute; | |
| z-index: 2; | |
| width: 100%; | |
| height: 100%; | |
| } | |
| &:before { | |
| .skew(unit(@skew--up-down, deg)); | |
| } | |
| &:after { | |
| .skew(unit((@skew--up-down * -1), deg)); | |
| } | |
| } | |
| &--up { | |
| &:before { | |
| .btn-border(left); | |
| .transform-origin(right bottom); | |
| } | |
| &:after { | |
| .btn-border(right); | |
| .transform-origin(left bottom); | |
| } | |
| } | |
| &--down { | |
| &:before { | |
| .btn-border(right); | |
| .transform-origin(right top); | |
| } | |
| &:after { | |
| .btn-border(left); | |
| .transform-origin(left top); | |
| } | |
| } | |
| &--turn-left, | |
| &--turn-right, | |
| &--left, | |
| &--right { | |
| .btn-color; | |
| &:before, | |
| &:after { | |
| content: ''; | |
| position: absolute; | |
| z-index: 2; | |
| width: 100%; | |
| height: 65%; | |
| } | |
| &:before { | |
| .skewY(unit(@skew--left-right, deg)); | |
| } | |
| &:after { | |
| .skewY(unit((@skew--left-right * -1), deg)); | |
| } | |
| } | |
| &--left { | |
| &:before { | |
| .btn-border(top); | |
| .btn-border(left); | |
| .transform-origin(right top); | |
| top: 0; | |
| } | |
| &:after { | |
| .btn-border(bottom); | |
| .btn-border(left); | |
| .transform-origin(right bottom); | |
| bottom: 0; | |
| } | |
| } | |
| &--right { | |
| &:before { | |
| .btn-border(bottom); | |
| .btn-border(right); | |
| .transform-origin(left bottom); | |
| bottom: 0; | |
| } | |
| &:after { | |
| .btn-border(top); | |
| .btn-border(right); | |
| .transform-origin(left top); | |
| top: 0; | |
| } | |
| } | |
| &--turn-left { | |
| &:before { | |
| .btn-border(top); | |
| .transform-origin(right top); | |
| top: @skew--turn-spacing; | |
| } | |
| &:after { | |
| .btn-border(bottom); | |
| .transform-origin(right bottom); | |
| bottom: @skew--turn-spacing; | |
| } | |
| } | |
| &--turn-right { | |
| &:before { | |
| .btn-border(bottom); | |
| .transform-origin(left bottom); | |
| bottom: @skew--turn-spacing; | |
| } | |
| &:after { | |
| .btn-border(top); | |
| .transform-origin(left top); | |
| top: @skew--turn-spacing; | |
| } | |
| } | |
| &--up-left, | |
| &--up-right, | |
| &--down-left, | |
| &--down-right { | |
| .btn-color; | |
| } | |
| &--up-left, | |
| &--down-right { | |
| .fa { | |
| .rotate(-45deg); | |
| } | |
| } | |
| &--up-right, | |
| &--down-left { | |
| .fa { | |
| .rotate(45deg); | |
| } | |
| } | |
| } | |
| > .row > .col { | |
| position: relative; | |
| //setting the initial height pr.line | |
| &--3 { | |
| &:before { | |
| padding-top: 100%; | |
| content: ''; | |
| height: 0; | |
| } | |
| } | |
| } | |
| } | |
| .@{row-namespace} { | |
| margin-left: unit((@grid-gutter * -1), px); | |
| display: flex; | |
| flex: 0 1 auto; | |
| flex-direction: row; | |
| flex-wrap: wrap; | |
| > .@{col-namespace} { | |
| padding-left: unit(@grid-gutter, px);; | |
| display: flex; | |
| flex: 0 1 auto; | |
| flex-direction: column; | |
| flex-grow: 0; | |
| flex-shrink: 0; | |
| } | |
| .for(@grid-columns); .-each(@grid-column) { | |
| & > .@{col-namespace}--@{grid-column} { | |
| .col-declarations; | |
| } | |
| } | |
| } | |
| body { | |
| padding: 24px; | |
| } | |
| *, | |
| *:before, | |
| *:after { | |
| .box-sizing(border-box); | |
| } | |
| /* ------------------------------------- | |
| Config | |
| -------------------------------------- */ | |
| /* How many columns do you want in the grid? | |
| */ | |
| @grid-columns: 15; | |
| /* Change the gutter size between the grid columns (in pixels) | |
| */ | |
| @grid-gutter: 0; | |
| /* Responsive breakpoints | |
| */ | |
| @breakpoints: 0; //0 = Not responsive | |
| @breakpoints-sizes: 480, 768, 1024, 1280, 1440, 1680, 1920; //In pixels | |
| @row-namespace: row; | |
| @col-namespace: col; | |
| /* ------------------------------------- | |
| Mixins | |
| -------------------------------------- */ | |
| .for(@i, @n) {.-each(@i)} | |
| .for(@n) when (isnumber(@n)) {.for(1, @n)} | |
| .for(@i, @n) when not (@i = @n) { | |
| .for((@i + (@n - @i) / abs(@n - @i)), @n); | |
| } | |
| .for(@array) when (default()) {.for-impl_(length(@array))} | |
| .for-impl_(@i) when (@i > 1) {.for-impl_((@i - 1))} | |
| .for-impl_(@i) when (@i > 0) {.-each(extract(@array, @i))} | |
| .col-declarations() { | |
| flex-basis: (@grid-column / @grid-columns * 100%); | |
| } | |
| .btn-color(@initial: @btn-color, @hover: @btn-color--hover, @active: @btn-color--active) { | |
| .transition(all .8s ease); | |
| background: @initial; | |
| &:before, | |
| &:after { | |
| .transition(all .8s ease); | |
| background: @initial; | |
| } | |
| &:hover { | |
| .transition(all .1s ease); | |
| background: @hover; | |
| &:before, | |
| &:after { | |
| .transition(all .1s ease); | |
| background: @hover; | |
| } | |
| } | |
| &:active { | |
| .transition(all .05s ease); | |
| background: @active; | |
| &:before, | |
| &:after { | |
| .transition(all .05s ease); | |
| background: @active; | |
| } | |
| } | |
| } | |
| .btn-border(@direction) { | |
| & when (length(@direction) > 0) { | |
| border-@{direction}: @border--width solid @border--color; | |
| } | |
| & when (@direction = all) { | |
| border: @border--width solid @border--color; | |
| } | |
| } |