Search code examples
htmlcsscss-transformsskew

Skewing both top and bottom of div


I am trying to skew both the top and bottom of a div to create a shape that I can then insert a background pattern to however, after a few hours of research I can't really come up with a solid solution. I'm nearly there in the sense that all I need to do is to skew the bottom but am looking for some help or guidance on doing so.

I would like the bottom to mirror the skew of the top. Any suggestions?

#test {
  position: relative;
  width: 100%;
  height: 400px;
}

.bg {
  width: 50%;
  height: 800px;
  -webkit-transition: all 300ms ease-in;
  background: black;
  border-radius: 80px 0px 0px 80px;
  position: absolute;
  right: 0;
  top: 0;
  -ms-transform: skewY(-9deg);
  -webkit-transform: skewY(-9deg);
  transform: skewY(-9deg);
}
<section id="test">
  <div class="bg"></div>
</section>

Example of what I currently have https://jsfiddle.net/3atsj1e5/


Solution

  • With some rotation and perspective you can do it:

    .box {
      margin-left: auto;
      width: 200px;
      height: 450px;
      transform-origin: right;
      transform: perspective(100px) rotateY(-10deg);
      border-radius: 40px 0 0 40px;
      overflow: hidden;
    }
    
    .box::before {
      content: "";
      position: absolute;
      top: 0;
      left: 0;
      right: 0;
      bottom: 0;
      background: url(https://picsum.photos/id/1074/400/800) center/cover;
      transform-origin:inherit;
      transform: perspective(100px) rotateY(10deg);
    }
    
    body {
      margin: 0;
      background:#eee;
    }
    <div class="box"></div>