All lintlab tools

Full-Page Screenshot Fix for Sticky Headers and Lazy-Loaded Images

What it does

If your full-page screenshot comes out with the sticky header repeated down the image, or blank spaces where lazy-loaded images should be, the problem is the capture, not your page. Give this Task a list of public URLs and it returns one full-page PNG per URL with two fixes switched on:

  • Scroll to load: it scrolls down the page one screen at a time, pausing about 250 ms per step, so lazy-loaded images render. Then it scrolls back to the top before capturing.
  • Un-stick fixed elements (full-page mode only): it switches position: fixed elements to absolute and position: sticky to static, so a sticky header appears once at the top instead of repeating down the image. It doesn't remove anything.

Both options are off by default on the Actor; the ready-made Task turns them on. Each URL gives one dataset row with the requested URL, HTTP status, device, mode, width, height and a link to the image.

Run the sticky-header Task on Apify

Open Website Screenshot & Visual Regression Diff · Compare screenshots against a baseline

Example input

This is the input the Task uses: full-page mode, desktop device, PNG output, with scrollToLoad and hideFixedElements set to true. Replace the URL with your own pages. For JPEG instead of PNG, set format to "jpeg".

{
  "urls": ["https://example.com"],
  "mode": "fullPage",
  "device": "desktop",
  "format": "png",
  "scrollToLoad": true,
  "hideFixedElements": true
}

Bottom-pinned cookie bars and chat widgets are the exception: once un-stuck they can still show up once near the bottom of the first screen. To hide them, add their CSS selectors to hideSelectors, for example ["#cookie-banner", ".chat-widget"]. Matching elements are made invisible before the capture.

Price and limits

$0.004 per successful capture; $0.00 start fee from lintlab. Apify platform usage is included in these prices. For example, 100 URLs cost $0.40 in lintlab charges. If you also compare against a baseline, each computed diff adds $0.002.

  • Up to 200 URLs per run.
  • Public HTTP(S) pages only. No login, cookie input, CAPTCHA handling, proxies, or stealth behavior.
  • Scrolling stops after 50 steps or 20,000 px, or when the run's timeout is reached. Images further down a very long or infinite-scroll page may not load.
  • Dynamic pages can vary between runs.

When a free tool is better

If you already write Playwright scripts, page.screenshot({ fullPage: true }) is free. You can inject your own CSS before the capture to un-stick the header, and add your own scroll loop for lazy images. For a few pages inside tests you already run, that's the better choice. This Task is for when you'd rather not write and maintain that script: paste the URLs, run it, download the images. Playwright screenshots documentation.