是否可以只用 CSS 制作一个圆角三角形?
Is it possible to make a rounded triangle with just CSS?
我正在尝试用 CSS 制作以下形状:
这是我目前拥有的:
.triangle {
width: 0;
height: 0;
border-style: solid;
border-width: 56px 56px 0 0;
border-color: #ff4369 transparent transparent transparent;
}
<div class="triangle">
</div>
我无法使用 border radius 使左上角变圆...有其他方法可以做到这一点还是我需要使用 SVG?
是的,可以使用 border-radius
:
.triangle {
box-sizing: border-box;
width: 60px;
height: 60px;
border-top: solid 30px rgb(200,30,50);
border-left: solid 30px rgb(200,30,50);
border-top-left-radius: 12px;
border-right: solid 30px transparent;
border-bottom: solid 30px transparent;
}
<div class="triangle triangle-0"></div>
您可以考虑 border-radius
和 clip-path: polygon()
解决方案:
.triangle {
width: 56px;
height: 56px;
background: #ff4369;
border-top-left-radius: 12px;
-webkit-clip-path: polygon(0 0, 0% 100%, 100% 0);
clip-path: polygon(0 0, 0% 100%, 100% 0);
}
<div class="triangle"></div>
另一种解决方案是:before
或:after
伪元素,可以作为层:
.triangle {
width: 56px;
height: 56px;
background: #ff4369;
border-top-left-radius: 12px;
position: relative;
overflow: hidden;
}
.triangle:after {
content: "";
position: absolute;
top: 0;
left: 50%;
width: 100%;
height: 100%;
background: #fff;
transform: skew(-45deg);
}
<div class="triangle"></div>
您可以轻松地使用 linear-gradient
并且它得到了很好的支持:
body {
background: #ccc;
}
.triangle {
margin: 10px;
width: 56px;
height: 56px;
background: linear-gradient(to bottom right, #ff4369 50%, transparent 0);
border-radius: 10px 0 0 0;
}
<div class="triangle">
</div>
要实际回答您的问题(并在没有 border-radius
的情况下提供第一个答案):如果您想要 CSS 唯一的解决方案,则必须使用 border-radius
.
尽管如此,我强烈建议使用 SVG 来创建形状,因为像这样的简单形状很容易手动创建,它具有响应性,widely supported now 并且(如评论中提到的@chharvey)在语义上更合适.
<svg viewbox="0 0 50 50" height="56px">
<path d="M1 50 V10 Q1 1 10 1 H50z" fill="#ff4369" />
</svg>
您可以找到有关路径属性的更多信息 in the specs。
我正在尝试用 CSS 制作以下形状:
这是我目前拥有的:
.triangle {
width: 0;
height: 0;
border-style: solid;
border-width: 56px 56px 0 0;
border-color: #ff4369 transparent transparent transparent;
}
<div class="triangle">
</div>
我无法使用 border radius 使左上角变圆...有其他方法可以做到这一点还是我需要使用 SVG?
是的,可以使用 border-radius
:
.triangle {
box-sizing: border-box;
width: 60px;
height: 60px;
border-top: solid 30px rgb(200,30,50);
border-left: solid 30px rgb(200,30,50);
border-top-left-radius: 12px;
border-right: solid 30px transparent;
border-bottom: solid 30px transparent;
}
<div class="triangle triangle-0"></div>
您可以考虑 border-radius
和 clip-path: polygon()
解决方案:
.triangle {
width: 56px;
height: 56px;
background: #ff4369;
border-top-left-radius: 12px;
-webkit-clip-path: polygon(0 0, 0% 100%, 100% 0);
clip-path: polygon(0 0, 0% 100%, 100% 0);
}
<div class="triangle"></div>
另一种解决方案是:before
或:after
伪元素,可以作为层:
.triangle {
width: 56px;
height: 56px;
background: #ff4369;
border-top-left-radius: 12px;
position: relative;
overflow: hidden;
}
.triangle:after {
content: "";
position: absolute;
top: 0;
left: 50%;
width: 100%;
height: 100%;
background: #fff;
transform: skew(-45deg);
}
<div class="triangle"></div>
您可以轻松地使用 linear-gradient
并且它得到了很好的支持:
body {
background: #ccc;
}
.triangle {
margin: 10px;
width: 56px;
height: 56px;
background: linear-gradient(to bottom right, #ff4369 50%, transparent 0);
border-radius: 10px 0 0 0;
}
<div class="triangle">
</div>
要实际回答您的问题(并在没有 border-radius
的情况下提供第一个答案):如果您想要 CSS 唯一的解决方案,则必须使用 border-radius
.
尽管如此,我强烈建议使用 SVG 来创建形状,因为像这样的简单形状很容易手动创建,它具有响应性,widely supported now 并且(如评论中提到的@chharvey)在语义上更合适.
<svg viewbox="0 0 50 50" height="56px">
<path d="M1 50 V10 Q1 1 10 1 H50z" fill="#ff4369" />
</svg>
您可以找到有关路径属性的更多信息 in the specs。