Skip to content

Instantly share code, notes, and snippets.

@jdanyow
Last active May 20, 2021 03:27
Show Gist options
  • Save jdanyow/ee059ba01681107fbab9e482141cf30a to your computer and use it in GitHub Desktop.
Save jdanyow/ee059ba01681107fbab9e482141cf30a to your computer and use it in GitHub Desktop.
Custom element to ensure clamped elements are not focusable
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>GistRun</title>
<style>
* {
box-sizing: border-box;
}
.line-clamp {
overflow: hidden;
display: -webkit-box;
-webkit-box-orient: vertical;
}
.line-clamp a {
white-space: nowrap;
}
.line-clamp-1 {
-webkit-line-clamp: 1 !important;
}
.line-clamp-2 {
-webkit-line-clamp: 2 !important;
}
.line-clamp-3 {
-webkit-line-clamp: 3 !important;
}
[tabindex] {
background-color: orange;
}
</style>
</head>
<body>
<h1>Hello world!</h1>
<script>
class ClampedContentElement extends HTMLElement {
debounceTimeout = 0;
connectedCallback() {
this.scheduleUpdate();
addEventListener('resize', this, { passive: true });
addEventListener('content-update', this, { passive: true }); // docs-ui fires this event after making updates to the page content
}
disconnectedCallback() {
clearTimeout(this.debounceTimeout);
removeEventListener('resize', this, { passive: true });
removeEventListener('content-update', this, { passive: true });
}
handleEvent(event) {
if (event.type === 'resize' || event.type === 'content-update') {
this.scheduleUpdate();
}
}
scheduleUpdate() {
clearTimeout(this.debounceTimeout);
this.debounceTimeout = setTimeout(() => this.update(), 300);
}
update() {
clearTimeout(this.debounceTimeout);
for (const a of Array.from(this.querySelectorAll('a'))) {
if (a.offsetTop >= this.offsetTop + this.clientHeight) {
if (a === document.activeElement) {
a.blur();
}
a.setAttribute('tabindex', '-1');
} else {
a.toggleAttribute('tabindex', false);
}
}
}
}
customElements.define('clamped-content', ClampedContentElement);
</script>
<clamped-content class="line-clamp line-clamp-3">
<p><a href="#">Hello world</a>! Lorem ipsum sumit dolar. <a href="#">Old MacDonald had a farm</a>. On that farm he had a chicken. <a href="#">Hello world</a>! Lorem ipsum sumit dolar. <a href="#">Old MacDonald had a farm</a>. On that farm he had a chicken. <a href="#">Hello world</a>! Lorem ipsum sumit dolar. <a href="#">Old MacDonald had a farm</a>. On that farm he had a chicken. <a href="#">Hello world</a>! Lorem ipsum sumit dolar. <a href="#">Old MacDonald had a farm</a>. On that farm he had a chicken. <a href="#">Hello world</a>! Lorem ipsum sumit dolar. <a href="#">Old MacDonald had a farm</a>. On that farm he had a chicken. <a href="#">Hello world</a>! Lorem ipsum sumit dolar. <a href="#">Old MacDonald had a farm</a>. On that farm he had a chicken. </p>
</clamped-content>
<clamped-content class="line-clamp line-clamp-2">
<p><a href="#">Hello world</a>! Lorem ipsum sumit dolar. <a href="#">Old MacDonald had a farm</a>. On that farm he had a chicken. <a href="#">Hello world</a>! Lorem ipsum sumit dolar. <a href="#">Old MacDonald had a farm</a>. On that farm he had a chicken. <a href="#">Hello world</a>! Lorem ipsum sumit dolar. <a href="#">Old MacDonald had a farm</a>. On that farm he had a chicken. <a href="#">Hello world</a>! Lorem ipsum sumit dolar. <a href="#">Old MacDonald had a farm</a>. On that farm he had a chicken. <a href="#">Hello world</a>! Lorem ipsum sumit dolar. <a href="#">Old MacDonald had a farm</a>. On that farm he had a chicken. <a href="#">Hello world</a>! Lorem ipsum sumit dolar. <a href="#">Old MacDonald had a farm</a>. On that farm he had a chicken. </p>
</clamped-content>
<clamped-content class="line-clamp line-clamp-1">
<p><a href="#">Hello world</a>! Lorem ipsum sumit dolar. <a href="#">Old MacDonald had a farm</a>. On that farm he had a chicken. <a href="#">Hello world</a>! Lorem ipsum sumit dolar. <a href="#">Old MacDonald had a farm</a>. On that farm he had a chicken. <a href="#">Hello world</a>! Lorem ipsum sumit dolar. <a href="#">Old MacDonald had a farm</a>. On that farm he had a chicken. <a href="#">Hello world</a>! Lorem ipsum sumit dolar. <a href="#">Old MacDonald had a farm</a>. On that farm he had a chicken. <a href="#">Hello world</a>! Lorem ipsum sumit dolar. <a href="#">Old MacDonald had a farm</a>. On that farm he had a chicken. <a href="#">Hello world</a>! Lorem ipsum sumit dolar. <a href="#">Old MacDonald had a farm</a>. On that farm he had a chicken. </p>
</clamped-content>
</body>
</html>
console.log('Hello World!');
/* todo: add styles */
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment