Toggle navigation
☰
Home
HTML
CSS
Scripting
Database
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Sortable List</title> <style> /* ========================================================================== Styles for Demo Preview Only ========================================================================== */ body { font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; background-color: #f1f5f9; color: #334155; margin: 0; padding: 2rem; display: flex; justify-content: center; } /* ========================================================================== Sortable List Component Styles - Copy from here ========================================================================== */ .sortable-list-template { --sort-font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; --sort-primary-text-color: #1e293b; --sort-secondary-text-color: #64748b; --sort-accent-color: #0d9488; --sort-bg-color: #ffffff; --sort-border-color: #cbd5e1; font-family: var(--sort-font-family); color: var(--sort-primary-text-color); width: 100%; max-width: 600px; background-color: var(--sort-bg-color); border: 1px solid var(--sort-border-color); border-radius: .5rem; padding: 2rem; } .sortable-list-template *, .sortable-list-template *::before, .sortable-list-template *::after { box-sizing: border-box; } .sortable-list-template .list-header { text-align: center; margin-bottom: 2rem; } .sortable-list-template .list-header h2 { font-size: 1.75rem; margin: 0; } .sort-controls { display: flex; justify-content: center; gap: 1rem; margin-bottom: 2rem; flex-wrap: wrap; } .sort-btn { padding: .5rem 1rem; font-size: .875rem; font-weight: 500; background-color: #f1f5f9; color: #475569; border: 1px solid var(--sort-border-color); border-radius: .25rem; cursor: pointer; transition: background-color 0.2s, border-color 0.2s, color 0.2s; } .sort-btn:hover, .sort-btn:focus { background-color: var(--sort-accent-color); color: white; border-color: var(--sort-accent-color); } .hero-list { list-style: none; padding: 0; margin: 0; } .hero-list li { display: flex; justify-content: space-between; align-items: center; gap: 1rem; padding: 1rem; border-bottom: 1px solid var(--sort-border-color); } .hero-list li:first-child { border-top: 1px solid var(--sort-border-color); } .hero-details .hero-name { font-weight: 600; } .hero-details .hero-power { font-size: .9rem; color: var(--sort-secondary-text-color); line-height: 1.4; } .hero-popularity { flex-shrink: 0; text-align: center; background-color: var(--sort-accent-color); color: white; font-weight: 700; font-size: .8rem; width: 48px; padding: .25rem; border-radius: .25rem; } .hero-popularity span { display: block; font-size: 1.25rem; line-height: 1.2; } </style> </head> <body> <div class="sortable-list-template"> <header class="list-header"> <h2>Hero Roster</h2> </header> <div class="sort-controls"> <button type="button" class="sort-btn" id="sort-by-name">Sort by Name (A-Z)</button> <button type="button" class="sort-btn" id="sort-by-popularity">Sort by Popularity Score (Desc)</button> </div> <ul class="hero-list" id="hero-list"> <li data-popularity="86"> <div class="hero-details"> <div class="hero-name">Captain Compliment</div> <div class="hero-power">Defeats evil with disarmingly sincere praise.</div> </div> <div class="hero-popularity">Score<span>86</span></div> </li> <li data-popularity="99"> <div class="hero-details"> <div class="hero-name">The Amazing Abstainer</div> <div class="hero-power">Can resist a second piece of cake.</div> </div> <div class="hero-popularity">Score<span>99</span></div> </li> <li data-popularity="65"> <div class="hero-details"> <div class="hero-name">Professor Punctual</div> <div class="hero-power">Arrives exactly on time, every time.</div> </div> <div class="hero-popularity">Score<span>65</span></div> </li> <li data-popularity="92"> <div class="hero-details"> <div class="hero-name">The Formidable Forsaker</div> <div class="hero-power">Remembers to cancel free trials before they expire.</div> </div> <div class="hero-popularity">Score<span>92</span></div> </li> </ul> <script> document.addEventListener('DOMContentLoaded', () => { const listContainer = document.querySelector('.sortable-list-template'); if (!listContainer) return; const sortByNameBtn = listContainer.querySelector('#sort-by-name'); const sortByPopularityBtn = listContainer.querySelector('#sort-by-popularity'); const heroList = listContainer.querySelector('#hero-list'); const sortList = (criteria) => { const items = Array.from(heroList.querySelectorAll('li')); items.sort((a, b) => { let valA, valB; if (criteria === 'name') { valA = a.querySelector('.hero-name').textContent.toLowerCase(); valB = b.querySelector('.hero-name').textContent.toLowerCase(); if (valA < valB) return -1; if (valA > valB) return 1; return 0; } else if (criteria === 'popularity') { valA = +a.dataset.popularity; valB = +b.dataset.popularity; // Sort descending for popularity if (valA > valB) return -1; if (valA < valB) return 1; return 0; } }); items.forEach(item => heroList.appendChild(item)); }; sortByNameBtn.addEventListener('click', () => sortList('name')); sortByPopularityBtn.addEventListener('click', () => sortList('popularity')); }); </script> </div> </body> </html>