Why the Browser Waits
CSS is render-blocking by design - the browser can't safely paint content it doesn't yet know the final styles for, so it holds off until every stylesheet in the document (that applies to the current viewport) has downloaded and parsed. A synchronous <script> tag blocks the HTML parser itself - parsing stops, the script downloads and executes, and only then does parsing resume.
How to Fix It
1. Defer non-critical JavaScript
1<script src="/analytics.js" defer></script>2. Inline critical, above-the-fold CSS
Extract just the CSS needed to render what's visible without scrolling, inline it directly in the <head>, and load the full stylesheet asynchronously:
1<style>/* critical, above-the-fold CSS inlined here */</style>
2<link rel="preload" href="/styles.css" as="style" onload="this.onload=null;this.rel='stylesheet'" />
3<noscript><link rel="stylesheet" href="/styles.css" /></noscript>3. Scope non-critical stylesheets with a media attribute
1<link rel="stylesheet" href="/print.css" media="print" />4. Move scripts that don't need to run early to the end of the body
If a script genuinely doesn't need defer's guarantees, placing it just before </body> means the parser has already processed everything above it before it blocks.
5. Let your framework's build step split and prioritize automatically
Modern framework build tooling (Next.js, Vite) already code-splits and defers non-critical JS by default in most configurations - a render-blocking finding is often a sign of a manually-added third-party <script> tag that bypassed that pipeline entirely.
How Scanverra Detects This
Scanverra's performance check runs a real Lighthouse pass against your live URL and reports every render-blocking stylesheet and script it finds, along with the estimated time savings from removing or deferring each one - the same run used to score LCP, TTFB, and the rest of your performance score.