Bionic Reading 및 "미니 라이브러리"
10325 단어 showdevjavascriptusabilitywebdev
그것은 많은 독서 용도로 사용될 수 있는 매혹적인 개념이며 많은 사람들이 선호할 수 있는 것 같습니다. 공식 웹사이트는 텍스트 블록을 "바이오닉"스타일로 활성화하고 변경하기 위한 공식 API와 몇 가지 다른 도구를 광고하지만 Javascript로 이와 같은 것을 구현하는 방법을 알아보고 싶었습니다. 비슷한 것을 찾기 위해 NPM을 검색했지만 확실한 결과가 없었습니다.
그래서 저만의 작은 도서관을 만들었습니다.
장애물
그것에 대한 나의 자격은 HTML 문서에 있는 텍스트의 모든 단락(또는 지정된 선택기 또는 클래스)에 영향을 주는 대부분의 JS 라이브러리와 같은 드롭 앤 고 기능 또는 클래스를 만드는 것이었습니다. 이 특정 아이디어에는 고려해야 할 몇 가지 장애물이 있습니다.
text-shadow
? font-weight
? transform: translate()
? 내 솔루션
저는 CSS
text-shadow
와 Shadow DOM을 사용하여 원래의 light DOM 콘텐츠와 자식으로 연결된 특정 스타일의 바이오닉 노드를 구분하는 솔루션을 찾았습니다. 기본적으로 text-shadow
를 선택한 이유는 (Shadow DOM은 유연성을 위해 open
이기 때문에) 외부에서 사용 및 변경될 가능성이 가장 높기 때문입니다. 또한 text-shadow
는 사용된 글꼴의 정확한 충실도를 유지하기 때문입니다. 또한 text-shadow는 로드된 굵은 글꼴 두께의 가용성에 의존하지 않습니다.이것은 여전히 웹 크롤러에 색인 생성 가능으로 표시되지만 추가된 윤곽선을 계산된 글꼴과 정확히 동일하게 유지해야 하는 요구 사항으로 인해 HTML 노드를 추가하지 않고 도형에 추가하는 것이 불가능하지는 않더라도 훨씬 더 어려울 것입니다. Shadow DOM은 "light DOM"노드의 인덱싱 가능성에 여전히 영향을 미치지 않으면서 적어도 개발자가 읽을 수 있는 구별을 만듭니다.
class Bionic extends HTMLParagraphElement {
constructor(elem){
super();
const root = document.createElement('bionic-reading');
const shadow = root.attachShadow({mode: 'open'});
const paragraph = document.createElement('bionic-reading');
const elemStyle = window.getComputedStyle(elem)
paragraph.style = elemStyle;
paragraph.innerHTML = elem.innerHTML;
root.classList.add('bionic');
paragraph.classList.add('bionic');
const style = document.createElement('style');
style.textContent = `
.bionic {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
`
elem.style.position = "relative"
root.style.color = "transparent";
paragraph.style.margin = "0";
paragraph.innerHTML = paragraph.innerHTML.split(' ').map(word => {
return `<span style="text-shadow:-2px 0 0 ${elemStyle.color};">${word[0]}</span>` + word.substring(1)
}).join(' ')
shadow.appendChild(style)
shadow.appendChild(paragraph)
this.result = root
}
}
function bionic(selector = 'p'){
customElements.define('bionic-reading', Bionic, { extends: selector });
document.querySelectorAll(selector).forEach(elem => {
let bionic = new Bionic(elem);
elem.parentNode.insertBefore(bionic.result, elem.nextSibling);
elem.appendChild(bionic.result);
})
}
bionic()
기본적으로 자식 Shadow DOM을 만들고 light DOM 노드의 절대적으로 배치된 복제본을 추가한 다음 각 단어의 모든 첫 글자에 대해
span
를 생성하는 text-shadow
를 주입합니다. 강조된 문자가 완벽하게 정렬되도록 문자 간격 및 색상 구성과 같은 텍스트 기반 스타일을 유지하기 위해 light DOM의 스타일이 상속됩니다.가벼운 DOM 노드가 상대적으로 배치되어야 합니다(일반적으로 시맨틱 단락을 사용하는 방식에서
static
와 차이를 만들지 않아야 함).잠재적으로 이 도구를 NPM 패키지로 확장하면 사용된 CSS 속성(
property
), 무거움, 문자 패딩, HTML 및/또는 클래스 선택기를 변경하는 'text-shadow' | 'transform' | 'filter' | font-weight
값과 같은 몇 가지 옵션 매개변수를 쉽게 허용할 수 있습니다. .당신이 무슨 생각을하는지 제게 알려주세요!
Reference
이 문제에 관하여(Bionic Reading 및 "미니 라이브러리"), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/kylefontenot/bionic-reading-and-mini-library-for-it-ndn텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)