Free tools Windows power users keep installed
One-click scans. No signup required.
Short answer: html2canvas can render some transformed elements, but its support is limited. It reconstructs an image from the DOM and CSS rather than taking a browser screenshot, and its handling of 3D transforms is lossy or unsupported. Test the specific transform and browser combination you need; if the output must match the browser’s rendered pixels, use a browser screenshot workflow instead.
What html2canvas captures—and what it does not
html2canvas reads a page’s DOM and styles, then paints a representation onto a canvas. It does not ask the browser to photograph the page as rendered by its compositor. That distinction explains why an element can look correct in the browser yet differ in the generated canvas: html2canvas must implement the CSS properties it renders, and its documentation cautions that the result may not be completely accurate to the real page.
The project describes support for the CSS transform property as limited. Its implementation parses matrix() and matrix3d() values, but this does not mean it reproduces every transform. In particular, the implementation does not support general 3D rendering; for matrix3d(), it extracts a 2D subset. Treat perspective and other 3D effects as unsupported or lossy unless your own tests show otherwise.
Set expectations by transform type
- 2D transforms: Rotation, translation, scaling, and skew may render, but validate the exact combination. Parsing matrix values is not a guarantee that the canvas will match the browser.
- 3D transforms and perspective: Do not assume the depth, perspective, or compositor result will be reproduced. The implementation extracts only a 2D subset of
matrix3d()data. - Other CSS effects: Transforms are only one possible source of mismatch. Any CSS property that html2canvas does not implement may render differently or not at all.
Capture a transformed element
Pass the element containing the transform to html2canvas. The returned promise resolves to a canvas; append it to the document, convert it to an image, or send it to another part of your application.
Recommended Free Tools
#1 Best Overall
- Read Before You Buy — No Video Output: These adapters support charging and USB 2.0 data transfer, but cannot transmit video signals. Except for standard USB webcams (which use USB data only), they are not compatible with HDMI/DisplayPort cables, video-capable USB-C hubs, or docking stations with video output.
- Convert USB-A Ports to USB-C: Designed to connect USB-C earphones, cables, flash drives, card readers, and other USB-C accessories to standard USB-A ports. Plug-and-play with no drivers or software required.
- Aluminum Alloy Housing: Built with a sturdy aluminum alloy shell that aids in heat dissipation and protects against daily wear and scratches. Designed to maintain a stable and secure connection.
- Compact & Travel-Friendly: The ultra-compact design allows the adapter to stay plugged into your device without blocking adjacent ports or adding bulk, reducing wear and tear on your original USB ports.
- 12-Month Warranty: Backed by a 12-month manufacturer warranty for peace of mind. Designed to meet strict quality control standards for reliable everyday performance.
<div id="capture" style="transform: rotate(12deg) scale(1.1); transform-origin: center;">
<h2>Transformed content</h2>
<p>Compare this rendering with the html2canvas output.</p>
</div>
<button id="capture-button">Capture</button>
<div id="output"></div>
<script type="module">
import html2canvas from 'html2canvas';
const button = document.querySelector('#capture-button');
const target = document.querySelector('#capture');
const output = document.querySelector('#output');
button.addEventListener('click', async () => {
if (!target || !output) {
throw new Error('Capture element or output container was not found.');
}
try {
const canvas = await html2canvas(target);
output.replaceChildren(canvas);
} catch (error) {
console.error('html2canvas capture failed:', error);
}
});
</script>
This example assumes html2canvas is installed and your project supports JavaScript modules. In a bundler-based project, install the package using that project’s normal package-manager workflow and import it as shown. If you already load html2canvas through a script tag, use the global provided by that setup instead of the module import. The key call is html2canvas(target).
Validate the result, not just the call
- Render the target in the browser at the dimensions and styles used in production.
- Run the capture and inspect the returned canvas beside the live element. Check position, dimensions, clipping, rotation, scale, and text placement.
- Repeat in the browser versions relevant to your users. DOM reconstruction can behave differently from the browser compositor, and a result on one setup does not establish support everywhere.
- If a mismatch appears, reduce the page to the smallest element and transform that still reproduces it. This helps distinguish a transform limitation from another unsupported CSS property or a page-specific issue.
Control the capture area and resolution
html2canvas offers options for choosing a region and output scale. They change capture geometry or canvas resolution; they do not add support for a CSS transform that the renderer cannot reproduce.
xandyselect the capture origin.widthandheightset the capture dimensions.scalecontrols the output scale and therefore the canvas resolution.
For example, to request a higher-resolution canvas, pass a larger scale value. To capture a crop, supply the desired x, y, width, and height values in the options object. Choose those values based on the region you need; do not use them as a workaround for incorrect transform rendering. A larger output canvas can also require more memory, so use only the dimensions and scale your output needs.
Rank #2
- 5-in-1 USB-C Hub: Experience comprehensive connectivity featuring a Power Delivery input, two USB-A 2.0 ports, a USB-A 3.0 port, and an HDMI port. (Note: The USB-C power delivery input port is only for connecting an external wall charger to power your laptop and cannot power peripheral devices.)
- 90W Pass-Through Charging: Achieve optimal charging with 90W pass-through power to your laptop, supported by a total input of 100W, with the hub reserving 10W for operational efficiency. (Note: Wall charger not included.)
- Quick Data Transfers: Accelerate your productivity with rapid data transfers using a high-speed 5Gbps USB 3.0 port and two 480Mbps USB 2.0 ports.
- 4K HDMI Display: Enhance your visual experience with a hub capable of delivering 4K resolution at 30Hz in both mirror and extend modes. Please note that this hub is compatible with MacBook (macOS 12 and newer), Windows 10 and 11, ChromeOS, and laptops equipped with DP Alt Mode and Power Delivery. Note: This device is not compatible with Linux.
- What You Get: Anker USB-C Hub (5-in-1, 4K HDMI), welcome guide, 18-month warranty, and our friendly customer service.
Check off-screen culling when elements disappear
The cullOffscreen option is disabled by default. If you enable it to avoid painting off-screen content and a transformed element is unexpectedly omitted in a large capture, investigate whether culling is involved. When this option is enabled, transformed elements—including elements with inherited transforms—are conservatively kept for painting. That avoids false culling of those nodes, but can limit the performance benefit of culling them.
PC Slower Than It Used to Be?
A free scan shows the junk files, broken settings and background clutter dragging Windows down - then fixes them in one click.Free scan · Windows 10 & 11Outdated Drivers Are Slowing You Down
One free scan finds every outdated or missing driver and matches the right update for your exact hardware.Free scan · exact hardware matchUse this setting only when it addresses a measured capture problem. If you do not need off-screen culling, leaving its default behavior in place avoids adding another variable while debugging a transform mismatch.
Account for iframe boundaries
html2canvas can recursively render content in a same-origin iframe. It cannot read the document of a cross-origin iframe, so it cannot reconstruct that iframe’s contents through DOM access. This is a browser security boundary, not a transform option you can fix by increasing scale or changing the crop.
Rank #3
- Sleek 7-in-1 USB-C Hub: Features an HDMI port, two USB-A 3.0 ports, and a USB-C data port, each providing 5Gbps transfer speeds. It also includes a USB-C PD input port for charging up to 100W and dual SD and TF card slots, all in a compact design.
- Flawless 4K@60Hz Video with HDMI: Delivers exceptional clarity and smoothness with its 4K@60Hz HDMI port, making it ideal for high-definition presentations and entertainment. (Note: Only the HDMI port supports video projection; the USB-C port is for data transfer only.)
- Double Up on Efficiency: The two USB-A 3.0 ports and a USB-C port support a fast 5Gbps data rate, significantly boosting your transfer speeds and improving productivity.
- Fast and Reliable 85W Charging: Offers high-capacity, speedy charging for laptops up to 85W, so you spend less time tethered to an outlet and more time being productive.
- What You Get: Anker USB-C Hub (7-in-1), welcome guide, 18-month warranty, and our friendly customer service.
If the transformed element is inside an iframe, first determine whether the frame is same-origin with the page running html2canvas. For cross-origin content, use an approach that can capture the rendered browser view, or arrange for the content to be captured from within the origin that can access it.
Troubleshoot common transform mismatches
| Symptom | Likely cause | What to try |
|---|---|---|
| A rotated or scaled element differs from the live page. | html2canvas reconstructs the DOM and CSS; transform support is limited and is not a native screenshot. | Reduce the example to the element and transform, then compare the canvas with the browser in each relevant browser version. If exact compositor output is required, switch to browser screenshot capture. |
| A 3D or perspective effect appears flattened or wrong. | General 3D transforms are not supported; matrix3d() handling extracts a 2D subset. |
Do not rely on html2canvas for that effect. Test whether a simpler 2D representation is acceptable, or capture with a real browser screenshot workflow. |
| The output is blurry or has unexpected dimensions. | The requested canvas scale or crop dimensions do not match the desired output. | Review scale, x, y, width, and height. These options affect resolution and region, not CSS feature support. |
| A transformed node is missing in a large capture. | Off-screen culling may be involved if cullOffscreen is enabled. |
Check the setting. When enabled, transformed nodes are conservatively retained for painting, which can reduce culling’s performance gains. |
| Iframe content is absent. | The iframe is cross-origin and its document cannot be read by html2canvas. | Confirm the frame’s origin. Capture same-origin content recursively; for cross-origin content, use a browser-rendered capture approach or capture from an origin with access. |
| Some other visual detail is missing or styled differently. | The relevant CSS property may not be implemented by html2canvas. | Remove unrelated styles and build a minimal reproducible case. The project’s FAQ recommends creating a test case for missing or incomplete CSS support. |
When to use a real browser screenshot
If your requirement is “show the pixels a user’s browser rendered,” a DOM-based renderer is the wrong assumption to build around. The html2canvas FAQ points to Puppeteer or Playwright for server-side screenshots and native tab screenshot APIs for browser extensions. These capture workflows operate on a rendered browser page rather than relying on html2canvas to implement each CSS property.
Choose based on where the capture runs: use html2canvas when an in-page canvas reconstruction is sufficient and its supported styling matches your needs; use a browser automation tool for server-side browser-rendered output; and use the browser’s native tab capture capability for an extension. A browser screenshot still needs to run in the right environment and state—such as the required viewport, loaded content, and authenticated session—but it avoids treating html2canvas’s CSS reconstruction as compositor output.
Rank #4
- Dual Converters, Infinite Potential:Includes 2× USB C male to USB A female adapters and 2× USB A male to USB C female adapters. Perfect for a wide range of uses—tablets with Bluetooth keyboards, expand USB ports on macbook, and more. Two different converters for all your daily needs
- Next-Level 10Gbps & 3A Charging: No more slow 480Mbps, this usb to usb c adapter has a transfer speed of up to 10Gbps, allowing you to do more transferring in less time. This usb adapter fits both USB A and USB C charger, supporting up to 3A fast charging
- Upgraded Exquisite Craftsmanship: With an aluminum alloy housing and metal connector, the usbc to usb adapter is extremely durable and sturdy. Rigorously tested to withstand more than 10,000 times of plugging and unplugging, ensuring long-lasting performance
- Broad Compatible: The usb c to usb adapter widely supports all USB C/ USB A devices like laptops, tablets, cellphones, car chargers, and phone chargers. Such as compatible with MacBook Pro/Air 2023/2022, Thunderbolt 4/3 Devices,Apple MagSafe Watch 9/8/7/SE/Ultra, iPad Pro 2022/2021, Samsung Galaxy S23/S20/S10, and iPhone 17/16/15 Pro. Plug and play
- Please Note: To reach 10Gbps speed, keep the cable under 3.3 ft. For USB A Male to USB C adapters, try flipping the USB C connector. USB C Male to USB A adapters support bidirectional 10Gbps transfer within 3.3 ft
Or skip the browser setup
If you need a browser-rendered screenshot without building your own capture flow, ScreenshotNeo offers a screenshot API and MCP server. One GET request takes a URL and returns a PNG, JPEG, WebP, or PDF. For example, this cURL request saves a WebP screenshot of the target page; see the ScreenshotNeo API documentation for request options.
curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://stripe.com -o shot.webp
- Cookie and consent banners are accepted and removed before capture, along with supported newsletter popups and chat widgets; each cleanup step can be turned off.
- Bot checks or CAPTCHAs, blank pages, timeouts, failed loads, and cache hits are not billed. Response headers report the page verdict and billing status.
- An MCP server provides
take_screenshot,get_page_info, andcapture_pdftools for AI agents and MCP clients. - The free plan includes 1,000 screenshots per month without a card; paid plans start at $5 for 3,000 screenshots.
Sign up for ScreenshotNeo’s free plan and get 1,000 screenshots a month with no card.
FAQ
Does changing scale make html2canvas support more transforms?
No. It changes output resolution; it does not change which CSS transform behavior html2canvas implements.
Best Value
- 5-in-1 Connectivity: Equipped with a 4K HDMI port, a 5 Gbps USB-C data port, two 5 Gbps USB-A ports, and a USB C 100W PD-IN port. Note: The USB C 100W PD-IN port supports only charging and does not support data transfer devices such as headphones or speakers.
- Powerful Pass-Through Charging: Supports up to 85W pass-through charging so you can power up your laptop while you use the hub. Note: Pass-through charging requires a charger (not included). Note: To achieve full power for iPad, we recommend using a 45W wall charger.
- Transfer Files in Seconds: Move files to and from your laptop at speeds of up to 5 Gbps via the USB-C and USB-A data ports. Note: The USB C 5Gbps Data port does not support video output.
- HD Display: Connect to the HDMI port to stream or mirror content to an external monitor in resolutions of up to 4K@30Hz. Note: The USB-C ports do not support video output.
- What You Get: Anker 332 USB-C Hub (5-in-1), welcome guide, our worry-free 18-month warranty, and friendly customer service.
Can html2canvas capture a transformed element inside a cross-origin iframe?
No. html2canvas cannot read cross-origin iframe documents. Same-origin iframe content can be recursively rendered.
Should I report a transform issue to the project?
A minimal reproduction is the useful starting point. Isolate the element, styles, and browser conditions that produce the mismatch so the behavior can be evaluated as a specific support case.
Quick Recap
Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.

