Just a little experiment with pseudo elements. Semantic HTML is maintained. No boilerplate elements.
A Pen by Fabrice Weinberg on CodePen.
Just a little experiment with pseudo elements. Semantic HTML is maintained. No boilerplate elements.
A Pen by Fabrice Weinberg on CodePen.
| <h1>Direction aware hover pure CSS</h1> | |
| <div class="box"> | |
| <div class="box__right">Right → Left</div> | |
| <div class="box__left">Left → Right</div> | |
| <div class="box__top">Top → Bottom</div> | |
| <div class="box__bottom">Bottom → Top</div> | |
| <div class="box__center"> | |
| Hover from any side | |
| </div> | |
| </div> | |
| <footer>Created by <a href="http://twitter.com/FWeinb" target="_blank">Fabrice Weinberg</a></footer> |
| @import "compass"; | |
| .box{ | |
| margin: 5em auto; | |
| position:relative; | |
| width:10em; | |
| height:10em; | |
| line-height:10em; | |
| overflow:hidden; | |
| } | |
| %box__dir{ | |
| position:absolute; | |
| width:inherit; | |
| height:inherit; | |
| text-align:center; | |
| line-height:inherit; | |
| transition:transform .4s ease; | |
| &:before{ | |
| position:absolute; | |
| content:''; | |
| /* | |
| * Calculation: | |
| * ____a____ | |
| * /|\ | | |
| * b | \ | | |
| * / a \ | | |
| * \ | / | | |
| * \ | / | | |
| * \|/________| | |
| * | |
| * a^2 = b^2+b^2 | |
| * | |
| * solve to b: | |
| * | |
| * a^2 = 2b^2 | /2 | |
| * a^2 / 2 = b^2 | sqrt | |
| * a / sqrt(2) = b | |
| * | |
| * Percentage: | |
| * a = 100% | |
| * 100 / sqrt(2) = 70.71% | |
| * ------ | |
| */ | |
| width:70.71%; | |
| height:70.71%; | |
| transform: rotate(45deg); | |
| } | |
| &:hover{ | |
| transform:translateX(0); | |
| z-index:1; | |
| } | |
| &:hover:before{ | |
| width:100%; | |
| height:100%; | |
| transform: none; | |
| } | |
| } | |
| .box__right{ | |
| @extend %box__dir; | |
| background:blue; | |
| transform:translateX(100%); | |
| &:before{ | |
| right:100%;bottom:0; | |
| transform-origin: 100% 100%; | |
| } | |
| &:hover ~ .box__center{ | |
| transform:translateX(-100%); | |
| } | |
| } | |
| .box__left{ | |
| @extend %box__dir; | |
| background:green; | |
| transform:translateX(-100%); | |
| &:before{ | |
| left:100%; | |
| transform-origin: 0 0; | |
| } | |
| &:hover ~ .box__center{ | |
| transform:translateX(100%); | |
| } | |
| } | |
| .box__top{ | |
| @extend %box__dir; | |
| background:red; | |
| transform:translateY(-100%); | |
| &:before{ | |
| top:100%;right:0; | |
| transform-origin:100% 0; | |
| } | |
| &:hover ~ .box__center{ | |
| transform:translateY(100%); | |
| } | |
| } | |
| .box__bottom{ | |
| @extend %box__dir; | |
| background:yellow; | |
| transform:translateY(100%); | |
| &:before{ | |
| bottom:100%;left:0; | |
| transform-origin:0 100%; | |
| } | |
| &:hover ~ .box__center{ | |
| transform:translateY(-100%); | |
| } | |
| } | |
| .box__center{ | |
| @extend %box__dir; | |
| background:orange; | |
| z-index:-1; | |
| } | |
| /* Some booring css*/ | |
| html, | |
| body{ | |
| height:100%; | |
| } | |
| body{ | |
| font-family:Helvetica, sans-serif; | |
| transform:translateZ(0); | |
| } | |
| h1{ | |
| text-align:center; | |
| } | |
| footer{ | |
| text-align:center; | |
| font-size:8pt; | |
| color:gray; | |
| } | |
| a{ | |
| color:#FF6600; | |
| } | |
| a:hover{ | |
| color:darkorange; | |
| } |