JSX to HTML Converter
Paste JSX — get standard HTML output instantly. Nothing leaves your browser.
How to convert JSX to HTML
- Paste your JSX markup into the input field — a React component's return block, a JSX snippet, or output from a React-based generator.
- Click "Convert" — the standard HTML output appears instantly with className→class, htmlFor→for, and style objects converted to CSS strings.
- Switch to "HTML → JSX" using the toggle above if you need the reverse direction.
- Click "Copy" to copy the HTML to clipboard, or "Download .html" to save the file locally.
- Use the output in a static HTML page, email template, or any non-React HTML context.
How the JSX to HTML converter works
The converter applies the reverse of the JSX transformation rules: className is renamed back to class, htmlFor becomes for, camelCase event names are lowercased (onClick → onclick), self-closing JSX tags on void elements are normalized for HTML, and React style objects are serialized back to CSS strings. The conversion runs entirely in your browser — no data is sent to any server.
Not all JSX is directly convertible to HTML — JSX is a superset that includes JavaScript expressions, component references, and dynamic logic that have no HTML equivalent. The converter handles the structural and attribute-level differences and leaves JavaScript expression placeholders intact so you can see exactly what needs manual replacement.
// Input JSX:
<div className="card" onClick={handleClick}>
<label htmlFor="email">Email</label>
<input type="email" id="email" readOnly tabIndex={1}
style={{ border: '1px solid red', fontSize: '14px' }} />
<br />
<img src="avatar.png" alt="User" />
</div>
// Output HTML:
<div class="card" onclick="handleClick">
<label for="email">Email</label>
<input type="email" id="email" readonly tabindex="1"
style="border: 1px solid red; font-size: 14px">
<br>
<img src="avatar.png" alt="User">
</div>JSX attributes and their HTML equivalents
Each JSX-specific attribute name maps back to its original HTML counterpart. Custom data attributes (data-*) and ARIA attributes (aria-*) are kept unchanged — they are identical in both JSX and HTML.
| JSX attribute | HTML equivalent | Notes |
|---|---|---|
| className="…" | class="…" | Reserved word conflict removed |
| htmlFor="…" | for="…" | Reserved word conflict removed |
| onClick={fn} | onclick="fn" | camelCase → lowercase; reference becomes string |
| onChange={fn} | onchange="fn" | All on* events lowercased |
| tabIndex={1} | tabindex="1" | camelCase → lowercase; value stringified |
| readOnly | readonly | camelCase → lowercase boolean |
| maxLength={10} | maxlength="10" | camelCase → lowercase; value stringified |
| style={{ color: 'red' }} | style="color: red" | JS object → CSS string |
| style={{ fontSize: '14px' }} | style="font-size: 14px" | camelCase property → kebab-case |
| <br /> | <br> | Self-closing slash removed for void elements |
| <img … /> | <img …> | Self-closing slash removed |
| {/* comment */} | <!-- comment --> | JSX expression comment → HTML comment |
When to convert JSX to HTML
Convert JSX to HTML when:
- Sharing with non-React developers — designers or backend engineers who need the HTML structure without a React context.
- Building email templates — email clients do not support React; JSX components need to be rendered to plain HTML first.
- Generating static HTML output — extracting the HTML structure from a React component for static site generation preview.
- Documentation examples — showing HTML usage for a component in docs, README files, or design system documentation.
- Integrating with non-React systems — WordPress, legacy CMS platforms, or jQuery-based codebases that need standard HTML.
Keep JSX when:
- Dynamic data is bound — {props.name}, {state.count}, and conditional rendering expressions must stay in JSX.
- React events are needed — properly typed synthetic events and React's controlled component pattern require JSX.
- Component composition is used — <Button variant="primary"> and other component references are not valid HTML.
- The output will be rendered by React — if React renders the output anyway, converting to HTML and back is unnecessary.
Style objects: from React object back to CSS string
React style objects use camelCased property names and JavaScript values. Converting back to an HTML style string means reversing both transformations: camelCase property names become kebab-case CSS property names, and JavaScript values are serialized to strings. Unitless numeric values (zIndex: 10) become their string equivalents without units.
// React JSX style object:
style={{
backgroundColor: '#fff',
fontSize: '16px',
marginTop: '8px',
zIndex: 100,
WebkitTransform: 'translateX(10px)',
}}
// Converted HTML inline style:
style="background-color: #fff; font-size: 16px; margin-top: 8px; z-index: 100; -webkit-transform: translateX(10px)"
// Rule: camelCase → kebab-case for all property names.
// PascalCase vendor prefixes (WebkitTransform) → -webkit-transform.Limitations: what JSX to HTML cannot convert
JSX is a superset of HTML and includes JavaScript-specific constructs that have no HTML equivalent. The converter handles the attribute-level and structural differences, but the following patterns require manual handling after conversion:
- JavaScript expressions — {variable}, {condition ? a : b}, {array.map(...)} are left as-is in the output. They need to be replaced with actual static values.
- Component references — <Button />, <Header title="…" />, and other React component tags are not valid HTML. Replace them with the rendered HTML output of those components.
- React-specific props — key, ref, and dangerouslySetInnerHTML are dropped or left as attributes; they have no HTML equivalent.
- Fragments — <></> and <React.Fragment> have no HTML equivalent. The converter unwraps them, keeping only the children.
- Conditional rendering — {isLoggedIn && <UserPanel />} expressions must be resolved to either the element or nothing by hand.
Handling complex JSX with AI
For components with nested logic, unclear prop structures, or multiple layers of composition, Lora — Abect's AI assistant converts JSX to HTML conversationally, explains every change, and reports any syntax errors it fixed along the way.