Accessible Drag and Drop Storyline Interaction

June 10, 2025

This accessible drag and drop interaction was developed in Articulate Storyline to meet WCAG 2.0 and section 508 standards, allowing learners to click and drag with a mouse or use keyboard inputs to make selections. It also includes alt text for each draggable item and each drop target so that learners with visual impairments can complete it using a screen reader.

The built-in drag and drop interactions in articulate storyline are not natively accessible so this interaction uses a freeform drag and drop slide with additional triggers to allow for a separate method of completing the interaction using the keyboard to select the item the learner would like to drag, and then selecting the location they'd like to drop.

A template of this project is available for download and maybe modified to suit the needs of any project. (Rename the .zip extension to .story to edit the file if necessary.)

Credit to Art Del Rosario for his work in developing this project!

Here's how it works:

Click to enlarge this image.

01

Buttons & Motion Paths

Each drag item and drop target is a button - this is mostly important because it automatically gives all the items a "selected" state which makes this whole thing work. By selecting a given drag item, and then selecting a drop target, triggers are used to move the drag item along a motion path that leads to that specific drop target. For example, Move Item 1 along Motion Path 1 when the user clicks Drop Target 1 - IF the state of Item 1 is Selected. This is repeated for each of the drop targets with individual motion paths for each drag item. If the user clicks on Drop Target 2, Item 1 would move along Motion Path 2 leading to that Drop Target.

Buttons & Motion Paths

Each drag item and drop target is a button - this is mostly important because it automatically gives all the items a "selected" state which makes this whole thing work. By selecting a given drag item, and then selecting a drop target, triggers are used to move the drag item along a motion path that leads to that specific drop target. For example, Move Item 1 along Motion Path 1 when the user clicks Drop Target 1 - IF the state of Item 1 is Selected. This is repeated for each of the drop targets with individual motion paths for each drag item. If the user clicks on Drop Target 2, Item 1 would move along Motion Path 2 leading to that Drop Target.

Buttons & Motion Paths

Each drag item and drop target is a button - this is mostly important because it automatically gives all the items a "selected" state which makes this whole thing work. By selecting a given drag item, and then selecting a drop target, triggers are used to move the drag item along a motion path that leads to that specific drop target. For example, Move Item 1 along Motion Path 1 when the user clicks Drop Target 1 - IF the state of Item 1 is Selected. This is repeated for each of the drop targets with individual motion paths for each drag item. If the user clicks on Drop Target 2, Item 1 would move along Motion Path 2 leading to that Drop Target.

Select & De-select

