I've got no idea how to generate this image button created with adobe illustrator with CSS. Does anyone have an idea of how this 3d button can be achieved?
Asked
Active
Viewed 766 times
4
-
1You can do it with svg.Otherwise , something like stacking box-shadow will also work. – Paran0a Apr 18 '16 at 06:00
-
Only the green-ish parts or the background also? – Harry Apr 18 '16 at 06:02
-
1background too, though I guess I can separate it to two objects maybe – vondip Apr 18 '16 at 06:02
2 Answers
9
Using CSS:
You can do this with CSS using rotate transform with a bit of perspective added to it.
button {
position: relative;
background: yellowgreen;
border: none;
height: 60px;
line-height: 1.5em;
min-width: 200px;
margin: 20px;
}
button:after {
position: absolute;
content: '';
height: 30%;
width: 100%;
bottom: -30%;
left: 0;
background: green;
transform: perspective(10px) rotateX(-2.5deg);
transform-origin: top;
}
button:before {
position: absolute;
content: '';
height: 120%;
width: 110%;
bottom: -40%;
left: -5%;
background: #444;
transform: perspective(20px) rotateX(1deg);
transform-origin: bottom;
z-index: -1;
}
<button>Test button</button>
<button>Test button wide</button>
<button>Test button <br> with line break</button>
If the area that contains the text also needs to angled a bit , then an extra container is required.
div{
position: relative;
display: inline-block;
padding: 0;
margin: 20px;
height: 60px;
min-width: 200px;
}
button {
position: absolute;
border: none;
background: transparent;
height: 100%;
width: 100%;
line-height: 1.5em;
}
div:after{
position: absolute;
content: '';
height: 100%;
width: 100%;
top: 0;
left: 0;
background: yellowgreen;
transform: perspective(10px) rotateX(.5deg);
transform-origin: bottom;
z-index: -1;
}
div:before {
position: absolute;
content: '';
height: 120%;
width: 110%;
bottom: -40%;
left: -5%;
background: #444;
transform: perspective(20px) rotateX(1deg);
transform-origin: bottom;
z-index: -2;
}
button:after {
position: absolute;
content: '';
height: 30%;
width: 100%;
bottom: -30%;
left: 0;
background: green;
transform: perspective(10px) rotateX(-2.5deg);
transform-origin: top;
}
<div><button>Test button</button></div>
<div><button>Test button wide</button></div>
<div><button>Test button <br> with line break</button></div>
Using SVG:
This can be created with SVG also using a few polygon
or path
elements and positioning the SVG absolutely behind the button with respect to the container.
div {
position: relative;
display: inline-block;
height: 80px;
min-width: 250px;
margin: 20px;
}
svg {
position: absolute;
height: 100%;
width: 100%;
}
button {
position: absolute;
border: none;
width: 100%;
height: 75%;
background: transparent;
line-height: 1.5em;
text-align: center;
}
#bg {
fill: #444;
}
#fg {
fill: yellowgreen;
}
#shade {
fill: green;
}
<div>
<svg viewBox='0 0 100 100' preserveAspectRatio='none'>
<polygon points='5,100 12,20 88,20 95,100' id='bg' />
<polygon points='15,0 85,0 88,70 12,70' id='fg' />
<polygon points='88,70 12,70 17,85 83,85' id='shade' />
</svg>
<button>Test button</button>
</div>
<div>
<svg viewBox='0 0 100 100' preserveAspectRatio='none'>
<polygon points='5,100 12,20 88,20 95,100' id='bg' />
<polygon points='15,0 85,0 88,70 12,70' id='fg' />
<polygon points='88,70 12,70 17,85 83,85' id='shade' />
</svg>
<button>Test button wide</button>
</div>
<div>
<svg viewBox='0 0 100 100' preserveAspectRatio='none'>
<polygon points='5,100 12,20 88,20 95,100' id='bg' />
<polygon points='15,0 85,0 88,70 12,70' id='fg' />
<polygon points='88,70 12,70 17,85 83,85' id='shade' />
</svg>
<button>Test button
<br>with line break</button>
</div>

Harry
- 87,580
- 25
- 202
- 214
4
It is also possible to make this shape using CSS and no transforms. The point is to use the border technique to make the slanted shapes and give them a 3d look:
div{
position:relative;
display:inline-block;
vertical-align:top;
padding:0 6em;
line-height:3.5em; height:3.5em;
color:#fff;
margin:2em 1em;
}
div:before, div:after,
span:before, span:after{
content:'';
position:absolute;
}
span:before{
top:0; left:0;
width:100%; height:0;
box-sizing:border-box;
border-bottom: 3.5em solid #8CC63F;
border-right:3px solid transparent;
border-left:3px solid transparent;
z-index:-1;
}
span:after{
top:100%; left:0;
width:100%;
box-sizing:border-box;
border-top:1.3em solid #39B54A;
border-right:2.5px solid transparent;
border-left:2.5px solid transparent;
}
div:before{
bottom:-2em;
left:-0.6em;right:-0.6em;
border-bottom:4.8em solid #4D4D4D;
border-right: 4px solid transparent;
border-left: 4px solid transparent;
z-index:-2;
}
div:after{
bottom:-2.2em;
left:-0.6em;right:-0.6em;
border-bottom:0.2em solid #242424;
}
<div><span>Go</span></div>