Je veux pouvoir arrondir les 3 coins les plus à gauche de cette forme que j'ai créée, une idée de comment cela peut être fait?
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>
J'ai récemment réussi à expérimenter des approches comme celle-ci ...
SVG
<svg width="0" height="0">
<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)" width="var(--myWidth)" height="calc(var(--myHeight) - (2 * var(--myRad)))"></rect>
<rect x="var(--myRad)" width="calc(var(--myWidth) - (2 * var(--myRad)))" height="var(--myHeight)"></rect>
</clipPath>
</defs>
</svg>
CSS
.clipped {
--myWidth: 100vw;
--myHeight: 10rem;
--myRad: 2rem;
clip-path: url(#clipped);
}
J'ai trouvé cela utile par rapport à l'utilisation de border-radius avec un débordement défini sur caché, car cette approche ne crée pas de BFC ou ne casse pas des choses comme la position collante et les effets de perspective css. De plus, cela vous permet "d'insérer" la position des chemins svg à découper à l'intérieur de l'élément avec un "rayon d'angle" si vous le souhaitez.
Vous pouvez également jouer avec le cercle pour obtenir différents effets.
-webkit-clip-path: circle(60.0% at 50% 10%);
clip-path: circle(50.0% at 50% 50%);
Dommage que vous ne puissiez pas combiner le polygone et le cercle ... ou peut-être que vous pouvez et je n'ai pas assez joué avec pour le comprendre. HTH
Je n'ai pas d'option de commentaire oui, donc je l'écris comme réponse ..
vous devez écrire autant de points que possible pour contourner le coin. Rien d'autre ... pour, par exemple, quelques points de plus pour rendre le bit de la partie inférieure plus rond:
-webkit-clip-path: polygon(100% 0%, 100% 100%, 100% 100%, 25% 100%, 5% 70%,1% 60%, 0% 50%, 25% 0%);
oh, oui, ou SVG comme commentaire ici .. :)
Vous pouvez utiliser un élément enfant et faire un clip-path
Imbriqué sur celui-ci et le pseudo-élément de l'enfant. Le parent fera d'abord un clip polygon
sur la forme, puis le pseudo aura un ellipse
pour arrondir les bordures. Les clips auront un effet combiné.
.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>
Voici la démo avec quelques adaptations pour illustrer ce qui se passe:
.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>
La taille horizontale et la position de l'ellipse peuvent être utilisées pour obtenir un effet différent sur les bords. Notez que la position de départ en arrière-plan du parent doit être ajustée à la même valeur que le placement de l'ellipse (dernière valeur dans clip-path
) Car elle remplit tout ce qui est coupé du côté droit. Cela peut être visualisé en supprimant background-color: blue
De .parent div
Dans la deuxième démo.
Ici est un Codepen supplémentaire pour l'essayer.