我在这里试过了perspective
解决方案How to transform each side of a shape separately?,但由于形状不规则,无法使其工作。只有顶部和右侧的列是倾斜的,垂直和底部是直的。我怎么能用CSS做到这一点?
答案 0 :(得分:8)
使用CSS边框可以创建triangles和梯形。
你可以实现连接三角形和梯形的形状。
.triangle {
border: 0 solid red;
border-left-width: 500px;
border-top-width: 30px;
border-top-color: transparent;
}
.trapezoid {
border: 0 solid red;
width: 500px;
border-bottom-width: 150px;
border-right-width: 30px;
border-right-color: transparent;
}

<div class="triangle"></div>
<div class="trapezoid"></div>
&#13;
答案 1 :(得分:6)
您可以使用CSS clip-path
功能将矩形剪切为所需的多边形形状。
div {
box-sizing: border-box;
height: 150px;
width: 250px;
background: red;
padding: 10px;
-webkit-clip-path: polygon(0% 0%, 90% 10%, 100% 100%, 0% 100%);
clip-path: polygon(0% 0%, 90% 10%, 100% 100%, 0% 100%);
}
div#image {
background: url(http://lorempixel.com/400/200);
}
/* Just for demo */
div{
float: left;
margin: 10px;
transition: all 1s;
}
div:hover{
height: 200px;
width: 300px;
}
<div>Some text</div>
<div id="image"></div>
<强>优点:强>
<强>缺点:强>
clip-path
功能。这可以通过对clip-path
使用内联SVG 来解决,就像下面的代码段一样,因为它有更好的浏览器支持。
div {
box-sizing: border-box;
height: 150px;
width: 250px;
padding: 10px;
background: red;
-webkit-clip-path: url(#clip);
clip-path: url(#clip);
}
div#image {
background: url(http://lorempixel.com/400/200);
}
/* Just for demo */
div{
float: left;
margin: 10px;
transition: all 1s;
}
div:hover{
height: 200px;
width: 300px;
}
<svg width="0" height="0">
<defs>
<clipPath id="clip" clipPathUnits="objectBoundingBox">
<path d="M0 0, 0.9 0.1, 1 1, 0 1z" />
</clipPath>
</defs>
</svg>
<div>
Some text
</div>
<div id="image"></div>
一般情况下,当形状(或)中的图像或文本等内容在形状的背景不是纯色时,最好不要使用变换,因为那时我们要么必须(a)分别反向转换子元素以使它们看起来正常或(b)使用绝对定位。
对于这个特殊形状,即使使用变换但是具有非纯色背景颜色,在形状内部使用文本也不会有问题。
选项1:使用两个伪元素
您可以使用几个具有倾斜变换的伪元素,一个位于顶部,另一个位于右侧以生成所需的形状。将形状悬停在代码段中以查看其创建方式。
div {
position: relative;
height: 150px;
width: 250px;
background: red;
margin: 40px 40px 0px 0px;
}
div:after,
div:before {
position: absolute;
content: '';
background: red;
z-index: -1;
backface-visibility: hidden;
}
div:before {
height: 12.5%;
width: 100%;
top: 0px;
left: 0px;
transform-origin: right top;
transform: skewY(3deg);
}
div:after {
height: 100%;
width: 12.5%;
right: -1px;
top: -1px;
transform-origin: right top;
transform: skewX(10deg);
}
/* Just for demo */
div{
transition: all 1s;
}
div:hover{
height: 250px;
width: 300px;
}
div:hover:after{
background: blue;
}
div:hover:before{
background: green;
}
<div>Some text</div>
<强>优点:强>
<强>缺点:强>
hover
在片段的形状上看看我的意思。原因与提到的here相同。选项2:使用一个伪元素
这与前一个选项非常相似,只是它在父级上使用单个伪元素和overflow: hidden
。
div {
position: relative;
box-sizing: border-box;
height: 200px;
width: 300px;
padding: 10px;
overflow: hidden;
}
div:after {
position: absolute;
content: '';
top: 0px;
left: -20px;
height: 100%;
width: 100%;
background: red;
transform-origin: left bottom;
transform: skewY(5deg) skewX(7.5deg);
z-index: -1;
}
div:hover {
height: 300px;
width: 500px;
transition: all 1s;
}
<div>Some text</div>
<强>优点:强>
<强>缺点:强>
overflow: hidden
是约束条件,则不适用。答案 2 :(得分:2)
解决方案是:
div {
width: 300px;
height: 100px;
margin:50px;
background-color: yellow;
border: 1px solid black;
}
.thisdiv {
-ms-transform: skewX(-20deg); /* IE 9 */
-webkit-transform: skewX(-20deg); /* Safari */
transform: skewX(-20deg); /* Standard syntax */
}
<div class="thisdiv">
This is the div I will skew
</div>
这是如何扭曲一个元素,如果你想制作你添加的形状,尝试使用两个重叠的div,位置,缩放,旋转和倾斜,如下所示:
.outer-div{
position:relative;
margin:50px;
width:200px;
height:200px;
border:2px black dashed;
}
.inner-one{
position:absolute;
left:0;
bottom:0;
width:180px;
height:180px;
background:red;
}
.inner-two{
position:absolute;
bottom:2px;
right:0px;
width:200px;
height:195px;
background:red;
transform: rotate(7deg) skew(14deg) scale(0.905); /* Standard syntax */
}
<div class="outer-div">
<div class="inner-one">
</div>
<div class="inner-two">
</div>
</div>
答案 3 :(得分:2)
在查看图像时,我注意到顶部和右侧的歪斜实际上只是长而窄的三角形覆盖矩形。
所以我所做的是使用CSS边框属性创建三角形,并将它们绝对放在矩形上。
#rectangle {
width: 400px;
height: 200px;
background-color: red;
margin-top: 25px;
position: relative;
}
#triangle-down {
border-left: 30px solid red;
border-right: 0;
border-top: 200px solid transparent;
position: absolute;
right: -30px;
top: 0;
}
#triangle-left {
border-top: 0;
border-bottom: 15px solid red;
border-right: 400px solid transparent;
position: absolute;
right: 0;
top: -15px;
}
&#13;
<div id="rectangle">
<div id="triangle-down"></div>
<div id="triangle-left"></div>
</div>
&#13;
答案 4 :(得分:1)
您可以查看clip-path
属性(请参阅下面的MDN),但支持非常不完整。 Chrome 24+支持前缀和FF,但仅支持引用SVG中路径的URL值。你可以read more about clip-path
here。
Here's a basic pen - 这只适用于Chrome。
来自MDN
剪辑路径CSS属性通过定义要显示的剪辑区域来防止元素的一部分显示,即,仅显示元素的特定区域。剪切区域是指定为引用内联或外部SVG的URL的路径,或者是诸如circle()之类的形状方法。 clip-path属性替换现在已弃用的剪辑属性。