JSFiddle - React, Tailwind, and code Playground
HTML
<script src="http://tympanus.net/Tutorials/ShapeHoverEffectSVG/js/snap.svg-min.js"></script>
<section id="grid" class="grid clearfix">
<a href="#" data-path-hover="m 0,0 0,47.7775 c 24.580441,3.12569 55.897012,-8.199417 90,-8.199417 34.10299,0 65.41956,11.325107 90,8.199417 L 180,0 z">
<figure>
<img src="http://zornet.ru/Aben/308321_879389.jpg" />
<svg viewBox="0 0 180 320" preserveAspectRatio="none">
<path d="m 0,0 0,171.14385 c 24.580441,15.47138 55.897012,24.75772 90,24.75772 34.10299,0 65.41956,-9.28634 90,-24.75772 L 180,0 0,0 z"/>
</svg>
<figcaption>
<h2>ZORNET.RU-1</h2>
<p>ZORNET.RU - создать сайт самостоятельно</p>
</figcaption>
</figure>
</a>
<a href="#" data-path-hover="m 0,0 0,47.7775 c 24.580441,3.12569 55.897012,-8.199417 90,-8.199417 34.10299,0 65.41956,11.325107 90,8.199417 L 180,0 z">
<figure>
<img src="http://zornet.ru/Aben/1rrPnfF7SNqgYgBx-kC6Zw.jpg" />
<svg viewBox="0 0 180 320" preserveAspectRatio="none">
<path d="m 0,0 0,171.14385 c 24.580441,15.47138 55.897012,24.75772 90,24.75772 34.10299,0 65.41956,-9.28634 90,-24.75772 L 180,0 0,0 z"/>
</svg>
<figcaption>
<h2>ZORNET.RU-2</h2>
<p>ZORNET.RU - создать сайт самостоятельно</p>
</figcaption>
</figure>
</a>
</section>
CSS
body {
background:#2f4067;
margin:0px;
padding:0px;
}
/* Common style */
.grid {
margin: 10px;
max-width: 1000px;
width: 90%;
}
.grid a {
float: left;
max-width: 250px;
width: 200px;
color: #333;
font-size: 13px;
}
.grid a:nth-child(odd) {
margin: 0px;
}
.grid figure {
position: relative;
overflow: hidden;
margin: 5px;
background: #333;
}
.grid figure img {
position: relative;
display: block;
width: 100%;
opacity: 0.7;
-webkit-transition: opacity 0.3s;
transition: opacity 0.3s;
}
.grid figcaption {
position: absolute;
top: 0;
z-index: 11;
width: 100%;
height: 100%;
text-align: center;
}
.grid figcaption h2 {
margin: 0 0 20px 0;
color: #3498db;
text-transform: uppercase;
letter-spacing: 1px;
font-weight: 300;
font-size: 130%;
-webkit-transition: -webkit-transform 0.3s;
transition: transform 0.3s;
}
.grid figcaption p {
padding: 0 20px;
color: #aaa;
font-weight: 300;
-webkit-transition: opacity 0.3s, -webkit-transform 0.3s;
transition: opacity 0.3s, transform 0.3s;
}
.grid figcaption h2, .grid figcaption p {
-webkit-transform: translateY(50px);
transform: translateY(50px);
}
.grid figure button {
position: absolute;
padding: 4px 20px;
border: none;
text-transform: uppercase;
letter-spacing: 1px;
font-weight: bold;
-webkit-transition: opacity 0.3s, -webkit-transform 0.3s;
transition: opacity 0.3s, transform 0.3s;
}
.grid figcaption, .grid figcaption h2, .grid figcaption p, .grid figure button {
-webkit-backface-visibility: hidden;
backface-visibility: hidden;
}
/* Style for SVG */
.grid svg {
position: absolute;
top: -1px;
/* fixes rendering issue in FF */
z-index: 10;
width: 100%;
height: 100%;
}
.grid svg path {
fill: #fff;
}
/* Hover effects */
.grid a:hover figure img {
opacity: 1;
}
.grid a:hover figcaption h2, .grid...
JavaScript
(function () {
function init() {
var speed = 330,
easing = mina.backout;
[].slice.call(document.querySelectorAll('#grid > a')).forEach(function (el) {
var s = Snap(el.querySelector('svg')),
path = s.select('path'),
pathConfig = {
from: path.attr('d'),
to: el.getAttribute('data-path-hover')
};
el.addEventListener('mouseenter', function () {
path.animate({
'path': pathConfig.to
}, speed, easing);
});
el.addEventListener('mouseleave', function () {
path.animate({
'path': pathConfig.from
}, speed, easing);
});
});
}
init();
})();