{"id":33544,"date":"2024-04-11T07:00:00","date_gmt":"2024-04-11T14:00:00","guid":{"rendered":"https:\/\/cloudinary.com\/blog\/?p=33544"},"modified":"2025-12-04T15:39:28","modified_gmt":"2025-12-04T23:39:28","slug":"deep-dive-responsive-images-next-js","status":"publish","type":"post","link":"https:\/\/cloudinary.com\/blog\/deep-dive-responsive-images-next-js","title":{"rendered":"Deep Dive Into Responsive Images in Next.js"},"content":{"rendered":"<div class=\"wp-block-cloudinary-markdown \"><p>Delivering an optimal image experience tailored to each user\u2019s device and screen size is crucial. Responsive images are a key technique ensuring images load quickly, maintain crisp quality, and adapt seamlessly across various viewports. This blog post explores what responsive images are, how to implement them in a framework such as Next.js, and how Cloudinary\u2019s <code>CldImage<\/code> component built for Next.js simplifies the process.<\/p>\n<h2>What Are Responsive Images?<\/h2>\n<p><a href=\"https:\/\/cloudinary.com\/guides\/responsive-images\/responsive-images-what-they-are-and-how-to-create-them\">Responsive images<\/a> enable the delivery of high-quality images that adapt to the user\u2019s device characteristics, such as screen size, resolution, and network conditions. Instead of serving a single, large image to all devices, responsive images provide different versions of the same image tailored to each device\u2019s capabilities. This approach ensures that users on mobile devices or slower networks receive optimized, smaller images, thus improving performance and reducing data usage. Even pixel density is considered; devices with retina displays, like modern MacBooks, can receive images of higher pixel density if supported by the website.<\/p>\n<h2>Using HTML Image Attributes For Responsive Images<\/h2>\n<p>HTML provides basic tools to facilitate responsive images through the <code>srcset<\/code> and <code>sizes<\/code> attributes on the <code>img<\/code> element. They can be used on the <code>img<\/code> element as on the following example:<\/p>\n<pre class=\"js-syntax-highlighted\" 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\">img<\/span>\n  <span class=\"hljs-attr\">srcset<\/span>=<span class=\"hljs-string\">\"\n    image-320w.jpg 320w,\n    image-480w.jpg 480w,\n    image-800w.jpg 800w\n  \"<\/span>\n  <span class=\"hljs-attr\">sizes<\/span>=<span class=\"hljs-string\">\"(max-width: 320px) 280px, (max-width: 480px) 440px, 800px\"<\/span>\n  <span class=\"hljs-attr\">src<\/span>=<span class=\"hljs-string\">\"image-800w.jpg\"<\/span>\n  <span class=\"hljs-attr\">alt<\/span>=<span class=\"hljs-string\">\"Responsive Image\"<\/span>\n\/&gt;<\/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\">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<p>The <code>srcset<\/code> attribute contains the image\u2019s different variations, where each variation is separated by a comma and provides the image\u2019s filename and the image\u2019s <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Glossary\/Intrinsic_Size\">intrinsic size<\/a>. In the above example, <code>image-320w.jpg<\/code> has a size of 320w, meaning it has an intrinsic width of 320 pixels. Alternatively, we could also use the image\u2019s pixel density descriptor instead of the size (e.g., 2x) if we wanted to provide images of different pixel densities (e.g., standard and retina, which has more pixels).<\/p>\n<p>The <code>sizes<\/code> property, on the other hand, is a comma-separated list of media conditions and <em>slot sizes<\/em> that are used when the media condition is evaluated to be true. The last value in the list is sometimes without any media conditions, meaning it is the fallback slot size when no media condition is matched. But how does the browser use this list?<\/p>\n<p>With <code>srcset<\/code> and <code>sizes<\/code> in place, the browser will look at characteristics of the user\u2019s device such as screen size and pixel density, find the first matching media query that matches the user\u2019s device, look at the slot size given to that media query, and load the image referenced in the <code>srcset<\/code> list that has the <em>same size as the slot<\/em> or, if there isn\u2019t one, <em>the first image that is bigger<\/em> than the chosen slot size.<\/p>\n<p>Now, with the above example in mind, this means that:<\/p>\n<ul>\n<li>For devices up to 320px wide, the browser will pick the first image from the <code>srcset<\/code> that is equal to or larger than 280px, and that is <code>image-320w.jpg<\/code>.<\/li>\n<li>For devices up to 480px wide, the browser will pick the first image from the <code>srcset<\/code> that is equal to or larger than 440px, and that is <code>image-480w.jpg<\/code>.<\/li>\n<li>For devices larger than 480px wide, the browser will pick the first image from the <code>srcset<\/code> that is equal to or larger than 800px (the fallback value), and that is <code>image-800w.jpg<\/code>.<\/li>\n<\/ul>\n<p>How is <code>src<\/code> used when <code>srcset<\/code> exists? It depends on whether the browser supports <code>srcset<\/code>. If the browser doesn\u2019t support <code>srcset<\/code>, or if there\u2019s an error parsing the <code>srcset<\/code> attribute, it will fall back to using the image source specified in the <code>src<\/code> attribute.<\/p>\n<h3>Client Hints<\/h3>\n<p>One relatively newer feature worth mentioning is <a href=\"https:\/\/cloudinary.com\/documentation\/responsive_server_side_client_hints\">Client Hints<\/a>. While an image\u2019s <code>srcset<\/code> is used on the client side by the browser to choose between different image resources based on device capabilities, Client Hints complement this by allowing the server to make more informed decisions about which images to serve based on additional information about the client\u2019s device, leading to potentially even more optimized content delivery. This is accomplished through the browser sending special headers to the server that contain information about the client device capabilities, such as <code>Sec-CH-DPR<\/code> (which represents the browser window\u2019s device pixel ratio). Client Hints still have limited browser support, however, the <a href=\"https:\/\/cloudinary.com\/documentation\/responsive_server_side_client_hints#automatic_pixel_density_detection\">Cloudinary API already supports them<\/a>.<\/p>\n<h3>Preventing Layout Shift<\/h3>\n<p>Layout shift in the context of an image loading occurs when the browser initially renders a web page without knowing the actual dimensions of an image. As a result, the image\u2019s placeholder takes up minimal space on the page, causing other elements to position themselves accordingly. However, once the image has fully loaded and the browser recognizes its actual dimensions, it may need to reflow the content, shifting surrounding elements to accommodate the image\u2019s true size.<\/p>\n<p>This effect can be seen below:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/cloudinary-marketing-res.cloudinary.com\/image\/upload\/v1764219279\/blog-Deep_Dive_Into_Responsive_Images_in_Next.js-1.gif\" alt=\"GIF showing content being reflowed\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"2000\" height=\"702\"\/><\/p>\n<p>To prevent this layout shift before an image has loaded, it\u2019s recommended to provide the <code>width<\/code> and <code>height<\/code> attributes on the <code>img<\/code> element. By specifying these attributes, the browser can reserve the appropriate amount of space for the image based on its aspect ratio, preventing surrounding content from shifting when the image loads. This technique is known as \u201creserving space\u201d and helps maintain a stable layout, improving the overall user experience. Therefore, to provide a good user experience for responsive images, we should not only rely on <code>srcset<\/code> and <code>sizes<\/code>, but provide <code>width<\/code> and <code>height<\/code> as well.<\/p>\n<p>It\u2019s important to note that while the width and height attributes define the intrinsic dimensions, the actual rendered size of the image can be different based on the applied CSS styles, such as <code>max-width<\/code> or <code>object-fit<\/code>.<\/p>\n<h2>Automatic Generation of srcset\/sizes in Next.js<\/h2>\n<p>If your website features a multitude of images, manually adding different variations in <code>srcset<\/code> can be a daunting task. Fortunately, there are tools like the <a href=\"https:\/\/www.responsivebreakpoints.com\/\">Responsive Image Breakpoints Generator<\/a> that help you alleviate this issue. Furthermore, modern frameworks such as Next.js come equipped with built-in functionality to generate a set of responsive images with no additional effort required by the developer. All that is required from you is to provide the image source, and Next.js will leverage its Image Optimization API to generate a set of images along with the accompanying <code>srcset<\/code>. This is achieved through the use of an Image Loader, essentially a function that creates multiple URLs to request the image at different sizes. These multiple URLs facilitate the automatic generation of <code>srcset<\/code>, ensuring that visitors to your site are served an image that is the perfect size for their viewport.<\/p>\n<p>The default loader for Next.js applications is capable of optimizing images not only hosted locally but also those from anywhere on the web, and then serving them directly from the Next.js web server.<\/p>\n<p>The Next.js <code>Image<\/code> component acts as a wrapper around the standard <code>img<\/code> element. By utilizing the <code>Image<\/code> component in the following manner, you can take advantage of Next.js\u2019s image optimization capabilities. For an <code>Image<\/code> component used like this:<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\"><span class=\"hljs-keyword\">import<\/span> Image <span class=\"hljs-keyword\">from<\/span> <span class=\"hljs-string\">'next\/image'<\/span>\n\n<span class=\"hljs-keyword\">const<\/span> MyComponent = <span class=\"hljs-function\"><span class=\"hljs-params\">()<\/span> =&gt;<\/span> (\n  <span class=\"xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">Image<\/span>\n    <span class=\"hljs-attr\">src<\/span>=<span class=\"hljs-string\">\"\/assets\/nature-mountains.jpg\"<\/span>\n    <span class=\"hljs-attr\">width<\/span>=<span class=\"hljs-string\">{800}<\/span>\n    <span class=\"hljs-attr\">height<\/span>=<span class=\"hljs-string\">{600}<\/span>\n    <span class=\"hljs-attr\">alt<\/span>=<span class=\"hljs-string\">\"Example Image\"<\/span>\n  \/&gt;<\/span><\/span>\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\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<p>Next.js will generate an <code>img<\/code> element like this:<\/p>\n<pre class=\"js-syntax-highlighted\" 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\">img<\/span> <span class=\"hljs-attr\">alt<\/span>=<span class=\"hljs-string\">\"Example Image\"<\/span> <span class=\"hljs-attr\">loading<\/span>=<span class=\"hljs-string\">\"lazy\"<\/span> <span class=\"hljs-attr\">width<\/span>=<span class=\"hljs-string\">\"800\"<\/span> <span class=\"hljs-attr\">height<\/span>=<span class=\"hljs-string\">\"600\"<\/span> <span class=\"hljs-attr\">decoding<\/span>=<span class=\"hljs-string\">\"async\"<\/span> <span class=\"hljs-attr\">data-nimg<\/span>=<span class=\"hljs-string\">\"1\"<\/span> <span class=\"hljs-attr\">style<\/span>=<span class=\"hljs-string\">\"color:transparent\"<\/span> <span class=\"hljs-attr\">srcset<\/span>=<span class=\"hljs-string\">\"\/_next\/image?url=%2Fassets%2Fnature-mountains.jpg<span class=\"hljs-symbol\">&amp;amp;<\/span>w=828<span class=\"hljs-symbol\">&amp;amp;<\/span>q=75 1x,\/_next\/image?url=%2Fassets%2Fnature-mountains.jpg<span class=\"hljs-symbol\">&amp;amp;<\/span>w=1920<span class=\"hljs-symbol\">&amp;amp;<\/span>q=75 2x\"<\/span> <span class=\"hljs-attr\">src<\/span>=<span class=\"hljs-string\">\"\/_next\/image?url=%2Fassets%2Fnature-mountains.jpg<span class=\"hljs-symbol\">&amp;amp;<\/span>w=1920<span class=\"hljs-symbol\">&amp;amp;<\/span>q=75\"<\/span>&gt;<\/span>\n<\/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<h2>Going Even Further: Cloudinary\u2019s CldImage<\/h2>\n<p>If Next.js\u2019s <code>Image<\/code> component is a wrapper around the HTML <code>img<\/code> element, then Cloudinary\u2019s <a href=\"https:\/\/next.cloudinary.dev\/cldimage\/basic-usage\">CldImage<\/a> is a wrapper around Next.js\u2019s <code>Image<\/code>. The <code>CldImage<\/code> component accepts similar props as the <code>Image<\/code> component from Next.js but automatically handles image optimization, responsive delivery, and various image transformations through Cloudinary\u2019s powerful API. This gives you access to advanced features like dynamic cropping, background removal, overlays, and other Cloudinary transformations.<\/p>\n<center><img decoding=\"async\" src=\"https:\/\/cloudinary-marketing-res.cloudinary.com\/image\/upload\/v1764219281\/blog-Deep_Dive_Into_Responsive_Images_in_Next.js-2.png\" alt=\"CLD image\" style=\"zoom: 67%;\" \/><\/center>\n<p><code>CldImage<\/code> can be used almost as a drop-in replacement for the Next.js image component, as shown below. We only changed the element name from <code>Image<\/code> to <code>CldImage<\/code> and updated the source to match the location of the image on Cloudinary.<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\"><span class=\"hljs-keyword\">import<\/span> { CldImage } <span class=\"hljs-keyword\">from<\/span> <span class=\"hljs-string\">\"next-cloudinary\"<\/span>;\n\n<span class=\"hljs-keyword\">const<\/span> MyComponent = <span class=\"hljs-function\"><span class=\"hljs-params\">()<\/span> =&gt;<\/span> (\n  <span class=\"xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">CldImage<\/span>\n    <span class=\"hljs-attr\">src<\/span>=<span class=\"hljs-string\">\"samples\/landscapes\/nature-mountains\"<\/span>\n    <span class=\"hljs-attr\">width<\/span>=<span class=\"hljs-string\">{800}<\/span>\n    <span class=\"hljs-attr\">height<\/span>=<span class=\"hljs-string\">{600}<\/span>\n    <span class=\"hljs-attr\">alt<\/span>=<span class=\"hljs-string\">\"Example Image\"<\/span>\n  \/&gt;<\/span><\/span>\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\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<p>The resulting <code>img<\/code> element is this:<\/p>\n<pre class=\"js-syntax-highlighted\" 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\">img<\/span> <span class=\"hljs-attr\">alt<\/span>=<span class=\"hljs-string\">\"Example Image\"<\/span> <span class=\"hljs-attr\">loading<\/span>=<span class=\"hljs-string\">\"lazy\"<\/span> <span class=\"hljs-attr\">width<\/span>=<span class=\"hljs-string\">\"800\"<\/span> <span class=\"hljs-attr\">height<\/span>=<span class=\"hljs-string\">\"600\"<\/span> <span class=\"hljs-attr\">decoding<\/span>=<span class=\"hljs-string\">\"async\"<\/span> <span class=\"hljs-attr\">data-nimg<\/span>=<span class=\"hljs-string\">\"1\"<\/span> <span class=\"hljs-attr\">style<\/span>=<span class=\"hljs-string\">\"color:transparent\"<\/span> <span class=\"hljs-attr\">srcset<\/span>=<span class=\"hljs-string\">\"https:\/\/res.cloudinary.com\/daa2k5bgw\/image\/upload\/c_limit,w_828\/f_auto\/q_auto\/v1\/samples\/landscapes\/nature-mountains?_a=BAVAEyBy0 1x, https:\/\/res.cloudinary.com\/daa2k5bgw\/image\/upload\/c_limit,w_1920\/f_auto\/q_auto\/v1\/samples\/landscapes\/nature-mountains?_a=BAVAEyBy0 2x\"<\/span> <span class=\"hljs-attr\">src<\/span>=<span class=\"hljs-string\">\"https:\/\/res.cloudinary.com\/daa2k5bgw\/image\/upload\/c_limit,w_1920\/f_auto\/q_auto\/v1\/samples\/landscapes\/nature-mountains?_a=BAVAEyBy0\"<\/span>&gt;<\/span>\n<\/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<p>As you can see, the <code>srcset<\/code> now uses Cloudinary URLs for each image in the <code>srcset<\/code>. In the following sections, we will see how we can utilize <code>CldImage<\/code> in some common UI patterns.<\/p>\n<h2>Common Patterns for Responsive Images<\/h2>\n<p>Responsive images can be used in various scenarios across web applications, but they are particularly prevalent in hero sections and card elements, where visual appeal and optimal presentation are crucial. In this context, we will demonstrate how to model these components effectively by leveraging the powerful combination of React, Tailwind CSS, and Cloudinary\u2019s <code>CldImage<\/code> component.<\/p>\n<h3>Hero Sections\/Background Images<\/h3>\n<p>A hero section on a website typically refers to the prominent, eye-catching area at the top of a web page. The hero section often occupies a significant portion of the initial viewport and can include various elements. Commonly, it features a large image in the background that stretches to fill the entire width.<\/p>\n<p>To achieve this, we will use <code>CldImage<\/code> with the <code>sizes<\/code> property set to <code>100vw<\/code>. This means the image will always be full-width, allowing the browser to calculate the width of the rendered image depending on the user\u2019s device and select the appropriate image from the auto-generated <code>srcset<\/code> based on that.<\/p>\n<p>In a hero section like this, layout shift isn\u2019t a concern because the image is used as a background image, and we don\u2019t need to specify the <code>width<\/code> and <code>height<\/code> of <code>CldImage<\/code>. Instead, we need to use <code>fill<\/code>, which <a href=\"https:\/\/nextjs.org\/docs\/pages\/api-reference\/components\/image#fill\">causes the image to fill the parent element<\/a>. This is the resulting code:<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">ResponsiveHero<\/span>(<span class=\"hljs-params\"><\/span>) <\/span>{\n  <span class=\"hljs-keyword\">return<\/span> (\n    <span class=\"xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span> <span class=\"hljs-attr\">className<\/span>=<span class=\"hljs-string\">\"relative\"<\/span>&gt;<\/span>\n      <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span> <span class=\"hljs-attr\">className<\/span>=<span class=\"hljs-string\">\"absolute inset-0\"<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">CldImage<\/span>\n          <span class=\"hljs-attr\">fill<\/span>\n          <span class=\"hljs-attr\">src<\/span>=<span class=\"hljs-string\">\"samples\/landscapes\/nature-mountains\"<\/span>\n          <span class=\"hljs-attr\">sizes<\/span>=<span class=\"hljs-string\">\"100vw\"<\/span>\n          <span class=\"hljs-attr\">alt<\/span>=<span class=\"hljs-string\">\"Lake with mountains in the background, blue sky and green trees along the shore\"<\/span>\n        \/&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span> <span class=\"hljs-attr\">className<\/span>=<span class=\"hljs-string\">\"absolute inset-0 bg-gray-800 opacity-50\"<\/span>&gt;<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n      <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n      <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span> <span class=\"hljs-attr\">className<\/span>=<span class=\"hljs-string\">\"relative max-w-7xl mx-auto py-24 px-4 sm:py-32 sm:px-6 lg:px-8\"<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">h1<\/span> <span class=\"hljs-attr\">className<\/span>=<span class=\"hljs-string\">\"text-4xl font-extrabold tracking-tight text-white sm:text-5xl lg:text-6xl\"<\/span>&gt;<\/span>\n          Conquer Towering Peaks: Your Ultimate Mountain Adventure Awaits\n        <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">h1<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">p<\/span> <span class=\"hljs-attr\">className<\/span>=<span class=\"hljs-string\">\"mt-6 text-xl text-gray-300\"<\/span>&gt;<\/span>\n          Anim aute id magna aliqua ad ad non deserunt sunt. Qui irure qui lorem\n          cupidatat commodo. Elit sunt amet fugiat veniam occaecat fugiat\n          aliqua. Anim aute id magna aliqua ad ad non deserunt sunt. Qui irure\n          qui lorem cupidatat commodo.\n        <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">p<\/span>&gt;<\/span>\n      <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span><\/span>\n  );\n}\n<\/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<p>When rendered, the hero section will appear as:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/cloudinary-marketing-res.cloudinary.com\/image\/upload\/v1764891298\/blog-Deep_Dive_Into_Responsive_Images_in_Next.js-3.png\" alt=\"Responsive hero\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"4058\" height=\"960\"\/><\/p>\n<p>The result of the above code is that <code>CldImage<\/code> generated a total of eight <code>srcset<\/code> images (part of the URL is omitted for simplicity).<\/p>\n<pre class=\"js-syntax-highlighted\"><code>1. https:\/\/res.cloudinary.com\/daa2k5bgw\/image\/upload\/c_limit,w_640\/[...]\/nature-mountains?_a=BAVAEyBy0 640w\n2. https:\/\/res.cloudinary.com\/daa2k5bgw\/image\/upload\/c_limit,w_750\/[...]\/nature-mountains?_a=BAVAEyBy0 750w\n3. https:\/\/res.cloudinary.com\/daa2k5bgw\/image\/upload\/c_limit,w_828\/[...]\/nature-mountains?_a=BAVAEyBy0 828w\n4. https:\/\/res.cloudinary.com\/daa2k5bgw\/image\/upload\/c_limit,w_1080\/[...]\/nature-mountains?_a=BAVAEyBy0 1080w\n5. https:\/\/res.cloudinary.com\/daa2k5bgw\/image\/upload\/c_limit,w_1200\/[...]\/nature-mountains?_a=BAVAEyBy0 1200w\n6. https:\/\/res.cloudinary.com\/daa2k5bgw\/image\/upload\/c_limit,w_1920\/[...]nature-mountains?_a=BAVAEyBy0 1920w\n7. https:\/\/res.cloudinary.com\/daa2k5bgw\/image\/upload\/c_limit,w_2048\/[...]\/nature-mountains?_a=BAVAEyBy0 2048w\n8. https:\/\/res.cloudinary.com\/daa2k5bgw\/image\/upload\/c_limit,w_3840\/[...]\/nature-mountains?_a=BAVAEyBy0 3840w\n<\/code><\/pre>\n<p>As you can see from the URLs, they contain parameters that determine the size and quality of the image you would receive if you made a GET request. The parameter starting with <code>w_<\/code> specifically indicates the width of the image. This means that you, as a developer, no longer need to manually generate the images \u2014 Cloudinary, with its CldImage, will do all the heavy lifting for you.<\/p>\n<p>Now, for someone using a 1080p monitor, the width of the viewport will be roughly 1920 pixels, and the browser will choose picture number 6 from the <code>srcset<\/code>, which is an image optimally sized for that resolution.<\/p>\n<h3>Card Layouts<\/h3>\n<p>Card components are a popular UI pattern used in modern web design, often featuring a visually appealing layout with images, text, and other content elements. Images play a crucial role in card components, frequently appearing on the left or right side, serving as an eye-catching thumbnail or visual representation of the card\u2019s content. Because images no longer appear in the background, we need to take a slightly different approach. This time, we need to be wary of possible layout shifts while the image is loading.<\/p>\n<p>For that reason, we need to reserve some space for the image by specifying both <code>width<\/code> and <code>height<\/code>. We\u2019ll also specify multiple sizes, because we want the image to be full-width when on mobile, while on larger screens, it will appear in the left section and be roughly 640px in width.<\/p>\n<p>The resulting code is:<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">ResponsiveCard<\/span>(<span class=\"hljs-params\"><\/span>) <\/span>{\n  <span class=\"hljs-keyword\">return<\/span> (\n    <span class=\"xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span> <span class=\"hljs-attr\">className<\/span>=<span class=\"hljs-string\">\"bg-white rounded-lg border-2 overflow-hidden grid grid-cols-1 sm:grid-cols-2 max-w-screen-lg mx-auto my-32\"<\/span>&gt;<\/span>\n      <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span> <span class=\"hljs-attr\">className<\/span>=<span class=\"hljs-string\">\"flex justify-center p-4\"<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">CldImage<\/span>\n          <span class=\"hljs-attr\">className<\/span>=<span class=\"hljs-string\">\"w-full lg:w-auto object-cover\"<\/span>\n          <span class=\"hljs-attr\">width<\/span>=<span class=\"hljs-string\">{478}<\/span>\n          <span class=\"hljs-attr\">height<\/span>=<span class=\"hljs-string\">{319}<\/span>\n          <span class=\"hljs-attr\">src<\/span>=<span class=\"hljs-string\">\"samples\/landscapes\/nature-mountains\"<\/span>\n          <span class=\"hljs-attr\">sizes<\/span>=<span class=\"hljs-string\">\"(max-width: 640px) 100vw, 750px\"<\/span>\n          <span class=\"hljs-attr\">alt<\/span>=<span class=\"hljs-string\">\"Lake with mountains in the background, blue sky and green trees along the shore\"<\/span>\n        \/&gt;<\/span>\n      <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n      <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span> <span class=\"hljs-attr\">className<\/span>=<span class=\"hljs-string\">\"p-6\"<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">h3<\/span> <span class=\"hljs-attr\">className<\/span>=<span class=\"hljs-string\">\"text-xl font-semibold mb-2\"<\/span>&gt;<\/span>Conquer Towering Peaks: Your Ultimate Mountain Adventure Awaits<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">h3<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">p<\/span> <span class=\"hljs-attr\">className<\/span>=<span class=\"hljs-string\">\"text-gray-600\"<\/span>&gt;<\/span>Anim aute id magna aliqua ad ad non deserunt sunt. Qui irure qui lorem\n          cupidatat commodo. Elit sunt amet fugiat veniam occaecat fugiat\n          aliqua. Anim aute id magna aliqua ad ad non deserunt sunt. Qui irure\n          qui lorem cupidatat commodo.<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">p<\/span>&gt;<\/span>\n      <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span><\/span>\n  );\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><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<p>When rendered, the card section will appear as:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/cloudinary-marketing-res.cloudinary.com\/image\/upload\/v1764891303\/blog-Deep_Dive_Into_Responsive_Images_in_Next.js-4.png\" alt=\"Responsive card\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"2106\" height=\"792\"\/><\/p>\n<h2>Conclusion<\/h2>\n<p>Responsive images are crucial for delivering an exceptional user experience across multiple devices. While Next.js provides built-in tools for implementing responsive images, Cloudinary\u2019s <code>CldImage<\/code> component offers a powerful and flexible solution for handling complex image optimization and transformation scenarios. Combine Next.js and Cloudinary to deliver high-quality, responsive images that enhance your application\u2019s performance and user experience. <a href=\"https:\/\/cloudinary.com\/contact\">Contact us<\/a> today to learn more.<\/p>\n<\/div>","protected":false},"excerpt":{"rendered":"","protected":false},"author":87,"featured_media":33547,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_cloudinary_featured_overwrite":false,"footnotes":""},"categories":[1],"tags":[212,251],"class_list":["post-33544","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","tag-next-js","tag-responsive-images"],"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>Responsive Images in Next.js With Cloudinary&#039;s CldImage Component<\/title>\n<meta name=\"description\" content=\"Learn the basics of HTML image attributes &amp; automatically generate srcset\/sizes in Next.js for optimized image delivery on various devices &amp; screen sizes.\" \/>\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\/deep-dive-responsive-images-next-js\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Deep Dive Into Responsive Images in Next.js\" \/>\n<meta property=\"og:description\" content=\"Learn the basics of HTML image attributes &amp; automatically generate srcset\/sizes in Next.js for optimized image delivery on various devices &amp; screen sizes.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/cloudinary.com\/blog\/deep-dive-responsive-images-next-js\" \/>\n<meta property=\"og:site_name\" content=\"Cloudinary Blog\" \/>\n<meta property=\"article:published_time\" content=\"2024-04-11T14:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-12-04T23:39:28+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1712265553\/responsive_images-blog\/responsive_images-blog.jpg?_i=AA\" \/>\n\t<meta property=\"og:image:width\" content=\"2000\" \/>\n\t<meta property=\"og:image:height\" content=\"1100\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"melindapham\" \/>\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\/deep-dive-responsive-images-next-js#article\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/deep-dive-responsive-images-next-js\"},\"author\":{\"name\":\"melindapham\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/0d5ad601e4c3b5be89245dfb14be42d9\"},\"headline\":\"Deep Dive Into Responsive Images in Next.js\",\"datePublished\":\"2024-04-11T14:00:00+00:00\",\"dateModified\":\"2025-12-04T23:39:28+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/deep-dive-responsive-images-next-js\"},\"wordCount\":8,\"publisher\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/deep-dive-responsive-images-next-js#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1712265553\/responsive_images-blog\/responsive_images-blog.jpg?_i=AA\",\"keywords\":[\"Next.js\",\"Responsive Images\"],\"inLanguage\":\"en-US\",\"copyrightYear\":\"2024\",\"copyrightHolder\":{\"@id\":\"https:\/\/cloudinary.com\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/cloudinary.com\/blog\/deep-dive-responsive-images-next-js\",\"url\":\"https:\/\/cloudinary.com\/blog\/deep-dive-responsive-images-next-js\",\"name\":\"Responsive Images in Next.js With Cloudinary's CldImage Component\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/deep-dive-responsive-images-next-js#primaryimage\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/deep-dive-responsive-images-next-js#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1712265553\/responsive_images-blog\/responsive_images-blog.jpg?_i=AA\",\"datePublished\":\"2024-04-11T14:00:00+00:00\",\"dateModified\":\"2025-12-04T23:39:28+00:00\",\"description\":\"Learn the basics of HTML image attributes & automatically generate srcset\/sizes in Next.js for optimized image delivery on various devices & screen sizes.\",\"breadcrumb\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/deep-dive-responsive-images-next-js#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/cloudinary.com\/blog\/deep-dive-responsive-images-next-js\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/deep-dive-responsive-images-next-js#primaryimage\",\"url\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1712265553\/responsive_images-blog\/responsive_images-blog.jpg?_i=AA\",\"contentUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1712265553\/responsive_images-blog\/responsive_images-blog.jpg?_i=AA\",\"width\":2000,\"height\":1100},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/cloudinary.com\/blog\/deep-dive-responsive-images-next-js#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/cloudinary.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Deep Dive Into Responsive Images in Next.js\"}]},{\"@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\/0d5ad601e4c3b5be89245dfb14be42d9\",\"name\":\"melindapham\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/e6f989fa97fe94be61596259d8629c3df65aec4c7da5c0000f90d810f313d4f4?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/e6f989fa97fe94be61596259d8629c3df65aec4c7da5c0000f90d810f313d4f4?s=96&d=mm&r=g\",\"caption\":\"melindapham\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Responsive Images in Next.js With Cloudinary's CldImage Component","description":"Learn the basics of HTML image attributes & automatically generate srcset\/sizes in Next.js for optimized image delivery on various devices & screen sizes.","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\/deep-dive-responsive-images-next-js","og_locale":"en_US","og_type":"article","og_title":"Deep Dive Into Responsive Images in Next.js","og_description":"Learn the basics of HTML image attributes & automatically generate srcset\/sizes in Next.js for optimized image delivery on various devices & screen sizes.","og_url":"https:\/\/cloudinary.com\/blog\/deep-dive-responsive-images-next-js","og_site_name":"Cloudinary Blog","article_published_time":"2024-04-11T14:00:00+00:00","article_modified_time":"2025-12-04T23:39:28+00:00","og_image":[{"width":2000,"height":1100,"url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1712265553\/responsive_images-blog\/responsive_images-blog.jpg?_i=AA","type":"image\/jpeg"}],"author":"melindapham","twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"NewsArticle","@id":"https:\/\/cloudinary.com\/blog\/deep-dive-responsive-images-next-js#article","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/deep-dive-responsive-images-next-js"},"author":{"name":"melindapham","@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/0d5ad601e4c3b5be89245dfb14be42d9"},"headline":"Deep Dive Into Responsive Images in Next.js","datePublished":"2024-04-11T14:00:00+00:00","dateModified":"2025-12-04T23:39:28+00:00","mainEntityOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/deep-dive-responsive-images-next-js"},"wordCount":8,"publisher":{"@id":"https:\/\/cloudinary.com\/blog\/#organization"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/deep-dive-responsive-images-next-js#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1712265553\/responsive_images-blog\/responsive_images-blog.jpg?_i=AA","keywords":["Next.js","Responsive Images"],"inLanguage":"en-US","copyrightYear":"2024","copyrightHolder":{"@id":"https:\/\/cloudinary.com\/#organization"}},{"@type":"WebPage","@id":"https:\/\/cloudinary.com\/blog\/deep-dive-responsive-images-next-js","url":"https:\/\/cloudinary.com\/blog\/deep-dive-responsive-images-next-js","name":"Responsive Images in Next.js With Cloudinary's CldImage Component","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/deep-dive-responsive-images-next-js#primaryimage"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/deep-dive-responsive-images-next-js#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1712265553\/responsive_images-blog\/responsive_images-blog.jpg?_i=AA","datePublished":"2024-04-11T14:00:00+00:00","dateModified":"2025-12-04T23:39:28+00:00","description":"Learn the basics of HTML image attributes & automatically generate srcset\/sizes in Next.js for optimized image delivery on various devices & screen sizes.","breadcrumb":{"@id":"https:\/\/cloudinary.com\/blog\/deep-dive-responsive-images-next-js#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/cloudinary.com\/blog\/deep-dive-responsive-images-next-js"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/deep-dive-responsive-images-next-js#primaryimage","url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1712265553\/responsive_images-blog\/responsive_images-blog.jpg?_i=AA","contentUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1712265553\/responsive_images-blog\/responsive_images-blog.jpg?_i=AA","width":2000,"height":1100},{"@type":"BreadcrumbList","@id":"https:\/\/cloudinary.com\/blog\/deep-dive-responsive-images-next-js#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/cloudinary.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Deep Dive Into Responsive Images in Next.js"}]},{"@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\/0d5ad601e4c3b5be89245dfb14be42d9","name":"melindapham","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/e6f989fa97fe94be61596259d8629c3df65aec4c7da5c0000f90d810f313d4f4?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/e6f989fa97fe94be61596259d8629c3df65aec4c7da5c0000f90d810f313d4f4?s=96&d=mm&r=g","caption":"melindapham"}}]}},"jetpack_featured_media_url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1712265553\/responsive_images-blog\/responsive_images-blog.jpg?_i=AA","_links":{"self":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/33544","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\/87"}],"replies":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/comments?post=33544"}],"version-history":[{"count":10,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/33544\/revisions"}],"predecessor-version":[{"id":39577,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/33544\/revisions\/39577"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media\/33547"}],"wp:attachment":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media?parent=33544"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/categories?post=33544"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/tags?post=33544"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}