Front End Interview Handbook의 CSS 파트를 번역 및 정리한 글입니다
Meta, Amazon., Google과 같은 미국 빅테크 프론트엔드 면접의 기출 문제라 합니다.
2019년 기준으로 작성된 것들이 꽤 있어서, 몇가지 경험 기반 답변들은 스스로 생각해 보시는 것도 좋은 듯 합니다.
1. CSS 셀렉터의 명시도(specificity)는 무엇이고, 어떻게 동작하나요?
- a는 인라인 스타일 여부입니다. 속성 선언이 요소의 인라인 스타일이면 a는 1이고 그렇지 않으면 0입니다.
- b는 ID 선택자의 수입니다.
- c는 클래스, 속성 및 의사 클래스 셀렉터의 수입니다.
- d는 태그 및 의사 요소 셀렉터의 수입니다.
명시도 점수는 왼쪽부터의 열 별 비교를 통해 결정됩니다.
예를 들어 0,1,0,0과 0,0,10,10은 뒤의 두 개는 필요도 없이 0,1,0,0이 높습니다.
2. CSS resetting(재설정)과 normalizing(표준화)의 차이점을 설명해주시고, 어떤 것을 사용할 것인지 말씀해 주세요
- Resetting : 리셋은 모든 기본 브라우저 스타일을 제거하는 것입니다.
- 예를 들어 마진, 패딩, 모든 요소의 폰트 크기가 동일하게 재설정됩니다.
- 일반적인 타이포그래피 요소에 대한 스타일을 다시 선언해야 합니다.
- Normalizing : 노말라이징은 유용한 디폴트 스타일을 제공합니다.
- 또한 브라우저 종속적인 버그를 수정합니다.
저는 리셋을 선호합니다.
브라우저 기본 스타일이 필요 없고, 많은 커스터마이징이 필요할 때 편리하기 떄문입니다.
기본 스타일 설정과 무관하게 처음부터 다시 설계할 수 있습니다.
References
3. float 속성과 동작에 대해 설명해 주세요
부모 요소에 플로팅 요소만 포함되어 있으면 높이가 0으로 축소됩니다.
이를 예방하기 위해 부모 컨테이너의 닫는 태그 전의 자식 요소에 clear 속성을 사용하는 방법이 있습니다.
이보다 더 쉬운 방법은 float 부모 태그에 아래 css를 적용하는 것입니다.
.clearfix::after {
content: ' ';
visibility: hidden;
display: block;
height: 0;
clear: both;
}
혹은 부모 요소에 overflow: auto 또는 overflow: hidden 속성을 적용하면,
자식 내부에 새 블록 서식 맥락(BFC)가 설정되어 자식을 포함하도록 확장됩니다.
References
4. z-index가 무엇인지, 스태킹 컨텍스트(쌓임 맥락)이 형성되는 방식을 설명해 주세요
CSS의 z-index 속성은 겹치는 요소의 수직 방향 스택 순서를 제어합니다.
z-index는 position:static이 아닌 position 값을 가진 요소에만 영향을 미칩니다.
주 : isolation : isolate가 가장 간단합니다.
References
- https://css-tricks.com/almanac/properties/z/z-index/
- https://philipwalton.com/articles/what-no-one-told-you-about-z-index/
- https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Positioning/Understanding_z_index/The_stacking_context
5. 블록 서식 맥락(Block Formatting Context;BFC)가 무엇이며, 어떻게 동작하나요?
- float의 값이 none이 아님
- position 값이 static도 아니고 relative도 아님
- display의 값이 table-cell, table-caption, inline-block, flex, inline-flex, grid, inline-grid 중 하나
- overflow 값이 visible이 아님
BFC 내부에 존재하는 각 박스의 왼쪽 외부 가장자리는 컨테이닝 블록의 왼쪽 가장자리에 닿습니다
(오른쪽에서 왼쪽 포맷의 경우 오른쪽 가장자리가 닿음).
- https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Block_formatting_context
- https://www.sitepoint.com/understanding-block-formatting-contexts-in-css/
6. clear 속성을 사용하는 방법과 어떤 방법이 가장 적절한지 설명해 주세요
- Empty div를 사용:
- <div style="clear:both;"></div>.
- Clearfix 클래스 사용:
- 3번 참고
- overflow: auto 혹은 overflow: hidden 사용
- 부모는 새로운 블록 포맷팅 컨텍스트를 설정하고 float 자식을 포함하도록 크기를 확장합니다.
대규모 프로젝트에서는 .clearfix 유틸리티 클래스를 작성하여 필요한 곳에 사용합니다.
overflow: hidden은 자식이 부모보다 height가 큰 경우, 자식을 자를 수 있으며, 이는 이상적이지 않을 있습니다.
7. CSS 스프라이트가 뭔지 설명해 주세요, 그리고 어떻게 구현하는지 설명해 주세요.
CSS 스프라이트는 여러 이미지를 하나의 큰 이미지로 결합하는 것입니다.
아이콘에 일반적으로 사용되는 기술입니다.(실제 Gmail에서 사용).
구현 방법은 다음과 같습니다.
- 여러 이미지를 하나로 묶는 스프라이트 생성기를 사용하여 적절한 CSS를 생성합니다.
- 각 이미지에는 background-image, background-position 및 background-size 속성이 정의된 해당 CSS 클래스가 있습니다
- 해당 이미지를 사용하려면 해당 클래스를 요소에 추가합니다.
장점:
- 여러 이미지에 대한 HTTP 요청 수를 줄입니다(스프라이트 시트당 하나의 단일 요청만 필요함)
- 하지만 HTTP2를 사용하면 여러 이미지를 로드하는 것은 더 이상 문제가 되지 않습니다.
- :hover 가상 상태에서만 나타나는 이미지와 같이 필요할 때까지 다운로드되지 않는 에셋을 사전 다운로드 할 수 있습니다.
- 깜빡임이 나타나지 않습니다.
References
8. 브라우저 별 특수한 스타일 문제는 어떻게 해결하나요?
- 문제와 대상 브라우저를 식별한 후 해당 특정 브라우저를 사용할 때만 로드되는 별도의 스타일 시트를 사용합니다.
- 이 기술에는 서버 측 렌더링이 필요합니다.
- 이러한 스타일링 문제를 해결해주는 Bootstrap과 같은 라이브러리를 사용합니다.
- autoprefixer를 사용하여 벤더 접두사를 코드에 자동으로 추가합니다.
- Reset CSS 또는 Normalize.css를 사용합니다.
- Postcss(또는 유사한 트랜스파일링 라이브러리)를 사용하는 경우 최신 CSS 구문(심지어 W3C 제안)을 사용하도록 도와주는 플러그인이 있을 수 있습니다.
- 이 플러그인은 당신이 사용할 브라우저를 위해 CSS를 안전하게 변경해 줍니다.
9. 최신 CSS 속성을 지원하지 않는 브라우저들을 위해선 어떤 조치를 취해야 할까요?
- 단계적 저하(Graceful degradation) - 최신 앱을 개발하면서, 레거시 브라우저를 위한 구현을 추가합니다.
- 점진적 개선(Progressive enhancement) - 기본 수준의 사용자 경험을 고려하며 애플리케이션을 구축하면서, 최신 브라우저를 위한 기능을 추가합니다.
- caniuse.com을 사용하여 기능 지원을 확인합니다.
- 자동 벤더 접두사 삽입을 위한 Autoprefixer 사용
- Modernizr를 사용한 기능 감지
- CSS 기능 쿼리 사용 : @support
10. 콘텐츠를 시각적으로 숨기고 스크린 리더에서만 사용할 수 있도록 하는 방법들을 설명해 주세요.
이 기술들은 접근성과 관련이 있습니다.
- width: 0; height: 0 : 요소가 화면에서 전혀 공간을 차지하지 않도록 하여 표시되지 않도록 합니다.
- position: absolute; left: -99999px : 화면 밖에 위치하도록 하여 보이지 않게 합니다.
- text-indent: -9999px : 이것은 블록 요소 내의 텍스트에서만 동작합니다.
- 이것은 널리 사용되며 유명한 트릭이지만 성능 문제를 일으키는 것과 같은 몇 가지 단점(some downsides)이 있으므로 대신 text-indent: 100%를 사용하는 것이 좋습니다.
.hide-text {
text-indent: 100%;
white-space: nowrap;
overflow: hidden;
}
- 메타 태그를 사용합니다. 예를 들어 Schema.org, RDF 및 JSON-LD가 있습니다.
- WAI-ARIA. 웹 페이지의 접근성을 높이는 방법을 지정하는 W3C 기술 사양입니다.
- 스크린 리더에 특정 정보를 알려주는 방법입니다.
WAI-ARIA가 이상적인 솔루션이더라도,
주의 사항이 가장 적고 대부분의 요소에서 동작하며 사용하기 쉬운 절대 포지셔닝 방법을 추천합니다.
References
- https://www.w3.org/TR/wai-aria-1.1/
- https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA
- http://a11yproject.com/
- https://www.zeldman.com/2012/03/01/replacing-the-9999px-hack-new-image-replacement/
11. 그리드 시스템을 사용해 본 적있나요? 만약 그렇다면, 어떤 구현을 좋아하시나요?
12. 미디어 쿼리 또는 모바일 전용 레이아웃/CSS를 사용하거나 구현한 적이 있나요?
네, 예를 들어 Pill navigation을, 일정 화면 크기 이상에서 네비게이션 바로 변경되도록 한 적이 있습니다.
https://www.w3schools.com/howto/howto_css_pill_nav.asp#news
13. SVG에 스타일을 적용하는 방법을 아시나요?
<rect
x="10"
y="10"
width="100"
height="100"
stroke="blue"
fill="purple"
fill-opacity="0.5"
stroke-opacity="0.8" />
14. screen 이외의 @media 속성에 대한 예를 들어주실 수 있나요?
- all : 모든 미디어 타입 디바이스를 위한 속성입니다.
- print : 프린터를 위한 속성입니다.
- speech : 소리내어 페이지를 "읽는" 스크린 리더를 위한 속성입니다.
- screen : 컴퓨터 화면, 태블릿, 스마트폰 등
<style>
@media print {
body {
color: black;
}
}
</style>
15. 효율적인 CSS를 작성하는 방법을 설명해 주세요
References
16. CSS 전처리기(preprocessors)의 장점 / 단점에 대해 설명해 주세요
장점은 다음과 같습니다.
- CSS의 유지관리가 쉬워집니다.
- 중첩 셀렉터를 작성하기 쉽습니다.
- 일관된 테마를 위한 CSS variables를 설정하여, 서로 다른 프로젝트 간에 테마 파일을 공유할 수 있습니다.
- 믹스인을 사용할 수 있습니다.
- loop, list 및 map과 같은 Sass 기능을 사용하면 설정을 더 쉽고 덜 장황하게 만들 수 있습니다.
- 코드를 여러 파일로 분할할 수 있습니다.
- CSS 파일도 분할할 수 있지만 그렇게 하려면 각 CSS 파일을 다운로드하기 위한 HTTP 요청이 필요합니다.
단점은 다음과 같습니다.
- 전처리를 위한 도구가 필요합니다. 재컴파일 시간이 느릴 수 있습니다.
- 앞으로 사용되지 않을 CSS를 작성하거나, 나중엔 사용하지 않을 CSS(규칙 및 기술)을 사용하는 것일 수도 있습니다.
- 전처리기 대신 webpack과 postcss-loader와 같은 것을 함께 사용하면 미래에 호환될 수 있는 CSS를 작성할 수 있습니다.
- Sass 변수 대신 CSS 변수와 같은 것을 사용할 수 있습니다.
- 이는 나중에 Sass가 CSS로 완전히 대체되면 빛을 발합니다.
- 전처리기 대신 webpack과 postcss-loader와 같은 것을 함께 사용하면 미래에 호환될 수 있는 CSS를 작성할 수 있습니다.
17. CSS 전처리기(preprocessors)를 좋아하는 이유 / 싫어하는 이유에 대해 설명해 주세요.
좋아하는 이유:
- #16을 참조해 주세요
- Less는 Node.js와 잘 작동하는 JavaScript로 작성되었습니다.
싫어하는 이유:
- 저는 C++로 작성된 LibSass에 대한 바인딩인 node-sass를 통해 Sass를 사용합니다.
- 노드 버전을 전환할 때마다 자주 다시 컴파일해야 합니다.
- Less는 변수 이름 앞에 @가 붙는데 이는 @media, @import 및 @font-face 규칙과 같은 기본 CSS 키워드와 혼동될 수 있습니다.
18. 비표준 폰트를 사용하는 웹 디자인 광고를 어떻게 구현하시겠습니까?
19. CSS 박스 모델에 대해 아는 대로 설명해 주세요. 그리고 브라우저가 다른 박스 모델을 사용해 레이아웃을 렌더링 하도록 하는 방법을 설명해주세요
- 블록 요소가 차지하는 공간.
- 테두리 및/또는 마진이 겹치거나 축소되는지 여부
- 박스의 크기
박스 모델에는 다음과 같은 규칙이 있습니다.
- 블록 요소의 크기는 width, height, padding, border 및 margin을 이용해 계산합니다.
- height가 지정되지 않은 경우 블록 요소는 포함한 콘텐츠만큼의 높이를 갖게 되며, 포함한 컨텐츠에 패딩이 있을경우, 높이에 패딩이 추가됩니다.
- (float 요소가 없는 경우)
- width가 지정되지 않은 경우 float가 아닌 블록 요소의 width는 부모의 width- 부모의 padding이 됩니다.
- 요소의 height는 콘텐츠의 height를 통해 계산됩니다.
- 요소의 width는 콘텐츠의 width를 통해 계산됩니다.
- 기본적으로 padding과 border는 요소의 width와 height의 일부가 아닙니다.
References
20. * { box-sizing: border-box; }는 어떤 역할을 하나요?
- 기본적으로 요소에는 box-sizing: content-box가 적용되며 사이즈 계산은 콘텐츠 크기만 고려합니다.
- box-sizing: border-box는 요소의 width와 height가 계산되는 방식을 변경하여, border와 padding도 계산에 포함하도록 합니다.
- 요소의 height는 이제 콘텐츠의 height + 세로 padding + 세로 border 너비로 계산됩니다.
- margin과 border를 박스 모델의 일부로 생각하는 것은 디자이너가 실제로 그리드의 콘텐츠를 상상하는 방식과 더 잘 어울립니다.
References
21. CSS의 display 속성이 무엇인지 설명해주세요. 그리고 해당 속성의 사용 예시를 보여주세요
display 속성은 아래와 같은 값을 가질 수 있습니다.
- none, block, inline, inline-block, flex, grid, table, table-row, table-cell, list-item
display | Description |
none |
요소를 표시하지 않습니다(요소는 더 이상 문서의 레이아웃에 영향을 주지 않습니다).
모든 하위 요소도 더 이상 표시되지 않습니다. 브라우저는 요소가 문서 트리에 존재하지 않는 것처럼 문서를 렌더링 합니다. |
block |
요소는 블록 방향(일반적으로 수평)으로 전체 라인을 소비합니다.
|
inline |
요소를 나란히 배치할 수 있습니다.
|
inline-block |
인라인과 유사하지만 너비 및 높이 설정과 같은 일부 블록 속성을 허용합니다.
(너비 및 높이는 자식 컨텐츠에 의해 결정됨) |
table | <table> 요소처럼 행동 |
table-row | <tr> 요소처럼 행동 |
table-cell | <td> 요소처럼 행동 |
list-item |
list-style-type 및 list-style-position 속성을 정의할 수 있는 <li> 요소처럼 행동
|
참고 : table과 list-item 자체는 블록 레벨 엘리먼트(block-level elements)
22. display:inline과 display:inline-block의 차이가 뭔가요?
block | inline-block | inline | |
Size |
부모 컨테이너의 너비를 따라갑니다
|
컨텐츠에 의해 결정됩니다. | 컨텐츠에 의해 결정됩니다. |
Positioning |
새 줄에서 시작하고
그 옆에 HTML 요소가 위치하는 것을 허용하지 않습니다.(줄바꿈) (float를 추가하는 경우 제외). |
다른 콘텐츠와 함께 흐르고 옆에 다른 요소가 있는 것을 허용합니다. |
다른 콘텐츠와 함께 흐르고
옆에 다른 요소가 있는 것을 허용합니다. |
높이,너비 설정 가능 여부 | Yes | Yes | No. 설정값은 무시됩니다. |
vertical-align으로 정렬 가능 | No | Yes | Yes |
마진과 패딩 | 수직, 수평 다 설정 가능 | 수직, 수평 다 설정 가능 | 수평 방향만 설정 가능합니다. 수직 방향은 설정하여도 레이아웃에 영향을 주지 않습니다. 콘텐츠 주변에 테두리와 패딩이 시각적으로 표시되더라도
세로 높이는 line-height에 따라 달라집니다. |
Float | - | - |
세로 마진과 패딩을 설정할 수 있는 블록 요소처럼 됩니다.
|
23. 위치 지정 요소와 position 속성 값 relative, fixed, absolute, static에 대해 설명해 주세요
- static - 기본 위치입니다. 요소는 css box 모델과 문서 상 위치에 따라 페이지로 흘러 들어갑니다.
- top, right, bottom, left , z-index 속성은 적용되지 않습니다.
- relative - 요소의 위치는 레이아웃을 변경하지 않으며, static일 떄 자신 위치를 기준으로 조정됩니다.
- absolute - 요소가 페이지의 흐름에서 제거되며, 이러한 요소는 다른 요소의 위치에 영향을 주지 않습니다.
- 마진을 갖을 수 있으며, 마진 겹침을 발생시키지 않습니다
- 다른 요소의 위치에 영향을 주지 않습니다.
- 가장 가까운 상대 위치로 지정된 조상 요소에 상대적로 위치합니다.
- 만약 조상 중 상대 지정 요소가 없으면 뷰포트에 상대적이게 됩니다.
- fixed - 요소가 페이지 흐름에서 제거되고 뷰포트에 상대적인 지정된 위치에 배치되어, 스크롤할 때 움직이지 않습니다.
References
24. 지금까지 사용한 CSS 프레임워크들을 소개해 주시고, 어떻게 개선하고 싶은지 말씀해 주세요
- Bootstrap
- 느린 릴리스 주기를 개선하고 싶습니다. Bootstrap 4는 거의 2년 동안 알파 상태였습니다.
- 널리 사용되는 스피너 버튼 컴포넌트가 있었으면 좋겠습니다.
- Semantic UI
- 소스 코드 구조로 인해 테마 커스터마이징이 너무 어렵습니다.
- 부트스트랩과 달리 CSS 변수를 재정의하는 것이 어렵습니다.
- 벤더 라이브러리 내부 설정파일 경로가 하드코딩 됩니다.
- Bulma
- 시맨틱하지 않은 많은 불필요한 클래스와 마크업이 필요합니다.
- 이전 버전과 호환되지 않습니다.
- 버전을 업그레이드하면 미묘하게 앱이 손상됩니다.
25. 새로운 CSS Flebox와 Grid 스펙을 사용해 보셨나요?
네. Flexbox는 주로 1차원 레이아웃용이고 Grid는 2차원 레이아웃용입니다.
그리드는 그리드 기반 레이아웃을 생성하기 위한 가장 직관적인 접근 방식이지만,
브라우저 지원이 제한적입니다.
26. 반응형 웹 전략과 모바일 퍼스트 전략의 차이점을 설명해 주세요
@media (min-width: 601px) {
.my-class {
font-size: 24px;
}
}
@media (max-width: 600px) {
.my-class {
font-size: 12px;
}
}
모바일 퍼스트 전략도 반응형이지만 모바일 디바이스에 대한 스타일을 디폴트로 정의하고,
나중에 다른 장치에 특정 반응형 규칙만 추가한다는 것입니다.
.my-class {
font-size: 12px;
}
@media (min-width: 600px) {
.my-class {
font-size: 24px;
}
}
- 모바일 장치에서 성능이 더 좋습니다.
- 모든 규칙의 미디어 쿼리 유효성 검사를 할 필요가 없기 때문입니다.
- 반응형 CSS 규칙 코드를 더 깨끗하게 작성할 수 있습니다.
27. 반응형(responsive) 디자인은 적응형(adaptive) 디자인과 어떻게 다른가요?
반응형 디자인과 적응형(adaptive) 디자인 모두
다양한 장치의 다양한 뷰포트 크기, 해상도, 사용 컨텍스트, 제어 메커니즘 등에 적합하게
사용자 경험을 최적화하고
- 반응형 디자인은 본질적으로 모든 상황에 맞는 반응형 레이아웃이지만 단일 소스코드를 사용함에 따라 오는 어려운 점이 있습니다.
- 미디어 쿼리 중단점을 설정하는 방법은 그러한 과제 중 하나입니다.
- 표준화된 중단점 값을 사용합니까? 아니면 특정 레이아웃에 적합한 중단점을 사용합니까?
- 레이아웃이 변경되면 어떻게 할까요?
- 미디어 쿼리 중단점을 설정하는 방법은 그러한 과제 중 하나입니다.
- 적응형 디자인에는 일반적으로 사용자 에이전트 스니핑 또는 DPI 감지 등이 필요하며 어떤 결과도 사실 신뢰하기 어렵습니다.
- https://developer.mozilla.org/en-US/docs/Archive/Apps/Design/UI_layout_basics/Responsive_design_versus_adaptive_design
- http://mediumwell.com/responsive-adaptive-mobile/
- https://css-tricks.com/the-difference-between-responsive-and-adaptive-design/
28. 레티나 그래픽으로 작업한 적이 있나요? 그렇다면 언제, 어떤 기술을 사용했습니까?
<div responsive-background-image>
<img
src="/images/test-1600.jpg"
sizes="
(min-width: 768px) 50vw,
(min-width: 1024px) 66vw,
100vw"
srcset="
/images/test-400.jpg 400w,
/images/test-800.jpg 800w,
/images/test-1200.jpg 1200w
" />
</div>
아이콘의 경우 해상도에 관계없이 선명하게 렌더링하기 위해, 가능하면 SVG와 아이콘 폰트를 사용하는 것을 선택합니다.
- https://css-tricks.com/responsive-images-youre-just-changing-resolutions-use-srcset/
- http://scottjehl.github.io/picturefill/
- https://aclaes.com/responsive-background-images-with-srcset-and-sizes/
29. 절대 위치 지정 대신 translate()를 사용하는 이유는 뭔가요?
References
해당 게시물에 대한 다른 답변들은 아래 링크에서 찾아보실 수 있습니다.
- https://neal.codes/blog/front-end-interview-css-questions
- https://quizlet.com/28293152/front-end-interview-questions-css-flash-cards/
- http://peterdoes.it/2015/12/03/a-personal-exercise-front-end-job-interview-questions-and-my-answers-all/
2019년 작성된 내용이라 요새 트렌드랑 안 맞는 것들도 있는 것 같습니다.
간간히 현행화해 놓도록 하겠습니다.
자주 지켜봐주시기 바랍니다.
보충 자료
위 면접 문제에서 다루고 있으나, 깊게 설명하지 않는 내용들을 별첨합니다.
CSS 레이아웃
CSS BOX 모델에 따라 컨텐츠가 어떤 순서로 위치하는지 자세히 설명합니다.
https://developer.mozilla.org/ko/docs/Learn/CSS/CSS_layout
컨테이너 쿼리
반응형 구현의 새로운 방법입니다.
https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Container_Queries
Block Formatting Context
https://itchallenger.tistory.com/877
z-index & stacking context
https://ishadeed.com/article/understanding-z-index/
'FrontEnd' 카테고리의 다른 글
[번역] 타입스크립트를 활용한 타입 프로그래밍 입문 (0) | 2023.02.01 |
---|---|
[번역] 빅테크 프론트엔드 기술 인터뷰 : Html편 (0) | 2023.02.01 |
[번역] 집합론으로 이해하는 타입스크립트 (0) | 2023.01.31 |
Javascript로 Python range 함수 구현하기 (0) | 2023.01.31 |
[번역]CSS 셀렉터 성능 최적화 (0) | 2023.01.31 |