{"id":8505,"date":"2026-02-09T11:21:12","date_gmt":"2026-02-09T16:21:12","guid":{"rendered":"https:\/\/frontendmasters.com\/blog\/?p=8505"},"modified":"2026-02-09T11:21:13","modified_gmt":"2026-02-09T16:21:13","slug":"background-patterns-with-css-corner-radius","status":"publish","type":"post","link":"https:\/\/frontendmasters.com\/blog\/background-patterns-with-css-corner-radius\/","title":{"rendered":"Background Patterns with CSS `corner-radius`"},"content":{"rendered":"\n<p>The <code>corner-shape<\/code> property in CSS can do some neat designs. <a href=\"https:\/\/frontendmasters.com\/blog\/drawing-css-shapes-using-corner-shape\/\">Things like vintage tickets, with corners trimmed inwards<\/a>, <a href=\"https:\/\/daverupert.com\/2025\/07\/sci-fi-rectangles-with-corner-shape\/\">sci-fi corners<\/a>, tags, and those types of designs are usually comes to mind when we think of the CSS property\u00a0<code>corner-shape<\/code>.<\/p>\n\n\n\n<p>There are a variety of nice primitive keywords we get with <code>corner-shape<\/code>, like <code>round<\/code> (the default), <code>bevel<\/code>, <code>scoop<\/code>, <code>squircle<\/code>, and <a href=\"https:\/\/frontendmasters.com\/blog\/understanding-css-corner-shape-and-the-power-of-the-superellipse\/\">the all-powerful <code>superellipse()<\/code><\/a>. It&#8217;s actually quite easy to create interesting shapes that can be used for more than corner decorations.<\/p>\n\n\n\n<p>Think patterned backgrounds.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"522\" src=\"https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2026\/02\/mgdkr_7X.png?resize=1024%2C522&#038;ssl=1\" alt=\"A grid of various decorative patterns featuring red shapes on a white background, including stars, crosses, and curved designs.\" class=\"wp-image-8507\" srcset=\"https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2026\/02\/mgdkr_7X.png?resize=1024%2C522&amp;ssl=1 1024w, https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2026\/02\/mgdkr_7X.png?resize=300%2C153&amp;ssl=1 300w, https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2026\/02\/mgdkr_7X.png?resize=768%2C392&amp;ssl=1 768w, https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2026\/02\/mgdkr_7X.png?w=1200&amp;ssl=1 1200w\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" \/><\/figure>\n\n\n\n<div class=\"wp-block-group learn-more\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<p><strong>Note<\/strong>: When <code>corner-shape<\/code> isn\u2019t supported by a browser, we can either keep or remove the default rounded corners set by the accompanying <code>border-radius<\/code><em>.<\/em><\/p>\n\n\n\n<p>We can do that with CSS&#8217; <code>@supports<\/code> statements like:<\/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\"><span class=\"hljs-keyword\">@supports<\/span> <span class=\"hljs-keyword\">not<\/span> (<span class=\"hljs-attribute\">corner-shape:<\/span> notch) {\n  <span class=\"hljs-comment\">\/* do something else instead *\/<\/span>\n}<\/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><\/div><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"the-corner-shape-property\">The <code>corner-shape<\/code> Property<\/h2>\n\n\n\n<p>While <code>border-radius<\/code> determines the size of the corner, <code>corner-shape<\/code> specifies its form. Both are needed to get the style. Just as <code>border-radius<\/code>, <code>corner-shape<\/code> affects the borders and shadows of an element.<\/p>\n\n\n\n<p>It is a shorthand for <code>corner-top-left-shape<\/code>, <code>corner-top-right-shape<\/code>, <code>corner-bottom-left-shape<\/code>, and <code>corner-bottom-right-shape<\/code>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"embedding-into-a-background\">Embedding into a Background<\/h2>\n\n\n\n<p>Here&#8217;s the trick! <\/p>\n\n\n\n<p>We can make HTML elements into a <code>background<\/code> by embedding it through SVG as a data URL. Like this:<\/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-class\">.element-with-the-background<\/span> {\n  <span class=\"hljs-attribute\">background<\/span>: <span class=\"hljs-built_in\">url<\/span>(<span class=\"hljs-string\">'data:image\/svg+xml,&lt;svg xmlns=\"http:\/\/www.w3.org\"&gt;&lt;foreignObject width=\"100%\" height=\"100%\"&gt;&lt;div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\"&gt;Styled HTML&lt;\/div&gt;&lt;\/foreignObject&gt;&lt;\/svg&gt;'<\/span>\n}<\/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>The unwrapped SVG part of the URL:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">svg<\/span> <span class=\"hljs-attr\">xmlns<\/span>=<span class=\"hljs-string\">\"http:\/\/www.w3.org\"<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">foreignObject<\/span> <span class=\"hljs-attr\">width<\/span>=<span class=\"hljs-string\">\"100%\"<\/span> <span class=\"hljs-attr\">height<\/span>=<span class=\"hljs-string\">\"100%\"<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span> <span class=\"hljs-attr\">xmlns<\/span>=<span class=\"hljs-string\">\"http:\/\/www.w3.org\/1999\/xhtml\"<\/span>&gt;<\/span>Styled HTML<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">foreignObject<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">svg<\/span>&gt;<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>The trick is to style an element into a desired shape using <code>corner-shape<\/code> and add that markup to a background\u2019s data URL.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"the-shapes\">The Shapes<\/h2>\n\n\n\n<p>Say we want to make a pattern based on a <code>&lt;div><\/code> that has these styles on it:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">background<\/span>: <span class=\"hljs-selector-tag\">red<\/span>;\n<span class=\"hljs-selector-tag\">width<\/span>: 30<span class=\"hljs-selector-tag\">px<\/span>;\n<span class=\"hljs-selector-tag\">aspect-ratio<\/span>: 1;\n<span class=\"hljs-selector-tag\">border-radius<\/span>: 30%;\n<span class=\"hljs-selector-tag\">corner-shape<\/span>: <span class=\"hljs-selector-tag\">superellipse<\/span>(<span class=\"hljs-selector-tag\">-3<\/span>);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><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>To reduce code length in the URL, we&#8217;ll put all those styles as inline styles right onto the <code>&lt;div><\/code> we&#8217;re going to embed into the SVG:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span> <span class=\"hljs-attr\">style<\/span>=<span class=\"hljs-string\">'background:red;width:30px;height:30px;corner-shape:superellipse(-3);border-radius:30%;'<\/span>&gt;<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>All corners get the <code>superellipse(-3)<\/code> style (similar to the scoop design) that are sized by the given border radius of <code>30%<\/code>.<\/p>\n\n\n\n<p>Now to use this styled div within SVG, which we can then use in CSS for a background, we&#8217;ll put it in a <code>background: url()<\/code> function with a Data URL and repeat it with standard CSS properties.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-class\">.pattern<\/span> {\n  <span class=\"hljs-attribute\">width<\/span>: <span class=\"hljs-number\">150px<\/span>;\n  <span class=\"hljs-attribute\">aspect-ratio<\/span>: <span class=\"hljs-number\">1<\/span>;\n  <span class=\"hljs-attribute\">background-size<\/span>: <span class=\"hljs-number\">50px<\/span> <span class=\"hljs-number\">50px<\/span>;\n  <span class=\"hljs-attribute\">background-position<\/span>:left <span class=\"hljs-number\">10px<\/span> top <span class=\"hljs-number\">10px<\/span>;\n  <span class=\"hljs-attribute\">background-repeat<\/span>: repeat;\n  <span class=\"hljs-attribute\">background-image<\/span>: <span class=\"hljs-built_in\">url<\/span>(<span class=\"hljs-string\">\"data:image\/svg+xml,&lt;svg xmlns='http:\/\/www.w3.org\/2000\/svg'&gt;&lt;foreignObject width='30px' height='100%'&gt;&lt;div xmlns='http:\/\/www.w3.org\/1999\/xhtml' style='background:deepskyblue;width:90%;aspect-ratio:1;corner-shape:superellipse(-1);border-radius:30%;'&gt;&lt;\/div&gt;&lt;\/foreignObject&gt;&lt;\/svg&gt;\"<\/span>);\n  <span class=\"hljs-attribute\">background-color<\/span>: ghostwhite;\n  <span class=\"hljs-comment\">\/* etc. *\/<\/span>\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><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_gbMzYwX\" src=\"\/\/codepen.io\/anon\/embed\/gbMzYwX?height=450&amp;theme-id=1&amp;slug-hash=gbMzYwX&amp;default-tab=result\" height=\"450\" scrolling=\"no\" frameborder=\"0\" allowfullscreen allowpaymentrequest name=\"CodePen Embed gbMzYwX\" title=\"CodePen Embed gbMzYwX\" class=\"cp_embed_iframe\" style=\"width:100%;overflow:hidden\">CodePen Embed Fallback<\/iframe><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">A Different Design #1<\/h3>\n\n\n\n<p>Since we can target individual corners, here\u2019s a totally different design we can try:<\/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-tag\">border-top-left-radius<\/span>: 12<span class=\"hljs-selector-tag\">px<\/span>;\n<span class=\"hljs-selector-tag\">corner-top-left-shape<\/span>: <span class=\"hljs-selector-tag\">scoop<\/span>;\n<span class=\"hljs-selector-tag\">border-bottom-right-radius<\/span>: 26<span class=\"hljs-selector-tag\">px<\/span>;\n<span class=\"hljs-selector-tag\">corner-bottom-right-shape<\/span>: <span class=\"hljs-selector-tag\">notch<\/span>;\n\n<span class=\"hljs-selector-tag\">transform<\/span>: <span class=\"hljs-selector-tag\">rotate<\/span>(<span class=\"hljs-selector-tag\">-135deg<\/span>) <span class=\"hljs-selector-tag\">scale<\/span>(0<span class=\"hljs-selector-class\">.8<\/span>) <span class=\"hljs-selector-tag\">translate<\/span>(<span class=\"hljs-selector-tag\">-3px<\/span>);\n<span class=\"hljs-selector-tag\">background<\/span>: <span class=\"hljs-selector-tag\">conic-gradient<\/span>(<span class=\"hljs-selector-tag\">red<\/span> 265<span class=\"hljs-selector-tag\">deg<\/span>, <span class=\"hljs-selector-tag\">blue<\/span> 265<span class=\"hljs-selector-tag\">deg<\/span>);<\/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<p>Only the top-left and bottom-right corners are styled, and the whole thing is rotated to a desired angle.<\/p>\n\n\n\n<div class=\"wp-block-cp-codepen-gutenberg-embed-block cp_embed_wrapper\"><iframe id=\"cp_embed_emzrOdw\" src=\"\/\/codepen.io\/anon\/embed\/emzrOdw?height=450&amp;theme-id=1&amp;slug-hash=emzrOdw&amp;default-tab=result\" height=\"450\" scrolling=\"no\" frameborder=\"0\" allowfullscreen allowpaymentrequest name=\"CodePen Embed emzrOdw\" title=\"CodePen Embed emzrOdw\" class=\"cp_embed_iframe\" style=\"width:100%;overflow:hidden\">CodePen Embed Fallback<\/iframe><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">A Different Design #2<\/h3>\n\n\n\n<p>We can also make use of borders and shadows:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">border-bottom-left-radius<\/span>: 66%;\n<span class=\"hljs-selector-tag\">corner-bottom-left-shape<\/span>: <span class=\"hljs-selector-tag\">notch<\/span>;\n\n<span class=\"hljs-selector-tag\">box-shadow<\/span>: <span class=\"hljs-selector-tag\">-26px<\/span> 16<span class=\"hljs-selector-tag\">px<\/span> 0 6<span class=\"hljs-selector-tag\">px<\/span> <span class=\"hljs-selector-tag\">blue<\/span>;\n<span class=\"hljs-selector-tag\">background<\/span>: <span class=\"hljs-selector-tag\">linear-gradient<\/span>(<span class=\"hljs-selector-tag\">to<\/span> <span class=\"hljs-selector-tag\">right<\/span>, <span class=\"hljs-selector-tag\">blue<\/span>, <span class=\"hljs-selector-tag\">deepskyblue<\/span>);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><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 bottom-left corner has a notch style and there\u2019s a leftward blue shadow.<\/p>\n\n\n\n<div class=\"wp-block-cp-codepen-gutenberg-embed-block cp_embed_wrapper\"><iframe id=\"cp_embed_LEZmPbZ\" src=\"\/\/codepen.io\/anon\/embed\/LEZmPbZ?height=450&amp;theme-id=1&amp;slug-hash=LEZmPbZ&amp;default-tab=result\" height=\"450\" scrolling=\"no\" frameborder=\"0\" allowfullscreen allowpaymentrequest name=\"CodePen Embed LEZmPbZ\" title=\"CodePen Embed LEZmPbZ\" class=\"cp_embed_iframe\" style=\"width:100%;overflow:hidden\">CodePen Embed Fallback<\/iframe><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">A Real Life Example<\/h2>\n\n\n\n<p>Below are a few example patterns. Since we are using HTML and CSS for the pattern design, we can work with other features, such as transform, gradients, and filters, in addition to corner shapes to get different designs.<\/p>\n\n\n\n<p>Here we&#8217;re setting a physical product onto a pattern created this way. Remember this gives us programmatic control over the pattern, so it should be straightforward to change colors, sizing, repeating styles, etc.<\/p>\n\n\n\n<div class=\"wp-block-cp-codepen-gutenberg-embed-block cp_embed_wrapper\"><iframe id=\"cp_embed_wBWjwoj\" src=\"\/\/codepen.io\/anon\/embed\/wBWjwoj?height=450&amp;theme-id=1&amp;slug-hash=wBWjwoj&amp;default-tab=result\" height=\"450\" scrolling=\"no\" frameborder=\"0\" allowfullscreen allowpaymentrequest name=\"CodePen Embed wBWjwoj\" title=\"CodePen Embed wBWjwoj\" class=\"cp_embed_iframe\" style=\"width:100%;overflow:hidden\">CodePen Embed Fallback<\/iframe><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Gallery<\/h2>\n\n\n\n<div class=\"wp-block-cp-codepen-gutenberg-embed-block cp_embed_wrapper\"><iframe id=\"cp_embed_wBWdwey\" src=\"\/\/codepen.io\/anon\/embed\/wBWdwey?height=850&amp;theme-id=1&amp;slug-hash=wBWdwey&amp;default-tab=result\" height=\"850\" scrolling=\"no\" frameborder=\"0\" allowfullscreen allowpaymentrequest name=\"CodePen Embed wBWdwey\" title=\"CodePen Embed wBWdwey\" class=\"cp_embed_iframe\" style=\"width:100%;overflow:hidden\">CodePen Embed Fallback<\/iframe><\/div>\n","protected":false},"excerpt":{"rendered":"<p>You might need to know this someday: you can style a div, put the div into SVG, then put the SVG in to CSS and use it as a repeating background.<\/p>\n","protected":false},"author":20,"featured_media":8520,"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":[448,7,447,91],"class_list":["post-8505","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog-post","tag-background-image","tag-css","tag-patterns","tag-svg"],"acf":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2026\/02\/pattern-thumb.jpg?fit=2000%2C1200&ssl=1","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/frontendmasters.com\/blog\/wp-json\/wp\/v2\/posts\/8505","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\/20"}],"replies":[{"embeddable":true,"href":"https:\/\/frontendmasters.com\/blog\/wp-json\/wp\/v2\/comments?post=8505"}],"version-history":[{"count":9,"href":"https:\/\/frontendmasters.com\/blog\/wp-json\/wp\/v2\/posts\/8505\/revisions"}],"predecessor-version":[{"id":8523,"href":"https:\/\/frontendmasters.com\/blog\/wp-json\/wp\/v2\/posts\/8505\/revisions\/8523"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/frontendmasters.com\/blog\/wp-json\/wp\/v2\/media\/8520"}],"wp:attachment":[{"href":"https:\/\/frontendmasters.com\/blog\/wp-json\/wp\/v2\/media?parent=8505"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/frontendmasters.com\/blog\/wp-json\/wp\/v2\/categories?post=8505"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/frontendmasters.com\/blog\/wp-json\/wp\/v2\/tags?post=8505"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}