{"id":10095,"date":"2025-10-07T15:12:15","date_gmt":"2025-10-07T15:12:15","guid":{"rendered":"https:\/\/hellonitish.com\/blog\/?p=10095"},"modified":"2026-09-01T12:07:21","modified_gmt":"2026-09-01T12:07:21","slug":"how-i-achieved-faster-load-times-via-smarter-image-delivery","status":"publish","type":"post","link":"https:\/\/hellonitish.com\/blog\/how-i-achieved-faster-load-times-via-smarter-image-delivery\/","title":{"rendered":"How I Achieved Faster Load Times via Smarter Image Delivery"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Unoptimized images are almost always the single biggest bottleneck on slow websites. <\/p>\n\n\n\n<p class=\"has-custom-css wp-custom-css-329ec74c wp-block-paragraph\">Great photos sell products, but you shouldn&#8217;t force mobile visitors to download the same massive images you serve desktop visitors. Multiple studies show how a faster website results in more sales <a href=\"#footnote\" data-type=\"internal\" data-id=\"#footnote\" class=\"fnote-link\">Sources in footnote<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Even if it feels like your site is loading &#8220;fast enough&#8221;, you will likely make more money if it loads faster.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Why Image Optimization Came First<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">While working on a client&#8217;s site, I found that images made up over 80% of the total page weight. Uncompressed uploads were ruining mobile load times and driving away impatient visitors. I focused on four straightforward goals:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Cutting Down File Sizes:<\/strong> A smaller image will always load faster if everything else stays the same.<\/li>\n\n\n\n<li><strong>Making Main Images Load Instantly:<\/strong> Getting the top banner on screen immediately so visitors aren&#8217;t staring at a blank space and Google doesn&#8217;t penalize your search ranking.<\/li>\n\n\n\n<li><strong>Cutting Out Wasted Data:<\/strong> Shaving 2.5 MB off every page view saved over 125 GB of useless data transfer across 50,000 monthly visitors.<\/li>\n\n\n\n<li><strong>Keeping Visitors from Leaving:<\/strong> When pages load fast and stop jumping around as images pop in, people actually stick around instead of hitting the back button.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">I Implemented Three Fixes<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">They go beyond installing optimization plugins. The idea was to use modern image formats, with proper responsive sizing, and CSS or JS instead of images whenever possible.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1. Upgrading to AVIF with a WebP Fallback<\/h3>\n\n\n\n<figure class=\"wp-block-image size-large\" class=\"n-bshadow n-round-x2\"><img decoding=\"async\" width=\"1024\" height=\"585\" loading=\"lazy\" src=\"https:\/\/hellonitish.com\/blog\/wp-content\/uploads\/2025\/10\/serve-right-format-1024x585.webp\" alt=\"Comparison of modern web image formats\" class=\"wp-image-10153\" srcset=\"https:\/\/hellonitish.com\/blog\/wp-content\/uploads\/2025\/10\/serve-right-format-1024x585.webp 1024w, https:\/\/hellonitish.com\/blog\/wp-content\/uploads\/2025\/10\/serve-right-format-320x183.webp 320w, https:\/\/hellonitish.com\/blog\/wp-content\/uploads\/2025\/10\/serve-right-format-460x263.webp 460w, https:\/\/hellonitish.com\/blog\/wp-content\/uploads\/2025\/10\/serve-right-format-640x366.webp 640w, https:\/\/hellonitish.com\/blog\/wp-content\/uploads\/2025\/10\/serve-right-format-800x457.webp 800w, https:\/\/hellonitish.com\/blog\/wp-content\/uploads\/2025\/10\/serve-right-format-1200x686.webp 1200w, https:\/\/hellonitish.com\/blog\/wp-content\/uploads\/2025\/10\/serve-right-format.webp 1344w\" sizes=\"auto, (max-width: 767px) 100vw, (min-width: 768px) and (max-width: 1300px) 66.67vw, 765px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The website was serving JPGs and PNGs with basic compression. I updated it to serve images in AVIF and WebP formats to visitors.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>The AVIF format gives the smallest file size for the same image quality, followed by the WebP format.<\/li>\n\n\n\n<li>Around 99% mobile and 95% desktop visitors have AVIF support. The remaining 5% support on desktop is covered by WebP.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Here is how the numbers shifted on a single archive card image:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Original PNG Export:<\/strong> 541 KB<\/li>\n\n\n\n<li><strong>Standard JPEG:<\/strong> 263 KB<\/li>\n\n\n\n<li><strong>Optimized WebP:<\/strong> 41 KB (84% lighter)<\/li>\n\n\n\n<li><strong>Optimized AVIF:<\/strong> ~28 KB (over 90% total reduction)<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">2. Responsive Sizing &amp; Mobile Art Direction<\/h3>\n\n\n\n<figure class=\"wp-block-image size-large\" class=\"n-bshadow n-round-x2\"><img decoding=\"async\" width=\"1024\" height=\"585\" loading=\"lazy\" src=\"https:\/\/hellonitish.com\/blog\/wp-content\/uploads\/2025\/10\/different-sized-sceneries-1024x585.webp\" alt=\"Responsive image sizes across devices\" class=\"wp-image-10156\" srcset=\"https:\/\/hellonitish.com\/blog\/wp-content\/uploads\/2025\/10\/different-sized-sceneries-1024x585.webp 1024w, https:\/\/hellonitish.com\/blog\/wp-content\/uploads\/2025\/10\/different-sized-sceneries-320x183.webp 320w, https:\/\/hellonitish.com\/blog\/wp-content\/uploads\/2025\/10\/different-sized-sceneries-460x263.webp 460w, https:\/\/hellonitish.com\/blog\/wp-content\/uploads\/2025\/10\/different-sized-sceneries-640x366.webp 640w, https:\/\/hellonitish.com\/blog\/wp-content\/uploads\/2025\/10\/different-sized-sceneries-800x457.webp 800w, https:\/\/hellonitish.com\/blog\/wp-content\/uploads\/2025\/10\/different-sized-sceneries-1200x686.webp 1200w, https:\/\/hellonitish.com\/blog\/wp-content\/uploads\/2025\/10\/different-sized-sceneries.webp 1344w\" sizes=\"auto, (max-width: 767px) 100vw, (min-width: 768px) and (max-width: 1300px) 66.67vw, 765px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Proper image optimization goes beyond serving the right format. I implemented two changes depending on the role an image served on the website.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Resolution Switching<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">If an image (likely a product image) stays the same across devices, it is best to serve different resolutions depending on the screen size. I serve AVIF images first and then WebP images as fallback using code that looks similar to the snippet below.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;picture class=\"neps-rspv\"&gt;\n    &lt;!-- AVIF Candidates with high-DPI mobile coverage --&gt;\n    &lt;source \n        type=\"image\/avif\"\n        srcset=\"\n            post-thumbnail-320.avif 320w,\n            post-thumbnail-460.avif 460w,\n            post-thumbnail-640.avif 640w,\n            post-thumbnail-800.avif 800w,\n            post-thumbnail-1024.avif 1024w\n        \"\n        sizes=\"(max-width: 767px) 100vw, (max-width: 991px) 50vw, 460px\"&gt;\n\n    &lt;!-- WebP Fallback --&gt;\n    &lt;source \n        type=\"image\/webp\"\n        srcset=\"\n            post-thumbnail-320.webp 320w,\n            post-thumbnail-460.webp 460w,\n            post-thumbnail-640.webp 640w,\n            post-thumbnail-800.webp 800w,\n            post-thumbnail-1024.webp 1024w\n        \"\n        sizes=\"(max-width: 767px) 100vw, (max-width: 991px) 50vw, 460px\"&gt;\n\n    &lt;!-- Default Fallback Image --&gt;\n    &lt;img \n        class=\"neps-rspv\"\n        src=\"post-thumbnail-460.webp\"\n        width=\"460\"\n        height=\"263\"\n        alt=\"Optimized client archive card asset\"\n        loading=\"lazy\"\n        decoding=\"async\"&gt;\n&lt;\/picture&gt;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Basically, we tell the browser the size at which we will render an image on different screen widths and give it a bunch of options. It then automatically selects the best one based on the situation.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Art-Directed Breakpoints<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Mobiles and desktops provide different viewing experiences to visitors. A 16:9 wide banner that looks great on PC will look cramped or suboptimal on mobile, where square or taller images look better. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">On multiple occasions, I have used the <code>&lt;picture&gt;<\/code> tag to serve a redesigned, taller or square image on phones and a widescreen version on desktops. Both variants keep the main focus of the image front and center.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I also add explicit <code>width<\/code> and <code>height<\/code> attributes to each <code>&lt;source&gt;<\/code> tag to force the browser to reserve the exact layout space before anything downloads. This helps avoid unwanted shifts as the page loads, improving user experience and PageSpeed scores.  <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;picture class=\"neps-rspv\"&gt;\n    &lt;!-- Mobile: Square crop (up to 767px) in AVIF --&gt;\n    &lt;source \n        media=\"(max-width: 767px)\"\n        type=\"image\/avif\"\n        srcset=\"hero-mobile-400x400.avif 400w, hero-mobile-800x800.avif 800w\"\n        sizes=\"100vw\"\n        width=\"400\"\n        height=\"400\"&gt;\n\n    &lt;!-- Mobile: Square crop in WebP --&gt;\n    &lt;source \n        media=\"(max-width: 767px)\"\n        type=\"image\/webp\"\n        srcset=\"hero-mobile-400x400.webp 400w, hero-mobile-800x800.webp 800w\"\n        sizes=\"100vw\"\n        width=\"400\"\n        height=\"400\"&gt;\n\n    &lt;!-- Desktop: 16:9 landscape crop (768px+) in AVIF --&gt;\n    &lt;source \n        media=\"(min-width: 768px)\"\n        type=\"image\/avif\"\n        srcset=\"hero-desktop-600x338.avif 600w, hero-desktop-1200x675.avif 1200w\"\n        sizes=\"(max-width: 1200px) 50vw, 600px\"\n        width=\"600\"\n        height=\"338\"&gt;\n\n    &lt;!-- Desktop: 16:9 landscape crop in WebP --&gt;\n    &lt;source \n        media=\"(min-width: 768px)\"\n        type=\"image\/webp\"\n        srcset=\"hero-desktop-600x338.webp 600w, hero-desktop-1200x675.webp 1200w\"\n        sizes=\"(max-width: 1200px) 50vw, 600px\"\n        width=\"600\"\n        height=\"338\"&gt;\n\n    &lt;!-- Fallback Image: High priority, NEVER lazy-loaded if above the fold --&gt;\n    &lt;img \n        class=\"neps-rspv\"\n        src=\"hero-desktop-600x338.webp\" \n        width=\"600\" \n        height=\"338\" \n        alt=\"Responsive client hero visual\" \n        fetchpriority=\"high\"\n        decoding=\"async\"&gt;\n&lt;\/picture&gt;<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">3. Replacing Decorative Background Images with Pure CSS<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Some websites I have audited load images when a carefully crafted CSS background would have done the job. Using CSS for simple background textures whenever possible has multiple advantages. They scale without quality loss and can receive real-time dynamic updates if you are looking for an immersive experience.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Properly designed animated CSS backgrounds can also occasionally replace videos. I did this for a client who wanted a light beam to enter through a prism and come out as a spectrum on the other side. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Performance is a priority here, so I offload any background animation to the GPU whenever possible.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Getting the Loading Order Right<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Cutting file sizes is only half the job. The perceived page load speed comes down to what loads first.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I always prioritize the hero image because it is one of the first things visitors see on your website. Hero images should have <code>fetchpriority=\"high\"<\/code> and never lazy-load.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I also explicitly declare the width and height of all images in the HTML to prevent layout shifts when the image does actually load.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For images that viewers will see only after they scroll, I instruct the browsers to load and decode them later on demand. This frees up the network and processor to focus all attention on immediately visible content.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The Measurable Impact<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">You can see how all the optimizations I implement drastically reduce page size and load time by visiting these two pages with optimized and unoptimized images.<\/p>\n\n\n\n<div class=\"wp-block-group ntu-alert has-background\" style=\"background-color:#dff2ff\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<h3 class=\"wp-block-heading\">Why Default CMS Settings Aren&#8217;t Enough<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Most business owners assume their CMS handles image optimization out of the box. In reality, the default CMS and plugin settings only do the bare minimum.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Shopify:<\/strong> Generates resized WebP images, but that&#8217;s where it stops. It doesn&#8217;t serve lighter AVIF files. It also won&#8217;t serve different conversion-optimized banners on desktops and mobiles.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>WordPress:<\/strong> Out of the box, core only makes standard thumbnail sizes. Setting up AVIF, modern caching, and clean markup without layout shifts usually means installing bloated plugins that slow down your admin dashboard without properly fixing the front end.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>The Takeaway:<\/strong> Default CMS settings only handle generic scaling. They have no way to know which images you can eliminate completely and which optimized version of the hero image to serve to different visitors.<\/p>\n<\/div><\/div>\n<\/div><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Final Thoughts<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Real-world speed gains don&#8217;t come from micro-optimizing JavaScript while serving 3 MB hero banners. You have to serve the image in the right format using proper responsive markup. Offload simple graphics and animations to CSS, and fix your download priorities to make a difference where it matters.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Servicing entirely different optimized image versions to different devices for A\/B testing and better conversions is also something CMS platforms can&#8217;t do by default.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I can help you optimize your website images and videos for both site speed and conversion. You can request a detailed, completely free website audit right now.<\/p>\n\n\n\n<div id=\"footnote\">\n  <p>\n    Sources: \n    <a href=\"https:\/\/www2.deloitte.com\/ie\/en\/pages\/consulting\/articles\/milliseconds-make-millions.html\" target=\"_blank\" rel=\"noopener noreferrer\">Deloitte: Milliseconds Make Millions<\/a> | \n    <a href=\"https:\/\/www.thinkwithgoogle.com\/marketing-strategies\/app-and-mobile\/mobile-page-speed-new-industry-benchmarks\/\" target=\"_blank\" rel=\"noopener noreferrer\">Google: Mobile Page Speed Benchmarks<\/a>\n  <\/p>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Unoptimized images are almost always the single biggest bottleneck on slow websites. Great photos sell products, but you shouldn&#8217;t force mobile visitors to download the same massive images you serve desktop visitors. Multiple studies show how a faster website results in more sales Sources in footnote. Even if it feels like your site is loading [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":10142,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[23],"tags":[],"class_list":["post-10095","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-case-studies"],"_links":{"self":[{"href":"https:\/\/hellonitish.com\/blog\/wp-json\/wp\/v2\/posts\/10095","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/hellonitish.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/hellonitish.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/hellonitish.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/hellonitish.com\/blog\/wp-json\/wp\/v2\/comments?post=10095"}],"version-history":[{"count":78,"href":"https:\/\/hellonitish.com\/blog\/wp-json\/wp\/v2\/posts\/10095\/revisions"}],"predecessor-version":[{"id":10388,"href":"https:\/\/hellonitish.com\/blog\/wp-json\/wp\/v2\/posts\/10095\/revisions\/10388"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/hellonitish.com\/blog\/wp-json\/wp\/v2\/media\/10142"}],"wp:attachment":[{"href":"https:\/\/hellonitish.com\/blog\/wp-json\/wp\/v2\/media?parent=10095"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/hellonitish.com\/blog\/wp-json\/wp\/v2\/categories?post=10095"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/hellonitish.com\/blog\/wp-json\/wp\/v2\/tags?post=10095"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}