Once all the motion paths and triggers are set up correctly, it's important that clicking on one drag item de-selects all the other drag items - so here's where the bulk of your triggers are going to come in. When the user clicks Drag Item 1, Change the State of Drag Item 2 to Normal. This is repeated for Drag Item 3, 4, 5, 6 (or for however many drag items you end up having. This process is then repeated for EACH of the drag items. So in the example here, we had 6 drag items, so there were a total of 36 triggers that adjusted the states when selected, one to set the state of the clicked item to Selected and five more to set the states of all the other triggers to Normal.

Select & De-select

Once all the motion paths and triggers are set up correctly, it's important that clicking on one drag item de-selects all the other drag items - so here's where the bulk of your triggers are going to come in. When the user clicks Drag Item 1, Change the State of Drag Item 2 to Normal. This is repeated for Drag Item 3, 4, 5, 6 (or for however many drag items you end up having. This process is then repeated for EACH of the drag items. So in the example here, we had 6 drag items, so there were a total of 36 triggers that adjusted the states when selected, one to set the state of the clicked item to Selected and five more to set the states of all the other triggers to Normal.

Select & De-select

Once all the motion paths and triggers are set up correctly, it's important that clicking on one drag item de-selects all the other drag items - so here's where the bulk of your triggers are going to come in. When the user clicks Drag Item 1, Change the State of Drag Item 2 to Normal. This is repeated for Drag Item 3, 4, 5, 6 (or for however many drag items you end up having. This process is then repeated for EACH of the drag items. So in the example here, we had 6 drag items, so there were a total of 36 triggers that adjusted the states when selected, one to set the state of the clicked item to Selected and five more to set the states of all the other triggers to Normal.

02

Screenshot of the Articulate Storyline interface showing the triggers panel used to control the select and de-select states of the drag-and-drop items.
Screenshot of the Articulate Storyline interface showing the triggers panel used to control the select and de-select states of the drag-and-drop items.

Click to enlarge this image.

Close-up of the Articulate Storyline Triggers panel, detailing the True/False variables and conditions used to check if an answer is correct or incorrect.
Close-up of the Articulate Storyline Triggers panel, detailing the True/False variables and conditions used to check if an answer is correct or incorrect.

Click to enlarge this image.

03

Checking Answers with Variables

Now we need to manually check the answers which will require a variable for each drag item and setting the state to Drop Correct or Drop Incorrect. To make it easy, we created variables for each drag item with the name of the drag item (Sounding is used as an example below). We used True/False to say whether the item was correct or not (false being the default and not correct), and adjusted the variable based on the Drop Correct and Drop Incorrect states. Then we need to account for the multiple ways the user can interact with it. If they are just clicking or using the keyboard, we can use the trigger "When Animation Completes" to track whether the motion path was going to the right place or not. In this case the correct answer for Sounding was Motion Path 4, so we set the state of Sounding to Drop Correct when animation 4 completes on Sounding. For all other motion paths, we want to set it to incorrect. That handles the accessible version but since we're using free form instead of the built-in drag and drop slide, we also needed to create triggers for when the user drops Sounding on any of the drop targets. That's where you have Set state of Sounding to Drop Correct when the user drops Sounding on Drop Target 4. If they drop it anywhere else, it should be set to Drop Incorrect.

Checking Answers with Variables

Now we need to manually check the answers which will require a variable for each drag item and setting the state to Drop Correct or Drop Incorrect. To make it easy, we created variables for each drag item with the name of the drag item (Sounding is used as an example below). We used True/False to say whether the item was correct or not (false being the default and not correct), and adjusted the variable based on the Drop Correct and Drop Incorrect states. Then we need to account for the multiple ways the user can interact with it. If they are just clicking or using the keyboard, we can use the trigger "When Animation Completes" to track whether the motion path was going to the right place or not. In this case the correct answer for Sounding was Motion Path 4, so we set the state of Sounding to Drop Correct when animation 4 completes on Sounding. For all other motion paths, we want to set it to incorrect. That handles the accessible version but since we're using free form instead of the built-in drag and drop slide, we also needed to create triggers for when the user drops Sounding on any of the drop targets. That's where you have Set state of Sounding to Drop Correct when the user drops Sounding on Drop Target 4. If they drop it anywhere else, it should be set to Drop Incorrect.

Checking Answers with Variables

Now we need to manually check the answers which will require a variable for each drag item and setting the state to Drop Correct or Drop Incorrect. To make it easy, we created variables for each drag item with the name of the drag item (Sounding is used as an example below). We used True/False to say whether the item was correct or not (false being the default and not correct), and adjusted the variable based on the Drop Correct and Drop Incorrect states. Then we need to account for the multiple ways the user can interact with it. If they are just clicking or using the keyboard, we can use the trigger "When Animation Completes" to track whether the motion path was going to the right place or not. In this case the correct answer for Sounding was Motion Path 4, so we set the state of Sounding to Drop Correct when animation 4 completes on Sounding. For all other motion paths, we want to set it to incorrect. That handles the accessible version but since we're using free form instead of the built-in drag and drop slide, we also needed to create triggers for when the user drops Sounding on any of the drop targets. That's where you have Set state of Sounding to Drop Correct when the user drops Sounding on Drop Target 4. If they drop it anywhere else, it should be set to Drop Incorrect.

Resetting the Options

Once the items are moved, they can't be moved back using the keyboard so we created a "Start Over" button that just reset everything. Selecting Start Over sets all the variables back to False and jumps to this slide (which is set to "Reset to Initial State" on revisiting). This effectively resets the whole thing so they can try again.

Resetting the Options

Once the items are moved, they can't be moved back using the keyboard so we created a "Start Over" button that just reset everything. Selecting Start Over sets all the variables back to False and jumps to this slide (which is set to "Reset to Initial State" on revisiting). This effectively resets the whole thing so they can try again.

Resetting the Options

Once the items are moved, they can't be moved back using the keyboard so we created a "Start Over" button that just reset everything. Selecting Start Over sets all the variables back to False and jumps to this slide (which is set to "Reset to Initial State" on revisiting). This effectively resets the whole thing so they can try again.

04

Screenshot of the triggers assigned to the 'Start Over' button in Storyline, which reset all variables to False to allow the user to try again.
Screenshot of the triggers assigned to the 'Start Over' button in Storyline, which reset all variables to False to allow the user to try again.

Click to enlarge this image.

Storyline triggers for the 'Submit' button, showing the logic that checks the variables to display either the 'Correct Feedback' or 'Incorrect Feedback' layer.
Storyline triggers for the 'Submit' button, showing the logic that checks the variables to display either the 'Correct Feedback' or 'Incorrect Feedback' layer.

Click to enlarge this image.

05

Submitting the Interaction

Finally, to submit the interaction, we added a Submit button and had it check that all of our variables are set to True, which means all of the items were dragged or moved to the right place. If they're all True, then show the Correct Feedback layer, Else, show the Try Again feedback layer. We allowed the user 2 attempts by adding a "Drag_drop_attempt" variable that adds one every time the user visits the Try Again layer. If when the timeline starts, attempts is = 1 (it starts at 0), it automatically shows the Incorrect layer. Otherwise, it adds 1 to the attempt variable.

Submitting the Interaction

Finally, to submit the interaction, we added a Submit button and had it check that all of our variables are set to True, which means all of the items were dragged or moved to the right place. If they're all True, then show the Correct Feedback layer, Else, show the Try Again feedback layer. We allowed the user 2 attempts by adding a "Drag_drop_attempt" variable that adds one every time the user visits the Try Again layer. If when the timeline starts, attempts is = 1 (it starts at 0), it automatically shows the Incorrect layer. Otherwise, it adds 1 to the attempt variable.

Submitting the Interaction

Finally, to submit the interaction, we added a Submit button and had it check that all of our variables are set to True, which means all of the items were dragged or moved to the right place. If they're all True, then show the Correct Feedback layer, Else, show the Try Again feedback layer. We allowed the user 2 attempts by adding a "Drag_drop_attempt" variable that adds one every time the user visits the Try Again layer. If when the timeline starts, attempts is = 1 (it starts at 0), it automatically shows the Incorrect layer. Otherwise, it adds 1 to the attempt variable.

Alt Text

Alt text was also added to each of the drop targets, explaining in words what the gist of the location was. This was a bit tricky because you can't just say "Sounding Correct Answer" or it defeats the purpose of the interaction so we leveraged some SME help to get meaningful descriptions of the areas that didn't give away the answer immediately. The drag items also have alt text, but it's just the name of the item (same for the start over and submit buttons).

Alt Text

Alt text was also added to each of the drop targets, explaining in words what the gist of the location was. This was a bit tricky because you can't just say "Sounding Correct Answer" or it defeats the purpose of the interaction so we leveraged some SME help to get meaningful descriptions of the areas that didn't give away the answer immediately. The drag items also have alt text, but it's just the name of the item (same for the start over and submit buttons).

Alt Text

Alt text was also added to each of the drop targets, explaining in words what the gist of the location was. This was a bit tricky because you can't just say "Sounding Correct Answer" or it defeats the purpose of the interaction so we leveraged some SME help to get meaningful descriptions of the areas that didn't give away the answer immediately. The drag items also have alt text, but it's just the name of the item (same for the start over and submit buttons).

06

The 'Size and Position' window in Articulate Storyline, with the Accessibility tab open to show where alternative text is added for a course object.
The 'Size and Position' window in Articulate Storyline, with the Accessibility tab open to show where alternative text is added for a course object.

Click to enlarge this image.

An example of an on-screen accessibility feature pop-up, which provides clear instructions to the user on how to navigate the interaction with a keyboard.
An example of an on-screen accessibility feature pop-up, which provides clear instructions to the user on how to navigate the interaction with a keyboard.

Click to enlarge this image.

07

Adding Instructions

We also added a marker at the top of the focus order that describes how to navigate through the project. This is set to show all on hover so when it's selected using a keyboard it'll just show everything instead of having to click on it. However, it's also out of the way enough that it won't bother users who can use the traditional drag and drop functionality with their mouse. And that's it! It's a significantly larger lift than the native drag and drop slide, but we don't take "it's impossible" for an answer when it comes to making eLearning accessible!

Adding Instructions

We also added a marker at the top of the focus order that describes how to navigate through the project. This is set to show all on hover so when it's selected using a keyboard it'll just show everything instead of having to click on it. However, it's also out of the way enough that it won't bother users who can use the traditional drag and drop functionality with their mouse. And that's it! It's a significantly larger lift than the native drag and drop slide, but we don't take "it's impossible" for an answer when it comes to making eLearning accessible!

Adding Instructions

We also added a marker at the top of the focus order that describes how to navigate through the project. This is set to show all on hover so when it's selected using a keyboard it'll just show everything instead of having to click on it. However, it's also out of the way enough that it won't bother users who can use the traditional drag and drop functionality with their mouse. And that's it! It's a significantly larger lift than the native drag and drop slide, but we don't take "it's impossible" for an answer when it comes to making eLearning accessible!

Contact us

Get in touch with our expert team

An overhead view of a successful client meeting, where our expert instructional design team finalizes a strategic partnership with a handshake over the conference table.

Contact us

Get in touch with our expert team

An overhead view of a successful client meeting, where our expert instructional design team finalizes a strategic partnership with a handshake over the conference table.

Contact us

Get in touch with our expert team

An overhead view of a successful client meeting, where our expert instructional design team finalizes a strategic partnership with a handshake over the conference table.