Keyboard navigation
Purpose of keyboard navigation
One cornerstone of web accessibility is ensuring that sites and applications are fully operable via keyboard alone. This navigation method benefits a wide range of users, especially those who are unable to use a mouse or have visual impairments.
Screen readers and other assistive technologies rely heavily on keyboard interaction, and some users choose this method due to an acquired skill set or personal preference. By including keyboard navigation in our charts, we make the tool more accessible and user-friendly, living up to the principles of inclusive design.
Implementing keyboard actions with Lightweight Charts™
The Lightweight Charts™ API provides numerous methods that enable handling chart actions programmatically, making it possible to tie these actions to keyboard events.
Here's a walk-through of how to add keyboard navigation to the chart.
Setting focus on the chart
Firstly, we must ensure the chart is programmatically focusable for keyboard
interaction. We can achieve this by placing a tabindex
attribute to the
chart's container div:
<div id="chart" tabindex="0"></div>
This can also be achieved via JavaScript:
const containerEl = chart.chartElement().parentElement;
containerEl.tabIndex = 0;
Adding event listener for keyboard actions
Following that, we will tie specific chart interactions to keypress events using
JavaScript's addEventListener
method. This will allow us to control the chart
using specific keystrokes:
const chartContainer = document.getElementById('chart');
chartContainer.addEventListener('keydown', event => {
switch (event.key) {
case 'ArrowLeft':
// Action for ArrowLeft key
break;
case 'ArrowRight':
// Action for ArrowRight key
break;
// ... more cases
}
});
The addEventListener
function lets us listen to keydown
events that occur
when the user presses a key.
Utilizing Lightweight Chart's API for actions
Next, for each case, we use Lightweight Chart's API for desired actions.
Let's assume we want the left arrow key to scroll the chart to the left, and the right arrow key to scroll it to the right:
function shiftChart(diff) {
const currentPos = chart.timeScale().scrollPosition();
chart.timeScale().scrollToPosition(currentPos + diff, false);
}
chartContainer.addEventListener('keydown', event => {
switch (event.key) {
case 'ArrowLeft':
shiftChart(-10);
break;
case 'ArrowRight':
shiftChart(10);
break;
}
});
In the above JavaScript code, the timeScale().scrollToPosition()
method from
Lightweight Charts™ API is used inside the event listener to scroll the chart
whenever the left or right arrow key is pressed.
Additionally, we can assign the up and down arrow keys to adjust the zoom level of the chart:
function scaleChart(pct, zoomIn) {
const currentRange = chart.timeScale().getVisibleLogicalRange();
if (currentRange) {
const bars = currentRange.to - currentRange.from;
const direction = zoomIn ? -1 : 1;
const newRangeBars = bars * pct * direction + bars;
chart.timeScale().setVisibleLogicalRange({
to: currentRange.to,
from: currentRange.to - newRangeBars,
});
}
}
chartContainer.addEventListener('keydown', event => {
switch (event.key) {
// ...
case 'ArrowUp':
scaleChart(1 / 8, true);
break;
case 'ArrowDown':
scaleChart(1 / 8, false);
break;
}
});
We are scaling the chart by adjusting the visibleLogicalRange
instead of
changing the barSpacing
option on the time scale. In this example, we are
keeping the right data point fixed when zooming in or out by retaining the to
value and only modifying the from
value.
This keyboard navigation inclusion makes the chart's underlying data more accessible to a wider audience, ensuring a diverse user base can fully interact with the chart's functions.
Note that more keyboard actions can be added according to project-specific requirements, thereby further enhancing the navigation controls and accessibility.
In the next section, we'll continue enhancing our accessible charts by integrating ARIA (Accessible Rich Internet Applications) roles and properties and generating descriptive content.