一、平行四边形

1. 使用两个元素实现

html

<a class="button">
  <div>click me</div>
</a>

css

.button{
  margin: 50px;
  display: inline-block;
  background: #404ED3;
  transform: skewX(-45deg);
} 
.button>div{
  padding: 15px;
  color: white;
  font-size: 24px;
  transform: skewX(45deg);
}

效果图

css实现平行四边形、菱形图片效果-冯金伟博客园

原理:

将容器和内容区域做相反方向的变形,就可以使外面的容器变形,同时不会影响内部的元素。

2. 使用伪元素实现

我们可以把所有样式都应用到伪元素上,然后再对伪元素进行变形。因为我们的内容并不是包含在伪元素中,所以内容并不会受到伪元素的影响。同时,我们希望伪元素保持良好的灵活性,可以自动继承宿主元素的尺寸,甚至当宿主尺寸是由其内容来决定时仍然如此。一个简单的办法就是给宿主元素应用position:relative,并且为其伪元素设置position:absolute,然后再把所有偏移量设置为0,以便让他在水平方向和垂直方向都和宿主尺寸相同。

html

<a class="button">click me</a>

css

.button{
  position: relative;
  display: inline-block;
  margin: 50px;
  padding: 15px;
  color: white;
  font-size: 24px;
} 
.button::before{
  background: #404ED3;
  z-index: -1;
  position: absolute;
  content: '';
  top: 0;left: 0;right: 0;bottom: 0;
  transform: skewX(-45deg);
}

值得注意的是:用伪元素生成的方框是重叠在内容上面的,一旦给他设置背景就会遮住内容,为了解决这个问题,我们给伪元素设置了z-index:-1,这样他的堆叠层次就会被推到宿主元素之后。

效果图:

css实现平行四边形、菱形图片效果-冯金伟博客园css实现平行四边形、菱形图片效果-冯金伟博客园 

 二、菱形图片

1. 使用两个元素实现

思路:我们可以将父元素旋转45deg,然后将里面的图片在向相反方向旋转45deg,并且设置父元素的overflow:hidden,子元素的最大宽度为100%。

html

<div class="picture">
  <img src="cat.jpg" alt="">
</div>

css

.picture{
  margin: 100px;
  width: 300px;
  transform: rotate(45deg);
  overflow: hidden;
} 
.picture>img{
  width: 300px;/*100%*/
  transform: rotate(-45deg);
}

效果图

css实现平行四边形、菱形图片效果-冯金伟博客园css实现平行四边形、菱形图片效果-冯金伟博客园

虽然这个八边形看起来也很好看,不过这不是我们想要的,原因在于图片的宽度应该为父元素(正方形)宽度的对角线长度,所以我们可以调整一下

css

.picture{
  margin: 100px;
  width: 300px;
  transform: rotate(45deg);
  overflow: hidden;
} 
.picture>img{
  max-width: 100%;
  transform: rotate(-45deg) scale(1.42);
}

效果图

css实现平行四边形、菱形图片效果-冯金伟博客园

2. 使用clip-path实现

hml

<div class="parent">
    <img src="cat1.jpg" alt="">
</div>

css

.parent{
  width: 300px;
}
img{
  width: 100%;
  clip-path: polygon(50% 0,100% 50%,50% 100%,0 50%);
  transition: 1s clip-path;
}
img:hover{
  clip-path: polygon(0 0,100% 0,100% 100%,0 100%);
}

如此简单的代码就实现了菱形,我们甚至实现了在鼠标悬停的时候平滑的扩展为完整的面积。

效果图

css实现平行四边形、菱形图片效果-冯金伟博客园css实现平行四边形、菱形图片效果-冯金伟博客园css实现平行四边形、菱形图片效果-冯金伟博客园