{"id":171,"date":"2026-05-14T09:21:56","date_gmt":"2026-05-14T13:21:56","guid":{"rendered":"https:\/\/simpletool.io\/blog\/?p=171"},"modified":"2026-05-05T09:22:11","modified_gmt":"2026-05-05T13:22:11","slug":"css-loader-spinner","status":"publish","type":"post","link":"https:\/\/simpletool.io\/blog\/css-loader-spinner\/","title":{"rendered":"CSS Loader Generator: 60+ Pure-CSS Spinners [2026]"},"content":{"rendered":"<div class=\"ai-summary\" style=\"padding: 14px 18px; background: #f6f9fc; border-left: 4px solid #635BFF; border-radius: 8px; font-size: 15px; margin-bottom: 28px;\"><strong>TL;DR:<\/strong> A CSS loader (or &#8220;CSS spinner&#8221;) is an animated waiting indicator built with pure CSS \u2014 no JavaScript, no SVG sprites, no GIFs. The five common patterns are <strong>spinning circles<\/strong> (border + animation), <strong>bouncing dots<\/strong> (3-dot pulse), <strong>progress bars<\/strong> (animated linear-gradient), <strong>skeleton screens<\/strong> (pulsing rectangles representing content shape), and <strong>conic gradients<\/strong> (modern Chromium+ Safari). Our <a href=\"https:\/\/simpletool.io\/tools\/css-loader-generator\/\">free CSS loader generator<\/a> ships 60+ presets, lets you customise size\/speed\/colour, and outputs accessible CSS that respects <code>prefers-reduced-motion<\/code>.<\/div>\n<p>Adding a loading spinner used to mean dropping a 12 KB animated GIF into your project. CSS animations made it weight-zero \u2014 a few hundred bytes of CSS, GPU-accelerated rendering, instantly responsive to dark mode and theme changes. The result: every modern app uses pure-CSS loaders. The challenge: writing a smooth, accessible loader from scratch involves keyframes, timing functions, transform-origin, and accessibility considerations that aren&#8217;t obvious.<\/p>\n<p>Our <a href=\"https:\/\/simpletool.io\/tools\/css-loader-generator\/\">CSS loader generator<\/a> ships 60+ tested presets across five categories \u2014 spinning circles, dots, bars, skeleton screens, and conic-gradient loaders. Customise size, speed, colour, and stroke width with sliders. Copy production-ready CSS that includes <code>prefers-reduced-motion<\/code> handling and proper ARIA attributes. This guide covers when each loader type is appropriate, the accessibility traps, and the performance gotchas that turn a smooth spinner into a paint-thrashing battery drain.<\/p>\n<h2 class=\"wp-block-heading\">Five loader types and when to use each<\/h2>\n<table style=\"width: 100%; border-collapse: collapse; margin: 12px 0 20px;\">\n<thead>\n<tr style=\"background: #0A2540; color: #fff;\">\n<th style=\"text-align: left; padding: 10px 14px;\">Type<\/th>\n<th style=\"text-align: left; padding: 10px 14px;\">Best for<\/th>\n<th style=\"text-align: left; padding: 10px 14px;\">Avoid when<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"padding: 10px 14px; border-bottom: 1px solid #e7ecef;\"><strong>Spinning circle<\/strong><\/td>\n<td style=\"padding: 10px 14px; border-bottom: 1px solid #e7ecef;\">Generic &#8220;loading&#8230;&#8221; (under 1s)<\/td>\n<td style=\"padding: 10px 14px; border-bottom: 1px solid #e7ecef;\">User waits more than 3s \u2014 feels unresponsive<\/td>\n<\/tr>\n<tr>\n<td style=\"padding: 10px 14px; border-bottom: 1px solid #e7ecef;\"><strong>Bouncing dots<\/strong><\/td>\n<td style=\"padding: 10px 14px; border-bottom: 1px solid #e7ecef;\">Chat \/ typing indicators<\/td>\n<td style=\"padding: 10px 14px; border-bottom: 1px solid #e7ecef;\">Page-level loading \u2014 too playful<\/td>\n<\/tr>\n<tr>\n<td style=\"padding: 10px 14px; border-bottom: 1px solid #e7ecef;\"><strong>Progress bar<\/strong><\/td>\n<td style=\"padding: 10px 14px; border-bottom: 1px solid #e7ecef;\">Known-duration tasks<\/td>\n<td style=\"padding: 10px 14px; border-bottom: 1px solid #e7ecef;\">Indeterminate progress (use indeterminate variant)<\/td>\n<\/tr>\n<tr>\n<td style=\"padding: 10px 14px; border-bottom: 1px solid #e7ecef;\"><strong>Skeleton screen<\/strong><\/td>\n<td style=\"padding: 10px 14px; border-bottom: 1px solid #e7ecef;\">Content-heavy pages \u2014 feels faster than spinners<\/td>\n<td style=\"padding: 10px 14px; border-bottom: 1px solid #e7ecef;\">Single-element waits \u2014 overkill<\/td>\n<\/tr>\n<tr>\n<td style=\"padding: 10px 14px;\"><strong>Conic-gradient<\/strong><\/td>\n<td style=\"padding: 10px 14px;\">Modern, distinctive loaders<\/td>\n<td style=\"padding: 10px 14px;\">IE \/ very old browser support required<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2 class=\"wp-block-heading\">A canonical pure-CSS spinner<\/h2>\n<p>The simplest CSS spinner is a circle with a transparent top border, rotated indefinitely. About 8 lines of CSS, GPU-accelerated, ~200 bytes minified:<\/p>\n<pre style=\"background: #f6f9fc; border-left: 4px solid #635BFF; padding: 12px 16px; overflow-x: auto; font-size: 13px; line-height: 1.5; border-radius: 6px;\"><code>.loader {\r\n  width: 32px;\r\n  height: 32px;\r\n  border: 4px solid #e0e0e0;\r\n  border-top-color: #635BFF;\r\n  border-radius: 50%;\r\n  animation: spin 0.8s linear infinite;\r\n}\r\n@keyframes spin {\r\n  to { transform: rotate(360deg); }\r\n}\r\n@media (prefers-reduced-motion: reduce) {\r\n  .loader { animation-duration: 3s; }\r\n}<\/code><\/pre>\n<p>The reduced-motion media query slows the animation rather than stopping it \u2014 users with vestibular disorders prefer slow over absent. Stopping animations entirely can break the implied &#8220;still loading&#8221; message.<\/p>\n<h2 class=\"wp-block-heading\">How to build a loader in your browser<\/h2>\n<ol class=\"wp-block-list\">\n<li>Open the <a href=\"https:\/\/simpletool.io\/tools\/css-loader-generator\/\">CSS loader generator<\/a><\/li>\n<li>Pick a preset from the gallery (60+ available across 5 categories)<\/li>\n<li>Adjust size, speed (animation duration), colour, and stroke width<\/li>\n<li>Watch the live preview animate in real time<\/li>\n<li>Click <strong>Copy CSS<\/strong> for production-ready code with <code>prefers-reduced-motion<\/code> handling<\/li>\n<li>Or click <strong>Copy as HTML+CSS<\/strong> for a complete drop-in component<\/li>\n<\/ol>\n<h2 class=\"wp-block-heading\">Accessibility \u2014 the loaders that beat off-the-shelf libraries<\/h2>\n<p>Most spinners shipped on Stack Overflow and CodePen miss accessibility basics:<\/p>\n<ul class=\"wp-block-list\">\n<li><strong>ARIA role + label.<\/strong> Loaders need <code>role=\"status\"<\/code> and <code>aria-label=\"Loading\"<\/code> so screen readers announce them. Without these, blind users have no idea anything is happening.<\/li>\n<li><strong>prefers-reduced-motion.<\/strong> Slow or pause animations for users with vestibular disorders. Don&#8217;t remove the spinner \u2014 slow it from 0.8s to 3s rotation.<\/li>\n<li><strong>Visible loading text.<\/strong> A pure visual spinner gives no information. Pair with text like &#8220;Loading&#8221;, &#8220;Saving&#8230;&#8221;, &#8220;Fetching results&#8221; \u2014 both for accessibility and to communicate context.<\/li>\n<li><strong>Removed from DOM when done.<\/strong> An invisible spinner left in the DOM still gets announced by screen readers as &#8220;loading&#8221;. Remove it or set <code>aria-hidden=\"true\"<\/code> when complete.<\/li>\n<li><strong>Don&#8217;t trap focus.<\/strong> A loader covering the page shouldn&#8217;t trap keyboard focus inside the spinner. Either make the page scrim non-interactive or move focus to a meaningful element when loading completes.<\/li>\n<\/ul>\n<p>Our generator outputs CSS with the ARIA attributes baked in. Copy and paste \u2014 accessibility done.<\/p>\n<h2 class=\"wp-block-heading\">Common gotchas<\/h2>\n<ul class=\"wp-block-list\">\n<li><strong>Don&#8217;t animate <code>top<\/code>, <code>left<\/code>, or <code>width<\/code>.<\/strong> Layout-triggering properties cause the browser to recalculate every frame. Always animate <code>transform<\/code> and <code>opacity<\/code> for 60fps. Our presets only use those.<\/li>\n<li><strong>Conic gradients need fallbacks.<\/strong> <code>conic-gradient()<\/code> works in Chrome 69+, Safari 13+, Firefox 83+ \u2014 close to universal in 2026. For very old browsers (IE, very old Android stock browser), provide a fallback border-style spinner via <code>@supports<\/code>.<\/li>\n<li><strong>Skeleton screens with shimmer animation can be expensive.<\/strong> A full-page skeleton with 20 animated rectangles taxes mobile CPUs. Test on a low-end phone before shipping; consider a single-element pulse instead of per-element shimmer.<\/li>\n<li><strong>Animation timing functions matter.<\/strong> <code>linear<\/code> for spinners (constant rotation feels &#8220;loading&#8221;), <code>ease-in-out<\/code> for bouncing dots (more natural pulse), <code>cubic-bezier()<\/code> for character or branded loaders.<\/li>\n<li><strong>Don&#8217;t stack multiple loaders on one page.<\/strong> One global spinner is enough; multiple loaders create competing animations that distract. Use skeleton screens for multiple regions instead.<\/li>\n<li><strong>Border-radius doesn&#8217;t always match expected geometry.<\/strong> A 50% border-radius on a non-square element produces an ellipse, not a circle. Spinners need explicit equal width and height.<\/li>\n<\/ul>\n<h2 class=\"wp-block-heading\">When NOT to use a CSS loader<\/h2>\n<p>For known-duration uploads or downloads, use a real <strong>progress bar<\/strong> showing percentage \u2014 much more informative than an indeterminate spinner. For sub-100ms operations, don&#8217;t show a loader at all (it&#8217;ll flash and feel jankier than no feedback). For very long operations (over 10 seconds), pair with text updates (&#8220;Uploading&#8230; 1.2 MB of 4 MB&#8221;) because a constant spinner stops feeling like progress. For complex character-style loaders (like the Discord cat or GitHub Octocat), consider an SVG or Lottie animation instead \u2014 pure CSS hits a complexity ceiling around morphing shapes.<\/p>\n<h2 class=\"wp-block-heading\">Frequently asked questions<\/h2>\n<h3 class=\"wp-block-heading\">Are CSS loaders accessible to screen readers?<\/h3>\n<p>Only with <code>role=\"status\"<\/code> and <code>aria-label<\/code>. Our presets ship with both. A bare <code>&lt;div&gt;<\/code> with animation gives no information to assistive tech \u2014 always pair the visual with proper ARIA, plus a hidden text alternative if the loader represents a complex state.<\/p>\n<h3 class=\"wp-block-heading\">Do CSS loaders work on all browsers?<\/h3>\n<p>Border-style spinners and bouncing-dot loaders work in every browser since IE 10. Conic-gradient loaders need Chrome 69+, Safari 13+, Firefox 83+ \u2014 universal in 2026 except for IE (retired by Microsoft in 2022). Use <code>@supports (background: conic-gradient(red, blue))<\/code> for graceful fallback if you support IE.<\/p>\n<h3 class=\"wp-block-heading\">How do I respect prefers-reduced-motion?<\/h3>\n<p>Add a media query that slows or replaces the animation: <code>@media (prefers-reduced-motion: reduce) { .loader { animation-duration: 3s; } }<\/code>. Don&#8217;t remove the loader entirely \u2014 users still need feedback that something is happening.<\/p>\n<h3 class=\"wp-block-heading\">Can I use these in React, Vue, or Svelte?<\/h3>\n<p>Yes \u2014 they&#8217;re CSS-only, so framework-agnostic. Drop the CSS into a stylesheet, add the markup as a component, and apply the class. Use scoped styles in Vue\/Svelte to avoid cross-component conflicts.<\/p>\n<h3 class=\"wp-block-heading\">Will animated loaders drain the battery?<\/h3>\n<p>Properly built ones (animating only <code>transform<\/code> and <code>opacity<\/code>) are GPU-accelerated and very cheap. Layout-triggering animations (animating <code>width<\/code> or <code>top<\/code>) can drain battery. Browsers also pause animations on hidden tabs to save power; a forgotten spinner on an inactive tab won&#8217;t keep the GPU busy.<\/p>\n<h3 class=\"wp-block-heading\">Is my data uploaded?<\/h3>\n<p>No. The generator runs entirely in your browser. Customisations and the generated CSS stay on your device.<\/p>\n<h2 class=\"wp-block-heading\">Related tools and guides<\/h2>\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/simpletool.io\/tools\/css-loader-generator\/\">CSS Loader Generator<\/a><\/li>\n<li><a href=\"https:\/\/simpletool.io\/tools\/css-cubic-bezier-generator\/\">Cubic Bezier Generator (for loader timing)<\/a><\/li>\n<li><a href=\"https:\/\/simpletool.io\/tools\/css-gradient-generator\/\">CSS Gradient Generator<\/a><\/li>\n<li><a href=\"https:\/\/simpletool.io\/tools\/css-glassmorphism-generator\/\">CSS Glassmorphism Generator<\/a><\/li>\n<li><a href=\"https:\/\/simpletool.io\/css-tools\/\">All CSS tools<\/a><\/li>\n<\/ul>\n<p><script type=\"application\/ld+json\">\n{\"@context\":\"https:\/\/schema.org\",\"@type\":\"FAQPage\",\"mainEntity\":[\n{\"@type\":\"Question\",\"name\":\"Are CSS loaders accessible to screen readers?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Only with role=status and aria-label. Our presets ship with both. A bare div with animation gives no info to assistive tech.\"}},\n{\"@type\":\"Question\",\"name\":\"Do CSS loaders work on all browsers?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Border-style spinners work since IE 10. Conic-gradient needs Chrome 69+, Safari 13+, Firefox 83+. Universal in 2026 except IE.\"}},\n{\"@type\":\"Question\",\"name\":\"How do I respect prefers-reduced-motion?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Use a media query to slow the animation: animation-duration: 3s. Don't remove entirely \u2014 users still need feedback.\"}},\n{\"@type\":\"Question\",\"name\":\"Can I use these in React, Vue, or Svelte?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Yes \u2014 CSS-only, framework-agnostic. Drop into a stylesheet, add markup, apply the class.\"}},\n{\"@type\":\"Question\",\"name\":\"Will animated loaders drain the battery?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Properly built ones (transform + opacity) are GPU-accelerated and cheap. Layout-triggering animations can drain battery.\"}},\n{\"@type\":\"Question\",\"name\":\"Is my data uploaded?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"No. Generator runs in your browser. Customisations and CSS stay on your device.\"}}\n]}<\/script><\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Pure-CSS loaders and spinners with no JS dependency. 60+ presets \u2014 circle, dots, bars, skeleton, gradient. Customise size, speed, color. Copy production CSS.<\/p>\n","protected":false},"author":2,"featured_media":170,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[40,9,6],"tags":[81,19,80],"class_list":["post-171","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-css-tools","category-free-tools","category-tutorials","tag-animation","tag-css","tag-css-tools"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>CSS Loader Generator: 60+ Pure-CSS Spinners [2026]<\/title>\n<meta name=\"description\" content=\"Pure-CSS loaders and spinners with no JS dependency. 60+ presets \u2014 circle, dots, bars, skeleton, gradient. Customise size, speed, color. Copy production CSS.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/simpletool.io\/blog\/css-loader-spinner\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"CSS Loader Generator: 60+ Pure-CSS Spinners [2026]\" \/>\n<meta property=\"og:description\" content=\"Pure-CSS loaders and spinners with no JS dependency. 60+ presets \u2014 circle, dots, bars, skeleton, gradient. Customise size, speed, color. Copy production CSS.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/simpletool.io\/blog\/css-loader-spinner\/\" \/>\n<meta property=\"og:site_name\" content=\"SimpleTool\" \/>\n<meta property=\"article:published_time\" content=\"2026-05-14T13:21:56+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/simpletool.io\/blog\/wp-content\/uploads\/2026\/05\/css-loader-spinner.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Simple Tool\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Simple Tool\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/simpletool.io\\\/blog\\\/css-loader-spinner\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/simpletool.io\\\/blog\\\/css-loader-spinner\\\/\"},\"author\":{\"name\":\"Simple Tool\",\"@id\":\"https:\\\/\\\/simpletool.io\\\/blog\\\/#\\\/schema\\\/person\\\/38da26da1ab731dd1b80f05ee75edcca\"},\"headline\":\"CSS Loader Generator: 60+ Pure-CSS Spinners [2026]\",\"datePublished\":\"2026-05-14T13:21:56+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/simpletool.io\\\/blog\\\/css-loader-spinner\\\/\"},\"wordCount\":1048,\"image\":{\"@id\":\"https:\\\/\\\/simpletool.io\\\/blog\\\/css-loader-spinner\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/simpletool.io\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/css-loader-spinner.png\",\"keywords\":[\"Animation\",\"CSS\",\"CSS Tools\"],\"articleSection\":[\"CSS Tools\",\"Free Tools\",\"Tutorials\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/simpletool.io\\\/blog\\\/css-loader-spinner\\\/\",\"url\":\"https:\\\/\\\/simpletool.io\\\/blog\\\/css-loader-spinner\\\/\",\"name\":\"CSS Loader Generator: 60+ Pure-CSS Spinners [2026]\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/simpletool.io\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/simpletool.io\\\/blog\\\/css-loader-spinner\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/simpletool.io\\\/blog\\\/css-loader-spinner\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/simpletool.io\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/css-loader-spinner.png\",\"datePublished\":\"2026-05-14T13:21:56+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/simpletool.io\\\/blog\\\/#\\\/schema\\\/person\\\/38da26da1ab731dd1b80f05ee75edcca\"},\"description\":\"Pure-CSS loaders and spinners with no JS dependency. 60+ presets \u2014 circle, dots, bars, skeleton, gradient. Customise size, speed, color. Copy production CSS.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/simpletool.io\\\/blog\\\/css-loader-spinner\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/simpletool.io\\\/blog\\\/css-loader-spinner\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/simpletool.io\\\/blog\\\/css-loader-spinner\\\/#primaryimage\",\"url\":\"https:\\\/\\\/simpletool.io\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/css-loader-spinner.png\",\"contentUrl\":\"https:\\\/\\\/simpletool.io\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/css-loader-spinner.png\",\"width\":1200,\"height\":630,\"caption\":\"CSS Loader and Spinner Generator featured graphic showing six pure-CSS loader styles in purple\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/simpletool.io\\\/blog\\\/css-loader-spinner\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/simpletool.io\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"CSS Loader Generator: 60+ Pure-CSS Spinners [2026]\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/simpletool.io\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/simpletool.io\\\/blog\\\/\",\"name\":\"SimpleTool\",\"description\":\"Always Simple, Always Free\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/simpletool.io\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/simpletool.io\\\/blog\\\/#\\\/schema\\\/person\\\/38da26da1ab731dd1b80f05ee75edcca\",\"name\":\"Simple Tool\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/9857d5538174f42513c518cd1beda9ebea17e9362d417a2bcde92767fcffcaa3?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/9857d5538174f42513c518cd1beda9ebea17e9362d417a2bcde92767fcffcaa3?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/9857d5538174f42513c518cd1beda9ebea17e9362d417a2bcde92767fcffcaa3?s=96&d=mm&r=g\",\"caption\":\"Simple Tool\"},\"sameAs\":[\"https:\\\/\\\/simpletool.io\"],\"url\":\"https:\\\/\\\/simpletool.io\\\/blog\\\/author\\\/simpletoolio\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"CSS Loader Generator: 60+ Pure-CSS Spinners [2026]","description":"Pure-CSS loaders and spinners with no JS dependency. 60+ presets \u2014 circle, dots, bars, skeleton, gradient. Customise size, speed, color. Copy production CSS.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/simpletool.io\/blog\/css-loader-spinner\/","og_locale":"en_US","og_type":"article","og_title":"CSS Loader Generator: 60+ Pure-CSS Spinners [2026]","og_description":"Pure-CSS loaders and spinners with no JS dependency. 60+ presets \u2014 circle, dots, bars, skeleton, gradient. Customise size, speed, color. Copy production CSS.","og_url":"https:\/\/simpletool.io\/blog\/css-loader-spinner\/","og_site_name":"SimpleTool","article_published_time":"2026-05-14T13:21:56+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/simpletool.io\/blog\/wp-content\/uploads\/2026\/05\/css-loader-spinner.png","type":"image\/png"}],"author":"Simple Tool","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Simple Tool","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/simpletool.io\/blog\/css-loader-spinner\/#article","isPartOf":{"@id":"https:\/\/simpletool.io\/blog\/css-loader-spinner\/"},"author":{"name":"Simple Tool","@id":"https:\/\/simpletool.io\/blog\/#\/schema\/person\/38da26da1ab731dd1b80f05ee75edcca"},"headline":"CSS Loader Generator: 60+ Pure-CSS Spinners [2026]","datePublished":"2026-05-14T13:21:56+00:00","mainEntityOfPage":{"@id":"https:\/\/simpletool.io\/blog\/css-loader-spinner\/"},"wordCount":1048,"image":{"@id":"https:\/\/simpletool.io\/blog\/css-loader-spinner\/#primaryimage"},"thumbnailUrl":"https:\/\/simpletool.io\/blog\/wp-content\/uploads\/2026\/05\/css-loader-spinner.png","keywords":["Animation","CSS","CSS Tools"],"articleSection":["CSS Tools","Free Tools","Tutorials"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/simpletool.io\/blog\/css-loader-spinner\/","url":"https:\/\/simpletool.io\/blog\/css-loader-spinner\/","name":"CSS Loader Generator: 60+ Pure-CSS Spinners [2026]","isPartOf":{"@id":"https:\/\/simpletool.io\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/simpletool.io\/blog\/css-loader-spinner\/#primaryimage"},"image":{"@id":"https:\/\/simpletool.io\/blog\/css-loader-spinner\/#primaryimage"},"thumbnailUrl":"https:\/\/simpletool.io\/blog\/wp-content\/uploads\/2026\/05\/css-loader-spinner.png","datePublished":"2026-05-14T13:21:56+00:00","author":{"@id":"https:\/\/simpletool.io\/blog\/#\/schema\/person\/38da26da1ab731dd1b80f05ee75edcca"},"description":"Pure-CSS loaders and spinners with no JS dependency. 60+ presets \u2014 circle, dots, bars, skeleton, gradient. Customise size, speed, color. Copy production CSS.","breadcrumb":{"@id":"https:\/\/simpletool.io\/blog\/css-loader-spinner\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/simpletool.io\/blog\/css-loader-spinner\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/simpletool.io\/blog\/css-loader-spinner\/#primaryimage","url":"https:\/\/simpletool.io\/blog\/wp-content\/uploads\/2026\/05\/css-loader-spinner.png","contentUrl":"https:\/\/simpletool.io\/blog\/wp-content\/uploads\/2026\/05\/css-loader-spinner.png","width":1200,"height":630,"caption":"CSS Loader and Spinner Generator featured graphic showing six pure-CSS loader styles in purple"},{"@type":"BreadcrumbList","@id":"https:\/\/simpletool.io\/blog\/css-loader-spinner\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/simpletool.io\/blog\/"},{"@type":"ListItem","position":2,"name":"CSS Loader Generator: 60+ Pure-CSS Spinners [2026]"}]},{"@type":"WebSite","@id":"https:\/\/simpletool.io\/blog\/#website","url":"https:\/\/simpletool.io\/blog\/","name":"SimpleTool","description":"Always Simple, Always Free","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/simpletool.io\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/simpletool.io\/blog\/#\/schema\/person\/38da26da1ab731dd1b80f05ee75edcca","name":"Simple Tool","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/9857d5538174f42513c518cd1beda9ebea17e9362d417a2bcde92767fcffcaa3?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/9857d5538174f42513c518cd1beda9ebea17e9362d417a2bcde92767fcffcaa3?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/9857d5538174f42513c518cd1beda9ebea17e9362d417a2bcde92767fcffcaa3?s=96&d=mm&r=g","caption":"Simple Tool"},"sameAs":["https:\/\/simpletool.io"],"url":"https:\/\/simpletool.io\/blog\/author\/simpletoolio\/"}]}},"_links":{"self":[{"href":"https:\/\/simpletool.io\/blog\/wp-json\/wp\/v2\/posts\/171","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/simpletool.io\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/simpletool.io\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/simpletool.io\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/simpletool.io\/blog\/wp-json\/wp\/v2\/comments?post=171"}],"version-history":[{"count":1,"href":"https:\/\/simpletool.io\/blog\/wp-json\/wp\/v2\/posts\/171\/revisions"}],"predecessor-version":[{"id":238,"href":"https:\/\/simpletool.io\/blog\/wp-json\/wp\/v2\/posts\/171\/revisions\/238"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/simpletool.io\/blog\/wp-json\/wp\/v2\/media\/170"}],"wp:attachment":[{"href":"https:\/\/simpletool.io\/blog\/wp-json\/wp\/v2\/media?parent=171"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/simpletool.io\/blog\/wp-json\/wp\/v2\/categories?post=171"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/simpletool.io\/blog\/wp-json\/wp\/v2\/tags?post=171"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}