CSS 질문
프론트엔드 면접 질문 - CSS 질문에 대한 해설입니다. Pull Request를 통한 제안, 수정 요청 환영합니다.
- CSS 선택자의 특정성은 무엇이며 어떻게 작동하나요?
Resetting과NormalizingCSS의 차이점은 무엇인가요? 당신은 무엇을 선택할 것이며, 그 이유는 무엇인가요?float가 어떻게 작동하는지 설명하세요.z-index와 스택 컨텍스트(stacking context)가 어떻게 형성되는지 설명하세요.- BFC(Block Formatting Context)와 그 작동 방식을 설명하세요.
- clear 하는 방법에는 어떤 것이 있으며, 각각 어떤 상황에 적합한가요?
- CSS 스프라이트는 무엇인가요? 그리고 당신이 페이지나 사이트에 구현하는 방법도 설명해 주세요.
- 브라우저 별로 스타일이 다른 문제를 어떤 접근 방법으로 해결하나요?
- 기능이 제한된 브라우저의 페이지는 어떻게 처리하나요? 어떤 기술/프로세스를 사용하나요?
- 콘텐츠를 시각적으로 숨기는(그리고 screen reader에서만 사용할 수 있게 만드는) 다양한 방법은 무엇인가요?
- 그리드 시스템을 사용해본적 있나요? 만약 그렇다면, 당신은 어떤 것을 선호하나요?
- 미디어 쿼리나 모바일만을 위한 layouts/CSS를 사용하거나 구현해본적 있나요?
- SVG 스타일링에 익숙하신가요?
- screen이 아닌 @media 속성의 예를 들어줄 수 있나요?
- 효율적인 CSS를 작성하는데 있어서 어려움은 무엇인가요?
- CSS 전처리기를 사용하면 어떤 장단점이 있나요?
- 사용했던 CSS 전처리기에 대해 좋았던 점과 싫었던 점을 설명해주세요.
- 비표준 글꼴을 사용하는 웹 디자인 컴포넌트를 어떻게 구현하나요?
- 브라우저가 CSS 선택자에 일치하는 요소를 어떻게 결정하는지 설명하세요.
- Pseudo-elements에 대해 설명하고 이 요소가 무엇을 위해 사용되는지 설명하세요.
- 박스 모델에 대한 당신의 이해와 CSS에서 브라우저에 다른 박스 모델로 레이아웃을 렌더링하는 방법을 설명하세요.
* { box-sizing: border-box; }는 무엇을 하나요? 장점은 무엇인가요?- CSS의
display속성은 무엇이며 사용법에 대한 몇 가지 예를 들 수 있나요? inline과inline-block의 차이점은 무 엇인가요?relative,fixed,absolute,static요소의 차이점은 무엇인가요?- 로컬이나 프로덕션 환경에서 사용했던 CSS 프레임워크는 무엇인가요? 어떻게 그들을 바꾸거나 개선할 수 있을까요?
- 새로운 CSS Flexbox나 Grid 스펙을 사용해본 적이 있나요?
- 반응형 웹사이트를 코딩하는 것과 모바일 우선 전략을 사용하는 것 사이의 차이점을 설명하세요.
- 반응형 디자인은 적응형 디자인과 어떻게 다른가요?
- 레티나 그래픽으로 작업 해본 적이 있나요? 그렇다면, 언제, 어떤 기술을 사용하였나요?
absolute포지셔닝 대신translate()를 사용하는 이유가 무엇인가요? 또는 그 반대의 경우에 대해서는 어떻게 생각하시나요?, 그 이유는 무엇인가요?- 다른 답변들
CSS 선택자의 특정성은 무엇이며 어떻게 작동하나요?
브라우저는 CSS 규칙의 특정성에 따라 요소에 표시할 스타일을 결정합니다. 브라우저는 이미 특정 요소와 일치하는 규칙을 결정했다고 가정합니다. 일치하는 규칙들 가운데, 네 개의 쉼표로 구분된 값 a, b, c, d는 다음을 기반으로 각 규칙에 대해 계산됩니다.
a는 인라인 스타일이 사용되고 있는지입니다. 속성의 선언이 요소의 인라인 스타일이면a는 1이고, 그렇지 않으면 0입니다.b는 ID 셀렉터의 수입니다.c는 클래스, 속성, 가상 클래스 선택자의 수입니다.d는 태그, 가상 요소 선택자의 수입니다.
결과적인 특정성은 점수가 아니라, 컬럼마다 비교할 수 있는 값들의 행렬입니다. 선택자를 비교하여 가장 높은 특정성을 갖는 항목을 결정할 때, 왼쪽에서 오른쪽 순으로 각 열의 가장 높은 값을 비교합니다. 따라서 b열의 값은 c와 d열에 있는 값을 무시합니다. 따라서 0,1,0,0의 특정성은 0,0,10,10중 하나보다 큽니다.
동등한 특정성의 경우: 가장 마지막 규칙이 중요한 규칙입니다. 스타일 시트에 동일한 규칙을 두 번 작성한 경우(내부나 외부에 관계없이) 스타일 시트의 하위 규칙이 스타일 될 요소에 더 가까우므로 더 구체적으로 적용됩니다.
저라면, 필요하다면 쉽게 재정의할 수 있도록 낮은 특정성 규칙들을 작성할 것입니다. CSS UI 컴포넌트 라이브러리 코드를 작성할 때, 라이브러리 사용자가 !important를 사용하거나 특정성을 높이기 위해 지나치게 복잡한 CSS 규칙을 사용하지 않고도 이를 재정의할 수 있도록 특정성을 낮게 하는 것이 중요합니다.
참고자료
- https://www.smashingmagazine.com/2007/07/css-specificity-things-you-should-know/
- https://www.sitepoint.com/web-foundations/specificity/
Resetting과 Normalizing CSS의 차이점은 무엇인가요? 당신은 무엇을 선택할 것이며, 그 이유는 무엇인가요?
-
Resetting - Resetting은 요소의 모든 기본 브라우저 스타일을 제거하기 위한 것입니다. 예:
margin,padding,font-size는 같은 값으로 재설정됩니다. 일반적 인 타이포그래피 요소에 대한 스타일을 재 선언해야합니다. -
Normalizing - Normalizing는 "모든 스타일을 제거"하는 것이 아니라 유용한 기본 스타일을 보존합니다. 또한 일반적인 브라우저 종속성에 대한 버그를 수정합니다.
필자는 저만의 스타일링을 많이 해야 하고 보존할 기본 스타일이 필요하지 않도록 매우 커스터마이징되었거나 자유로운 사이트 디자인해야할 때 리셋을 선택합니다.
참고자료
float가 어떻게 작동하는지 설명하세요.
Float는 CSS 위치 지정 속성입니다. Float된 요소는 페이지의 흐름의 일부가 되며, 페이지의 흐름에서 제거되는 position: absolute 요소와 달리 다른 요소(예: 플로팅 요소 주위로 흐르는 텍스트)의 위치에 영향을 줍니다.
CSS clear 속성은 float 요소에 left/right/both에 위치하도록 사용될 수 있습니다.
부모 요소에 float 요소만 있으면, 그 높이는 무효가 됩니다. 컨테이너의 float 요소 다음에 있지만 컨테이너가 닫히기 전에 float를 clear 하면 해결할 수 있습니다.
.clearfix는 영리한 CSS 가상 선택자 (:after)를 사용하여 float를 제거합니다. 상위 클래스에 overflow 를 설정하는 대신 추가 클래스 clearfix를 적용합니다. 그 다음 아래 CSS를 적용하세요:
.clearfix:after {
content: ' ';
visibility: hidden;
display: block;
height: 0;
clear: both;
}
대신, 부모 요소에 overflow: auto나 overflow: hidden 속성을 주면, 자식 요소 내부에 새로운 블록 포맷 컨텍스트을 설정하고 자식을 포함하도록 확장합니다.
참고자료
z-index와 스택 컨텍스트(stacking context)가 어떻게 형성되는지 설명하세요.
CSS의 z-index속성은 겹치는 요소의 쌓임 순서를 제어합니다. z-index는 position에 static이 아닌 값을 갖는 요소에만 영향을 줍니다.
z-index 값이 없으면 DOM에 나타나는 순서대로 요소가 쌓이게 됩니다(동일한 계층에서 가장 아래의 것이 맨 위에 보여집니다). 정적이지 않은(non-static) 위치지정 요소(및 해당 하위 요소)는 HTML 레이어 구조와 상관없이 기본 정적 위치로 항상 요소 위에 나타납니다.
스택 컨텍스트(stacking context)는 레이어들을 포함하는 요소입니다. 지역 스택 컨텍스트 내에서, 자식의 z-index 값은 문서 루트가 아닌 해당 요소를 기준으로 설정됩니다. 해당 컨텍스트 외부 레이어(예: 지역 스택 컨텍스트의 형제 요소)는 그 사이의 레이어에 올 수 없습니다. 요소 B가 요소 A의 상단에 위치하는 경우, 요소 A의 하위 요소 C는, 요소 C가 요소 B보다 z-index가 더 높은 경우에도 요소 B 보다 위에 올 수 없습니다.
각각의 스택 컨텍스트는 자체적으로 포함되어 있습니다 - 요소의 내용이 쌓인 후에는 전체 요소를 스택 컨텍스트의 쌓인 순서로 고려합니다. 다음 몇몇 CSS 속성, opacity가 1보다 작거나, filter가 none이 이거나, transform이 none이 아닌 것들이 새로운 스택 컨텍스트를 트리거 합니다.
참고 자료
- 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
BFC(Block Formatting Context)와 그 작동 방식을 설명하세요.
BFC(Block Formatting Context)는 블록 박스가 배치된 웹 페이지의 시각적 CSS 렌더링의 일부입니다. float, absolute로 배치된 요소, inline-blocks, table-cells, table-caption 그리고 visible( 그 값이 viewport에 전파되었을 때는 제외)이 아닌 overflow가 있는 요소들이 새로운 Block Formatting Context를 만듭니다.
BFC는 다음 조건 중 하나 이상을 충족시키는 HTML 박스입니다:
float의 값이none이 아님.position의 값이static도 아니고relative도 아님.display의 값이table-cell,table-caption,inline-block,flex,inline-flex임.overflow의 값이visible이 아님.
BFC에서 각 박스의 왼쪽 바깥 모서리는 포함하는 블록의 왼쪽 모서리에 닿습니다(right-to-left 포맷에서는, 오른쪽 모서리에 닿음).
BFC collapse 시에 인접한 블록 레벨 박스 사이의 수직 마진. collapsing margins에 대해 자세히 읽어보세요.
참고 자료
- https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Block_formatting_context
- https://www.sitepoint.com/understanding-block-formatting-contexts-in-css/
clear 하는 방법에는 어떤 것이 있으며, 각각 어떤 상황에 적합한가요?
- 빈
div방법 -<div style="clear:both;"></div> - Clearfix 방법 - 위
.clearfix클래스를 참조하세요. overflow: auto또는overflow: hidden방법 - 부모는 새로운 Block Formatting Context를 설정하고, 확장된 자식을 포함하도록 합니다.
대규모의 프로젝트에서는 유용하게 .clearfix 클래스를 만들어 필요한 곳에서 사용합니다. 자식이 부모보다 크기가 큰 경우 overflow: hidden은 자식을 모두 보여줄 수 없습니다.
CSS 스프라이트는 무엇인가요? 그리고 당신이 페이지나 사이트에 구현하는 방법도 설명해 주세요.
CSS 스프라이트는 여러 이미지를 하나의 큰 이미지로 결합합니다. 일반적으로 아이콘에 사용되는 기술(Gmail에서 사용)입니다. 구현 방법:
- 스프라이트 생성기를 사용하여 여러 이미지를 하나로 묶 어 적절한 CSS를 생성합니다.
- 각 이미지는
background-image,background-position,background-size속성이 정의된 해당 CSS 클래스를 갖습니다. - 해당 이미지를 사용하기 위해, 요소에 해당 클래스를 추가합니다.
장점:
- 여러 이미지에 대한 HTTP 요청 수를 줄입니다(스프라이트 시트당 하나의 단일 요청만 필요합니다.) 그러나 HTTP2를 사용하면, 여러 이미지를 로드하는 것이 더 이상 중요하지 않습니다.
:hover의 상태에서만 나타나는 이미지가 필요할 때, 다운로드되지 않는 이미지를 미리 다운로드하여 깜박임이 보이지 않습니다.
참고 자료
브라우저 별로 스타일이 다른 문제를 어떤 접근 방법으로 해결하나요?
- 문제와 그 문제를 일으키는 브라우저를 식별한 후, 해당 브라우저가 사용 중일 때만 로드되는 별도의 스타일 시트를 사용합니다. 하지만 이 방식을 사용하려면 서버사이드 렌더링이 필요합니다.
- 이미 이러한 스타일링 문제를 처리하고 있는 Bootstrap 같은 라이브러리를 사용합니다.
autoprefixer를 사용하여 벤더 프리픽스를 코드에 자동으로 추가합니다.- Reset CSS 또는 Normalize.css를 사용합니다.
기능이 제한된 브라우저의 페이지는 어떻게 처리하나요? 어떤 기술/프로세스를 사용하나요?
- 우아한 퇴보 - 최신 브라우저를 위한 어플리케이션을 구축하는 동시에 그것이 구형 브라우저에서도 계속 작동하도록 하는 구축 방법.
- 점진적 향상 - 기본 수준의 사용자 환경에 대한 응용 프로그램을 구축하지만 브라우저가 이를 지원할 경우 기능을 강화하는 방법.
- caniuse.com을 사용하여 기능 지원을 확인합니다.
- 자동 벤더 프리픽스 삽입을 위해 Autoprefixer 사용.
- Modernizr를 사용하여 기능 감지.
- CSS Feature 쿼리 @support 사용.
콘텐츠를 시각적으로 숨기는(그리고 screen reader에서만 사용할 수 있게 만드는) 다양한 방법은 무엇인가요?
이러한 기술은 Accessibility(a11y)에 관련이 있습니다.
width: 0; height: 0. 요소가 화면의 어떤 공간도 차지하지 않도록 합니다. 결과적으로 보이지 않게 됩니다.position: absolute; left: -99999px. 화면 외부에 배치합니다.text-indent: -9999px. 이것은block인 요소 내의 텍스트에서만 작동합니다.- 메타데이터. 예를 들면, Schema.org, RDF, JSON-LD를 사용합니다.
- WAI-ARIA. 웹 페이지의 Accessibility를 높이는 방법을 정의하는 W3C 기술 사양입니다.
WAI-ARIA가 이상적인 해결책이라 하더라도 저는 absolute 위치 지정 접근 방법을 택할 것입니다. 대부분의 요소에 작동하며 간단한 기술이기 때문입니다.
참고자료
- https://www.w3.org/TR/wai-aria-1.1/
- https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA
- http://a11yproject.com/
그리드 시스템을 사용해본적 있나요? 만약 그렇다면, 당신은 어떤 것을 선호하나요?
저는는 float 기반 그리드 시스템을 좋아합니다. 왜냐하면, 여전히 기존 대체할만한 시스템(flex, grid) 중에서도 가장 많은 브라우저를 지원하기 때문입니다. 이것은 Bootstrap에서 수 년동안 사용되었으며, 효과가 있다는 것이 입증되었습니다.
미디어 쿼리나 모바일만을 위한 layouts/CSS를 사용하거나 구현해본적 있나요?
네. 한가지 예를 들면, 여러 줄 형식의 네비게이션을 특정 breakpoint를 지나면 fixed-bottom tab 형태로 변환하였습니다.
SVG 스타일링에 익숙하신가요?
네, 객체의 속성을 지정하는 방법을 포함해 inline CSS, CSS section 삽입, 외부 CSS file처럼 shape의 색상을 정하는 여러 방법이 있습니다. 웹에서 볼 수 있는 대부분의 SVG는 inline CSS를 사용하지만, 각각 장단점이 있습니다.
기본적인 채색은 노드에 fill과 stroke 두 속성을 설정하여 정할 수 있습니다. fill은 객체 안쪽 색을 설정하고, stroke는 객체 주위에 그려지는 선의 색을 설정합니다. 색상 이름 (red 등), RGB값 (rgb(255,0,0)), 16진수 값, RGBA 값 등 HTML에서 사용하는 것과 동일한 CSS 색상 이름 스킴을 사용할 수 있습니다. HTML에서 사용하는 것과 동일한 CSS 색상 지정 스킴을 사용할 수 있습니다.
<rect
x="10"
y="10"
width="100"
height="100"
stroke="blue"
fill="purple"
fill-opacity="0.5"
stroke-opacity="0.8" />
참고자료
screen이 아닌 @media 속성의 예를 들어줄 수 있나요?
네, @media 속성은 screen 을 포함하여 4가지 타입이 있습니다.
- all - 모든 미디어 기기 장치
- print - 프린터
- speech - 화면을 크게 읽는 스크린리더
- screen - 컴퓨터 스크린, 태블릿, 스마트폰 등
print 미디 어 타입의 사용 예제:
@media print {
body {
color: black;
}
}
참고자료
효율적인 CSS를 작성하는데 있어서 어려움은 무엇인가요?
먼저, 브라우저는 선택자가 맨 오른쪽(key 선택자)부터 왼쪽으로 일치하는지 확인합니다. 브라우저는 선택자에 따라 DOM의 요소를 필터링하고 해당 부모요소가 일치하는지 식별합니다. 선택자 체인의 길이가 짧을수록 브라우저는 해당 요소가 선택자와 일치하는지 여부를 빠르게 판별할 수 있습니다. 따라서 태그 선택자와 보편적인 선택자 사용을 피해야 합니다. 이들은 많은 요소가 매치되기 때문에 부모가 일치하는지 여부를 판단하기 위해 브라우저가 많은 작업을 해야합니다.
BEM (Block Element Modifier) 방법론에서는 모두 단일 클래스를 갖고, 계층구조가 필요한 곳에서는 클래스의 이름을 확장하기를 권장합니다. 따라서 선택자를 쉽고 효율적으로 재정의할 수 있습니다.
어떤 CSS 속성이 reflow, repaint, compositing을 트리거 하는지 알아두세요. 가능하면 레이아웃(reflow 트리거)를 변경하는 스타일은 피하세요.
참고자료
CSS 전처리기를 사용하면 어떤 장단점이 있나요?
장점:
- CSS의 유지보수성이 향상됩니다.
- 중첩 선택자를 작성하기 쉽습니다.
- 일관된 테마를 위한 변수사용. 여러 프로젝트에 걸쳐 테마 파일을 공유할 수 있습니다.
- 반복되는 CSS를 위한 Mixins 생성.
- 코드를 여러 파일로 나눕니다. CSS 파일도 나눌 수 있지만, 그렇게 하기 위해서는 각 CSS 파일을 다운로드하기 위한 HTTP 요청이 필요합니다.
단점:
- 전처리기를 위한 도구가 필요합니다. 다시 컴파일하는 시간이 느릴 수도 있습니다.
사용했던 CSS 전처리기에 대해 좋았던 점과 싫었던 점을 설명해주세요.
좋은 점:
- 대부분의 장점은 위에서 언급했습니다.
- Less는 자바스크립트로 작성되었으며, Node와 잘 작동합니다.
싫은 점:
- 저는 C++로 작성된 LibSass 바인딩인
node-sass를 통해 Sass를 사용합니다. 노드 버전을 바꿀 때 자주 다시 컴파일해야 했습니다. - Less에서는 변수 이름의 접두어가
@이며,@media,@import,@font-face규칙과 같은 고유 CSS 키워드와 혼동될 수 있습니다.
비표준 글꼴을 사용하는 웹 디자인 컴포넌트를 어떻게 구현하나요?
font-face를 사용하고 font-weight가 다른 경우 font-family를 정의합니다.