How to Turn an Elementor Page Into Plain HTML and CSS
Elementor already sends the browser plain HTML and CSS; the job is to save that output, cut the CSS down to what the page uses, and replace the few parts that need WordPress.
A page built with Elementor is assembled by WordPress and PHP on every visit, but what arrives in the browser is ordinary HTML, CSS and JavaScript. That is why a static copy is possible at all: you keep the output and drop the machinery that produced it. People do it to host a finished landing page anywhere, to stop maintaining a WordPress install for a site that never changes, or to make a heavy page load faster.
Elementor has no button for this. Its own export produces a template file in JSON, meant for importing back into Elementor, not HTML you can host. So the work happens in three steps: save the rendered page, reduce the CSS to what it actually uses, and replace the parts that depended on WordPress.
What survives the move, and what does not
| Part of the page | In a static copy |
|---|---|
| Layout, text, images, colours, fonts | Works: it is HTML and CSS |
| Hover effects and responsive layouts | Works: pure CSS |
| Sliders, carousels, tabs, accordions, popups | Only if you keep Elementor's JavaScript files, or rebuild them |
| Entrance animations | Need Elementor's JavaScript; without it the widgets stay hidden (see below) |
| Elementor forms, comments, search | Stop working: they send data to WordPress |
| Lists of posts or products that change | Frozen at the moment you saved the page |
If the page is mostly the first two rows, a static copy is an easy win. If it lives on forms, shop listings or a blog feed, keep it in WordPress and speed it up there instead.
Step 1: save the rendered page
Log out of WordPress first, or open the page in a private window. A logged-in visit adds the admin bar and its styles to the HTML, and you do not want either in the copy.
One page: save it from the browser
- Open the page in Chrome, logged out.
- Press Ctrl+S (Cmd+S on a Mac) and choose Webpage, Complete.
- You get an HTML file and a folder next to it with the images, stylesheets and scripts the page loaded.
A whole site: use a static export plugin
For more than a handful of pages, a static site plugin such as Simply Static crawls the WordPress site and writes every page with its assets into a folder or a ZIP file. It also rewrites the internal links, which is tedious by hand. Check the output page by page all the same: plugins can miss files that only JavaScript asks for.
Step 2: cut the CSS down to what the page uses
A typical Elementor page loads the theme stylesheet, Elementor's frontend CSS, a CSS file per widget type, a generated file for the page itself and often a font file or two. Most of those rules style widgets that are not on the page. The most reliable way to find the ones that are used is to let Chrome record them.
- Open the live page, logged out, and open DevTools.
- Open the menu with the three dots, then More tools, then Coverage, and press its reload button.
- Use the page: open the mobile menu, click through tabs and accordions, and resize the window to your phone and tablet widths.
- Press Export in the Coverage panel and save the JSON file.
- Drop that file on the coverage JSON to CSS page and press Extract used CSS.
- Save the result as one stylesheet, replace the page's
<link rel="stylesheet">tags with a single link to it, and keep the font files it refers to.
The Unused CSS Remover writes each rule back inside its own @media block, which matters here: Elementor keeps its tablet and mobile rules in media queries, and a tool that loses them makes the mobile layout apply on desktop too. It also keeps @font-face and @keyframes whole.
If you would rather work from the saved files, the HTML + CSS tab of the same tool takes the HTML and the stylesheets instead. Elementor and its add-ons add some classes with JavaScript after the page loads, so put their prefixes in Always keep, for example /^elementor-/ and /^e-/, and compare the result with the original page before you trust it.
Step 3: deal with what needed WordPress
Entrance animations and hidden widgets
A widget with an entrance animation carries the class elementor-invisible, and Elementor's JavaScript removes it when the widget scrolls into view. In a copy without that script, the class never goes away and the widget stays invisible. Either keep Elementor's frontend scripts, or remove elementor-invisible from the HTML and let the widgets appear without the animation.
Forms
An Elementor form sends its data to WordPress, which is no longer there. Replace it with a form service that accepts a plain HTML form, or with a simple link that opens an email.
Links and leftovers
- Check every internal link: WordPress addresses such as
/about/need a matching folder with anindex.html, or a rewrite on the new host. - Remove the WordPress scripts the page no longer needs, such as the emoji script, and the
?ver=numbers on file names if you rename files. - Keep the
srcsetimages the HTML points to, or phones will load the full-size picture.
Check before you switch
- Open the static copy and the original side by side at desktop, tablet and phone widths.
- Open every menu, tab and accordion, and scroll the whole page to catch hidden widgets.
- Run both through a speed test and compare the amount of CSS loaded.
- Keep the WordPress site and the full CSS files until the static copy has been live for a while.