{"id":39719,"date":"2026-01-23T18:34:55","date_gmt":"2026-01-24T02:34:55","guid":{"rendered":"https:\/\/cloudinary.com\/blog\/?p=39719"},"modified":"2026-01-23T18:34:56","modified_gmt":"2026-01-24T02:34:56","slug":"how-are-fade-in-animations-created-using-css-transitions-and-keyframes","status":"publish","type":"post","link":"https:\/\/cloudinary.com\/blog\/questions\/how-are-fade-in-animations-created-using-css-transitions-and-keyframes\/","title":{"rendered":"How are fade-in animations created using CSS transitions and keyframes?"},"content":{"rendered":"\n<p>Subtle fade-ins make UIs feel smoother and more polished without stealing focus. You will see dev threads filled with questions like when to use transitions vs keyframes, how to trigger fades on scroll, and how to keep animations accessible and fast.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Question:<\/h2>\n\n\n\n<p><em>How are fade-in animations created using CSS transitions and keyframes? I want a simple, reusable pattern for images, cards, and text that:&nbsp;<\/em><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><em>Fades in on load or when scrolled into view<\/em><\/li>\n\n\n\n<li><em>Stays performant on mobile<\/em><\/li>\n\n\n\n<li><em>Respects prefers-reduced-motion.<\/em><\/li>\n<\/ol>\n\n\n\n<p><em>Sample CSS and a minimal JS snippet would help. Tips for handling images and placeholders would be great too.<\/em><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Answer:<\/h2>\n\n\n\n<p>You can implement fade-ins either with transitions or with keyframes. Use transitions when you toggle a property once, and keyframes when you need timeline control or multiple stages.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Approach 1: CSS transitions for simple state changes<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml shcb-wrap-lines\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">style<\/span>&gt;<\/span><span class=\"css\">\n<span class=\"hljs-comment\">\/* Start hidden *\/<\/span>\n<span class=\"hljs-selector-class\">.fade-target<\/span> {\n\u00a0 <span class=\"hljs-attribute\">opacity<\/span>: <span class=\"hljs-number\">0<\/span>;\n\u00a0 <span class=\"hljs-attribute\">transform<\/span>: <span class=\"hljs-built_in\">translateY<\/span>(<span class=\"hljs-number\">8px<\/span>);\n\u00a0 <span class=\"hljs-attribute\">transition<\/span>: opacity <span class=\"hljs-number\">300ms<\/span> ease-out, transform <span class=\"hljs-number\">300ms<\/span> ease-out;\n}\n\n<span class=\"hljs-comment\">\/* When ready to show *\/<\/span>\n<span class=\"hljs-selector-class\">.fade-target<\/span><span class=\"hljs-selector-class\">.is-visible<\/span> {\n\u00a0 <span class=\"hljs-attribute\">opacity<\/span>: <span class=\"hljs-number\">1<\/span>;\n\u00a0 <span class=\"hljs-attribute\">transform<\/span>: <span class=\"hljs-built_in\">translateY<\/span>(<span class=\"hljs-number\">0<\/span>);\n}\n\n<span class=\"hljs-comment\">\/* Respect user preferences *\/<\/span>\n<span class=\"hljs-keyword\">@media<\/span> (<span class=\"hljs-attribute\">prefers-reduced-motion:<\/span> reduce) {\n\u00a0 <span class=\"hljs-selector-class\">.fade-target<\/span> {\n\u00a0 \u00a0 <span class=\"hljs-attribute\">transition<\/span>: none;\n\u00a0 \u00a0 <span class=\"hljs-attribute\">transform<\/span>: none;\n\u00a0 }\n}\n<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">style<\/span>&gt;<\/span>\n\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"fade-target\"<\/span> <span class=\"hljs-attr\">id<\/span>=<span class=\"hljs-string\">\"card\"<\/span>&gt;<\/span>Content...<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">script<\/span>&gt;<\/span><span class=\"javascript\">\n<span class=\"hljs-comment\">\/\/ Example: reveal on page load<\/span>\n<span class=\"hljs-built_in\">window<\/span>.addEventListener(<span class=\"hljs-string\">'load'<\/span>, () =&gt; {\n\u00a0 <span class=\"hljs-built_in\">document<\/span>.getElementById(<span class=\"hljs-string\">'card'<\/span>).classList.add(<span class=\"hljs-string\">'is-visible'<\/span>);\n});\n<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">script<\/span>&gt;<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><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<h3 class=\"wp-block-heading\">Approach 2: CSS keyframes for more control<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml shcb-wrap-lines\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">style<\/span>&gt;<\/span><span class=\"css\">\n<span class=\"hljs-keyword\">@keyframes<\/span> fadeIn {\n\u00a0 <span class=\"hljs-selector-tag\">from<\/span> { <span class=\"hljs-attribute\">opacity<\/span>: <span class=\"hljs-number\">0<\/span>; <span class=\"hljs-attribute\">transform<\/span>: <span class=\"hljs-built_in\">translateY<\/span>(<span class=\"hljs-number\">10px<\/span>); }\n\u00a0 <span class=\"hljs-selector-tag\">to<\/span> { <span class=\"hljs-attribute\">opacity<\/span>: <span class=\"hljs-number\">1<\/span>; <span class=\"hljs-attribute\">transform<\/span>: <span class=\"hljs-built_in\">translateY<\/span>(<span class=\"hljs-number\">0<\/span>); }\n}\n\n<span class=\"hljs-selector-class\">.fade-in<\/span> {\n\u00a0 <span class=\"hljs-attribute\">animation<\/span>: fadeIn <span class=\"hljs-number\">450ms<\/span> ease-out both;\n}\n\n<span class=\"hljs-comment\">\/* Motion preference *\/<\/span>\n<span class=\"hljs-keyword\">@media<\/span> (<span class=\"hljs-attribute\">prefers-reduced-motion:<\/span> reduce) {\n\u00a0 <span class=\"hljs-selector-class\">.fade-in<\/span> { <span class=\"hljs-attribute\">animation<\/span>: none; }\n}\n<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">style<\/span>&gt;<\/span>\n\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"fade-in\"<\/span>&gt;<\/span>I will fade and lift in.<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><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<h3 class=\"wp-block-heading\">Reveal on scroll using Intersection Observer<\/h3>\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 shcb-wrap-lines\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">style<\/span>&gt;<\/span><span class=\"css\">\n<span class=\"hljs-selector-class\">.fade-on-scroll<\/span> { <span class=\"hljs-attribute\">opacity<\/span>: <span class=\"hljs-number\">0<\/span>; <span class=\"hljs-attribute\">transform<\/span>: <span class=\"hljs-built_in\">translateY<\/span>(<span class=\"hljs-number\">12px<\/span>); <span class=\"hljs-attribute\">transition<\/span>: opacity <span class=\"hljs-number\">360ms<\/span>, transform <span class=\"hljs-number\">360ms<\/span>; }\n<span class=\"hljs-selector-class\">.fade-on-scroll<\/span><span class=\"hljs-selector-class\">.is-inview<\/span> { <span class=\"hljs-attribute\">opacity<\/span>: <span class=\"hljs-number\">1<\/span>; <span class=\"hljs-attribute\">transform<\/span>: <span class=\"hljs-built_in\">translateY<\/span>(<span class=\"hljs-number\">0<\/span>); }\n<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">style<\/span>&gt;<\/span>\n\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">section<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"fade-on-scroll\"<\/span>&gt;<\/span>Section A<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">section<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">section<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"fade-on-scroll\"<\/span>&gt;<\/span>Section B<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">section<\/span>&gt;<\/span>\n\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">script<\/span>&gt;<\/span><span class=\"javascript\">\n<span class=\"hljs-keyword\">const<\/span> io = <span class=\"hljs-keyword\">new<\/span> IntersectionObserver(<span class=\"hljs-function\">(<span class=\"hljs-params\">entries<\/span>) =&gt;<\/span> {\n\u00a0 entries.forEach(<span class=\"hljs-function\"><span class=\"hljs-params\">e<\/span> =&gt;<\/span> {\n\u00a0 \u00a0 <span class=\"hljs-keyword\">if<\/span> (e.isIntersecting) {\n\u00a0 \u00a0 \u00a0 e.target.classList.add(<span class=\"hljs-string\">'is-inview'<\/span>);\n\u00a0 \u00a0 \u00a0 io.unobserve(e.target);\n\u00a0 \u00a0 }\n\u00a0 });\n}, { <span class=\"hljs-attr\">rootMargin<\/span>: <span class=\"hljs-string\">'0px 0px -10% 0px'<\/span>, <span class=\"hljs-attr\">threshold<\/span>: <span class=\"hljs-number\">0.1<\/span> });\n\n<span class=\"hljs-built_in\">document<\/span>.querySelectorAll(<span class=\"hljs-string\">'.fade-on-scroll'<\/span>).forEach(<span class=\"hljs-function\"><span class=\"hljs-params\">el<\/span> =&gt;<\/span> io.observe(el));\n<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">script<\/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<h3 class=\"wp-block-heading\">Performance and accessibility tips<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Animate only opacity and transform. <\/strong>Avoid layout-affecting properties like width or top.<\/li>\n\n\n\n<li><strong>Use short durations and gentle easing. <\/strong>200 to 500 ms usually feels natural.<\/li>\n\n\n\n<li><strong>Avoid stacking too many effects. <\/strong>No more than a few parallel transitions.<\/li>\n\n\n\n<li><strong>Gate animations behind Intersection Observer<\/strong> instead of scroll handlers.<\/li>\n\n\n\n<li><strong>Respect <code>prefers-reduced-motion<\/code>.<\/strong> Provide a no-animation path.<\/li>\n\n\n\n<li><strong>Apply <code>will-change<\/code> sparingly <\/strong>and temporarily if needed for heavy views.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Fade-in images cleanly<\/h3>\n\n\n\n<p>A common pattern is a blur-up or transparent-to-opaque fade once the image is loaded. For markup guidance, see this overview of the <a href=\"https:\/\/cloudinary.com\/guides\/image-effects\/html-image-tag\">HTML image tag<\/a>.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml shcb-wrap-lines\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">style<\/span>&gt;<\/span><span class=\"css\">\n\n<span class=\"hljs-selector-class\">.img-fade<\/span> { <span class=\"hljs-attribute\">opacity<\/span>: <span class=\"hljs-number\">0<\/span>; <span class=\"hljs-attribute\">transition<\/span>: opacity <span class=\"hljs-number\">300ms<\/span> ease-out; }\n<span class=\"hljs-selector-class\">.img-fade<\/span><span class=\"hljs-selector-class\">.is-loaded<\/span> { <span class=\"hljs-attribute\">opacity<\/span>: <span class=\"hljs-number\">1<\/span>; }\n<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">style<\/span>&gt;<\/span>\n\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">img<\/span>\n\u00a0 <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"img-fade\"<\/span>\n\u00a0 <span class=\"hljs-attr\">src<\/span>=<span class=\"hljs-string\">\"image-large.jpg\"<\/span>\n\u00a0 <span class=\"hljs-attr\">alt<\/span>=<span class=\"hljs-string\">\"Decorative fade-in\"<\/span>\n\u00a0 <span class=\"hljs-attr\">loading<\/span>=<span class=\"hljs-string\">\"lazy\"<\/span>\n\u00a0 <span class=\"hljs-attr\">width<\/span>=<span class=\"hljs-string\">\"1600\"<\/span> <span class=\"hljs-attr\">height<\/span>=<span class=\"hljs-string\">\"900\"<\/span>\n\/&gt;<\/span>\n\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">script<\/span>&gt;<\/span><span class=\"javascript\">\n<span class=\"hljs-built_in\">document<\/span>.querySelectorAll(<span class=\"hljs-string\">'img.img-fade'<\/span>).forEach(<span class=\"hljs-function\"><span class=\"hljs-params\">img<\/span> =&gt;<\/span> {\n\u00a0 <span class=\"hljs-keyword\">if<\/span> (img.complete) img.classList.add(<span class=\"hljs-string\">'is-loaded'<\/span>);\n\u00a0 <span class=\"hljs-keyword\">else<\/span> img.addEventListener(<span class=\"hljs-string\">'load'<\/span>, () =&gt; img.classList.add(<span class=\"hljs-string\">'is-loaded'<\/span>));\n});\n<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">script<\/span>&gt;<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><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<h3 class=\"wp-block-heading\">Optional: keyframes with stagger<\/h3>\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 shcb-wrap-lines\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">style<\/span>&gt;<\/span><span class=\"css\">\n<span class=\"hljs-keyword\">@keyframes<\/span> fadeUp { <span class=\"hljs-selector-tag\">from<\/span> { <span class=\"hljs-attribute\">opacity<\/span>: <span class=\"hljs-number\">0<\/span>; <span class=\"hljs-attribute\">transform<\/span>: <span class=\"hljs-built_in\">translateY<\/span>(<span class=\"hljs-number\">8px<\/span>); } <span class=\"hljs-selector-tag\">to<\/span> { <span class=\"hljs-attribute\">opacity<\/span>: <span class=\"hljs-number\">1<\/span>; <span class=\"hljs-attribute\">transform<\/span>: <span class=\"hljs-built_in\">translateY<\/span>(<span class=\"hljs-number\">0<\/span>); } }\n<span class=\"hljs-selector-class\">.stagger<\/span> &gt; * { <span class=\"hljs-attribute\">opacity<\/span>: <span class=\"hljs-number\">0<\/span>; <span class=\"hljs-attribute\">animation<\/span>: fadeUp <span class=\"hljs-number\">380ms<\/span> ease-out both; }\n<span class=\"hljs-selector-class\">.stagger<\/span> &gt; *<span class=\"hljs-selector-pseudo\">:nth-child(1)<\/span> { <span class=\"hljs-attribute\">animation-delay<\/span>: <span class=\"hljs-number\">50ms<\/span>; }\n<span class=\"hljs-selector-class\">.stagger<\/span> &gt; *<span class=\"hljs-selector-pseudo\">:nth-child(2)<\/span> { <span class=\"hljs-attribute\">animation-delay<\/span>: <span class=\"hljs-number\">120ms<\/span>; }\n<span class=\"hljs-selector-class\">.stagger<\/span> &gt; *<span class=\"hljs-selector-pseudo\">:nth-child(3)<\/span> { <span class=\"hljs-attribute\">animation-delay<\/span>: <span class=\"hljs-number\">190ms<\/span>; }\n<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">style<\/span>&gt;<\/span>\n\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">ul<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"stagger\"<\/span>&gt;<\/span>\n\u00a0 <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">li<\/span>&gt;<\/span>Item 1<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">li<\/span>&gt;<\/span>\n\u00a0 <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">li<\/span>&gt;<\/span>Item 2<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">li<\/span>&gt;<\/span>\n\u00a0 <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">li<\/span>&gt;<\/span>Item 3<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">li<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">ul<\/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<h3 class=\"wp-block-heading\">Using Cloudinary to enhance the pattern<\/h3>\n\n\n\n<p>You can pair fade-ins with responsive, optimized assets to keep pages snappy. For background images, see these CSS tips on sizing and coverage: <a href=\"https:\/\/cloudinary.com\/guides\/front-end-development\/6-ways-to-stretch-a-background-image-with-css\">6 ways to stretch a background image with CSS<\/a>. For overall site performance principles, review <a href=\"https:\/\/cloudinary.com\/guides\/web-performance\/what-is-an-optimized-website-and-6-ways-to-optimize-yours\">what makes an optimized website<\/a>.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Serve responsive images with automatic format and quality: <code>https:\/\/res.cloudinary.com\/&lt;cloud_name>\/image\/upload\/f_auto,q_auto,w_800\/&lt;public_id>.jpg<\/code><\/li>\n\n\n\n<li>Use a tiny blurred placeholder and swap to the full image on load:<\/li>\n<\/ul>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\">&lt;img <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span><\/span>=<span class=\"hljs-string\">\"img-fade\"<\/span> src=<span class=\"hljs-string\">\"https:\/\/res.cloudinary.com\/demo\/image\/upload\/e_blur:2000,q_1,w_40\/sample.jpg\"<\/span> data-full=<span class=\"hljs-string\">\"https:\/\/res.cloudinary.com\/demo\/image\/upload\/f_auto,q_auto,w_1200\/sample.jpg\"<\/span> alt=<span class=\"hljs-string\">\"Sample\"<\/span> \/&gt;\n\n<span class=\"xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">script<\/span>&gt;<\/span><span class=\"javascript\">\n<span class=\"hljs-comment\">\/\/ Blur-up swap<\/span>\n<span class=\"hljs-built_in\">document<\/span>.querySelectorAll(<span class=\"hljs-string\">'img&#91;data-full]'<\/span>).forEach(<span class=\"hljs-function\"><span class=\"hljs-params\">img<\/span> =&gt;<\/span> {\n\u00a0 <span class=\"hljs-keyword\">const<\/span> full = <span class=\"hljs-keyword\">new<\/span> Image();\n\u00a0 full.src = img.getAttribute(<span class=\"hljs-string\">'data-full'<\/span>);\n\u00a0 full.addEventListener(<span class=\"hljs-string\">'load'<\/span>, () =&gt; {\n\u00a0 \u00a0 img.src = full.src;\n\u00a0 \u00a0 img.classList.add(<span class=\"hljs-string\">'is-loaded'<\/span>); <span class=\"hljs-comment\">\/\/ fade-in<\/span>\n\u00a0 });\n});\n<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">script<\/span>&gt;<\/span><\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>You can also explore handy utilities on the <a href=\"https:\/\/cloudinary.com\/tools\">Cloudinary tools page<\/a> for quick media tasks during development.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Common pitfalls<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Animating display or visibility.<\/strong> Use opacity and transforms for a smooth fade.<\/li>\n\n\n\n<li><strong>Forgetting initial state.<\/strong> Make sure elements start at opacity 0 before you toggle in.<\/li>\n\n\n\n<li><strong>Not handling reduced motion. <\/strong>Always provide a no-animation path.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">TL;DR<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Use transitions for one-off fades by toggling a class. Use keyframes for staged or staggered reveals.<\/li>\n\n\n\n<li>Animate only opacity and transform for performance. Gate with Intersection Observer.<\/li>\n\n\n\n<li>Respect prefers-reduced-motion. Keep durations short and easing gentle.<\/li>\n\n\n\n<li>For images, apply a blur-up placeholder and fade-in once fully loaded. Combine with optimized delivery for best UX.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Learn More<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/cloudinary.com\/tools\/image-to-webp\">Convert images to WebP<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/cloudinary.com\/tools\/png-to-webp\">PNG to WebP converter<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/cloudinary.com\/tools\/image-upscale\">Image upscaling<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/cloudinary.com\/guides\/video\/video-as-a-service\">Video as a Service guide<\/a><\/li>\n<\/ul>\n\n\n\n<p>Want to ship fast, polished visuals with effortless optimization and delivery? <a href=\"https:\/\/cloudinary.com\/users\/register_free\">Create a free Cloudinary account<\/a> and start enhancing your fade-in workflows today.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Subtle fade-ins make UIs feel smoother and more polished without stealing focus. You will see dev threads filled with questions like when to use transitions vs keyframes, how to trigger fades on scroll, and how to keep animations accessible and fast. Question: How are fade-in animations created using CSS transitions and keyframes? I want a [&hellip;]<\/p>\n","protected":false},"author":88,"featured_media":39726,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_cloudinary_featured_overwrite":false,"footnotes":""},"categories":[1],"tags":[423],"class_list":["post-39719","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","tag-questions"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.6 (Yoast SEO v26.9) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>How are fade-in animations created using CSS transitions and keyframes?<\/title>\n<meta name=\"description\" content=\"Subtle fade-ins make UIs feel smoother and more polished without stealing focus. You will see dev threads filled with questions like when to use\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/cloudinary.com\/blog\/questions\/how-are-fade-in-animations-created-using-css-transitions-and-keyframes\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"How are fade-in animations created using CSS transitions and keyframes?\" \/>\n<meta property=\"og:description\" content=\"Subtle fade-ins make UIs feel smoother and more polished without stealing focus. You will see dev threads filled with questions like when to use\" \/>\n<meta property=\"og:url\" content=\"https:\/\/cloudinary.com\/blog\/questions\/how-are-fade-in-animations-created-using-css-transitions-and-keyframes\/\" \/>\n<meta property=\"og:site_name\" content=\"Cloudinary Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-01-24T02:34:55+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-01-24T02:34:56+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1769222068\/css_featured_image\/css_featured_image.jpg?_i=AA\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"damjanantevski\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"NewsArticle\",\"@id\":\"https:\/\/cloudinary.com\/blog\/questions\/how-are-fade-in-animations-created-using-css-transitions-and-keyframes\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/questions\/how-are-fade-in-animations-created-using-css-transitions-and-keyframes\/\"},\"author\":{\"name\":\"damjanantevski\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/43592e43c12520a1e867d456b1e8cf7e\"},\"headline\":\"How are fade-in animations created using CSS transitions and keyframes?\",\"datePublished\":\"2026-01-24T02:34:55+00:00\",\"dateModified\":\"2026-01-24T02:34:56+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/questions\/how-are-fade-in-animations-created-using-css-transitions-and-keyframes\/\"},\"wordCount\":468,\"publisher\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/questions\/how-are-fade-in-animations-created-using-css-transitions-and-keyframes\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1769222068\/css_featured_image\/css_featured_image.jpg?_i=AA\",\"keywords\":[\"Questions\"],\"inLanguage\":\"en-US\",\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/cloudinary.com\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/cloudinary.com\/blog\/questions\/how-are-fade-in-animations-created-using-css-transitions-and-keyframes\/\",\"url\":\"https:\/\/cloudinary.com\/blog\/questions\/how-are-fade-in-animations-created-using-css-transitions-and-keyframes\/\",\"name\":\"How are fade-in animations created using CSS transitions and keyframes?\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/questions\/how-are-fade-in-animations-created-using-css-transitions-and-keyframes\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/questions\/how-are-fade-in-animations-created-using-css-transitions-and-keyframes\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1769222068\/css_featured_image\/css_featured_image.jpg?_i=AA\",\"datePublished\":\"2026-01-24T02:34:55+00:00\",\"dateModified\":\"2026-01-24T02:34:56+00:00\",\"description\":\"Subtle fade-ins make UIs feel smoother and more polished without stealing focus. You will see dev threads filled with questions like when to use\",\"breadcrumb\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/questions\/how-are-fade-in-animations-created-using-css-transitions-and-keyframes\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/cloudinary.com\/blog\/questions\/how-are-fade-in-animations-created-using-css-transitions-and-keyframes\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/questions\/how-are-fade-in-animations-created-using-css-transitions-and-keyframes\/#primaryimage\",\"url\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1769222068\/css_featured_image\/css_featured_image.jpg?_i=AA\",\"contentUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1769222068\/css_featured_image\/css_featured_image.jpg?_i=AA\",\"width\":1200,\"height\":630,\"caption\":\"CSS featured image\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/cloudinary.com\/blog\/questions\/how-are-fade-in-animations-created-using-css-transitions-and-keyframes\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/cloudinary.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"How are fade-in animations created using CSS transitions and keyframes?\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#website\",\"url\":\"https:\/\/cloudinary.com\/blog\/\",\"name\":\"Cloudinary Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/cloudinary.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\",\"name\":\"Cloudinary Blog\",\"url\":\"https:\/\/cloudinary.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA\",\"contentUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA\",\"width\":312,\"height\":60,\"caption\":\"Cloudinary Blog\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/43592e43c12520a1e867d456b1e8cf7e\",\"name\":\"damjanantevski\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/3b40c995531fe4d510212a06c9d4fc666d2cb8efbfebc98a94191701accf4817?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/3b40c995531fe4d510212a06c9d4fc666d2cb8efbfebc98a94191701accf4817?s=96&d=mm&r=g\",\"caption\":\"damjanantevski\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"How are fade-in animations created using CSS transitions and keyframes?","description":"Subtle fade-ins make UIs feel smoother and more polished without stealing focus. You will see dev threads filled with questions like when to use","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/cloudinary.com\/blog\/questions\/how-are-fade-in-animations-created-using-css-transitions-and-keyframes\/","og_locale":"en_US","og_type":"article","og_title":"How are fade-in animations created using CSS transitions and keyframes?","og_description":"Subtle fade-ins make UIs feel smoother and more polished without stealing focus. You will see dev threads filled with questions like when to use","og_url":"https:\/\/cloudinary.com\/blog\/questions\/how-are-fade-in-animations-created-using-css-transitions-and-keyframes\/","og_site_name":"Cloudinary Blog","article_published_time":"2026-01-24T02:34:55+00:00","article_modified_time":"2026-01-24T02:34:56+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1769222068\/css_featured_image\/css_featured_image.jpg?_i=AA","type":"image\/jpeg"}],"author":"damjanantevski","twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"NewsArticle","@id":"https:\/\/cloudinary.com\/blog\/questions\/how-are-fade-in-animations-created-using-css-transitions-and-keyframes\/#article","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/questions\/how-are-fade-in-animations-created-using-css-transitions-and-keyframes\/"},"author":{"name":"damjanantevski","@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/43592e43c12520a1e867d456b1e8cf7e"},"headline":"How are fade-in animations created using CSS transitions and keyframes?","datePublished":"2026-01-24T02:34:55+00:00","dateModified":"2026-01-24T02:34:56+00:00","mainEntityOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/questions\/how-are-fade-in-animations-created-using-css-transitions-and-keyframes\/"},"wordCount":468,"publisher":{"@id":"https:\/\/cloudinary.com\/blog\/#organization"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/questions\/how-are-fade-in-animations-created-using-css-transitions-and-keyframes\/#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1769222068\/css_featured_image\/css_featured_image.jpg?_i=AA","keywords":["Questions"],"inLanguage":"en-US","copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/cloudinary.com\/#organization"}},{"@type":"WebPage","@id":"https:\/\/cloudinary.com\/blog\/questions\/how-are-fade-in-animations-created-using-css-transitions-and-keyframes\/","url":"https:\/\/cloudinary.com\/blog\/questions\/how-are-fade-in-animations-created-using-css-transitions-and-keyframes\/","name":"How are fade-in animations created using CSS transitions and keyframes?","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/questions\/how-are-fade-in-animations-created-using-css-transitions-and-keyframes\/#primaryimage"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/questions\/how-are-fade-in-animations-created-using-css-transitions-and-keyframes\/#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1769222068\/css_featured_image\/css_featured_image.jpg?_i=AA","datePublished":"2026-01-24T02:34:55+00:00","dateModified":"2026-01-24T02:34:56+00:00","description":"Subtle fade-ins make UIs feel smoother and more polished without stealing focus. You will see dev threads filled with questions like when to use","breadcrumb":{"@id":"https:\/\/cloudinary.com\/blog\/questions\/how-are-fade-in-animations-created-using-css-transitions-and-keyframes\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/cloudinary.com\/blog\/questions\/how-are-fade-in-animations-created-using-css-transitions-and-keyframes\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/questions\/how-are-fade-in-animations-created-using-css-transitions-and-keyframes\/#primaryimage","url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1769222068\/css_featured_image\/css_featured_image.jpg?_i=AA","contentUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1769222068\/css_featured_image\/css_featured_image.jpg?_i=AA","width":1200,"height":630,"caption":"CSS featured image"},{"@type":"BreadcrumbList","@id":"https:\/\/cloudinary.com\/blog\/questions\/how-are-fade-in-animations-created-using-css-transitions-and-keyframes\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/cloudinary.com\/blog\/"},{"@type":"ListItem","position":2,"name":"How are fade-in animations created using CSS transitions and keyframes?"}]},{"@type":"WebSite","@id":"https:\/\/cloudinary.com\/blog\/#website","url":"https:\/\/cloudinary.com\/blog\/","name":"Cloudinary Blog","description":"","publisher":{"@id":"https:\/\/cloudinary.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/cloudinary.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/cloudinary.com\/blog\/#organization","name":"Cloudinary Blog","url":"https:\/\/cloudinary.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA","contentUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA","width":312,"height":60,"caption":"Cloudinary Blog"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/43592e43c12520a1e867d456b1e8cf7e","name":"damjanantevski","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/3b40c995531fe4d510212a06c9d4fc666d2cb8efbfebc98a94191701accf4817?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/3b40c995531fe4d510212a06c9d4fc666d2cb8efbfebc98a94191701accf4817?s=96&d=mm&r=g","caption":"damjanantevski"}}]}},"parsely":{"version":"1.1.0","canonical_url":"https:\/\/cloudinary.com\/blog\/questions\/how-are-fade-in-animations-created-using-css-transitions-and-keyframes\/","smart_links":{"inbound":0,"outbound":0},"traffic_boost_suggestions_count":0,"meta":{"@context":"https:\/\/schema.org","@type":"NewsArticle","headline":"How are fade-in animations created using CSS transitions and keyframes?","url":"https:\/\/cloudinary.com\/blog\/questions\/how-are-fade-in-animations-created-using-css-transitions-and-keyframes\/","mainEntityOfPage":{"@type":"WebPage","@id":"https:\/\/cloudinary.com\/blog\/questions\/how-are-fade-in-animations-created-using-css-transitions-and-keyframes\/"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1769222068\/css_featured_image\/css_featured_image.jpg?_i=AA&w=150&h=150&crop=1","image":{"@type":"ImageObject","url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1769222068\/css_featured_image\/css_featured_image.jpg?_i=AA"},"articleSection":"Uncategorized","author":[{"@type":"Person","name":"damjanantevski"}],"creator":["damjanantevski"],"publisher":{"@type":"Organization","name":"Cloudinary Blog","logo":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA"},"keywords":["questions"],"dateCreated":"2026-01-24T02:34:55Z","datePublished":"2026-01-24T02:34:55Z","dateModified":"2026-01-24T02:34:56Z"},"rendered":"<meta name=\"parsely-title\" content=\"How are fade-in animations created using CSS transitions and keyframes?\" \/>\n<meta name=\"parsely-link\" content=\"https:\/\/cloudinary.com\/blog\/questions\/how-are-fade-in-animations-created-using-css-transitions-and-keyframes\/\" \/>\n<meta name=\"parsely-type\" content=\"post\" \/>\n<meta name=\"parsely-image-url\" content=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1769222068\/css_featured_image\/css_featured_image.jpg?_i=AA&w=150&amp;h=150&amp;crop=1\" \/>\n<meta name=\"parsely-pub-date\" content=\"2026-01-24T02:34:55Z\" \/>\n<meta name=\"parsely-section\" content=\"Uncategorized\" \/>\n<meta name=\"parsely-tags\" content=\"questions\" \/>\n<meta name=\"parsely-author\" content=\"damjanantevski\" \/>","tracker_url":"https:\/\/cdn.parsely.com\/keys\/cloudinary.com\/p.js"},"jetpack_featured_media_url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1769222068\/css_featured_image\/css_featured_image.jpg?_i=AA","_links":{"self":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/39719","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/users\/88"}],"replies":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/comments?post=39719"}],"version-history":[{"count":1,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/39719\/revisions"}],"predecessor-version":[{"id":39720,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/39719\/revisions\/39720"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media\/39726"}],"wp:attachment":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media?parent=39719"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/categories?post=39719"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/tags?post=39719"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}