*** CodePen Demo ***
SortableJS is a JavaScript library for building re-orderable drag and drop ui elements.
As an introduction to the library we’ll build a quiz that requires the user to correctly order a set of answers.
SortableJS can be downloaded from here or loaded via CDN.
<script src="https://cdn.jsdelivr.net/npm/sortablejs@latest/Sortable.min.js"></script>
In this example we’ll ask the user to sort a list of F1 drivers by their number of Grand Prix victories.
Let’s get started by creating the following HTML list with the driver names:
<!-- index.html -->
<ul id="quiz">
<li>Ayrton Senna</li>
<li>Sebastian Vettel</li>
<li>Lewis Hamilton</li>
<li>Fernando Alonso</li>
<li>Michael Schumacher</li>
<li>Alain Prost</li>
</ul>
Next we initiate SortableJS, passing the id of our “quiz” element.
// script.js
new Sortable(quiz);
At this point you should be able to drag the list items to change the order in the browser.
Next we’ll add a button to the HTML that can be clicked to check if the answer is correct:
<!-- index.html -->
<button onclick="checkAnswer()">Check Answer</button>
Then define the correct order that the drivers need to be sorted:
// script.js
const correctAnswers = [
"Michael Schumacher",
"Lewis Hamilton",
"Sebastian Vettel",
"Alain Prost",
"Ayrton Senna",
"Fernando Alonso",
];
In the checkAnswer
function we push the users answer to an array and then compare with the correctAnswers
.
// script.js
function checkAnswer() {
const li = document.querySelectorAll("#quiz li");
let answers = new Array();
li.forEach(function (text) {
answers.push(text.innerHTML);
});
if (JSON.stringify(correctAnswers) === JSON.stringify(answers)) {
alert("Correct :)");
} else {
alert("Try Again...");
}
}
Lastly we’ll add some basic styling and change the cursor style to indicate the list items are draggable.
/* style.css */
#quiz li {
display: block;
background-color: lightsteelblue;
padding: 10px;
border-bottom: 1px solid #fff;
cursor: move;
cursor: -webkit-grabbing;
}
#quiz li.sortable-chosen {
background-color: lightslategray;
}
Top comments (0)