Sortable Lists

Back

Loading concept...

Sortable Lists in Alpine.js: The Magic Toy Shelf

Imagine you have a toy shelf. You want to rearrange your toys easily—move the teddy bear above the robot, put the dinosaur at the bottom. Sortable Lists let you do exactly that with items on a webpage!


The Story: Maya’s Magic Bookshelf

Maya had a bookshelf with her favorite stories. But every time she wanted to read a different book first, she had to ask her dad to move them. One day, her dad gave her a magic wand (Alpine.js + Sortable). Now Maya could just drag and drop books anywhere she wanted!

Let’s learn Maya’s magic!


1. Sortable List Basics

What Is It?

A sortable list is a list where you can move items around by dragging them. Think of it like rearranging magnets on a fridge!

The Magic Spell (Code)

<div x-data="{ items: ['Apple', 'Banana', 'Cherry'] }">
  <ul x-sort>
    <template x-for="item in items">
      <li x-text="item"></li>
    </template>
  </ul>
</div>

How It Works

graph TD A["Your List Items"] --> B["Add x-sort directive"] B --> C["Items become draggable"] C --> D["User drags and drops"] D --> E["List reorders automatically!"]

Real-Life Example

  • Before: Apple, Banana, Cherry
  • User drags Banana to top
  • After: Banana, Apple, Cherry

It’s like a playlist where you move songs around!


2. Sort Event Handling

What Is It?

When items move, sometimes you want to know about it. Maybe you want to save the new order. Event handling tells your code: “Hey! Something changed!”

The Magic Spell

<ul x-sort="handleSort">
  <!-- items here -->
</ul>

<script>
function handleSort(item, position) {
  console.log(item, 'moved to', position);
}
</script>

What Happens?

graph TD A["User moves an item"] --> B["x-sort fires event"] B --> C["Your function runs"] C --> D["You know what moved!"] D --> E["Save to database/update state"]

Example: Saving Maya’s Book Order

When Maya moves “Harry Potter” to the top, the magic tells her dad’s computer: “Harry Potter is now in position 1!”

<ul x-sort="(item, pos) =>
  saveOrder(item.textContent, pos)">
  <li>Harry Potter</li>
  <li>Narnia</li>
  <li>Percy Jackson</li>
</ul>

3. Sort Visual Feedback

What Is It?

When you’re dragging something, it helps to see it moving! Visual feedback shows:

  • Which item you’re holding
  • Where it will land
  • That something is happening

The Magic Spell

[x-sort]:active {
  opacity: 0.5;
  background: #e0f7fa;
}

.sortable-ghost {
  background: #ffeb3b;
  border: 2px dashed #ff9800;
}

What It Looks Like

graph TD A["Pick up item"] --> B["Item becomes see-through"] B --> C[Ghost shows where it'll go] C --> D["Drop it!"] D --> E["Item snaps into place"]

Real Example

Maya drags “Narnia”:

  1. Narnia fades (you’re holding it!)
  2. Yellow dotted box appears where it’ll land
  3. Drop! Narnia is in its new home
<style>
  .dragging { opacity: 0.4; }
  .drop-zone {
    border: 2px dashed gold;
  }
</style>

4. Sorting Between Lists

What Is It?

Sometimes you have two or more lists. Like a “To Do” list and a “Done” list. You want to move items between them!

The Magic Spell

<div x-data="{
  todo: ['Homework', 'Clean room'],
  done: ['Breakfast']
}">

  <div x-sort="moveToTodo" group="tasks">
    <h3>To Do</h3>
    <template x-for="t in todo">
      <div x-text="t"></div>
    </template>
  </div>

  <div x-sort="moveToDone" group="tasks">
    <h3>Done</h3>
    <template x-for="d in done">
      <div x-text="d"></div>
    </template>
  </div>

</div>

The Secret: group

The group="tasks" is like giving both lists the same club membership. Items can only move between lists in the same club!

graph TD A["To Do List"] -->|group=tasks| B["Done List"] B -->|group=tasks| A C["Shopping List"] -->|group=shopping| C A -.->|Can't cross!| C

Example: Maya’s Reading Tracker

  • “Want to Read” list
  • “Currently Reading” list
  • “Finished” list

She drags “Percy Jackson” from “Want to Read” to “Currently Reading”. Magic!


5. Sort Drag Handles

What Is It?

Sometimes you don’t want the whole item to be draggable. Only a small part (the handle). It’s like a suitcase—you grab the handle, not the whole bag!

The Magic Spell

<ul x-sort handle=".handle">
  <li>
    <span class="handle"></span>
    Buy groceries
  </li>
  <li>
    <span class="handle"></span>
    Walk the dog
  </li>
</ul>

Why Use Handles?

graph TD A["Problem: Clicking anywhere drags"] --> B["Accidental drags!"] C["Solution: Add a handle"] --> D["Only handle drags"] D --> E["Click content safely"]

Real Example

Maya’s to-do list has buttons in each item:

  • ✅ Mark complete
  • 🗑️ Delete

If the whole item was draggable, clicking those buttons would start dragging! With a handle, only the ☰ icon triggers drag.

<li class="task-item">
  <span class="handle"></span>
  <span>Do homework</span>
  <button></button>
  <button>🗑️</button>
</li>

Quick Summary

Concept What It Does Key Code
Basics Make list draggable x-sort
Events Know when items move x-sort="myFunction"
Visual Show drag feedback CSS for .ghost, opacity
Between Lists Move across lists group="name"
Handles Drag only from icon handle=".class"

The Full Picture

graph TD A["Sortable List"] --> B["Add x-sort"] B --> C{Need events?} C -->|Yes| D["Add handler function"] C -->|No| E["Basic sorting works"] D --> F{Multiple lists?} E --> F F -->|Yes| G["Add group attribute"] F -->|No| H{Need precise control?} G --> H H -->|Yes| I["Add handle selector"] H -->|No| J["Done! Your list is magical"] I --> J

You Did It!

Now you know how to:

  • ✅ Create sortable lists
  • ✅ Listen for sort changes
  • ✅ Add beautiful visual feedback
  • ✅ Move items between lists
  • ✅ Use drag handles for precision

Maya’s magic bookshelf is now your magic bookshelf. Go build something amazing!


“The best way to learn is to play. Now go rearrange some lists!” 🎉

Loading story...

Story - Premium Content

Please sign in to view this story and start learning.

Upgrade to Premium to unlock full access to all stories.

Stay Tuned!

Story is coming soon.

Story Preview

Story - Premium Content

Please sign in to view this concept and start learning.

Upgrade to Premium to unlock full access to all content.