At work last week, we started building a cool new project and part of the design revolves around angles. A particularly tricky part is angular-cropped images. The images need to have a 8 degree angle top and bottom to give a skewed look–however the image cannot be distorted.

Here's an example of what we want: Some other points worth mentioning are that the images can be any size and in any width container.

After quickly abandoning my initial attempt with transform skew, I reached for the `clip-path` property. Clip path accepts a polygon value, which you can create with some 4 lots of 2 percentage coordinates. I like to use a web app called Clippy to quickly test out polygons so I knocked up a quick example: This uses the follwing CSS which kind of makes sense but it actually doesn't work.

``clip-path: polygon(0 8%, 100% 0%, 100% 92%, 0% 100%);``

The issue is, if the image proprtions change, the angle is going to change. Basically we need to work out the sides of a triangle when we only know 2 angles. Like this: One thing we can know though, is the aspect ratio of the image. For example the image we've been using is 16:9. Therefore we could add those measurements in and see if it helps us. As the clip-path will be in percent, we can scale it all up after. Now we have a triangle where we know 1 side (16 width) and one angle (8°). Digging out my old maths textbooks, I can confirm that we need to use some GCSE trigonometry. To be specific, the phrase `SOH CAH TOA`.

Effectively, this is mnemonic to remember the 3 ways of working out the sides of a triangle, based on the information you have. We have the Opposite angle (8°) or O, the Adjacent side (16 wide) or A. O and A means we need to use T (Tan). Using the formula `Tangent = Opposite / Adjacent` (TOA). Algebra time... That shows the other unknown side of our triangle is 2.248653355238256 in length. This doesn't solve our clip-path issue by itself. First we need to get this as a percentage of the whole length of the vertical side (9).

So, to work out the top angle, we need to divide this by 9 and multiply it by 100%:

``tan(8deg) * 16 / 9 * 100%``

For the bottom angle, we need to reverse it by taking it away from 100%:

``100% - (tan(8deg) * 16 / 9 * 100%)``

Unfortunately CSS (or any of it's preprocessors?) don't have native trigonometry functions. However, someone already made them! Take a look at the post Trigonometry in Sass. By adding these functions into our code, we can then use the functions in our SCSS. Here's our final clip-path for our 16x9 image:

``clip-path: polygon(0 #{tan(8deg) * 16 / 9 * 100%}, 100% 0, 100% #{100% - (tan(8deg) * 16 / 9 * 100%)}, 0 100%);``

And here is a Codepen showing the same applied to 16:9, 4:3 and 3:4 aspect ratio images (I'm using Intrinsic Ratios/Uncle Dave's Ole Padded Box to maintain the images' aspect ratio):

See the Pen Trigonometry Image Skew by matthew jackson (@matthewbeta) on CodePen.

Hope that didn't fry your brain like it did mine.