This pen gathers some hover animations in CSS, using pseudo elements and transform properties.
A Pen by Thomas Aufresne on CodePen.
| <h1>Links hover animations</h1> | |
| <div class="link-cont"> | |
| <div class="link-wrapper"> | |
| <a class="link hover-1" href="#">#1 - left to right</a> | |
| </div> | |
| <div class="link-wrapper"> | |
| <a class="link hover-2" href="#">#2 center to tips</a> | |
| </div> | |
| <div class="link-wrapper"> | |
| <a class="link hover-3" href="#">#3 left to right</a> | |
| </div> | |
| <div class="link-wrapper"> | |
| <a class="link hover-4" href="#">#4 right to left</a> | |
| </div> | |
| <div class="link-wrapper"> | |
| <a class="link hover-5" href="#">#5 scaling height</a> | |
| </div> | |
| <div class="link-wrapper"> | |
| <a class="link hover-6" href="#">#6 edges to center</a> | |
| </div> | |
| <div class="link-wrapper"> | |
| <a class="link hover-7" href="#">#7 top & bottom, left to right + reverse</a> | |
| </div> | |
| <div class="link-wrapper"> | |
| <a class="link hover-8" href="#">#8 top & bottom, left to right</a> | |
| </div> | |
| <div class="link-wrapper"> | |
| <a class="link hover-9" href="#">#9 top & bottom, right to left</a> | |
| </div> | |
| <div class="link-wrapper"> | |
| <a class="link hover-10" href="#">#10 top & bottom tips to center</a> | |
| </div> | |
| <div class="link-wrapper"> | |
| <a class="link hover-11" href="#">#11 top & bottom, scaling height</a> | |
| </div> | |
| <div class="link-wrapper"> | |
| <a class="link hover-12" href="#">#12 top & bottom, left to right + reverse</a> | |
| </div> | |
| <div class="link-wrapper"> | |
| <span class="inner-wrapper wrapper-13"> | |
| <a class="link hover-13" href="#">#13 top & bottom, tips to center</a> | |
| </span> | |
| </div> | |
| <div class="link-wrapper"> | |
| <span class="inner-wrapper wrapper-14"> | |
| <a class="link hover-14" href="#">#14 square effect, center to edges</a> | |
| </span> | |
| </div> | |
| <div class="link-wrapper"> | |
| <span class="inner-wrapper wrapper-15"> | |
| <a class="link hover-15" href="#">#15 square effect, symetrical</a> | |
| </span> | |
| </div> | |
| <div class="link-wrapper"> | |
| <span class="inner-wrapper wrapper-16"> | |
| <a class="link hover-16" href="#">#16 square effect, simultaneous</a> | |
| </span> | |
| </div> | |
| <div class="link-wrapper"> | |
| <span class="inner-wrapper wrapper-17"> | |
| <a class="link hover-17" href="#">#17 square effect, side by side</a> | |
| </span> | |
| </div> | |
| </div> |
| body { | |
| font-family: Quicksand; | |
| margin: 40px; | |
| padding: 0; | |
| color: #fff; | |
| background-color: #080a6b; | |
| background: linear-gradient(0,#281130 0,#030133); | |
| } | |
| @red : #E2061B; | |
| @blue: #20C2F7; | |
| @green: #37D631; | |
| @yellow: #ffcc00; | |
| h1 { | |
| position: relative; | |
| font-size: 45px; | |
| margin: 15px 0; | |
| display: inline-block; | |
| &:after { | |
| content:''; | |
| position: absolute; | |
| bottom: -2px; | |
| left: 0; | |
| right: 0; | |
| height: 2px; | |
| background-color: #fff; | |
| border-radius: 5px; | |
| } | |
| } | |
| .link-cont { | |
| position: relative; | |
| font-size: 24px; | |
| } | |
| .link { | |
| display: inline-block; | |
| position: relative; | |
| text-decoration: none; | |
| padding: 10px 0; | |
| color: #fff; | |
| } | |
| .link-wrapper { | |
| position: relative; | |
| display: block; | |
| padding: 20px 0; | |
| } | |
| .inner-wrapper { | |
| position: relative; | |
| display: inline-block; | |
| } | |
| /* hover styles */ | |
| .hover-1 { | |
| &:after { | |
| content:''; | |
| position: absolute; | |
| width: 100%; | |
| height: 3px; | |
| bottom: 0; | |
| left: 0; | |
| background-color: @red; | |
| transform: scaleX(0); | |
| transform-origin: bottom right; | |
| transition: transform 0.3s; | |
| } | |
| &:hover { | |
| &:after { | |
| transform-origin: bottom left; | |
| transform: scaleX(1); | |
| } | |
| } | |
| } | |
| .hover-2 { | |
| &:after { | |
| content: ''; | |
| position: absolute; | |
| bottom: 0; | |
| left: 0; | |
| right: 0; | |
| width: 100%; | |
| height: 3px; | |
| transform: scaleX(0); | |
| background-color: @blue; | |
| transition: transform 0.3s; | |
| } | |
| &:hover { | |
| &:after { | |
| transform: scaleX(1); | |
| } | |
| } | |
| } | |
| .hover-3 { | |
| &:after { | |
| content: ''; | |
| position: absolute; | |
| bottom: 0; | |
| left: 0; | |
| width: 100%; | |
| height: 3px; | |
| background-color: @green; | |
| transform: scaleX(0); | |
| transform-origin: bottom left; | |
| transition: transform 0.3s; | |
| } | |
| &:hover { | |
| &:after { | |
| transform: scaleX(1); | |
| } | |
| } | |
| } | |
| .hover-4 { | |
| &:after { | |
| content: ''; | |
| position: absolute; | |
| bottom: 0; | |
| right: 0; | |
| width: 100%; | |
| height: 3px; | |
| background-color: @yellow; | |
| transform: scaleX(0); | |
| transform-origin: bottom right; | |
| transition: transform 0.3s; | |
| } | |
| &:hover { | |
| &:after { | |
| transform: scaleX(1); | |
| } | |
| } | |
| } | |
| .hover-5 { | |
| &:after { | |
| content: ''; | |
| position: absolute; | |
| bottom: 0; | |
| left: 0; | |
| right: 0; | |
| width: 100%; | |
| height: 3px; | |
| transform: scaleY(0); | |
| background-color: @red; | |
| transition: transform 0.3s; | |
| } | |
| &:hover { | |
| &:after { | |
| transform: scaleY(1); | |
| } | |
| } | |
| } | |
| .hover-6 { | |
| &:before { | |
| content: ''; | |
| position: absolute; | |
| bottom: 0; | |
| left: 0; | |
| right: 50%; | |
| height: 3px; | |
| background-color: @blue; | |
| transform: scaleX(0); | |
| transform-origin: bottom left; | |
| transition: transform 0.3s; | |
| } | |
| &:after { | |
| content: ''; | |
| position: absolute; | |
| bottom: 0; | |
| right: 0; | |
| left : 50%; | |
| height: 3px; | |
| background-color: @blue; | |
| transform: scaleX(0); | |
| transform-origin: bottom right; | |
| transition: transform 0.3s; | |
| } | |
| &:hover { | |
| &:before { | |
| transform: scaleX(1); | |
| } | |
| &:after { | |
| transform: scaleX(1); | |
| } | |
| } | |
| } | |
| .hover-7 { | |
| &:before { | |
| content: ''; | |
| position: absolute; | |
| top: 0; | |
| left: 0; | |
| width: 100%; | |
| height: 3px; | |
| background-color: @green; | |
| transform: scaleX(0); | |
| transform-origin: top left; | |
| transition: transform 0.3s; | |
| } | |
| &:after { | |
| content: ''; | |
| position: absolute; | |
| bottom: 0; | |
| right: 0; | |
| width : 100%; | |
| height: 3px; | |
| background-color: @green; | |
| transform: scaleX(0); | |
| transform-origin: bottom right; | |
| transition: transform 0.3s; | |
| } | |
| &:hover { | |
| &:before { | |
| transform: scaleX(1); | |
| } | |
| &:after { | |
| transform: scaleX(1); | |
| } | |
| } | |
| } | |
| .hover-8 { | |
| &:before { | |
| content: ''; | |
| position: absolute; | |
| top: 0; | |
| left: 0; | |
| width: 100%; | |
| height: 3px; | |
| background-color: @yellow; | |
| transform: scaleX(0); | |
| transform-origin: top left; | |
| transition: transform 0.3s; | |
| } | |
| &:after { | |
| content: ''; | |
| position: absolute; | |
| bottom: 0; | |
| left: 0; | |
| width: 100%; | |
| height: 3px; | |
| background-color: @yellow; | |
| transform: scaleX(0); | |
| transform-origin: top left; | |
| transition: transform 0.3s; | |
| } | |
| &:hover { | |
| &:before, | |
| &:after { | |
| transform: scaleX(1); | |
| } | |
| } | |
| } | |
| .hover-9 { | |
| &:before { | |
| content: ''; | |
| position: absolute; | |
| top: 0; | |
| right: 0; | |
| width: 100%; | |
| height: 3px; | |
| background-color: @red; | |
| transform: scaleX(0); | |
| transform-origin: top right; | |
| transition: transform 0.3s; | |
| } | |
| &:after { | |
| content: ''; | |
| position: absolute; | |
| bottom: 0; | |
| right: 0; | |
| width: 100%; | |
| height: 3px; | |
| background-color: @red; | |
| transform: scaleX(0); | |
| transform-origin: top right; | |
| transition: transform 0.3s; | |
| } | |
| &:hover { | |
| &:before, | |
| &:after { | |
| transform: scaleX(1); | |
| } | |
| } | |
| } | |
| .hover-10 { | |
| &:before { | |
| content: ''; | |
| position: absolute; | |
| top: 0; | |
| right: 0; | |
| width: 100%; | |
| height: 3px; | |
| background-color: @blue; | |
| transform: scaleX(0); | |
| transition: transform 0.3s; | |
| } | |
| &:after { | |
| content: ''; | |
| position: absolute; | |
| bottom: 0; | |
| right: 0; | |
| width: 100%; | |
| height: 3px; | |
| background-color: @blue; | |
| transform: scaleX(0); | |
| transition: transform 0.3s; | |
| } | |
| &:hover { | |
| &:before, | |
| &:after { | |
| transform: scaleX(1); | |
| } | |
| } | |
| } | |
| .hover-11 { | |
| &:before { | |
| content: ''; | |
| position: absolute; | |
| top: 0; | |
| left: 0; | |
| right: 0; | |
| width: 100%; | |
| height: 3px; | |
| transform: scaleY(0); | |
| background-color: @green; | |
| transition: transform 0.3s; | |
| } | |
| &:after { | |
| content: ''; | |
| position: absolute; | |
| bottom: 0; | |
| left: 0; | |
| right: 0; | |
| width: 100%; | |
| height: 3px; | |
| transform: scaleY(0); | |
| background-color: @green; | |
| transition: transform 0.2s; | |
| } | |
| &:hover { | |
| &:before, | |
| &:after { | |
| transform: scaleY(1); | |
| } | |
| } | |
| } | |
| .hover-12 { | |
| &:before { | |
| content:''; | |
| position: absolute; | |
| width: 100%; | |
| height: 3px; | |
| top: 0; | |
| left: 0; | |
| background-color: @yellow; | |
| transform: scaleX(0); | |
| transform-origin: top left; | |
| transition: transform 0.3s; | |
| } | |
| &:after { | |
| content:''; | |
| position: absolute; | |
| width: 100%; | |
| height: 3px; | |
| bottom: 0; | |
| right: 0; | |
| background-color: @yellow; | |
| transform: scaleX(0); | |
| transform-origin: bottom right; | |
| transition: transform 0.3s; | |
| } | |
| &:hover { | |
| &:before { | |
| transform-origin: top right; | |
| transform: scaleX(1); | |
| } | |
| &:after { | |
| transform-origin: bottom left; | |
| transform: scaleX(1); | |
| } | |
| } | |
| } | |
| .wrapper-13 { | |
| &:before { | |
| content: ''; | |
| position: absolute; | |
| top: 0; | |
| left: 0; | |
| right: 50%; | |
| height: 3px; | |
| background-color: @red; | |
| transform: scaleX(0); | |
| transform-origin: top left; | |
| transition: transform 0.3s; | |
| } | |
| &:after { | |
| content: ''; | |
| position: absolute; | |
| top: 0; | |
| right: 0; | |
| left : 50%; | |
| height: 3px; | |
| background-color: @red; | |
| transform: scaleX(0); | |
| transform-origin: top right; | |
| transition: transform 0.3s; | |
| } | |
| .hover-13 { | |
| &:before { | |
| content: ''; | |
| position: absolute; | |
| bottom: 0; | |
| left: 0; | |
| right: 50%; | |
| height: 3px; | |
| background-color: @red; | |
| transform: scaleX(0); | |
| transform-origin: bottom left; | |
| transition: transform 0.3s; | |
| } | |
| &:after { | |
| content: ''; | |
| position: absolute; | |
| bottom: 0; | |
| right: 0; | |
| left: 50%; | |
| height: 3px; | |
| background-color: @red; | |
| transform: scaleX(0); | |
| transform-origin: bottom right; | |
| transition: transform 0.3s; | |
| } | |
| &:hover { | |
| &:before, | |
| &:after { | |
| transform: scaleX(1); | |
| } | |
| } | |
| } | |
| &:hover { | |
| &:before, | |
| &:after { | |
| transform: scaleX(1); | |
| } | |
| } | |
| } | |
| .wrapper-14 { | |
| &:before { | |
| content: ''; | |
| position: absolute; | |
| top: 0; | |
| left: 0; | |
| width: 3px; | |
| height: 100%; | |
| background-color: @blue; | |
| transform: scaleY(0); | |
| transition: transform 0.3s; | |
| } | |
| &:after { | |
| content: ''; | |
| position: absolute; | |
| top: 0; | |
| right: 0; | |
| width: 3px; | |
| height: 100%; | |
| background-color: @blue; | |
| transform: scaleY(0); | |
| transition: transform 0.3s; | |
| } | |
| .hover-14 { | |
| padding: 10px; | |
| &:before { | |
| content: ''; | |
| position: absolute; | |
| top: 0; | |
| right: 0; | |
| width: 100%; | |
| height: 3px; | |
| background-color: @blue; | |
| transform: scaleX(0); | |
| transition: transform 0.3s; | |
| } | |
| &:after { | |
| content: ''; | |
| position: absolute; | |
| bottom: 0; | |
| right: 0; | |
| width: 100%; | |
| height: 3px; | |
| background-color: @blue; | |
| transform: scaleX(0); | |
| transition: transform 0.3s; | |
| } | |
| } | |
| &:hover { | |
| &:before, | |
| &:after { | |
| transform: scaleY(1); | |
| } | |
| .hover-14 { | |
| &:before, | |
| &:after { | |
| transform: scaleX(1); | |
| } | |
| } | |
| } | |
| } | |
| .wrapper-15 { | |
| &:before { | |
| content: ''; | |
| position: absolute; | |
| top: 0; | |
| left: 0; | |
| width: 3px; | |
| height: 100%; | |
| background-color: @green; | |
| transform: scaleY(0); | |
| transform-origin: top left; | |
| transition: transform 0.3s; | |
| } | |
| &:after { | |
| content: ''; | |
| position: absolute; | |
| bottom: 0; | |
| right: 0; | |
| width: 3px; | |
| height: 100%; | |
| background-color: @green; | |
| transform: scaleY(0); | |
| transform-origin: bottom right; | |
| transition: transform 0.3s; | |
| } | |
| .hover-15 { | |
| padding: 10px; | |
| &:before { | |
| content: ''; | |
| position: absolute; | |
| top: 0; | |
| left: 0; | |
| width: 100%; | |
| height: 3px; | |
| background-color: @green; | |
| transform: scaleX(0); | |
| transform-origin: top left; | |
| transition: transform 0.3s; | |
| } | |
| &:after { | |
| content: ''; | |
| position: absolute; | |
| bottom: 0; | |
| right: 0; | |
| width: 100%; | |
| height: 3px; | |
| background-color: @green; | |
| transform: scaleX(0); | |
| transform-origin: bottom right; | |
| transition: transform 0.3s; | |
| } | |
| } | |
| &:hover { | |
| &:before, | |
| &:after { | |
| transform: scaleY(1); | |
| } | |
| .hover-15 { | |
| &:before, | |
| &:after { | |
| transform: scaleX(1); | |
| } | |
| } | |
| } | |
| } | |
| .wrapper-16 { | |
| &:before { | |
| content: ''; | |
| position: absolute; | |
| bottom: 0; | |
| left: 0; | |
| width: 3px; | |
| height: 100%; | |
| background-color: @yellow; | |
| transform: scaleY(0); | |
| transform-origin: bottom left; | |
| transition: transform 0.3s; | |
| } | |
| &:after { | |
| content: ''; | |
| position: absolute; | |
| top: 0; | |
| right: 0; | |
| width: 3px; | |
| height: 100%; | |
| background-color: @yellow; | |
| transform: scaleY(0); | |
| transform-origin: top right; | |
| transition: transform 0.3s; | |
| } | |
| .hover-16 { | |
| padding: 10px; | |
| &:before { | |
| content: ''; | |
| position: absolute; | |
| top: 0; | |
| left: 0; | |
| width: 100%; | |
| height: 3px; | |
| background-color: @yellow; | |
| transform: scaleX(0); | |
| transform-origin: top left; | |
| transition: transform 0.3s; | |
| } | |
| &:after { | |
| content: ''; | |
| position: absolute; | |
| bottom: 0; | |
| right: 0; | |
| width: 100%; | |
| height: 3px; | |
| background-color: @yellow; | |
| transform: scaleX(0); | |
| transform-origin: bottom right; | |
| transition: transform 0.3s; | |
| } | |
| } | |
| &:hover { | |
| &:before, | |
| &:after { | |
| transform: scaleY(1); | |
| } | |
| .hover-16 { | |
| &:before, | |
| &:after { | |
| transform: scaleX(1); | |
| } | |
| } | |
| } | |
| } | |
| .wrapper-17 { | |
| &:before { | |
| content: ''; | |
| position: absolute; | |
| bottom: 0; | |
| left: 0; | |
| width: 3px; | |
| height: 100%; | |
| background-color: @red; | |
| transform: scaleY(0); | |
| transform-origin: bottom left; | |
| transition: transform 0.2s; | |
| } | |
| &:after { | |
| content: ''; | |
| position: absolute; | |
| top: 0; | |
| right: 0; | |
| width: 3px; | |
| height: 100%; | |
| background-color: @red; | |
| transform: scaleY(0); | |
| transform-origin: top right; | |
| transition: transform 0.2s 0.2s; | |
| } | |
| .hover-17 { | |
| padding: 10px; | |
| &:before { | |
| content: ''; | |
| position: absolute; | |
| top: 0; | |
| left: 0; | |
| width: 100%; | |
| height: 3px; | |
| background-color: @red; | |
| transform: scaleX(0); | |
| transform-origin: top left; | |
| transition: transform 0.2s 0.3s; | |
| } | |
| &:after { | |
| content: ''; | |
| position: absolute; | |
| bottom: 0; | |
| right: 0; | |
| width: 100%; | |
| height: 3px; | |
| background-color: @red; | |
| transform: scaleX(0); | |
| transform-origin: bottom right; | |
| transition: transform 0.2s 0.1s; | |
| } | |
| } | |
| &:hover { | |
| &:before { | |
| transform: scaleY(1); | |
| transition: transform 0.2s 0.3s; | |
| } | |
| &:after { | |
| transform: scaleY(1); | |
| transition: transform 0.2s 0.1s; | |
| } | |
| .hover-17 { | |
| &:before { | |
| transform: scaleX(1); | |
| transition: transform 0.2s; | |
| } | |
| &:after { | |
| transform: scaleX(1); | |
| transition: transform 0.2s 0.2s; | |
| } | |
| } | |
| } | |
| } |