使用 CSS 剪辑路径时如何圆角

Posted

技术标签:

【中文标题】使用 CSS 剪辑路径时如何圆角【英文标题】:How to round out corners when using CSS clip-path 【发布时间】:2015-10-24 06:21:07 【问题描述】:

我希望能够将我创建的这个形状的最左边的 3 个角弄圆,知道怎么做吗?

div 
  position: absolute;
  z-index: 1;
  width: 423px;
  height: 90px;
  background-color: #b0102d;
  color: white;
  right: 0;
  margin-top: 10vw;
  -webkit-clip-path: polygon(100% 0%, 100% 50%, 100% 100%, 25% 100%, 0% 50%, 25% 0%);
  clip-path: polygon(100% 0%, 100% 50%, 100% 100%, 25% 100%, 0% 50%, 25% 0%);
<div></div>

【问题讨论】:

bennettfeely.com/clippy 是的,这就是我用来制作形状的方法,但我只是不知道如何圆角。有什么想法吗? 你必须走我怀疑的 SVG 剪辑路径路线。我不认为polygon 支持曲线。 - sarasoueidan.com/blog/css-svg-clipping @Paulie_D 是正确的。 CSS only clip-path 仅支持基本形状(如多边形、圆形)。它不支持形状或路径的组合,您必须为此使用 SVG(内联或外部)。 对于后来的读者,回答标题中的问题:在Clippy中注意您在inset()中有圆角边框选项:clip-path: inset(0 0 0 0 round 10%); 【参考方案1】:

是的,我没有评论选项,所以我写它作为答案..

你需要写尽可能多的点来绕过拐角。别的没... 例如,再多几个点使下半部分更圆:

-webkit-clip-path: polygon(100% 0%, 100% 100%, 100% 100%, 25% 100%, 5% 70%,1% 60%, 0% 50%, 25% 0%);

哦,是的,或者 SVG 作为评论人在这里.. :)

【讨论】:

【参考方案2】:

你也可以把圆圈弄乱,得到一些不同的效果。

-webkit-clip-path: circle(60.0% at 50% 10%);
clip-path: circle(50.0% at 50% 50%);

Codepen

太糟糕了,你不能把多边形和圆结合起来……或者你可以,但我还没有玩够它来弄明白。高温

【讨论】:

【参考方案3】:

我最近发现尝试使用这种方法取得了成功...

SVG

<svg  >
  <defs>
    <clipPath id="clipped">
      <circle cx="var(--myRad)" cy="var(--myRad)" r="var(--myRad)"></circle>
      <circle cx="var(--myRad)" cy="calc(var(--myHeight) - var(--myRad))" r="var(--myRad)"></circle>
      <circle cx="calc(var(--myWidth) - var(--myRad))" cy="calc(var(--myHeight) - var(--myRad))" r="var(--myRad)"></circle>
      <circle cx="calc(var(--myWidth) - var(--myRad))" cy="var(--myRad)" r="var(--myRad)"></circle>
      <rect y="var(--myRad)"  ></rect>
      <rect x="var(--myRad)"  ></rect>
    </clipPath>
  </defs>
</svg>

CSS

