Links / Title Anchors
Description of component:
How to use this component
This component is boiled down to the class js--anchor-title
. Any heading element (H1-H6) with this class will Automatically have an anchor prepended. IDs need to be added manually
Working Example
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum sit amet sem laoreet, pulvinar justo vel, pulvinar mauris. Cras ut lorem vel arcu scelerisque viverra a eget magna. Vivamus ac eleifend nulla. Sed convallis magna molestie ullamcorper viverra. Maecenas sit amet erat eget dolor pellentesque maximus eu quis lorem.
Curabitur cursus, ante at viverra cursus
Fusce ac eros sit amet ligula tristique hendrerit nec ac nisi. Morbi ullamcorper, enim id iaculis finibus, purus arcu iaculis diam, eu suscipit orci lacus nec enim. Pellentesque sodales dui ut lorem molestie fringilla. Donec sit amet condimentum libero.
Sed turpis orci
In volutpat convallis mauris, dictum gravida nibh volutpat nec. Proin lorem arcu, dapibus sit amet auctor eget, tincidunt eget tellus. Suspendisse euismod felis et hendrerit faucibus. Mauris efficitur dui ut enim efficitur, eu faucibus nunc venenatis. Proin sed enim libero.
Sed turpis orci nibh volutpat nec
In volutpat convallis mauris, dictum gravida nibh volutpat nec. Proin lorem arcu, dapibus sit amet auctor eget, tincidunt eget tellus. Suspendisse euismod felis et hendrerit faucibus. Mauris efficitur dui ut enim efficitur, eu faucibus nunc venenatis. Proin sed enim libero.
Code Snippets
HTML
<h2 class="js--anchor-title anchor-title" id="working-example">Working Example</h2>
CSS
.anchor-title {
position: relative;
&.focus {
box-shadow: 0 0 0 1px blue;
}
}
.anchor-title__link {
position: absolute;
left: -1rem;
&::before {
content: "§";
display: inline-block;
font-size: clamp(13px, 83%, 22px);
transform: translateY(-12%);
}
}
JS
// get all anchor titles
const titleAnchors = document.querySelectorAll('.js--anchor-title');
var i;
// for each anchor titles prepend an anchor
for( i = 0; i < titleAnchors.length; i++ ) {
var titleId = titleAnchors[i].getAttribute('id');
var newAnchor = document.createElement('a');
newAnchor.setAttribute('href','#' + titleId);
newAnchor.setAttribute('class','js--anchor-title__link anchor-title__link');
newAnchor.setAttribute('aria-label','§');
titleAnchors[i].prepend(newAnchor);
}
// get all anchor title links
const titleAnchorsLinks = document.querySelectorAll('.js--anchor-title__link');
// for each anchor title link on click scroll to link and highlight title section visually
for( i = 0; i < titleAnchorsLinks.length; i++ ) {
titleAnchorsLinks[i].addEventListener('click', function(e){
var anchorTitle = e.currentTarget.parentNode;
var anchorTitleOffSet = anchorTitle.offsetTop - 50;
// check if the body has the animations-paused class to either smooth scroll or straight jump
if( document.body.classList.contains('animations-paused') ) {
scroll({
top: anchorTitleOffSet,
behavior: "auto"
});
} else {
scroll({
top: anchorTitleOffSet,
behavior: "smooth"
});
}
anchorTitle.classList.add('focus');
setTimeout( function(){
anchorTitle.classList.remove('focus');
}, 1000 );
});
}
Credits
This component was based on the code used on https://www.w3.org/TR/WCAG22/ as their own section anchors.