피드나 리뷰처럼 텍스트가 길어질 수 있는 영역은 보통 처음엔 일부만 보여주고, 나머지는 더 보기 버튼으로 펼치는 방식을 많이 씁니다.
이번에는 이 기능을 조금 더 범용적으로 만들어서 두 가지 케이스를 모두 지원하도록 구현했습니다.
1. 더보기 ↔ 접기 토글 가능
2. 더보기만 가능 (한 번 펼치면 버튼이 사라짐)
"false"면 더보기만 가능)data-lines="2" → 두 줄까지만 보임)스크립트는 텍스트 높이를 계산해서 지정한 줄 수를 넘으면 자동으로 버튼을 붙이고, 버튼 클릭 시 접거나 펼치는 동작을 합니다.
특히 data-collapsible="false"를 주면 더보기 클릭 후 버튼이 사라지게 동작합니다.
btn.onclick = () => {
const isExpanded = text.classList.contains('is-expanded');
if (isExpanded) {
// 접기
if (!collapsible) return; // 접기 불가면 아무 동작 안 함
applyVisualClamp(text, lines, false);
if (hasText) {
btn.textContent = MORE_LABEL;
} else {
btn.classList.remove('active');
}
} else {
// 더 보기
applyVisualClamp(text, lines, true);
if (hasText) {
btn.textContent = collapsible ? LESS_LABEL : MORE_LABEL;
} else {
btn.classList.add('active');
}
// 더보기만 가능할 경우 버튼 사라짐
if (!collapsible) {
btn.hidden = true;
}
}
};
"더 보기" / "접기" 라벨을 토글active 클래스를 토글해서 아이콘 버튼처럼 활용 가능data-collapsible="false"를 지정하면 더보기 클릭 후 버튼이 바로 사라짐핵심은
data-collapsible="false"한 줄! (코드는 동일하게 재사용)
data-lines로 기준 줄 수를 설정하고, 텍스트가 넘칠 때만 버튼을 노출data-collapsible 옵션으로 토글형과 더보기 전용형을 구분 가능이렇게 만들어두면 피드, 댓글, 리뷰 등 여러 컴포넌트에서 재사용할 수 있고, 프로젝트 전반에 적용하기 좋아집니다.