前言
相信大家在用css实现三角形,比如下拉或者向右的三角形的时候,已经体会到了css的神奇之处,我们之所以考虑用样式而非图片控制效果,很可能是出于以下的关键几条原因:
1.css写的样式具有更好的可变性,我们可以控制其大小、颜色
2.可以减少对图片的依赖,减少http请求,让页面性能更佳
3.能够更好的支持一些动态内容,动态需求
场景
那么本文将带大家用纯css实现一个梯形的背景,它的效果可能是这样的。你很容易想到两边可以用伪元素实现即可,代码地址在这里:链接
伪元素边框实现
实现这样的直角梯形是比较简单的,代码如下:其核心的实现思路是利用首尾的伪元素,创建行内块级元素,然后通过底边和左边或者右边的组合实现三角形效果,最终定位到盒模型的左边和右边。(如果你有兴趣还可以尝试下上边题型,单边梯形等效果,另外,因为我们要考虑到不影响内容,所以要把你的梯形两边z-index设置更低)
.ladder{
&::after,&::before{
content:'';
position:absolute;
display:inline-block;
top:-50px;
bottom:0;
z-index:-1;
border-bottom:40px solid rgb(44,59,82);
}
&::after{
right:-100px;
border-right:100px solid #fff;
}
&::before{
left:-20px;
border-left:20px solid #fff;
}
}
小结:也希望你能通过这种css方案了解css实现普通三角形包括各个方向的一种方案。
伪元素transform3D变形
上面的技术方案只能实现最简单的直角梯形,但如果梯形需要一些复杂的圆角,就无法实现了。
那么在css的方案中,其实是有css3 3d变形的,思考下,如果按照透视的关系,将一个长方形,上方拉远,那么透视的效果就是一个梯形了,那么我们伪元素尝试下是否可行,在此之前,你需要了解3d透视的css语法:链接
一句话说明:perspective负责透视的距离,rotateX负责旋转产生梯形效果,scale负责旋转透视之后大小的问题
&::before{
content: '';
position: absolute;
top: 0; right: 0; bottom: 0; left: 0; z-index: -1;
background: rgb(44,59,82);
border-radius: .5em .5em 0 0;
box-shadow: 0 .15em white inset;
transform: perspective(.8em) rotateX(5deg) scale(1.49);
transform-origin: bottom;
}
实现的重点:
1.梯形要保证底部的效果,所以把变形的基准点选在了底部
2.由于透视的关系,导致的高度不对,使用scale进行校准
3.因为如果直接对元素进行透视,会导致内容也发生透视,导致问题,所以最终设置的还是伪元素
拓展延伸
除了本文提到的技术方案,
参考文档
- 《css揭秘》