.clipped 
  --myWidth: 100vw;
  --myHeight: 10rem;
  --myRad: 2rem;
  clip-path: url(#clipped);

与使用设置为隐藏的溢出的边界半径相比,我发现这很有用,因为这种方法不会创建 BFC 或破坏诸如粘性位置和 css 透视效果之类的东西。此外,这允许您“插入” svg 路径的位置,以便根据需要使用“角半径”剪辑元素内部。

【讨论】:

你能寄支笔吗? @ElvioCavalcante 没有完全减少,但在铬浏览器中尝试,并为其他人添加前缀属性,您可以看到值是如何在这个小提琴和我的原始答案示例之间派生的。 jsfiddle.net/y7heo6md/1 对于那些错过上面@antoni 评论的人来说,我在这里的回答是有效地做与使用带有round 选项的 inset() 方法相同的事情。与 clip-path: inset(0 round 2rem) 类似,但请记住,浏览器并不总是支持 round 选项,因此请逐步增强或仅使用此 SVG 方法来兼容。【参考方案4】:

您可以使用子元素并在该元素和子元素的伪元素上嵌套clip-path。父级将首先在形状上做一个polygon 剪辑,然后伪将有一个ellipse 来环绕边框。剪辑将具有组合效果。

.parent, .parent div, .parent div:before 
  width: 423px;
  height: 90px;
  position: absolute;


.parent 
  right: 0;
  background-image: linear-gradient(to right, transparent 210px, #b0102d 210px);
  margin-top: 15vh;


.parent div 
  clip-path: polygon(100% 0%, 100% 100%, 25% 100%, 0 50%, 25% 0);


.parent div:before 
  content: "";
  background-color: #b0102d;
  clip-path: ellipse(200px 45px at 210px);
<div class="parent">
  <div></div>
</div>

以下是演示,其中包含一些修改以说明正在发生的事情:

.parent, .parent div, .parent div:before 
  width: 423px;
  height: 90px;
  position: absolute;


.parent 
  right: 0;
  background-image: linear-gradient(to right, transparent 210px, yellow 210px);
  margin-top: 15vh;


.parent div 
  background-color: blue;
  clip-path: polygon(90% 0%, 90% 100%, 25% 100%, 0 50%, 25% 0);


.parent div:before 
  content: "";
  background-color: #b0102d;
  clip-path: ellipse(200px 45px at 210px);
<div class="parent">
  <div></div>
</div>

椭圆的水平大小和位置可用于在边缘上获得不同的效果。请注意,父项的背景起始位置需要调整为与椭圆的位置相同的值(clip-path 中的最后一个值),因为它会填充右侧被剪掉的任何内容。这可以通过在第二个演示中从 .parent div 中删除 background-color: blue 来可视化。

Here 是一个额外的 Codepen 来试用它。

【讨论】:

【参考方案5】:

剪辑路径:插入(45% 0% 33% 10% 圆形 10px)

【讨论】:

【参考方案6】:

SVG 过滤器可以对任何类型的clip-path 进行舍入。您只需将其应用于父元素。调整stdDeviation控制半径:

.box 
  width: 423px;
  height: 90px;
  background-color: #b0102d;
  color: white;
  clip-path: polygon(100% 0%, 100% 50%, 100% 100%, 25% 100%, 0% 50%, 25% 0%);


.parent 
  filter: url('#goo');
  overflow:hidden;
  position: fixed;
  right:-50px;
  z-index: 1;
  margin-top: 10vw;
<div class="parent">
  <div class="box"></div>
</div>

<svg style="visibility: hidden; position: absolute;"   xmlns="http://www.w3.org/2000/svg" version="1.1">
  <defs>
        <filter id="goo"><feGaussianBlur in="SourceGraphic" stdDeviation="8" result="blur" />    
            <feColorMatrix in="blur" mode="matrix" values="1 0 0 0 0  0 1 0 0 0  0 0 1 0 0  0 0 0 19 -9" result="goo" />
            <feComposite in="SourceGraphic" in2="goo" operator="atop"/>
        </filter>
    </defs>
</svg>

相关:https://***.com/a/65485455/8620333

【讨论】:

【参考方案7】:

使用带有圆形属性的插图:

inset(0% 45% 0% 45% round 10px)

【讨论】:

太棒了!谢谢!

以上是关于使用 CSS 剪辑路径时如何圆角的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 CSS 在两个图像之间创建剪辑路径 [关闭]

当引用为 css 剪辑路径属性时,SVG 剪辑路径的位置不正确

css 剪辑路径形状不适用于 ie 或者我如何使用 css 创建它

创建反向剪辑路径 - CSS 或 SVG

css 剪辑路径: url ();不适用于 svg 文件源

创建一个反向剪辑路径 - CSS或SVG