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: fixedelements toabsoluteandposition: stickytostatic, 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.