{"id":3519,"date":"2024-08-19T10:12:53","date_gmt":"2024-08-19T15:12:53","guid":{"rendered":"https:\/\/frontendmasters.com\/blog\/?p=3519"},"modified":"2024-08-19T10:12:54","modified_gmt":"2024-08-19T15:12:54","slug":"the-css-contain-property","status":"publish","type":"post","link":"https:\/\/frontendmasters.com\/blog\/the-css-contain-property\/","title":{"rendered":"The CSS contain property"},"content":{"rendered":"\n<p>The&nbsp;<em>purpose<\/em>&nbsp;of CSS\u2019&nbsp;<code>contain<\/code>&nbsp;property (\u201cCSS containment\u201d) is twofold:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Optimization<\/li>\n\n\n\n<li>Styling possibilities<\/li>\n<\/ol>\n\n\n\n<p>When we apply\u00a0<code>contain<\/code>\u00a0to an element we&#8217;re isolating it (and it\u2019s descendents) from the rest of the page, and this isolation what opens those possibilities. There are different types of containment which all do different things, and we\u2019ll be getting into each of them.<\/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-selector-class\">.element<\/span> {\n  <span class=\"hljs-attribute\">contain<\/span>: size;\n  <span class=\"hljs-attribute\">contain<\/span>: paint;\n  <span class=\"hljs-attribute\">contain<\/span>: layout;\n  \n  <span class=\"hljs-comment\">\/* they can also be combined, e.g. *\/<\/span>\n  <span class=\"hljs-attribute\">contain<\/span>: size layout;\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>\n\n\n<p>First,&nbsp;<strong>optimization<\/strong>. When something&nbsp;<em>changes<\/em>&nbsp;an element after the page has rendered, the browser rethinks the entire page in case that element affects the rest of the page (visible or not). But with a contained element, we let the browser know that the change we made is restricted to&nbsp;<em>only<\/em>&nbsp;the contained element and its children, and the browser needn\u2019t bother with the rest of the page because there won\u2019t be any impact on that.<\/p>\n\n\n\n<p>Second,&nbsp;<strong>relative styling<\/strong>. Meaning positioning, visibility, stacking, sizing, etc, and by \u201crelative\u201d I mean styling an element in comparison to that of the viewport or the parent element \u2014&nbsp;<em>relative positioning<\/em>&nbsp;and&nbsp;<em>relative sizing<\/em>&nbsp;are two good examples of this that we\u2019ve had for a long time.<\/p>\n\n\n\n<p>Since the introduction of CSS Containment, a lot more relative styling can be done in the scope the contained element and its descendants. You\u2019ll see examples as we proceed.<\/p>\n\n\n\n<p class=\"learn-more\">In this article, CSS Containment refers to the CSS&nbsp;<code>contain<\/code>&nbsp;property. <a href=\"https:\/\/www.w3.org\/TR\/css-contain-3\/\">Its namesake W3C Standard<\/a>, however, covers a few more specifications, like container units. <\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"size-containment\">Size Containment<\/h2>\n\n\n\n<p>Although \u201csize containment\u201d sounds highly useful, in practice you might not use this much.<\/p>\n\n\n\n<p>When an element\u2019s size is&nbsp;<em>contained<\/em>,&nbsp;<strong>the browser does not allow anything that happens inside the contained element<\/strong>&nbsp;<strong>(to the content or the descendant elements)<\/strong>&nbsp;<strong>to affect its size<\/strong>. In other words, you have a way to achieve truly fixed sizing.<\/p>\n\n\n\n<p>But fixed sizing is not in trend. These days we have a lot of options for for dynamic sizing. For instance, CSS units relative to the root font size (<code>rem<\/code>,&nbsp;<code>rex<\/code>, etc.), units responsive to the viewport size (<code>vw<\/code>,&nbsp;<code>dvh<\/code>, etc.), units relative to the current font size (<code>em<\/code>,&nbsp;<code>lh<\/code>, etc.), you name it. Which means we usually do a pretty good job of sizing the different elements on a page for different screen sizes and content.<\/p>\n\n\n\n<p>What if, for example, a user is interacting with a page and caused new dynamic information to appear on the page? This new information takes up space. Now have options and can make a choice.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Is it better to allow the element, and potentially the entire page, to reflow and change?<\/li>\n\n\n\n<li>Or is it better to contain the element so that the changes&nbsp;<em>prevent<\/em>&nbsp;the reflow?<\/li>\n<\/ul>\n\n\n\n<p>If it feels like the latter, size containment can be the solution (or part of the solution) for you.<\/p>\n\n\n\n<p class=\"learn-more\">Be sure to set the desired dimensions, width and height (or logical properties), or aspect ratios when using size containment, because the browser initially renders a contained element as if it\u2019s empty, and without the right dimensions set, elements might end up having a zero dimension.<\/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\">.box<\/span> {\n  <span class=\"hljs-attribute\">width<\/span>: <span class=\"hljs-number\">100px<\/span>;\n  <span class=\"hljs-attribute\">min-height<\/span>: <span class=\"hljs-number\">100px<\/span>;\n  img {\n    <span class=\"hljs-attribute\">width<\/span>: <span class=\"hljs-number\">200%<\/span>;\n    ...\n  }\n  &amp;<span class=\"hljs-selector-pseudo\">:nth-of-type(2)<\/span> { <span class=\"hljs-comment\">\/* the second box *\/<\/span>\n    <span class=\"hljs-attribute\">contain<\/span>: size; \n    ...\n  }\n  ...\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<div class=\"wp-block-cp-codepen-gutenberg-embed-block cp_embed_wrapper\"><iframe id=\"cp_embed_GRbEQva\" src=\"\/\/codepen.io\/anon\/embed\/GRbEQva?height=550&amp;theme-id=47434&amp;slug-hash=GRbEQva&amp;default-tab=result\" height=\"550\" scrolling=\"no\" frameborder=\"0\" allowfullscreen allowpaymentrequest name=\"CodePen Embed GRbEQva\" title=\"CodePen Embed GRbEQva\" class=\"cp_embed_iframe\" style=\"width:100%;overflow:hidden\">CodePen Embed Fallback<\/iframe><\/div>\n\n\n\n<p>Setting an element\u2019s dimensions yourself may feel like size containment already, and typically that is all you need, which is why I said you may not need this much. But if you\u2019re entirely sure you don\u2019t want this element to change size or affect any other elements, protecting against unforseen changes, size containment may be a good idea.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"paint-containment\">Paint Containment<\/h2>\n\n\n\n<p>If you\u2019re familiar with the&nbsp;<code>overflow<\/code>&nbsp;property, that\u2019s a good place to start understanding paint containment. However, they are not quite the same.<\/p>\n\n\n\n<p>Outside a paint-contained element\u2019s box,&nbsp;<strong>the browser neither displays any content, nor it makes the concealed content scrollable to<\/strong>&nbsp;<strong>by<\/strong>&nbsp;<strong>any means<\/strong>&nbsp;<strong>at all<\/strong>. In this aspect, paint containment\u2019s behavior is similar to&nbsp;<code>overflow:&nbsp;clip<\/code> rather than <code>overflow:&nbsp;hidden<\/code> (which allows scrolling to the concealed content or elements through methods like the JavaScript <code>scroll<\/code> event).<\/p>\n\n\n\n<p>So if you want to&nbsp;<strong>trim the<\/strong>&nbsp;<strong>overflowed<\/strong>&nbsp;<strong>content<\/strong>&nbsp;of an element while also ensuring that content is not at all scrollable to, a paint-containment can be used. A browser might also&nbsp;<strong>save computational effort by not rendering an off screen paint-contained element<\/strong>.<\/p>\n\n\n\n<p>I also have another good reason for why you might need paint containment.<\/p>\n\n\n\n<p>As I mentioned at the beginning of the article, containment is the isolation of an element in all factors. That\u2019s worth repeating here. Paint containment is not just about clipping what\u2019s fallen out of a container box, but also&nbsp;<strong>isolating that box itself from the rest of the rendered page by creating new stacking and formatting contexts<\/strong>&nbsp;for that element. Paint containment also generates a separate absolute and fixed positioning container box (I\u2019ll explain this in Layout Containment).<\/p>\n\n\n\n<p>Below, there are two examples: the first one is a sample of paint containment (<code>contain:&nbsp;paint<\/code>), and the second is a comparison between the behavior of <code>overflow:&nbsp;clip<\/code> <code>and<\/code> <code>contain:&nbsp;paint<\/code>. You\u2019ll notice the paint containment\u2019s isolating effect clearly in the second example, where the contained element is unaffected by the CSS blending applied to its sibling element.<\/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-class\">.box<\/span> {\n  <span class=\"hljs-attribute\">width<\/span>: <span class=\"hljs-number\">100px<\/span>;\n  img {\n    <span class=\"hljs-attribute\">width<\/span>: <span class=\"hljs-number\">200%<\/span>;\n    ...\n  }\n  &amp;<span class=\"hljs-selector-pseudo\">:nth-of-type(2)<\/span> { <span class=\"hljs-comment\">\/* second box *\/<\/span>\n    <span class=\"hljs-attribute\">contain<\/span>: paint; \n    ...\n  }\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<div class=\"wp-block-cp-codepen-gutenberg-embed-block cp_embed_wrapper\"><iframe id=\"cp_embed_WNqOMdr\" src=\"\/\/codepen.io\/anon\/embed\/WNqOMdr?height=550&amp;theme-id=47434&amp;slug-hash=WNqOMdr&amp;default-tab=result\" height=\"550\" scrolling=\"no\" frameborder=\"0\" allowfullscreen allowpaymentrequest name=\"CodePen Embed WNqOMdr\" title=\"CodePen Embed WNqOMdr\" class=\"cp_embed_iframe\" style=\"width:100%;overflow:hidden\">CodePen Embed Fallback<\/iframe><\/div>\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\">section<\/span> {\n  div {\n  <span class=\"hljs-attribute\">width<\/span>: <span class=\"hljs-number\">100px<\/span>; \n  <span class=\"hljs-attribute\">aspect-ratio<\/span>: <span class=\"hljs-number\">1<\/span>\/<span class=\"hljs-number\">1<\/span>;\n  }\n  <span class=\"hljs-selector-class\">.box<\/span> {\n    <span class=\"hljs-attribute\">background<\/span>: red; \n  }   \n  &amp;<span class=\"hljs-selector-pseudo\">:nth-of-type(2)<\/span> <span class=\"hljs-selector-class\">.box<\/span> { \n    <span class=\"hljs-attribute\">overflow<\/span>: clip;\n  }\n  &amp;<span class=\"hljs-selector-pseudo\">:nth-of-type(3)<\/span> <span class=\"hljs-selector-class\">.box<\/span> { \n    <span class=\"hljs-attribute\">contain<\/span>: paint;\n  }\n  <span class=\"hljs-selector-class\">.box-sibling<\/span> {\n    <span class=\"hljs-attribute\">background<\/span>: blue; \n    <span class=\"hljs-attribute\">mix-blend-mode<\/span>: hue;\n    ...\n  }\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\">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_eYwRVME\" src=\"\/\/codepen.io\/anon\/embed\/eYwRVME?height=550&amp;theme-id=47434&amp;slug-hash=eYwRVME&amp;default-tab=result\" height=\"550\" scrolling=\"no\" frameborder=\"0\" allowfullscreen allowpaymentrequest name=\"CodePen Embed eYwRVME\" title=\"CodePen Embed eYwRVME\" class=\"cp_embed_iframe\" style=\"width:100%;overflow:hidden\">CodePen Embed Fallback<\/iframe><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"layout-containment\">Layout Containment<\/h2>\n\n\n\n<p>Layout is essentially the <em>flow<\/em> of elements and content. Over the years, more than sizing, more than painting, the most work we have delegated to the browsers is in the scope of layout. There are CSS properties, like&nbsp;<code>float<\/code>,&nbsp;<code>vertical-align<\/code>, and such, for us to communicate to the browsers where we prefer an element to be a little re-positioned to from its natural place on the page.<\/p>\n\n\n\n<p>And then there are full scale layouts, like Grid Layout, Page Layout (used for the print medium), Column Layout, etc., to tell the browser to place everything on the page in a particular fashion we fancy.<\/p>\n\n\n\n<p>The modern browsers do all that with incredible speed and efficiency, however, we can still make it easier on them by adding layout containments to elements, so that&nbsp;<strong>any layout changes in the contained elements and its descendants can be handled independently<\/strong>, and&nbsp;<strong>if they are off screen, laying out their contents can be put off until needed<\/strong>. If you are considering&nbsp;<strong>optimizing your pages<\/strong>, layout containment is a good candidate to consider.<\/p>\n\n\n\n<p>And that\u2019s not all. More often than not, position of all the boxes in a page are based on each other \u2014 One box moves, the other follows suit. Which is not we always want to happen. With the help of layout containment,&nbsp;<strong>you can have multiple layouts in a page with the assurance that their contents are not going to flow into each other<\/strong>, by forming layout islands that are unaffected by whatever\u2019s happening in the nearby islands.<\/p>\n\n\n\n<p>Just as in the case of paint containment, layout containment also creates a separate formatting, and stacking, contexts for the contained elements. They also generate their own <strong>absolute<\/strong> and <strong>fixed<\/strong> <strong>positioning containing boxes<\/strong>, meaning they become the reference box to position any absolute \u2014 or fixed \u2014 positioned child elements.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-class\">.box<\/span> {\n  <span class=\"hljs-attribute\">width<\/span>: <span class=\"hljs-number\">100px<\/span>;\n  <span class=\"hljs-attribute\">aspect-ratio<\/span>: <span class=\"hljs-number\">1<\/span>\/<span class=\"hljs-number\">1<\/span>;\n  .fixed-element {\n    <span class=\"hljs-attribute\">background<\/span>: lime;\n    <span class=\"hljs-attribute\">position<\/span>: fixed;\n    <span class=\"hljs-attribute\">left<\/span>: <span class=\"hljs-number\">0px<\/span>;\n    <span class=\"hljs-attribute\">bottom<\/span>: <span class=\"hljs-number\">0px<\/span>;\n    ...\n  }\n  &amp;<span class=\"hljs-selector-pseudo\">:nth-of-type(2)<\/span> { <span class=\"hljs-comment\">\/* Box B *\/<\/span>\n    <span class=\"hljs-attribute\">contain<\/span>: layout; \n    ...\n  }\n  ...\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><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_VwJWQxg\" src=\"\/\/codepen.io\/anon\/embed\/VwJWQxg?height=550&amp;theme-id=47434&amp;slug-hash=VwJWQxg&amp;default-tab=result\" height=\"550\" scrolling=\"no\" frameborder=\"0\" allowfullscreen allowpaymentrequest name=\"CodePen Embed VwJWQxg\" title=\"CodePen Embed VwJWQxg\" class=\"cp_embed_iframe\" style=\"width:100%;overflow:hidden\">CodePen Embed Fallback<\/iframe><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"inline-size-and-style-containments\">Inline-Size and Style Containments<\/h2>\n\n\n\n<p>Although not yet a W3C recommendation, both&nbsp;<code>contain: inline-size<\/code>&nbsp;and&nbsp;<code>contain: style<\/code>&nbsp;are valid values, that are well supported in browsers, and are included in the W3C Working Drafts of CSS Containment Module Level 2 and 3. I didn\u2019t mention them at the top only because they haven&#8217;t yet reached that recommendation status. <\/p>\n\n\n\n<p>The functions of a Style Containment is also a bit tentative at the moment, and might grow before it hits the W3C recommendation status.<\/p>\n\n\n\n<p>I\u2019ll briefly explain them both, however.&nbsp;<strong>Inline Size Containment<\/strong>&nbsp;is same as the Size Containment, but&nbsp;<strong>for inline sizes only<\/strong> (the horizontal\/width direction in any left-to-right or right-to-left horizontal writing mode). This gives you a size restraint for elements along their inline axes. This is particularly common for container queries. I haven&#8217;t mentioned container queries here, but these things are conceptually linked. When you set a <code>container-type: inline-size<\/code> as is required for typical container queries, you are effectively also setting <code>contain: inline-size<\/code> implicitly.<\/p>\n\n\n\n<p>When an element has&nbsp;<strong>Style Containment<\/strong>, the tallying of CSS Counters and the&nbsp;<code>quote<\/code>&nbsp;values of the&nbsp;<code>content<\/code>&nbsp;property inside the contained element are unaffected by any counter or quote values mentioned outside. Essentially,&nbsp;<strong>the counters and quotes are scoped within a style-contained element<\/strong>. Pretty niche! <\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"the-strict-and-content-values\">The&nbsp;<code>strict<\/code>&nbsp;and&nbsp;<code>content<\/code>&nbsp;Values<\/h2>\n\n\n\n<p>As I mentioned at the top, you can combine the different&nbsp;<code>contain<\/code>&nbsp;values (by space-separating them). There are also keywords for pre-combined values.<\/p>\n\n\n\n<p>When&nbsp;<code>contain<\/code>&nbsp;has the value&nbsp;<code>strict<\/code>,&nbsp;<strong>all the containment types are applied<\/strong>&nbsp;to an element. Probably not something you&#8217;d use unless you are working with an element or module on your page that\u2019s prone to a lot of changes during the page\u2019s existence on screen, like the display of live sports data or the like.<\/p>\n\n\n\n<p>Then there\u2019s the <code>content<\/code>&nbsp;value, which is a&nbsp;<strong>combination<\/strong> of <code>paint<\/code>, <code>layout<\/code><strong>, <\/strong>and&nbsp;<code>style<\/code>.&nbsp;You are more likely to want to use this if your goal is to simply ensure nothing spills outside an element\u2019s boundary at all cost, or to keep the browser from rendering or laying out the contained elements and its children when they are off screen or hidden, for the sake of optimization.<\/p>\n\n\n\n<p>Those are my recommendations for the CSS&nbsp;<code>contain<\/code>&nbsp;property. It\u2019s a property that\u2019s just as worthwhile to learn about for the sake of programming techniques, as it is for the sake of optimizing web pages.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"reference\">References<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/CSS\/contain\">The CSS&nbsp;<code>contain<\/code>&nbsp;property<\/a> \u2014 MDN Web Docs<\/li>\n\n\n\n<li><a href=\"https:\/\/www.w3.org\/TR\/css-contain-1\/\">CSS Containment Module Level 1<\/a> \u2014 W3C Recommendation<\/li>\n\n\n\n<li><a href=\"https:\/\/caniuse.com\/mdn-css_properties_contain\">Support table for CSS&nbsp;<code>contain<\/code><\/a>&nbsp;\u2014 Can I use\u2026<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>CSS containment is used for optimization and opening styling possibilities by isolating elements from the rest of the page. Different contain values (size, paint, layout, etc.) provide various benefits and tradeoffs.<\/p>\n","protected":false},"author":20,"featured_media":3523,"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":[122,7],"class_list":["post-3519","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog-post","tag-contain","tag-css"],"acf":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/08\/pexels-photo-10473675.jpeg?fit=1880%2C1253&ssl=1","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/frontendmasters.com\/blog\/wp-json\/wp\/v2\/posts\/3519","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=3519"}],"version-history":[{"count":4,"href":"https:\/\/frontendmasters.com\/blog\/wp-json\/wp\/v2\/posts\/3519\/revisions"}],"predecessor-version":[{"id":3554,"href":"https:\/\/frontendmasters.com\/blog\/wp-json\/wp\/v2\/posts\/3519\/revisions\/3554"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/frontendmasters.com\/blog\/wp-json\/wp\/v2\/media\/3523"}],"wp:attachment":[{"href":"https:\/\/frontendmasters.com\/blog\/wp-json\/wp\/v2\/media?parent=3519"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/frontendmasters.com\/blog\/wp-json\/wp\/v2\/categories?post=3519"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/frontendmasters.com\/blog\/wp-json\/wp\/v2\/tags?post=3519"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}