부트캠프/멋쟁이 사자처럼
40+DAY_멋사 프론트엔드 부트캠프 14기_TIL
NamDoHyeon
2025. 6. 23. 17:30
What I Learned Today
오늘은 아코디언을 실습해보며 루프를 연습했다.
- 아코디언 : 정보를 펼치거나 숨길 수 있는 UI 컴포넌트다.
- 닫혀있을 땐 헤더만 보이고 열면 내용이 표시된다.
이런 마크업이 있을때
<div class="accordion__container">
<div class="accordion" data-theme="cheese">
<div class="accordion__header">
<h2>
<button type="button">
<span class="accordion__title">치즈</span>
<span class="accordion__indicator">
<svg viewBox="0 0 80 80" aria-hidden="true">
<use href="images/sprite.svg#plus" />
</svg>
</span>
</button>
</h2>
</div>
<div class="accordion__content">
<svg viewBox="0 0 141 65">
<use href="./images/sprite.svg#cheese" />
</svg>
<p>
<a
href="https://ko.wikipedia.org/wiki/Cheese"
rel="noopener noreferrer"
target="_blank"
>
치즈</a>는 우유에서 유래한 식품으로, 우유 단백질인 카제인을
응고시켜 다양한 맛, 질감, 형태로 만들어집니다.
</p>
</div>
</div>
</div>
이렇게 JS를 작성했다.
// 먼저 아코디언 컨테이너, 아코디언 클래스를 찾아 변수에 저장한다.
const accordionContainer = document.querySelector('.accordion__container')
const accordions = accordionContainer.querySelectorAll('.accordion')
// 루프를 이용하여 각 버튼에 is-open 클래스를 추가하는 클릭 이벤트를 만들어준다.
accordions.forEach((accordion) => {
const accordionButton = accordion.querySelector('button')
accordionButton.addEventListener('click', () => {
accordion.classList.toggle('is-open')
})
})
이렇게 짜면 좋은점은 계속 컨텐츠를 추가해도 JS 코드는 바꿀 필요가 없다.
JS에서는 요소를 선택하는 여러가지 방법이 있다.
- 아이디
- 클래스
- 태그
- 속성
개발자는 어떤 상황에서 어떤 방법으로 요소를 선택해야 효율적일지 고민해야한다.
- 요소가 하나일 경우 : id
- 문서 전체에서 고유하게 식별 가능하기 때문이다.
- 요소가 두개일 경우 : 클래스, 속성 또는 태그
- 하지만 태그 사용은 지양하는것이 좋다.
- 태그는 너무 일반적이라 많은곳에 사용하기 때문이다.
- JavaScript Hook : JS가 필요한 컴포넌트에는 js 접두사를 포함하는 것이 유용할 수 있다.
- JS가 해당 요소에 필요하다는 것을 알기 쉽다.
- 클래스를 제어할 때 JS 기능 손상을 예방할 수도 있다.
JS를 사용해 요소의 CSS 스타일을 설정해야 할 때가 있다.
// 요소의 CSS 스타일 설정을 위해서는 style 속성을 사용한다.
// 브라우저에서 지원되는 모든 CSS 속성을 변경할 수 있다.
// style 속성을 사용해 CSS 스타일 설정 시 속성 이름은 카멜케이스로 작성해야 한다.
const element = document.querySelector('.element')
element.style.color = 'rgb(237, 76, 103)'
element.style.backgroundColor = '#1289A7'
element.style.fontSize = '2.875rem'
element.style.fontWeight = '800'
// 하이픈이 포함된 CSS 속성을 변수로 사용할 경우 대괄호를 사용한다.
element.style['속성명'] = 값
// setProperty() 메서드를 사용하는 방법도 있다.
// 사용자 정의 속성도 설정할 수 있다.
// setProperty() 메서드를 사용할 경우 CSS 속성 이름은 하이픈 케이스로 설정해야 한다.
element.style.setProperty('--theme-color', '#A3CB38')
JS를 사용하여 CSS 스타일을 읽을 수도 있다.
- 인라인 스타일 읽기 : DOM 요소에 style 속성으로 설정된 스타일을 읽는다.
- 계산된 스타일 읽기 : 요소에 적용된 스타일이 CSS 파일에 작성된 경우를 읽는다.
인라인 스타일 읽기
<p class="element" style="font-size: 2rem; color: #1289a7;">
인라인 스타일이 적용된 단락입니다.
</p>
// 인라인 스타일이 적용된 요소의 CSS 스타일 속성 값을 읽으려면 style 속성을 사용하면 된다.
const element = document.querySelector('.element')
const fontSize = element.style.fontSize
console.log(fontSize) // '2rem'
const color = element.style.color
console.log(color) // '#1289a7'
계산된 스타일 읽기
<p class="element">
스타일이 적용된 단락입니다.
</p>
<!-- CSS 문서에 작성됨 -->
.element {
background-color: #131012;
color: #f9f8f0;
}
// CSS 문서에 작성된 스타일을 읽으려면 getComputedStyle() 메서드를 사용한다.
// 문서에서 .element 요소를 변수에 참조
const element = document.querySelector('.element')
// getComputedStyle() 메서드를 사용해 요소의 스타일을 가져올 수 있다.
const elementStyles = getComputedStyle(element)
console.log(elementStyles)
// 하나의 스타일을 보는 방법
// CSS 속성 값을 읽으려면 속성 이름을 카멜케이스로 작성한다.
// backgroundColor 속성을 보고싶다면
const backgroundColor = elementStyles.backgroundColor
// color 속성을 보고싶다면
const color = elementStyles.color
가상 요소의 스타일도 읽을 수 있다.
<p class="element">
가상 요소를 포함하는 단락입니다.
</p>
<!-- CSS 문서 -->
.element {
background-color: #131012;
color: #f9f8f0;
&::before {
content: '[가상 요소]';
}
}
// 가상 요소 스타일 값을 읽을때도 getComputedStyle() 메서드를 사용한다.
// 하지만 메서드의 두 번째 인수로 가상 요소를 전달해야 한다.
const element = document.querySelector('.element')
const pseudoElementStyle = getComputedStyle(elelment, '::before')
console.log(pseudoElementStyle.content) // '[가상 요소]'
The Problem I Faced
What I Tried to Do
How I Solved It
So
Aha Moments
BOM과 DOM 부분이 정말 많은 지식을 필요로 하고 활용 방법이 많아서 어렵다.
하지만 너무 재미있어서 흥미가 떨어지지 않는다.
반응형