Using Transforms (CSS3 Only)
There is a small amount of inaccuracy in the following method and has two drawbacks to “coding”:
- Two shells needed for
img - You need to know the size of the image (which may not always be a drawback if the images are set in size or if javascript is used to indicate width / height information).
However, it decomposes beautifully back into square corners for IE8 and below.
The main idea is to size the outer shell and its overflow, correct size, rotate and scale the inner shell to create beveled corners (which also have overflow hidden), and then reverse rotation and scaling, and if necessary, insert img inside. This method is strong enough to get pretty decent borders if you want, although the rendering of such borders in browsers depends on the quality.
HTML (main form)
span can be a div .
<span class="chamfer"> <span> <img src="http://placehold.it/351x151" /> </span> </span>
CSS (basic form)
.chamfer { overflow: hidden; display: inline-block; margin: 25px; width: 351px; height: 151px; } .chamfer > span { overflow: hidden; display: inline-block; -moz-transform-origin: 50% 50%; -webkit-transform-origin: 50% 50%; -o-transform-origin: 50% 50%; -ms-transform-origin: 50% 50%; transform-origin: 50% 50%; -moz-transform: rotate(45deg) scale(.9); -webkit-transform: rotate(45deg) scale(.9); -o-transform: rotate(45deg) scale(.9); -ms-transform: rotate(45deg) scale(.9); transform: rotate(45deg) scale(.9); padding: 100px 0; margin-top: -100px; width: 100%; height: 100%; } .chamfer img { display: inline-block; -moz-transform-origin: 50% 50%; -webkit-transform-origin: 50% 50%; -o-transform-origin: 50% 50%; -ms-transform-origin: 50% 50%; transform-origin: 50% 50%; -moz-transform: rotate(-45deg) scale(1.11); -webkit-transform: rotate(-45deg) scale(1.11); -o-transform: rotate(-45deg) scale(1.11); -ms-transform: rotate(-45deg) scale(1.11); transform: rotate(-45deg) scale(1.11); }
HTML (smaller bevel with 2px border)
See the above fiddle for a “larger” chamfer with a 10x version of the frame.
Of course, if all your images got a border with a fixed size, you would just do it the same as your base html above, and don't do class redefinition like I do here.
<span class="chamfer small b2"> <span> <img src="http://placehold.it/351x151" /> </span> </span>
CSS (overrides basic css above)
See the above fiddle for a “larger” chamfer with a 10x version of the frame.
Of course, if all your images got a border with a fixed size, you would just do these values of your base css and not do it in separate classes, as defined here.
.b2 * { border: 2px solid black; } .chamfer.b2 { width: 355px; height: 155px; } .chamfer.b2 > span { margin-top: -102px; margin-left: -2px; } .chamfer.small > span { -moz-transform: rotate(45deg) scale(.96); -webkit-transform: rotate(45deg) scale(.96); -o-transform: rotate(45deg) scale(.96); -ms-transform: rotate(45deg) scale(.96); transform: rotate(45deg) scale(.96); } .chamfer.small img { -moz-transform: rotate(-45deg) scale(1.042); -webkit-transform: rotate(-45deg) scale(1.042); -o-transform: rotate(-45deg) scale(1.042); -ms-transform: rotate(-45deg) scale(1.042); transform: rotate(-45deg) scale(1.042); }