본문 바로가기

티스토리 하이라이팅(highlight) 목차(TOC) & 헤딩(heading)

by JINYH 2022. 1. 22.
728x90
반응형

글의 길이가 짧을 경우에는 괜찮지만 길 경우에는 웹사이트 방문자에게 현재 화면의 내용(위치)이 전체 글에서 어느 부분에 해당하는지 인지시켜 줄 필요가 있다.

 

이는 근본적으로 웹사이트 방문자가 글을 보다 잘 이해하는 데에 도움을 주면서도 페이지를 이탈하지 않고 체류할 수 있는 기본 토대가 된다.

 

 

 

본 글은 보다 친절한 웹사이트 이용 환경 구축을 위해 목차(TOC) 및 헤딩(Headings)에 하이라이트(Highlight) 효과를 주는 방법에 대한 내용이다.

 

추가로 일전 발행한 글인 목차 콘텐츠에서 이어지는 내용임을 참고 바란다.

 

 

 

 

 

 


 

 

 

 

 

★ 미리 보기

 

먼저 본 글의 결과다.

 

① 스크롤 시, 현재 화면의 위치에 따라 목차의 헤딩에 하이라이트 효과 적용

② 목차의 헤딩 클릭 시 본문의 헤딩에 하이라이트 효과 적용

 

01-미리-보기

 

 

 

 

 

1] 목차 헤딩 하이라이트

 

먼저 아래와 같이 스크롤을 내릴 때 현재 화면의 위치에 따라 목차의 헤딩에 하이라이트 효과를 적용해 보겠다.

 

02-목차-헤딩-하이라이트

 

 

 

아래 코드를 HTML의 기존 목차 코드 아래에 삽입한다. <script> ~ </script> 사이에 삽입해야 한다.

 

// 기존 목차 코드
<script>
~~~~~~~~~~
	});

// 추가 목차 코드
	function checkPosition() {
		var findHeading = $('div.entry-content').find('h2,h3,h4');
		var scrollY = window.scrollY + 400;
		if(findHeading.length > 1) {
			for(var i=0; i < findHeading.length; i++) {
				var findA = $('#toc').find('a');
				if(i < findHeading.length-1) {
					if(findHeading.eq(i).offset().top < scrollY && findHeading.eq(i+1).offset().top > scrollY) {
						findA.removeAttr('style');
						findA.eq(i).css('background-color', '#E2D2FC');
						findA.eq(i).css('font-weight', 'bold');
						findA.eq(i).css('border-bottom', '2px solid blue');
						findA.eq(i).css('border-radius', '15px');
						findA.eq(i).css('padding', '0px 10px 0px 10px');
						break;
					}
				}
				else {
					if(findHeading.eq(i).offset().top < scrollY) {
						findA.removeAttr('style');
						findA.eq(i).css('background-color', '#E2D2FC');
						findA.eq(i).css('font-weight', 'bold');
						findA.eq(i).css('border-bottom', '2px solid blue');
						findA.eq(i).css('border-radius', '15px');
						findA.eq(i).css('padding', '0px 10px 0px 10px');
						break;
					}
				}
			}
		}
	}

	$(document).ready(function() {
		$(window).on('scroll', function() {
			checkPosition();
		});
	});
	</script>

 

 

 

[ 7 ]

checkPosition 함수로 본 기능을 구현한다.

 

[ 8 ]

본문(div.entry-content) 안에 있는 헤딩(h2, h3, h4)을 찾고, 이 변수(var)를 findHeading으로 선언한다.

 

div.entry-content.tt_article_useless_p_margin으로 변경 가능하다. 헤딩에서 'h3'과 'h4'를 제거하면 'h2'만 찾는다.

 

[ 9 ]

본 기능이 작동하는 스크롤의 높이를 선언하는 것으로, 숫자 '400'으로 하면 본문 안에 있는 헤딩이 현재 화면 상 중앙 정도에 위치했을 때 본 기능이 작동한다. '400'은 기호에 맞게 변경 가능하다.

 

[ 12 ]

목차(#toc) 안에 있는 헤딩(a : h2, h3, h4)을 찾고, 이 변수(var)를 findA로 선언한다.

 

[ 15 ]

찾은 후 먼저 findA의 기존 스타일을 제거한다.

 

[ 16 ~ 20 ]

기존 스타일 제거하면서 새로운 스타일을 추가한다.

 

[ 39 ~ 43 ]

checkPosition 함수에 대한 스크롤 이벤트를 지정한다.

 

 

 

 

 

2] 본문 헤딩 하이라이트

 

다음은 아래와 같이 목차의 헤딩을 클릭할 때 본문의 헤딩에 하이라이트 효과를 적용해 보겠다.

 

03-본문-헤딩-하이라이트

 

 

 

아래 코드를 CSS의 기존 목차 코드 아래에 삽입한다.

 

목차의 헤딩 클릭 시, 설정한 타겟(h2, h3, h4)의 background 색상이 #E2D2FC에서 white로 변경되며, 변경 시간을 1초로 설정한다는 내용이다.

 

target은 'h2', 'h3', 'h4' 각각 설정해야 하며, 각각의 색상이 다르면 정상 작동이 안 될 수도 있다.

 

h2:target {
	-moz-animation: highlight 1s ease;
	-webkit-animation: highlight 1s ease;
	-ms-animation: highlight 1s ease;
	animation: highlight 1s ease;
}
@-moz-keyframes highlight {
	from { background: #E2D2FC; }
	to { background: white; }
}
@-webkit-keyframes highlight {
	from { background: #E2D2FC; }
	to { background: white; }
}
@-ms-keyframes highlight {
	from { background: #E2D2FC; }
	to { background: white; }
}
@keyframes highlight {
	from { background: #E2D2FC; }
	to { background: white; }
}
h3:target {
	-moz-animation: highlight 1s ease;
	-webkit-animation: highlight 1s ease;
	-ms-animation: highlight 1s ease;
	animation: highlight 1s ease;
}
@-moz-keyframes highlight {
	from { background: #E2D2FC; }
	to { background: white; }
}
@-webkit-keyframes highlight {
	from { background: #E2D2FC; }
	to { background: white; }
}
@-ms-keyframes highlight {
	from { background: #E2D2FC; }
	to { background: white; }
}
@keyframes highlight {
	from { background: #E2D2FC; }
	to { background: white; }
}
h4:target {
	-moz-animation: highlight 1s ease;
	-webkit-animation: highlight 1s ease;
	-ms-animation: highlight 1s ease;
	animation: highlight 1s ease;
}
@-moz-keyframes highlight {
	from { background: #E2D2FC; }
	to { background: white; }
}
@-webkit-keyframes highlight {
	from { background: #E2D2FC; }
	to { background: white; }
}
@-ms-keyframes highlight {
	from { background: #E2D2FC; }
	to { background: white; }
}
@keyframes highlight {
	from { background: #E2D2FC; }
	to { background: white; }
}

 

 

 

 

 

728x90
반응형