Flask Icons: 25 Free SVGs for Web & Mobile

Best Flask Icon Sets (2025): Stylish, Lightweight, Open SourceIcons are a small but powerful part of UI design — they communicate actions, statuses, and brand quickly and with minimal space. For Flask developers building web apps and admin dashboards, using the right icon set helps keep pages lightweight, accessible, and visually consistent. This article surveys the best open-source icon sets for 2025 that pair well with Flask projects, focusing on style, performance, accessibility, and ease of integration.


Why icons matter in Flask apps

Icons affect usability (recognition of actions), performance (file sizes and requests), accessibility (screen-reader compatibility), and maintainability (consistent visual language). For server-side frameworks like Flask that render HTML templates and often serve single-page-app front-ends, choosing an icon strategy early reduces refactoring later.

Key practical considerations:

  • Performance: SVG sprites or icon fonts reduce HTTP requests; tree-shaking or on-demand imports reduce bundle size.
  • Accessibility: Use aria-label, inside SVGs, and proper role attributes.</li> <li><strong>Styling</strong>: SVGs are CSS-friendly (fill, stroke), enabling theme-aware icons.</li> <li><strong>Licensing</strong>: Open-source (MIT, Apache 2.0, SIL) avoids legal headaches for commercial apps.</li> </ul> <hr> <h2 id="how-to-integrate-icons-into-a-flask-project">How to integrate icons into a Flask project</h2> <p>Workflow options:</p> <ol> <li>Inline SVG: paste SVG markup into Jinja templates or include via Jinja macros. Pros: full CSS control and accessibility. Cons: larger HTML if many icons.</li> <li>SVG sprite with <use>: load a single sprite and reference icons by id. Pros: one HTTP request, cacheable. Cons: initial setup.</li> <li>Icon font: single font file with CSS classes. Pros: simple HTML classes. Cons: less control over multi-color icons and accessibility nuances.</li> <li>CDN or npm package + build tool: for Flask apps using frontend bundlers (Webpack, Vite). Pros: modern builds and tree-shaking. Cons: requires JS toolchain.</li> </ol> <p>Example minimal Jinja macro for inline SVG (paste into macros.html and import into templates):</p> <pre><code >{% macro icon(name, cls='icon', title=None) -%} {% set svg = icons.get(name) %} {% if svg %} <span class="{{ cls }}" role="img" aria-label="{{ title or name|replace('-', ' ') }}"> {{ svg | safe }} </span> {% endif %} {%- endmacro %} </code></pre> <p>Store a Python dict <code>icons</code> with SVG strings or load from files when the app starts.</p> <hr> <h2 id="selection-criteria-used-in-this-roundup">Selection criteria used in this roundup</h2> <p>Each icon set below was evaluated for:</p> <ul> <li>Visual style variety and modernity</li> <li>File size and performance (SVG-first, sprite support, tree-shaking)</li> <li>Licensing (prefer MIT, Apache 2.0, SIL)</li> <li>Accessibility features or guidance</li> <li>Ease of integration with Flask templates or front-end toolchains</li> <li>Maintenance and community activity (2024–2025)</li> </ul> <hr> <h2 id="top-open-source-icon-sets-for-flask-2025">Top open-source icon sets for Flask (2025)</h2> <h3 id="1-phosphor-icons">1) Phosphor Icons</h3> <ul> <li>Style: Versatile — thin, regular, bold, duotone, and fill styles; geometric and contemporary.</li> <li>Format: Pure SVG + React/Vue packages; icon font available via community tools.</li> <li>Performance: Individual SVGs and optimized builds; supports tree-shaking in JS toolchains.</li> <li>License: MIT.</li> <li>Why use it: Great for apps needing multiple weights/styles (e.g., compact admin UI and bold marketing pages). Works well as inline SVGs for full styling control.</li> </ul> <p>Usage tip: Import SVGs as files into templates or build a sprite; use CSS variables to change stroke/fill dynamically.</p> <hr> <h3 id="2-heroicons">2) Heroicons</h3> <ul> <li>Style: Clean, minimal, designed for interfaces (outline and solid).</li> <li>Format: SVG source, React, Vue components.</li> <li>Performance: Small SVGs; simple to inline or sprite.</li> <li>License: MIT.</li> <li>Why use it: Excellent default for dashboards and forms where clarity and minimalism matter. Widely adopted and easy to customize.</li> </ul> <p>Flask integration: Keep a small subset in static/icons and include via Jinja macro or use an SVG-sprite generator in your build step.</p> <hr> <h3 id="3-tabler-icons">3) Tabler Icons</h3> <ul> <li>Style: Line-based, friendly, consistent stroke widths designed for interfaces.</li> <li>Format: SVGs, icon components for popular frameworks.</li> <li>Performance: Compact SVGs; suitable for sprite usage.</li> <li>License: MIT.</li> <li>Why use it: Good balance between character and simplicity; large collection tailored for dashboard controls.</li> </ul> <p>Accessibility tip: Add <title> inside SVGs or include aria-hidden when purely decorative.</p> <hr> <h3 id="4-feather-icons">4) Feather Icons</h3> <ul> <li>Style: Thin, open, and highly legible line icons.</li> <li>Format: SVGs and JS package.</li> <li>Performance: Very lightweight; ideal for minimal designs.</li> <li>License: MIT.</li> <li>Why use it: When you want understated elegance and the smallest possible icon payload.</li> </ul> <p>Implementation: Use CDN for prototypes; for production, inline only used icons or build a sprite to avoid unused assets.</p> <hr> <h3 id="5-lucide">5) Lucide</h3> <ul> <li>Style: Fork of Feather with expanded set and community contributions.</li> <li>Format: SVGs, JS packages, framework components.</li> <li>Performance: Similar to Feather, with more icons.</li> <li>License: MIT.</li> <li>Why use it: If you like Feather’s look but need more coverage.</li> </ul> <hr> <h3 id="6-remix-icon">6) Remix Icon</h3> <ul> <li>Style: Mix of outline and filled icons; polished, modern.</li> <li>Format: SVG sprite, npm package.</li> <li>Performance: Good; supports sprite usage.</li> <li>License: Apache 2.0.</li> <li>Why use it: Large set with consistent design language; useful when you need UI and product icons in one place.</li> </ul> <hr> <h3 id="7-bootstrap-icons">7) Bootstrap Icons</h3> <ul> <li>Style: Neutral, UI-focused.</li> <li>Format: SVGs and webfont.</li> <li>Performance: Optimized SVGs; can subset.</li> <li>License: MIT.</li> <li>Why use it: If you already use Bootstrap in the front end, integration is straightforward.</li> </ul> <hr> <h3 id="8-iconoir">8) Iconoir</h3> <ul> <li>Style: Simple, geometric line icons with consistent stroke.</li> <li>Format: SVGs, React components.</li> <li>Performance: Lightweight.</li> <li>License: MIT.</li> <li>Why use it: Clean set for modern UIs; good coverage of app patterns.</li> </ul> <hr> <h3 id="9-tabler-icons-already-listed-alternative-mention-boxicons">9) Tabler Icons (already listed) — alternative mention: Boxicons</h3> <ul> <li>Style: Outline, solid, logos.</li> <li>Format: SVG, webfonts, npm.</li> <li>License: MIT.</li> <li>Why use it: Flexible licensing and many category choices (logos helpful for auth/social links).</li> </ul> <hr> <h3 id="10-fontawesome-free">10) FontAwesome Free</h3> <ul> <li>Style: Wide variety (solid, regular, brands).</li> <li>Format: Webfont, SVG.</li> <li>Performance: Larger than others; but widely familiar.</li> <li>License: CC BY‑SA for some icons, SIL for fonts; paywall for Pro.</li> <li>Why use it: If you need a very broad set including brand icons; weigh the size cost.</li> </ul> <hr> <h2 id="recommended-setups-for-common-flask-scenarios">Recommended setups for common Flask scenarios</h2> <ul> <li> <p>Small server-rendered admin without JS bundler:</p> <ul> <li>Use: Heroicons or Feather.</li> <li>Approach: Inline SVG macros for the 30–50 icons you need; store SVG files in static/icons and load into a Python dict at startup.</li> </ul> </li> <li> <p>Flask with a frontend bundler (React/Vue/Svelte):</p> <ul> <li>Use: Phosphor, Remix, or Heroicons (component packages).</li> <li>Approach: Install via npm, import only used icons; bundle optimizer will tree-shake unused icons.</li> </ul> </li> <li> <p>Public-facing marketing site:</p> <ul> <li>Use: Phosphor or Remix for richer visuals; consider icon sprites to reduce requests.</li> <li>Approach: Build a single sprite and cache it aggressively.</li> </ul> </li> <li> <p>Accessibility-first applications:</p> <ul> <li>Use: Any SVG-first library (Heroicons, Tabler) and ensure each inline icon has a <title> and role=“img” or aria-hidden=“true” when decorative.</li> </ul> </li> </ul> <hr> <h2 id="performance-optimization-checklist">Performance & optimization checklist</h2> <ul> <li>Subset icons: include only icons you use.</li> <li>Use SVG sprites or inline only used icons to avoid many network hits.</li> <li>Compress SVGs (SVGO) and remove unnecessary metadata.</li> <li>Prefer vector icons over raster for scaling and smaller file sizes for many icons.</li> <li>Cache static icon files with long max-age and fingerprinted filenames.</li> <li>For icon fonts, subset the font and serve from a single file; consider WOFF2.</li> </ul> <hr> <h2 id="accessibility-quick-rules">Accessibility quick rules</h2> <ul> <li>Decorative icons: add aria-hidden=“true”.</li> <li>Informative icons: add role=“img” and an accessible name via aria-label or <title>.</li> <li>Ensure sufficient contrast between icon color and background (WCAG).</li> <li>Provide keyboard-accessible controls where icons represent interactive controls (buttons/links).</li> </ul> <hr> <h2 id="example-adding-a-small-icon-set-to-flask-practical-steps">Example: adding a small icon set to Flask (practical steps)</h2> <ol> <li>Create static/icons/ and copy 20–50 SVG files you need.</li> <li>On app startup, load them into a dict: “`python import os from flask import Flask</li> </ol> <p>def load_icons(path):</p> <pre><code>icons = {} for fname in os.listdir(path): if fname.endswith('.svg'): with open(os.path.join(path, fname), 'r', encoding='utf8') as f: icons[os.path.splitext(fname)[0]] = f.read() return icons </code></pre> <p>app = Flask(<strong>name</strong>) app.config[‘ICONS’] = load_icons(‘static/icons’)</p> <pre><code>3. Create a Jinja macro (see earlier) to render icons with accessible labels. 4. Use CSS variables to control color/size: ```css .icon svg { width: 1.25rem; height: 1.25rem; fill: currentColor; } </code></pre> <hr> <h2 id="license-checklist-before-shipping">License checklist before shipping</h2> <ul> <li>Confirm license (MIT/Apache/SIL) for each set.</li> <li>If you modify icons, ensure compliance with the license (most allow modification).</li> <li>For brand logos, verify trademark rules — some logos require permission for commercial use.</li> </ul> <hr> <h2 id="closing-recommendations">Closing recommendations</h2> <ul> <li>For most Flask apps in 2025, start with a lightweight SVG-first set: <strong>Heroicons</strong> or <strong>Feather/Lucide</strong> for minimal UIs; <strong>Phosphor</strong> if you want multiple weights and more expressive options.</li> <li>Keep icons as SVGs, subset them, and serve them either inline or as a sprite to balance accessibility and performance.</li> <li>Add simple Jinja macros and CSS variables early so icons can be themed consistently across templates.</li> </ul> </div> <div class="wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained" style="padding-top:var(--wp--preset--spacing--60);padding-bottom:var(--wp--preset--spacing--60)"> </div> <div class="wp-block-group alignwide is-layout-flow wp-block-group-is-layout-flow" style="margin-top:var(--wp--preset--spacing--60);margin-bottom:var(--wp--preset--spacing--60);"> <nav class="wp-block-group alignwide is-content-justification-space-between is-nowrap is-layout-flex wp-container-core-group-is-layout-9b36172e wp-block-group-is-layout-flex" aria-label="Post navigation" style="border-top-color:var(--wp--preset--color--accent-6);border-top-width:1px;padding-top:var(--wp--preset--spacing--40);padding-bottom:var(--wp--preset--spacing--40)"> <div class="post-navigation-link-previous wp-block-post-navigation-link"><span class="wp-block-post-navigation-link__arrow-previous is-arrow-arrow" aria-hidden="true">←</span><a href="http://cloud934221.pics/wise-toys-smart-playthings-that-grow-with-your-child/" rel="prev">Wise Toys: Smart Playthings That Grow With Your Child</a></div> <div class="post-navigation-link-next wp-block-post-navigation-link"><a href="http://cloud934221.pics/jpcsp-performance-tips-improving-fps-and-reducing-stutter/" rel="next">Jpcsp Performance Tips: Improving FPS and Reducing Stutter</a><span class="wp-block-post-navigation-link__arrow-next is-arrow-arrow" aria-hidden="true">→</span></div> </nav> </div> <div class="wp-block-comments wp-block-comments-query-loop" style="margin-top:var(--wp--preset--spacing--70);margin-bottom:var(--wp--preset--spacing--70)"> <h2 class="wp-block-heading has-x-large-font-size">Comments</h2> <div id="respond" class="comment-respond wp-block-post-comments-form"> <h3 id="reply-title" class="comment-reply-title">Leave a Reply <small><a rel="nofollow" id="cancel-comment-reply-link" href="/flask-icons-25-free-svgs-for-web-mobile/#respond" style="display:none;">Cancel reply</a></small></h3><form action="http://cloud934221.pics/wp-comments-post.php" method="post" id="commentform" class="comment-form"><p class="comment-notes"><span id="email-notes">Your email address will not be published.</span> <span class="required-field-message">Required fields are marked <span class="required">*</span></span></p><p class="comment-form-comment"><label for="comment">Comment <span class="required">*</span></label> <textarea id="comment" name="comment" cols="45" rows="8" maxlength="65525" required></textarea></p><p class="comment-form-author"><label for="author">Name <span class="required">*</span></label> <input id="author" name="author" type="text" value="" size="30" maxlength="245" autocomplete="name" required /></p> <p class="comment-form-email"><label for="email">Email <span class="required">*</span></label> <input id="email" name="email" type="email" value="" size="30" maxlength="100" aria-describedby="email-notes" autocomplete="email" required /></p> <p class="comment-form-url"><label for="url">Website</label> <input id="url" name="url" type="url" value="" size="30" maxlength="200" autocomplete="url" /></p> <p class="comment-form-cookies-consent"><input id="wp-comment-cookies-consent" name="wp-comment-cookies-consent" type="checkbox" value="yes" /> <label for="wp-comment-cookies-consent">Save my name, email, and website in this browser for the next time I comment.</label></p> <p class="form-submit wp-block-button"><input name="submit" type="submit" id="submit" class="wp-block-button__link wp-element-button" value="Post Comment" /> <input type='hidden' name='comment_post_ID' value='330' id='comment_post_ID' /> <input type='hidden' name='comment_parent' id='comment_parent' value='0' /> </p></form> </div><!-- #respond --> </div> </div> <div class="wp-block-group alignwide has-global-padding is-layout-constrained wp-block-group-is-layout-constrained" style="padding-top:var(--wp--preset--spacing--60);padding-bottom:var(--wp--preset--spacing--60)"> <h2 class="wp-block-heading alignwide has-small-font-size" style="font-style:normal;font-weight:700;letter-spacing:1.4px;text-transform:uppercase">More posts</h2> <div class="wp-block-query alignwide is-layout-flow wp-block-query-is-layout-flow"> <ul class="alignfull wp-block-post-template is-layout-flow wp-container-core-post-template-is-layout-3ee800f6 wp-block-post-template-is-layout-flow"><li class="wp-block-post post-870 post type-post status-publish format-standard hentry category-uncategorised"> <div class="wp-block-group alignfull is-content-justification-space-between is-nowrap is-layout-flex wp-container-core-group-is-layout-154222c2 wp-block-group-is-layout-flex" style="border-bottom-color:var(--wp--preset--color--accent-6);border-bottom-width:1px;padding-top:var(--wp--preset--spacing--30);padding-bottom:var(--wp--preset--spacing--30)"> <h3 class="wp-block-post-title has-large-font-size"><a href="http://cloud934221.pics/web-page-refresher-and-monitor-tools-enhance-your-browsing-experience/" target="_self" >Web Page Refresher and Monitor Tools: Enhance Your Browsing Experience</a></h3> <div class="has-text-align-right wp-block-post-date"><time datetime="2025-09-08T18:00:55+01:00"><a href="http://cloud934221.pics/web-page-refresher-and-monitor-tools-enhance-your-browsing-experience/">8 September 2025</a></time></div> </div> </li><li class="wp-block-post post-869 post type-post status-publish format-standard hentry category-uncategorised"> <div class="wp-block-group alignfull is-content-justification-space-between is-nowrap is-layout-flex wp-container-core-group-is-layout-154222c2 wp-block-group-is-layout-flex" style="border-bottom-color:var(--wp--preset--color--accent-6);border-bottom-width:1px;padding-top:var(--wp--preset--spacing--30);padding-bottom:var(--wp--preset--spacing--30)"> <h3 class="wp-block-post-title has-large-font-size"><a href="http://cloud934221.pics/how-process-controllers-optimize-industrial-operations-for-efficiency/" target="_self" >How Process Controllers Optimize Industrial Operations for Efficiency</a></h3> <div class="has-text-align-right wp-block-post-date"><time datetime="2025-09-08T17:38:07+01:00"><a href="http://cloud934221.pics/how-process-controllers-optimize-industrial-operations-for-efficiency/">8 September 2025</a></time></div> </div> </li><li class="wp-block-post post-868 post type-post status-publish format-standard hentry category-uncategorised"> <div class="wp-block-group alignfull is-content-justification-space-between is-nowrap is-layout-flex wp-container-core-group-is-layout-154222c2 wp-block-group-is-layout-flex" style="border-bottom-color:var(--wp--preset--color--accent-6);border-bottom-width:1px;padding-top:var(--wp--preset--spacing--30);padding-bottom:var(--wp--preset--spacing--30)"> <h3 class="wp-block-post-title has-large-font-size"><a href="http://cloud934221.pics/top-5-tools-to-compress-images-without-losing-quality/" target="_self" >Top 5 Tools to Compress Images Without Losing Quality</a></h3> <div class="has-text-align-right wp-block-post-date"><time datetime="2025-09-08T17:09:46+01:00"><a href="http://cloud934221.pics/top-5-tools-to-compress-images-without-losing-quality/">8 September 2025</a></time></div> </div> </li><li class="wp-block-post post-867 post type-post status-publish format-standard hentry category-uncategorised"> <div class="wp-block-group alignfull is-content-justification-space-between is-nowrap is-layout-flex wp-container-core-group-is-layout-154222c2 wp-block-group-is-layout-flex" style="border-bottom-color:var(--wp--preset--color--accent-6);border-bottom-width:1px;padding-top:var(--wp--preset--spacing--30);padding-bottom:var(--wp--preset--spacing--30)"> <h3 class="wp-block-post-title has-large-font-size"><a href="http://cloud934221.pics/plainamp-vs-competitors-which-tool-is-right-for-you/" target="_self" >Plainamp vs. Competitors: Which Tool is Right for You?</a></h3> <div class="has-text-align-right wp-block-post-date"><time datetime="2025-09-08T16:46:30+01:00"><a href="http://cloud934221.pics/plainamp-vs-competitors-which-tool-is-right-for-you/">8 September 2025</a></time></div> </div> </li></ul> </div> </div> </main> <footer class="wp-block-template-part"> <div class="wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained" style="padding-top:var(--wp--preset--spacing--60);padding-bottom:var(--wp--preset--spacing--50)"> <div class="wp-block-group alignwide is-layout-flow wp-block-group-is-layout-flow"> <div class="wp-block-group alignfull is-content-justification-space-between is-layout-flex wp-container-core-group-is-layout-e5edad21 wp-block-group-is-layout-flex"> <div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex"> <div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:100%"><h2 class="wp-block-site-title"><a href="http://cloud934221.pics" target="_self" rel="home">cloud934221.pics</a></h2> </div> <div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"> <div style="height:var(--wp--preset--spacing--40);width:0px" aria-hidden="true" class="wp-block-spacer"></div> </div> </div> <div class="wp-block-group is-content-justification-space-between is-layout-flex wp-container-core-group-is-layout-570722b2 wp-block-group-is-layout-flex"> <nav class="is-vertical wp-block-navigation is-layout-flex wp-container-core-navigation-is-layout-fe9cc265 wp-block-navigation-is-layout-flex"><ul class="wp-block-navigation__container is-vertical wp-block-navigation"><li class=" wp-block-navigation-item wp-block-navigation-link"><a class="wp-block-navigation-item__content" href="#"><span class="wp-block-navigation-item__label">Blog</span></a></li><li class=" wp-block-navigation-item wp-block-navigation-link"><a class="wp-block-navigation-item__content" href="#"><span class="wp-block-navigation-item__label">About</span></a></li><li class=" wp-block-navigation-item wp-block-navigation-link"><a class="wp-block-navigation-item__content" href="#"><span class="wp-block-navigation-item__label">FAQs</span></a></li><li class=" wp-block-navigation-item wp-block-navigation-link"><a class="wp-block-navigation-item__content" href="#"><span class="wp-block-navigation-item__label">Authors</span></a></li></ul></nav> <nav class="is-vertical wp-block-navigation is-layout-flex wp-container-core-navigation-is-layout-fe9cc265 wp-block-navigation-is-layout-flex"><ul class="wp-block-navigation__container is-vertical wp-block-navigation"><li class=" wp-block-navigation-item wp-block-navigation-link"><a class="wp-block-navigation-item__content" href="#"><span class="wp-block-navigation-item__label">Events</span></a></li><li class=" wp-block-navigation-item wp-block-navigation-link"><a class="wp-block-navigation-item__content" href="#"><span class="wp-block-navigation-item__label">Shop</span></a></li><li class=" wp-block-navigation-item wp-block-navigation-link"><a class="wp-block-navigation-item__content" href="#"><span class="wp-block-navigation-item__label">Patterns</span></a></li><li class=" wp-block-navigation-item wp-block-navigation-link"><a class="wp-block-navigation-item__content" href="#"><span class="wp-block-navigation-item__label">Themes</span></a></li></ul></nav> </div> </div> <div style="height:var(--wp--preset--spacing--70)" aria-hidden="true" class="wp-block-spacer"></div> <div class="wp-block-group alignfull is-content-justification-space-between is-layout-flex wp-container-core-group-is-layout-91e87306 wp-block-group-is-layout-flex"> <p class="has-small-font-size">Twenty Twenty-Five</p> <p class="has-small-font-size"> Designed with <a href="https://en-gb.wordpress.org" rel="nofollow">WordPress</a> </p> </div> </div> </div> </footer> </div> <script type="speculationrules"> {"prefetch":[{"source":"document","where":{"and":[{"href_matches":"\/*"},{"not":{"href_matches":["\/wp-*.php","\/wp-admin\/*","\/wp-content\/uploads\/*","\/wp-content\/*","\/wp-content\/plugins\/*","\/wp-content\/themes\/twentytwentyfive\/*","\/*\\?(.+)"]}},{"not":{"selector_matches":"a[rel~=\"nofollow\"]"}},{"not":{"selector_matches":".no-prefetch, .no-prefetch a"}}]},"eagerness":"conservative"}]} </script> <script src="http://cloud934221.pics/wp-includes/js/comment-reply.min.js?ver=6.8.2" id="comment-reply-js" async data-wp-strategy="async"></script> <script id="wp-block-template-skip-link-js-after"> ( function() { var skipLinkTarget = document.querySelector( 'main' ), sibling, skipLinkTargetID, skipLink; // Early exit if a skip-link target can't be located. if ( ! skipLinkTarget ) { return; } /* * Get the site wrapper. * The skip-link will be injected in the beginning of it. */ sibling = document.querySelector( '.wp-site-blocks' ); // Early exit if the root element was not found. if ( ! sibling ) { return; } // Get the skip-link target's ID, and generate one if it doesn't exist. skipLinkTargetID = skipLinkTarget.id; if ( ! skipLinkTargetID ) { skipLinkTargetID = 'wp--skip-link--target'; skipLinkTarget.id = skipLinkTargetID; } // Create the skip link. skipLink = document.createElement( 'a' ); skipLink.classList.add( 'skip-link', 'screen-reader-text' ); skipLink.id = 'wp-skip-link'; skipLink.href = '#' + skipLinkTargetID; skipLink.innerText = 'Skip to content'; // Inject the skip link. sibling.parentElement.insertBefore( skipLink, sibling ); }() ); </script> </body> </html>