{"id":1021,"date":"2024-02-29T09:04:12","date_gmt":"2024-02-29T15:04:12","guid":{"rendered":"https:\/\/frontendmasters.com\/blog\/?p=1021"},"modified":"2024-10-30T20:21:57","modified_gmt":"2024-10-31T01:21:57","slug":"creating-flower-shapes-using-css-mask-trigonometric-functions","status":"publish","type":"post","link":"https:\/\/frontendmasters.com\/blog\/creating-flower-shapes-using-css-mask-trigonometric-functions\/","title":{"rendered":"Creating Flower Shapes using CSS Mask &amp; Trigonometric Functions"},"content":{"rendered":"\n<p>Creating unusual shapes is always a fun exercise and a good way to practice your CSS skills. One might argue that SVG is better for this job, but nowadays we have a lot of new CSS tricks that allow us to create shapes with a clean and optimized code. Through this two-article series, we will explore what can be done with CSS nowadays.<\/p>\n\n\n<div class=\"box article-series\">\n  <header>\n    <h3 class=\"article-series-header\">Article Series<\/h3>\n  <\/header>\n  <div class=\"box-content\">\n            <ol>\n                      <li>\n              <a href=\"https:\/\/frontendmasters.com\/blog\/creating-flower-shapes-using-css-mask-trigonometric-functions\/\">Creating Flower Shapes using CSS Mask &amp; Trigonometric Functions<\/a>\n            <\/li>\n                      <li>\n              <a href=\"https:\/\/frontendmasters.com\/blog\/creating-wavy-circles-with-fancy-animations\/\">Creating Wavy Circles with Fancy Animations in CSS<\/a>\n            <\/li>\n                  <\/ol>\n        <\/div>\n<\/div>\n\n\n\n<p>In this article, we are going to create flower-like shapes. We are going to rely on modern features like mask, trigonometric functions, CSS variables, etc.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"749\" height=\"448\" src=\"https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/emMTHfAN.png?resize=749%2C448&#038;ssl=1\" alt=\"four flower-like shapes with purple to pink gradients. two of them have petals and two of them have spikes. two of them are filled and two of them are outlined.\" class=\"wp-image-1022\" srcset=\"https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/emMTHfAN.png?w=749&amp;ssl=1 749w, https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/emMTHfAN.png?resize=300%2C179&amp;ssl=1 300w\" sizes=\"auto, (max-width: 749px) 100vw, 749px\" \/><\/figure>\n\n\n\n<p>Before we start, you can take a look at <a href=\"https:\/\/css-generators.com\/flower-shapes\/\" target=\"_blank\" rel=\"noreferrer noopener\">my online generator for flower shapes<\/a> to get an overview of what we are building here. You can easily define your settings and get the CSS code in no time. Some of the code we will be writing can be complex so it\u2019s always good to have a generator to make our life easy. That said I invite you to keep reading to understand the logic behind the code you are copying and be able to tweak it if needed.&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The Geometry of A Flower Shape<\/h2>\n\n\n\n<p>The structure of the flower shape can be seen as small circles placed around a bigger one.&nbsp;<\/p>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;69e1962717ab2&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"69e1962717ab2\" class=\"wp-block-image size-full wp-lightbox-container\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"775\" height=\"338\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/JrgVmGSG.png?resize=775%2C338&#038;ssl=1\" alt=\"final shape showing it is built from one large circle and many smaller ones.\" class=\"wp-image-1023\" srcset=\"https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/JrgVmGSG.png?w=775&amp;ssl=1 775w, https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/JrgVmGSG.png?resize=300%2C131&amp;ssl=1 300w, https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/JrgVmGSG.png?resize=768%2C335&amp;ssl=1 768w\" sizes=\"auto, (max-width: 775px) 100vw, 775px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\taria-label=\"Enlarge\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.imageButtonRight\"\n\t\t\tdata-wp-style--top=\"state.imageButtonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure>\n\n\n\n<p>Consider that the small circles touch each other without overlapping each other. This will make the calculation a bit challenging as we will need accurate formulas. Turns out this is a perfect use case for trigonometric functions in CSS.<\/p>\n\n\n\n<p>The shape can be controlled using 2 variables; the number of small circles (<code>N<\/code>) and their radius (<code>R<\/code>). From there we can identify the size of the whole shape and the radius of the big circle.<\/p>\n\n\n\n<p>Here is a figure to illustrate some of the values and from where we can extract the different formulas.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"587\" height=\"425\" src=\"https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/s_8902C59F87FE310188B36E4009897C666C3E33E25BC1C2DF285794D452BA158A_1708953029181_image.png?resize=587%2C425&#038;ssl=1\" alt=\"geometry of the circles showing the radius comparisons. \" class=\"wp-image-1025\" srcset=\"https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/s_8902C59F87FE310188B36E4009897C666C3E33E25BC1C2DF285794D452BA158A_1708953029181_image.png?w=587&amp;ssl=1 587w, https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/s_8902C59F87FE310188B36E4009897C666C3E33E25BC1C2DF285794D452BA158A_1708953029181_image.png?resize=300%2C217&amp;ssl=1 300w\" sizes=\"auto, (max-width: 587px) 100vw, 587px\" \/><\/figure>\n\n\n\n<p>I won\u2019t start a boring geometry course so I will jump straight to the formulas we need to use. The size of the element is equal to<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\">2 * (<span class=\"hljs-selector-tag\">X<\/span> + <span class=\"hljs-selector-tag\">R<\/span>) = 2 * (<span class=\"hljs-selector-tag\">R<\/span>\/<span class=\"hljs-selector-tag\">sin<\/span>(180<span class=\"hljs-selector-tag\">deg<\/span>\/<span class=\"hljs-selector-tag\">N<\/span>) + <span class=\"hljs-selector-tag\">R<\/span>) = 2 * <span class=\"hljs-selector-tag\">R<\/span> * (1 + 1\/<span class=\"hljs-selector-tag\">sin<\/span>(180<span class=\"hljs-selector-tag\">deg<\/span>\/<span class=\"hljs-selector-tag\">N<\/span>))<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>and the radius of the big circle is equal to<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">C<\/span>  = <span class=\"hljs-selector-tag\">R<\/span>\/<span class=\"hljs-selector-tag\">tan<\/span>(180<span class=\"hljs-selector-tag\">deg<\/span>\/<span class=\"hljs-selector-tag\">N<\/span>)<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>We have all that we need to start writing some code.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Coding The Shape<\/h2>\n\n\n\n<p>The main challenge is to rely on a single element. We are not going to consider a complex HTML structure where each circle is a different element. Instead, we will only use <em>one<\/em> element (and no pseudo-elements either!)<\/p>\n\n\n\n<p>I mentioned <code>mask<\/code>, we&#8217;ll be using that, and gradients will allow us to do the shape drawing we want to do. Since it\u2019s all about circles we are going to use <code>radial-gradient()<\/code>. We will also use a bit of Sass (for the looping feature) to control the number of circles. The number of gradients will depend on the number of circles and with Sass we can write a loop to generate the needed gradients.<\/p>\n\n\n\n<p>Let\u2019s start by setting the different variables and the shape size:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\">$<span class=\"hljs-selector-tag\">n<\/span>: 12; <span class=\"hljs-comment\">\/* the number of circles\/petals *\/<\/span>\n\n<span class=\"hljs-selector-class\">.flower<\/span> {\n  <span class=\"hljs-attribute\">--r<\/span>: <span class=\"hljs-number\">30px<\/span>; <span class=\"hljs-comment\">\/* the radius of the small circles *\/<\/span>\n  <span class=\"hljs-attribute\">width<\/span>: <span class=\"hljs-built_in\">calc<\/span>(<span class=\"hljs-number\">2<\/span>*var(--r)*(<span class=\"hljs-number\">1<\/span> + <span class=\"hljs-number\">1<\/span>\/<span class=\"hljs-built_in\">sin<\/span>(<span class=\"hljs-number\">180deg<\/span>\/#{$n})));\n  <span class=\"hljs-attribute\">aspect-ratio<\/span>: <span class=\"hljs-number\">1<\/span>;\n  <span class=\"hljs-attribute\">mask<\/span>: <span class=\"hljs-built_in\">radial-gradient<\/span>(#<span class=\"hljs-number\">000<\/span> calc(var(--r)\/<span class=\"hljs-built_in\">tan<\/span>(<span class=\"hljs-number\">180deg<\/span>\/#{$n})),<span class=\"hljs-number\">#0000<\/span> <span class=\"hljs-number\">0<\/span>);\n  <span class=\"hljs-attribute\">background<\/span>: <span class=\"hljs-comment\">\/* you background coloration *\/<\/span>\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Nothing fancy so far, we simply translated the previous formulas using code. I also added the big circle so all that we are missing is the small ones. The Sass code to generate them will look like this:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"SCSS\" data-shcb-language-slug=\"scss\"><span><code class=\"hljs language-scss\"><span class=\"hljs-variable\">$m<\/span>: (); <span class=\"hljs-comment\">\/* empty variable *\/<\/span>\n<span class=\"hljs-keyword\">@for<\/span> <span class=\"hljs-variable\">$i<\/span> from <span class=\"hljs-number\">1<\/span> through (<span class=\"hljs-variable\">$n<\/span>) { <span class=\"hljs-comment\">\/* loop through the number of circles*\/<\/span>\n  <span class=\"hljs-variable\">$m<\/span>: append(<span class=\"hljs-variable\">$m<\/span>, \n    radial-gradient(<span class=\"hljs-number\">50%<\/span> <span class=\"hljs-number\">50%<\/span>,<span class=\"hljs-number\">#000<\/span> <span class=\"hljs-number\">100%<\/span>,<span class=\"hljs-number\">#0000<\/span>) no-repeat\n    x y \/ calc(<span class=\"hljs-number\">2<\/span>*var(--r)) calc(<span class=\"hljs-number\">2<\/span>*var(--r)), \n  comma);\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">SCSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">scss<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p><code>--r<\/code> defines the radius so the size of each gradient will be equal to <code>calc(2*var(--r))<\/code>. Then we need to identify the position of each gradient (the <code>x y<\/code>).<\/p>\n\n\n\n<p>Here as well, we need to consider some geometry formulas<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"SCSS\" data-shcb-language-slug=\"scss\"><span><code class=\"hljs language-scss\">x = calc(50% + 50%*cos(360deg*#{<span class=\"hljs-variable\">$i<\/span>\/<span class=\"hljs-variable\">$n<\/span>})) \ny = calc(50% + 50%*sin(360deg*#{<span class=\"hljs-variable\">$i<\/span>\/<span class=\"hljs-variable\">$n<\/span>}))<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">SCSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">scss<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>The final code will be:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"SCSS\" data-shcb-language-slug=\"scss\"><span><code class=\"hljs language-scss\"><span class=\"hljs-variable\">$n<\/span>: <span class=\"hljs-number\">6<\/span>; <span class=\"hljs-comment\">\/* the number of circles\/petals *\/<\/span>\n\n<span class=\"hljs-selector-class\">.flower<\/span> {\n  --r: <span class=\"hljs-number\">30px<\/span>; <span class=\"hljs-comment\">\/* the radius of the small circles *\/<\/span>\n  <span class=\"hljs-attribute\">width<\/span>: calc(<span class=\"hljs-number\">2<\/span>*var(--r)*(<span class=\"hljs-number\">1<\/span> + <span class=\"hljs-number\">1<\/span>\/sin(<span class=\"hljs-number\">180deg<\/span>\/#{<span class=\"hljs-variable\">$n<\/span>})));\n  aspect-ratio: <span class=\"hljs-number\">1<\/span>;\n  <span class=\"hljs-variable\">$m<\/span>: (); <span class=\"hljs-comment\">\/* empty variable *\/<\/span>\n  <span class=\"hljs-keyword\">@for<\/span> <span class=\"hljs-variable\">$i<\/span> from <span class=\"hljs-number\">1<\/span> through (<span class=\"hljs-variable\">$n<\/span>) { <span class=\"hljs-comment\">\/* loop through the number of circles*\/<\/span>\n    <span class=\"hljs-variable\">$m<\/span>: append(<span class=\"hljs-variable\">$m<\/span>, \n      radial-gradient(<span class=\"hljs-number\">50%<\/span> <span class=\"hljs-number\">50%<\/span>,<span class=\"hljs-number\">#000<\/span> <span class=\"hljs-number\">100%<\/span>,<span class=\"hljs-number\">#0000<\/span>) no-repeat\n      calc(<span class=\"hljs-number\">50%<\/span> + <span class=\"hljs-number\">50%<\/span>*cos(<span class=\"hljs-number\">360deg<\/span>*#{<span class=\"hljs-variable\">$i<\/span>\/<span class=\"hljs-variable\">$n<\/span>})) \n      calc(<span class=\"hljs-number\">50%<\/span> + <span class=\"hljs-number\">50%<\/span>*sin(<span class=\"hljs-number\">360deg<\/span>*#{<span class=\"hljs-variable\">$i<\/span>\/<span class=\"hljs-variable\">$n<\/span>}))\n     \/ calc(<span class=\"hljs-number\">2<\/span>*var(--r)) calc(<span class=\"hljs-number\">2<\/span>*var(--r)), \n    comma);\n  }\n  <span class=\"hljs-attribute\">mask<\/span>: radial-gradient(<span class=\"hljs-number\">#000<\/span> calc(var(--r)\/tan(<span class=\"hljs-number\">180deg<\/span>\/#{<span class=\"hljs-variable\">$n<\/span>})),<span class=\"hljs-number\">#0000<\/span> <span class=\"hljs-number\">0<\/span>),{<span class=\"hljs-variable\">$m<\/span>};\n  <span class=\"hljs-attribute\">background<\/span>: \/* you background coloration *\/\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">SCSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">scss<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Note how the <code>mask<\/code> property takes the value generated using Sass in addition to the gradient that creates the big circle.<\/p>\n\n\n\n<p>Our shape is done!<\/p>\n\n\n\n<div class=\"wp-block-cp-codepen-gutenberg-embed-block cp_embed_wrapper\"><iframe id=\"cp_embed_NWJQYNx\/513f5200c53b77bcbb926113b10e6edc\" src=\"\/\/codepen.io\/anon\/embed\/NWJQYNx\/513f5200c53b77bcbb926113b10e6edc?height=450&amp;theme-id=47434&amp;slug-hash=NWJQYNx\/513f5200c53b77bcbb926113b10e6edc&amp;default-tab=result\" height=\"450\" scrolling=\"no\" frameborder=\"0\" allowfullscreen allowpaymentrequest name=\"CodePen Embed NWJQYNx\/513f5200c53b77bcbb926113b10e6edc\" title=\"CodePen Embed NWJQYNx\/513f5200c53b77bcbb926113b10e6edc\" class=\"cp_embed_iframe\" style=\"width:100%;overflow:hidden\">CodePen Embed Fallback<\/iframe><\/div>\n\n\n\n<p>The size of the shape is controlled by the radius of the small circles but we can do the opposite which is probably more convenient since we generally want to control the width\/height of our element.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-class\">.flower<\/span> {\n  <span class=\"hljs-attribute\">--w<\/span>: <span class=\"hljs-number\">200px<\/span>; <span class=\"hljs-comment\">\/* the size *\/<\/span>\n  <span class=\"hljs-attribute\">--r<\/span>: <span class=\"hljs-built_in\">calc<\/span>(var(--w)\/(<span class=\"hljs-number\">2<\/span>*(<span class=\"hljs-number\">1<\/span> + <span class=\"hljs-number\">1<\/span>\/<span class=\"hljs-built_in\">sin<\/span>(<span class=\"hljs-number\">180deg<\/span>\/#{$n}))));\n  <span class=\"hljs-attribute\">width<\/span>: <span class=\"hljs-built_in\">var<\/span>(--w);\n  <span class=\"hljs-comment\">\/* same as before *\/<\/span>\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<div class=\"wp-block-cp-codepen-gutenberg-embed-block cp_embed_wrapper\"><iframe id=\"cp_embed_VwRoXPR\/11e3574a0918d6914814ed4f5fda79a1\" src=\"\/\/codepen.io\/anon\/embed\/VwRoXPR\/11e3574a0918d6914814ed4f5fda79a1?height=450&amp;theme-id=47434&amp;slug-hash=VwRoXPR\/11e3574a0918d6914814ed4f5fda79a1&amp;default-tab=result\" height=\"450\" scrolling=\"no\" frameborder=\"0\" allowfullscreen allowpaymentrequest name=\"CodePen Embed VwRoXPR\/11e3574a0918d6914814ed4f5fda79a1\" title=\"CodePen Embed VwRoXPR\/11e3574a0918d6914814ed4f5fda79a1\" class=\"cp_embed_iframe\" style=\"width:100%;overflow:hidden\">CodePen Embed Fallback<\/iframe><\/div>\n\n\n\n<p>We can even optimize the previous code a little and get rid the of <code>--w<\/code> variable. The latter is defining the width\/height of the element and gradients can access such value using percentages we can write the code like below:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"SCSS\" data-shcb-language-slug=\"scss\"><span><code class=\"hljs language-scss\"><span class=\"hljs-variable\">$n<\/span>: <span class=\"hljs-number\">12<\/span>; <span class=\"hljs-comment\">\/* the number of circles\/petals *\/<\/span>\n\n<span class=\"hljs-selector-class\">.flower<\/span> {  \n  <span class=\"hljs-attribute\">width<\/span>: <span class=\"hljs-number\">300px<\/span>; <span class=\"hljs-comment\">\/* the size *\/<\/span>\n  --r: calc(<span class=\"hljs-number\">50%<\/span>\/(<span class=\"hljs-number\">1<\/span> + <span class=\"hljs-number\">1<\/span>\/sin(<span class=\"hljs-number\">180deg<\/span>\/#{<span class=\"hljs-variable\">$n<\/span>}))); <span class=\"hljs-comment\">\/* using percentage instead of --w *\/<\/span>\n  aspect-ratio: <span class=\"hljs-number\">1<\/span>;\n  <span class=\"hljs-variable\">$m<\/span>: (); <span class=\"hljs-comment\">\/* empty variable *\/<\/span>\n  <span class=\"hljs-keyword\">@for<\/span> <span class=\"hljs-variable\">$i<\/span> from <span class=\"hljs-number\">1<\/span> through (<span class=\"hljs-variable\">$n<\/span>) { <span class=\"hljs-comment\">\/* loop through the number of circles*\/<\/span>\n    <span class=\"hljs-variable\">$m<\/span>: append(<span class=\"hljs-variable\">$m<\/span>, \n      radial-gradient(<span class=\"hljs-number\">50%<\/span> <span class=\"hljs-number\">50%<\/span>,<span class=\"hljs-number\">#000<\/span> <span class=\"hljs-number\">100%<\/span>,<span class=\"hljs-number\">#0000<\/span>) no-repeat\n      calc(<span class=\"hljs-number\">50%<\/span> + <span class=\"hljs-number\">50%<\/span>*cos(<span class=\"hljs-number\">360deg<\/span>*#{<span class=\"hljs-variable\">$i<\/span>\/<span class=\"hljs-variable\">$n<\/span>})) \n      calc(<span class=\"hljs-number\">50%<\/span> + <span class=\"hljs-number\">50%<\/span>*sin(<span class=\"hljs-number\">360deg<\/span>*#{<span class=\"hljs-variable\">$i<\/span>\/<span class=\"hljs-variable\">$n<\/span>}))\n     \/ calc(<span class=\"hljs-number\">2<\/span>*var(--r)) calc(<span class=\"hljs-number\">2<\/span>*var(--r)), \n    comma);\n  }\n  <span class=\"hljs-attribute\">mask<\/span>: radial-gradient(<span class=\"hljs-number\">100%<\/span> <span class=\"hljs-number\">100%<\/span>,<span class=\"hljs-number\">#000<\/span> calc(var(--r)\/tan(<span class=\"hljs-number\">180deg<\/span>\/#{<span class=\"hljs-variable\">$n<\/span>})),<span class=\"hljs-number\">#0000<\/span> <span class=\"hljs-number\">0<\/span>),#{<span class=\"hljs-variable\">$m<\/span>};\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">SCSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">scss<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Now by adjusting the width you control the size of the whole shape. Here is an interactive demo where you can resize the element and see how the shape adjusts automatically. Try it below with the resizer handle on the bottom right of the box:<\/p>\n\n\n\n<div class=\"wp-block-cp-codepen-gutenberg-embed-block cp_embed_wrapper\"><iframe id=\"cp_embed_abMeGEb\/c0564ba633690740770ba382e7d53d5c\" src=\"\/\/codepen.io\/anon\/embed\/abMeGEb\/c0564ba633690740770ba382e7d53d5c?height=450&amp;theme-id=47434&amp;slug-hash=abMeGEb\/c0564ba633690740770ba382e7d53d5c&amp;default-tab=result\" height=\"450\" scrolling=\"no\" frameborder=\"0\" allowfullscreen allowpaymentrequest name=\"CodePen Embed abMeGEb\/c0564ba633690740770ba382e7d53d5c\" title=\"CodePen Embed abMeGEb\/c0564ba633690740770ba382e7d53d5c\" class=\"cp_embed_iframe\" style=\"width:100%;overflow:hidden\">CodePen Embed Fallback<\/iframe><\/div>\n\n\n\n<p>Voil\u00e0! We did a nice flower shape without hack or complex code and you can easily control it by adjusting a few variables. You either use the above code or you consider <a href=\"https:\/\/css-generators.com\/flower-shapes\/\">my online generator<\/a> to get the generated CSS without the variables and Sass.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Inverting the shape<\/h2>\n\n\n\n<p>Let\u2019s try a different shape this time. It\u2019s somehow the invert of the previous one where the circular part is going inside instead of outside. Well, a figure worth a thousand words.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"411\" height=\"404\" src=\"https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/s_8902C59F87FE310188B36E4009897C666C3E33E25BC1C2DF285794D452BA158A_1708960190302_image.png?resize=411%2C404&#038;ssl=1\" alt=\"spiky flower shape with purple to orange coloring\" class=\"wp-image-1029\" srcset=\"https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/s_8902C59F87FE310188B36E4009897C666C3E33E25BC1C2DF285794D452BA158A_1708960190302_image.png?w=411&amp;ssl=1 411w, https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/s_8902C59F87FE310188B36E4009897C666C3E33E25BC1C2DF285794D452BA158A_1708960190302_image.png?resize=300%2C295&amp;ssl=1 300w\" sizes=\"auto, (max-width: 411px) 100vw, 411px\" \/><\/figure>\n\n\n\n<p>\u200b\u200bThe code to get the above shape is the same as the previous one, but we are going to introduce\u00a0<code>mask-composite<\/code>\u200b. The idea is to cut the small circles from the bigger one which translates to a\u00a0\u201csubtract\u201d\u00a0composition.<\/p>\n\n\n\n<p>Here is a figure to illustrate the process:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"611\" height=\"487\" src=\"https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/AzkwW2ZD.png?resize=611%2C487&#038;ssl=1\" alt=\"\" class=\"wp-image-4289\" srcset=\"https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/AzkwW2ZD.png?w=611&amp;ssl=1 611w, https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/AzkwW2ZD.png?resize=300%2C239&amp;ssl=1 300w\" sizes=\"auto, (max-width: 611px) 100vw, 611px\" \/><\/figure>\n\n\n\n<p>The code of mask will look like this:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\">\n<span class=\"hljs-selector-tag\">mask<\/span>: \n <span class=\"hljs-selector-tag\">radial-gradient<\/span>(100% 100%,<span class=\"hljs-selector-id\">#000<\/span> <span class=\"hljs-selector-tag\">calc<\/span>(<span class=\"hljs-selector-tag\">var<\/span>(<span class=\"hljs-selector-tag\">--r<\/span>)\/<span class=\"hljs-selector-tag\">tan<\/span>(180<span class=\"hljs-selector-tag\">deg<\/span>\/#{$n})),<span class=\"hljs-selector-id\">#0000<\/span> 0) <span class=\"hljs-selector-tag\">subtract<\/span>,\n #{$m};<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>And here is the one of the previous shape to compare both:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\">\n<span class=\"hljs-selector-tag\">mask<\/span>: \n <span class=\"hljs-selector-tag\">radial-gradient<\/span>(100% 100%,<span class=\"hljs-selector-id\">#000<\/span> <span class=\"hljs-selector-tag\">calc<\/span>(<span class=\"hljs-selector-tag\">var<\/span>(<span class=\"hljs-selector-tag\">--r<\/span>)\/<span class=\"hljs-selector-tag\">tan<\/span>(180<span class=\"hljs-selector-tag\">deg<\/span>\/#{$n})),<span class=\"hljs-selector-id\">#0000<\/span> 0),\n #{$m};<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>The only difference is the value of composition \u201csubtract\u201d. And since the remaining code is also the same, we can introduce a variable to control which one to use:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\">\n$<span class=\"hljs-selector-tag\">n<\/span>: 12; <span class=\"hljs-comment\">\/* the number of circles\/petals *\/<\/span>\n\n<span class=\"hljs-selector-class\">.flower<\/span> {\n  <span class=\"hljs-attribute\">width<\/span>: <span class=\"hljs-number\">300px<\/span>;\n  <span class=\"hljs-attribute\">aspect-ratio<\/span>: <span class=\"hljs-number\">1<\/span>;\n  <span class=\"hljs-attribute\">--r<\/span>: <span class=\"hljs-built_in\">calc<\/span>(<span class=\"hljs-number\">50%<\/span>\/(<span class=\"hljs-number\">1<\/span> + <span class=\"hljs-number\">1<\/span>\/sin(<span class=\"hljs-number\">180deg<\/span>\/#{$n})));\n  $<span class=\"hljs-attribute\">m<\/span>: (); <span class=\"hljs-comment\">\/* empty variable *\/<\/span>\n  @for $i from 1 through ($n) { <span class=\"hljs-comment\">\/* loop through the number of circles*\/<\/span>\n    $<span class=\"hljs-attribute\">m<\/span>: <span class=\"hljs-built_in\">append<\/span>($m, \n      radial-gradient(<span class=\"hljs-number\">50%<\/span> <span class=\"hljs-number\">50%<\/span>,#<span class=\"hljs-number\">000<\/span> <span class=\"hljs-number\">100%<\/span>,#<span class=\"hljs-number\">0000<\/span>) no-repeat\n      <span class=\"hljs-built_in\">calc<\/span>(<span class=\"hljs-number\">50%<\/span> + <span class=\"hljs-number\">50%<\/span>*cos(<span class=\"hljs-number\">360deg<\/span>*#{$i\/$n})) \n      <span class=\"hljs-built_in\">calc<\/span>(<span class=\"hljs-number\">50%<\/span> + <span class=\"hljs-number\">50%<\/span>*sin(<span class=\"hljs-number\">360deg<\/span>*#{$i\/$n}))\n     \/ <span class=\"hljs-built_in\">calc<\/span>(<span class=\"hljs-number\">2<\/span>*var(--r)) <span class=\"hljs-built_in\">calc<\/span>(<span class=\"hljs-number\">2<\/span>*var(--r)), \n    comma);\n  }\n  <span class=\"hljs-selector-tag\">mask<\/span>: <span class=\"hljs-selector-tag\">radial-gradient<\/span>(100% 100%,<span class=\"hljs-selector-id\">#000<\/span> <span class=\"hljs-selector-tag\">calc<\/span>(<span class=\"hljs-selector-tag\">var<\/span>(<span class=\"hljs-selector-tag\">--r<\/span>)\/<span class=\"hljs-selector-tag\">tan<\/span>(180<span class=\"hljs-selector-tag\">deg<\/span>\/#{$n})),<span class=\"hljs-selector-id\">#0000<\/span> 0) <span class=\"hljs-selector-tag\">var<\/span>(<span class=\"hljs-selector-tag\">--alt<\/span>,),#{$m};\n}\n<span class=\"hljs-selector-class\">.alt<\/span> {\n  <span class=\"hljs-attribute\">--alt<\/span>: subtract;\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<div class=\"wp-block-cp-codepen-gutenberg-embed-block cp_embed_wrapper\"><iframe id=\"cp_embed_zYbgaGr\/818d9d2ec7fc205febb42f744f8afce7\" src=\"\/\/codepen.io\/anon\/embed\/zYbgaGr\/818d9d2ec7fc205febb42f744f8afce7?height=450&amp;theme-id=47434&amp;slug-hash=zYbgaGr\/818d9d2ec7fc205febb42f744f8afce7&amp;default-tab=result\" height=\"450\" scrolling=\"no\" frameborder=\"0\" allowfullscreen allowpaymentrequest name=\"CodePen Embed zYbgaGr\/818d9d2ec7fc205febb42f744f8afce7\" title=\"CodePen Embed zYbgaGr\/818d9d2ec7fc205febb42f744f8afce7\" class=\"cp_embed_iframe\" style=\"width:100%;overflow:hidden\">CodePen Embed Fallback<\/iframe><\/div>\n\n\n\n<p>The <code>var(--alt,)<\/code> will default to nothing when the variable is not specified and we get the code of the first shape. By adding the composition value, we get the second shape. Two different shapes with the same code.<\/p>\n\n\n\n<p><strong><em>Why not simply add <code>mask-composite: subtract<\/code>?<\/em><\/strong><\/p>\n\n\n\n<p>This won\u2019t work because it will apply a \u201csubtract\u201d composition between all the gradient layers whereas we want the composition to happen only between the big circle and the small ones. If you want to use <code>mask-composite<\/code> it should have the following value:<\/p>\n\n\n\n<p><code>mask-composite: subtract, add, add, ..., add;<\/code><\/p>\n\n\n\n<p>We perform and \u201cadd\u201d composition between the small circles (the default composition) then we \u201csubtract\u201d the result from the big circle. It\u2019s clear that adding one value inside the shorthand version is easier.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The Border-Only Version<\/h2>\n\n\n\n<p>Now let\u2019s tackle the border-only version of the previous shapes. We are also going to rely on <code>mask-composite<\/code> and the same code structure.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"824\" height=\"364\" src=\"https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/s_8902C59F87FE310188B36E4009897C666C3E33E25BC1C2DF285794D452BA158A_1708987376830_image.png?resize=824%2C364&#038;ssl=1\" alt=\"\" class=\"wp-image-1031\" srcset=\"https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/s_8902C59F87FE310188B36E4009897C666C3E33E25BC1C2DF285794D452BA158A_1708987376830_image.png?w=824&amp;ssl=1 824w, https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/s_8902C59F87FE310188B36E4009897C666C3E33E25BC1C2DF285794D452BA158A_1708987376830_image.png?resize=300%2C133&amp;ssl=1 300w, https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/s_8902C59F87FE310188B36E4009897C666C3E33E25BC1C2DF285794D452BA158A_1708987376830_image.png?resize=768%2C339&amp;ssl=1 768w\" sizes=\"auto, (max-width: 824px) 100vw, 824px\" \/><\/figure>\n\n\n\n<p>First of all, let\u2019s introduce a new variable to control the border thickness and update the code that generates the small circles.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-12\" data-shcb-language-name=\"SCSS\" data-shcb-language-slug=\"scss\"><span><code class=\"hljs language-scss\"><span class=\"hljs-variable\">$n<\/span>: <span class=\"hljs-number\">12<\/span>; <span class=\"hljs-comment\">\/* the number of circles\/petals *\/<\/span>\n\n<span class=\"hljs-selector-class\">.flower<\/span> {\n  --<span class=\"hljs-selector-tag\">b<\/span>: <span class=\"hljs-number\">10px<\/span>; <span class=\"hljs-comment\">\/* the border thickness*\/<\/span>\n\n  <span class=\"hljs-attribute\">width<\/span>: <span class=\"hljs-number\">300px<\/span>;\n  aspect-ratio: <span class=\"hljs-number\">1<\/span>;\n  --r: calc(<span class=\"hljs-number\">50%<\/span>\/(<span class=\"hljs-number\">1<\/span> + <span class=\"hljs-number\">1<\/span>\/sin(<span class=\"hljs-number\">180deg<\/span>\/#{<span class=\"hljs-variable\">$n<\/span>})));\n  <span class=\"hljs-variable\">$m<\/span>: (); <span class=\"hljs-comment\">\/* empty variable *\/<\/span>\n  <span class=\"hljs-keyword\">@for<\/span> <span class=\"hljs-variable\">$i<\/span> from <span class=\"hljs-number\">1<\/span> through (<span class=\"hljs-variable\">$n<\/span>) { <span class=\"hljs-comment\">\/* loop through the number of circles*\/<\/span>\n    <span class=\"hljs-variable\">$m<\/span>: append(<span class=\"hljs-variable\">$m<\/span>, \n      radial-gradient(<span class=\"hljs-number\">50%<\/span> <span class=\"hljs-number\">50%<\/span>,<span class=\"hljs-number\">#0000<\/span> calc(<span class=\"hljs-number\">100%<\/span> - var(--b)),<span class=\"hljs-number\">#000<\/span> <span class=\"hljs-number\">0<\/span> <span class=\"hljs-number\">100%<\/span>,<span class=\"hljs-number\">#0000<\/span>) no-repeat\n      calc(<span class=\"hljs-number\">50%<\/span> + <span class=\"hljs-number\">50%<\/span>*cos(<span class=\"hljs-number\">360deg<\/span>*#{<span class=\"hljs-variable\">$i<\/span>\/<span class=\"hljs-variable\">$n<\/span>})) \n      calc(<span class=\"hljs-number\">50%<\/span> + <span class=\"hljs-number\">50%<\/span>*sin(<span class=\"hljs-number\">360deg<\/span>*#{<span class=\"hljs-variable\">$i<\/span>\/<span class=\"hljs-variable\">$n<\/span>}))\n     \/ calc(<span class=\"hljs-number\">2<\/span>*var(--r)) calc(<span class=\"hljs-number\">2<\/span>*var(--r)), \n    comma);\n  }\n  <span class=\"hljs-attribute\">mask<\/span>: #{<span class=\"hljs-variable\">$m<\/span>};\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-12\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">SCSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">scss<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<div class=\"wp-block-cp-codepen-gutenberg-embed-block cp_embed_wrapper\"><iframe id=\"cp_embed_poYMGpv\/08f0fe38119bd81d51a5723fb09ae871\" src=\"\/\/codepen.io\/anon\/embed\/poYMGpv\/08f0fe38119bd81d51a5723fb09ae871?height=450&amp;theme-id=47434&amp;slug-hash=poYMGpv\/08f0fe38119bd81d51a5723fb09ae871&amp;default-tab=result\" height=\"450\" scrolling=\"no\" frameborder=\"0\" allowfullscreen allowpaymentrequest name=\"CodePen Embed poYMGpv\/08f0fe38119bd81d51a5723fb09ae871\" title=\"CodePen Embed poYMGpv\/08f0fe38119bd81d51a5723fb09ae871\" class=\"cp_embed_iframe\" style=\"width:100%;overflow:hidden\">CodePen Embed Fallback<\/iframe><\/div>\n\n\n\n<p>Nothing complex so far. Instead of full circles, we are getting a border-only version. This time we don\u2019t want them to touch each other but rather overlap a bit to have a continuous shape.<\/p>\n\n\n\n<p>We need to increase the radius a little from this<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-13\" data-shcb-language-name=\"SCSS\" data-shcb-language-slug=\"scss\"><span><code class=\"hljs language-scss\">--r: calc(<span class=\"hljs-number\">50%<\/span>\/(<span class=\"hljs-number\">1<\/span> + <span class=\"hljs-number\">1<\/span>\/sin(<span class=\"hljs-number\">180deg<\/span>\/#{<span class=\"hljs-variable\">$n<\/span>})));<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-13\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">SCSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">scss<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>To this:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-14\" data-shcb-language-name=\"SCSS\" data-shcb-language-slug=\"scss\"><span><code class=\"hljs language-scss\">--r:calc((<span class=\"hljs-number\">50%<\/span> + var(--b)\/(<span class=\"hljs-number\">2<\/span>*sin(<span class=\"hljs-number\">180deg<\/span>\/#{<span class=\"hljs-variable\">$n<\/span>})))\/(<span class=\"hljs-number\">1<\/span> + <span class=\"hljs-number\">1<\/span>\/sin(<span class=\"hljs-number\">180deg<\/span>\/#{<span class=\"hljs-variable\">$n<\/span>})));<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-14\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">SCSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">scss<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Again some geometry stuff but you don\u2019t really need to accurately understand all the formulas. I did the hard work to identify them and you only need to understand the main trick. In the end, all you have to do is update a few variables to control the shape or get the code from <a href=\"https:\/\/css-generators.com\/flower-shapes\/\">my generator<\/a>.<\/p>\n\n\n\n<p>The result so far:<\/p>\n\n\n\n<div class=\"wp-block-cp-codepen-gutenberg-embed-block cp_embed_wrapper\"><iframe id=\"cp_embed_abMeXYW\/0cf2d498efa49c962ff5a6f6a8d19b48\" src=\"\/\/codepen.io\/anon\/embed\/abMeXYW\/0cf2d498efa49c962ff5a6f6a8d19b48?height=450&amp;theme-id=47434&amp;slug-hash=abMeXYW\/0cf2d498efa49c962ff5a6f6a8d19b48&amp;default-tab=result\" height=\"450\" scrolling=\"no\" frameborder=\"0\" allowfullscreen allowpaymentrequest name=\"CodePen Embed abMeXYW\/0cf2d498efa49c962ff5a6f6a8d19b48\" title=\"CodePen Embed abMeXYW\/0cf2d498efa49c962ff5a6f6a8d19b48\" class=\"cp_embed_iframe\" style=\"width:100%;overflow:hidden\">CodePen Embed Fallback<\/iframe><\/div>\n\n\n\n<p>Now, we use <code>mask-composite<\/code> with another gradient to hide some parts and get our final shapes. Here is a figure to illustrate the process for both shapes.<\/p>\n\n\n\n<p>For the first shape:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"564\" height=\"447\" src=\"https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/s_8902C59F87FE310188B36E4009897C666C3E33E25BC1C2DF285794D452BA158A_1708986701525_image.png?resize=564%2C447&#038;ssl=1\" alt=\"\" class=\"wp-image-1032\" srcset=\"https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/s_8902C59F87FE310188B36E4009897C666C3E33E25BC1C2DF285794D452BA158A_1708986701525_image.png?w=564&amp;ssl=1 564w, https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/s_8902C59F87FE310188B36E4009897C666C3E33E25BC1C2DF285794D452BA158A_1708986701525_image.png?resize=300%2C238&amp;ssl=1 300w\" sizes=\"auto, (max-width: 564px) 100vw, 564px\" \/><\/figure>\n\n\n\n<p>And for the second one:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"564\" height=\"447\" src=\"https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/s_8902C59F87FE310188B36E4009897C666C3E33E25BC1C2DF285794D452BA158A_1708986728215_image.png?resize=564%2C447&#038;ssl=1\" alt=\"\" class=\"wp-image-1033\" srcset=\"https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/s_8902C59F87FE310188B36E4009897C666C3E33E25BC1C2DF285794D452BA158A_1708986728215_image.png?w=564&amp;ssl=1 564w, https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/s_8902C59F87FE310188B36E4009897C666C3E33E25BC1C2DF285794D452BA158A_1708986728215_image.png?resize=300%2C238&amp;ssl=1 300w\" sizes=\"auto, (max-width: 564px) 100vw, 564px\" \/><\/figure>\n\n\n\n<p>In both cases, I am introducing an extra gradient that will intersect with the small circles. The difference between each shape is the coloration of the extra gradient. In the first case, we have transparent inside and filling outside and for the second case, we have the opposite.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-15\" data-shcb-language-name=\"SCSS\" data-shcb-language-slug=\"scss\"><span><code class=\"hljs language-scss\"><span class=\"hljs-comment\">\/* first shape *\/<\/span>\n<span class=\"hljs-attribute\">mask<\/span>:\n radial-gradient(<span class=\"hljs-number\">100%<\/span> <span class=\"hljs-number\">100%<\/span>,<span class=\"hljs-number\">#0000<\/span> calc(var(--r)\/tan(<span class=\"hljs-number\">180deg<\/span>\/#{<span class=\"hljs-variable\">$n<\/span>}) - var(--b)\/(<span class=\"hljs-number\">2<\/span>*tan(<span class=\"hljs-number\">180deg<\/span>\/#{<span class=\"hljs-variable\">$n<\/span>}))),<span class=\"hljs-number\">#000<\/span> <span class=\"hljs-number\">0<\/span>) intersect, \n #{<span class=\"hljs-variable\">$m<\/span>};\n<span class=\"hljs-comment\">\/* second shape *\/<\/span>\n<span class=\"hljs-attribute\">mask<\/span>:\n radial-gradient(<span class=\"hljs-number\">100%<\/span> <span class=\"hljs-number\">100%<\/span>,<span class=\"hljs-number\">#000<\/span> calc(var(--r)\/tan(<span class=\"hljs-number\">180deg<\/span>\/#{<span class=\"hljs-variable\">$n<\/span>}) - var(--b)\/(<span class=\"hljs-number\">2<\/span>*tan(<span class=\"hljs-number\">180deg<\/span>\/#{<span class=\"hljs-variable\">$n<\/span>}))),<span class=\"hljs-number\">#0000<\/span> <span class=\"hljs-number\">0<\/span>) intersect, \n #{<span class=\"hljs-variable\">$m<\/span>};\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-15\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">SCSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">scss<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>And here is the full code with both variations:<\/p>\n\n\n\n<div class=\"wp-block-cp-codepen-gutenberg-embed-block cp_embed_wrapper\"><iframe id=\"cp_embed_xxBvBwW\/6783fe97c630a1fc5bea3206fe80af5f\" src=\"\/\/codepen.io\/anon\/embed\/xxBvBwW\/6783fe97c630a1fc5bea3206fe80af5f?height=450&amp;theme-id=47434&amp;slug-hash=xxBvBwW\/6783fe97c630a1fc5bea3206fe80af5f&amp;default-tab=result\" height=\"450\" scrolling=\"no\" frameborder=\"0\" allowfullscreen allowpaymentrequest name=\"CodePen Embed xxBvBwW\/6783fe97c630a1fc5bea3206fe80af5f\" title=\"CodePen Embed xxBvBwW\/6783fe97c630a1fc5bea3206fe80af5f\" class=\"cp_embed_iframe\" style=\"width:100%;overflow:hidden\">CodePen Embed Fallback<\/iframe><\/div>\n\n\n\n<p>If you have some trouble visualizing how <code>mask-composite<\/code> works, I invite you to read <a href=\"https:\/\/css-tricks.com\/mask-compositing-the-crash-course\/\">the crash course written by Ana Tudor<\/a> where you will find a more in-depth exploration.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">One More Shape<\/h2>\n\n\n\n<p>Another flower? Let\u2019s go!<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"749\" height=\"448\" src=\"https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/s_8902C59F87FE310188B36E4009897C666C3E33E25BC1C2DF285794D452BA158A_1709024827938_image.png?resize=749%2C448&#038;ssl=1\" alt=\"blob like shape, sort of like a gear with smoothed over cogs.\" class=\"wp-image-1034\" srcset=\"https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/s_8902C59F87FE310188B36E4009897C666C3E33E25BC1C2DF285794D452BA158A_1709024827938_image.png?w=749&amp;ssl=1 749w, https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/s_8902C59F87FE310188B36E4009897C666C3E33E25BC1C2DF285794D452BA158A_1709024827938_image.png?resize=300%2C179&amp;ssl=1 300w\" sizes=\"auto, (max-width: 749px) 100vw, 749px\" \/><\/figure>\n\n\n\n<p>This time, it\u2019s your turn to figure out the code. Consider this as a small piece of homework to practice what we have learned together. As a hint, here is a figure that illustrates the <code>mask-composite<\/code> you need to perform, or maybe you will figure out another idea! If so don\u2019t hesitate to share it in the comment section<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1001\" height=\"486\" src=\"https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/image.png?resize=1001%2C486&#038;ssl=1\" alt=\"\" class=\"wp-image-4287\" srcset=\"https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/image.png?w=1001&amp;ssl=1 1001w, https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/image.png?resize=300%2C146&amp;ssl=1 300w, https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/image.png?resize=768%2C373&amp;ssl=1 768w\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" \/><\/figure>\n\n\n\n<p>Here is <a href=\"https:\/\/codepen.io\/t_afif\/pen\/JjVPjWZ\/687389c54821a0763e97bb22cbdc6481\">the code of my implementation<\/a> but make a try before checking it so you can compare your method with mine. Take the time to study this last example because it will be the starting point of <a href=\"https:\/\/frontendmasters.com\/blog\/creating-wavy-circles-with-fancy-animations\/\">our second article<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n\n\n\n<p>I hope you enjoyed this little experimentation using CSS mask and trigonometric functions. You are probably not going to use such shapes in a real project but creating them is a good way to learn new features. If you have to remember one thing from this article it\u2019s the use of <code>mask-composite<\/code>. It\u2019s a powerful property that can help you create complex shapes.<\/p>\n\n\n\n<p>It is worth noting that since we are using <code>mask<\/code>, we can easily apply our shape to image elements.<\/p>\n\n\n\n<div class=\"wp-block-cp-codepen-gutenberg-embed-block cp_embed_wrapper\"><iframe id=\"cp_embed_LYvPEeV\/57f34d224701b9ee71efe52d5294be63\" src=\"\/\/codepen.io\/anon\/embed\/LYvPEeV\/57f34d224701b9ee71efe52d5294be63?height=450&amp;theme-id=47434&amp;slug-hash=LYvPEeV\/57f34d224701b9ee71efe52d5294be63&amp;default-tab=result\" height=\"450\" scrolling=\"no\" frameborder=\"0\" allowfullscreen allowpaymentrequest name=\"CodePen Embed LYvPEeV\/57f34d224701b9ee71efe52d5294be63\" title=\"CodePen Embed LYvPEeV\/57f34d224701b9ee71efe52d5294be63\" class=\"cp_embed_iframe\" style=\"width:100%;overflow:hidden\">CodePen Embed Fallback<\/iframe><\/div>\n\n\n\n<p>Don\u2019t forget to bookmark <a href=\"https:\/\/css-generators.com\/flower-shapes\/\">my flower shapes generator<\/a> so you can easily grab the code whenever you need it. I also have more <a href=\"http:\/\/css-generators.com\/\">CSS generators<\/a> that invite you to check. Most of them rely on CSS mask as well and I have a detailed article linked to each one.<\/p>\n\n\n\n<p>I will close this article with a few mesmerizing animations involving some flower shapes.<\/p>\n\n\n\n<div class=\"wp-block-cp-codepen-gutenberg-embed-block cp_embed_wrapper\"><iframe id=\"cp_embed_NWJVdaw\" src=\"\/\/codepen.io\/anon\/embed\/preview\/NWJVdaw?height=450&amp;theme-id=47434&amp;slug-hash=NWJVdaw&amp;default-tab=result\" height=\"450\" scrolling=\"no\" frameborder=\"0\" allowfullscreen allowpaymentrequest name=\"CodePen Embed NWJVdaw\" title=\"CodePen Embed NWJVdaw\" class=\"cp_embed_iframe\" style=\"width:100%;overflow:hidden\">CodePen Embed Fallback<\/iframe><\/div>\n\n\n\n<div class=\"wp-block-cp-codepen-gutenberg-embed-block cp_embed_wrapper\"><iframe id=\"cp_embed_vYPwrPo\" src=\"\/\/codepen.io\/anon\/embed\/preview\/vYPwrPo?height=450&amp;theme-id=47434&amp;slug-hash=vYPwrPo&amp;default-tab=result\" height=\"450\" scrolling=\"no\" frameborder=\"0\" allowfullscreen allowpaymentrequest name=\"CodePen Embed vYPwrPo\" title=\"CodePen Embed vYPwrPo\" class=\"cp_embed_iframe\" style=\"width:100%;overflow:hidden\">CodePen Embed Fallback<\/iframe><\/div>\n\n\n\n<div class=\"wp-block-cp-codepen-gutenberg-embed-block cp_embed_wrapper\"><iframe id=\"cp_embed_BabgjVO\" src=\"\/\/codepen.io\/anon\/embed\/preview\/BabgjVO?height=450&amp;theme-id=47434&amp;slug-hash=BabgjVO&amp;default-tab=result\" height=\"450\" scrolling=\"no\" frameborder=\"0\" allowfullscreen allowpaymentrequest name=\"CodePen Embed BabgjVO\" title=\"CodePen Embed BabgjVO\" class=\"cp_embed_iframe\" style=\"width:100%;overflow:hidden\">CodePen Embed Fallback<\/iframe><\/div>\n\n\n<div class=\"box article-series\">\n  <header>\n    <h3 class=\"article-series-header\">Article Series<\/h3>\n  <\/header>\n  <div class=\"box-content\">\n            <ol>\n                      <li>\n              <a href=\"https:\/\/frontendmasters.com\/blog\/creating-flower-shapes-using-css-mask-trigonometric-functions\/\">Creating Flower Shapes using CSS Mask &amp; Trigonometric Functions<\/a>\n            <\/li>\n                      <li>\n              <a href=\"https:\/\/frontendmasters.com\/blog\/creating-wavy-circles-with-fancy-animations\/\">Creating Wavy Circles with Fancy Animations in CSS<\/a>\n            <\/li>\n                  <\/ol>\n        <\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Creating unusual shapes is always a fun exercise and a good way to practice your CSS skills. One might argue that SVG is better for this job, but nowadays we have a lot of new CSS tricks that allow us to create shapes with a clean and optimized code. Through this two-article series, we will [&hellip;]<\/p>\n","protected":false},"author":12,"featured_media":1038,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"sig_custom_text":"","sig_image_type":"featured-image","sig_custom_image":0,"sig_is_disabled":false,"inline_featured_image":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[1],"tags":[7,117,118],"class_list":["post-1021","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog-post","tag-css","tag-scss","tag-shapes"],"acf":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/flowers-thumb.jpg?fit=1000%2C500&ssl=1","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/frontendmasters.com\/blog\/wp-json\/wp\/v2\/posts\/1021","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/frontendmasters.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/frontendmasters.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/frontendmasters.com\/blog\/wp-json\/wp\/v2\/users\/12"}],"replies":[{"embeddable":true,"href":"https:\/\/frontendmasters.com\/blog\/wp-json\/wp\/v2\/comments?post=1021"}],"version-history":[{"count":11,"href":"https:\/\/frontendmasters.com\/blog\/wp-json\/wp\/v2\/posts\/1021\/revisions"}],"predecessor-version":[{"id":4290,"href":"https:\/\/frontendmasters.com\/blog\/wp-json\/wp\/v2\/posts\/1021\/revisions\/4290"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/frontendmasters.com\/blog\/wp-json\/wp\/v2\/media\/1038"}],"wp:attachment":[{"href":"https:\/\/frontendmasters.com\/blog\/wp-json\/wp\/v2\/media?parent=1021"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/frontendmasters.com\/blog\/wp-json\/wp\/v2\/categories?post=1021"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/frontendmasters.com\/blog\/wp-json\/wp\/v2\/tags?post=1021"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}