📝

21. CSS 실무 테크닉

 
 
💡
꼭 한 번씩 실습을 해보시길 권해드립니다!

1. 커스텀 input, select 박스

디자인적인 개성을 주기 위해 실무에서는 input 요소나 select 박스를 브라우저 스타일과 다르게 표현하곤 합니다.

1.1 개념

스타일링이 까다로운 input 요소를 화면에서 숨기고 label 요소를 연결하여 스타일링을 진행합니다.

1.2 input checkbox 커스텀

<!-- txt-hide 클래스로 요소를 숨겨줍니다. --> <input type="checkbox" id="inpHold" class="inp-hold txt-hide"> <label for="inpHold" class="labl-hold">로그인 상태 유지</label>
.form-login .labl-hold{ display: block; height:22px; margin:17px 0 21px; text-align: left; font-weight: 500; font-size: 16px; line-height: 20px; color:#767676; cursor: pointer; } .form-login .labl-hold::before{ display: inline-block; content:""; width:22px; height:22px; margin-right:8px; vertical-align: -5px; background-image:url("images_login/icon_check_empty.png") ; } .form-login .inp-hold:focus+.labl-hold::before{ outline:2px solid #000; outline-offset: 5px; } .form-login .inp-hold:checked+.labl-hold::before{ background-image:url("images_login/icon_check.png") ; }
 

1.3 select 커스텀

<h2>셀렉트 박스 만들기</h2> <button class="btn-select">당신의 에스파 최애 맴버는??</button> <ul class="list-member"> <li><button type="button">카리나</button></li> <li><button type="button">지젤</button></li> <li><button type="button">닝닝</button></li> <li><button type="button">윈터</button></li> </ul> <script> const btn = document.querySelector('.btn-select'); const list = document.querySelector('.list-member'); btn.addEventListener('click', () => { list.classList.toggle('on'); }); list.addEventListener('click', (event) => { if (event.target.nodeName === "BUTTON") { btn.innerText = event.target.innerText; list.classList.remove('on'); } }); </script>
 
/* 직접 셀렉트 박스 만들기 */ h2 { margin: 30px; } .btn-select { width: 200px; height: 30px; background: purple; color: #fff; } .list-member { display: none; width: 200px; height: 30px; } .list-member.on { display: block; } .btn-select:active+.list-member { display: block; } .list-member li { height: 30px; width: 200px; } .list-member li button { display: block; height: 100%; width: 100%; background-color: #fff; border: 1px solid black; border-top: none; } .list-member li button:hover { background-color: bisque; }
 
*** select 실습해보기!! ***
 
 

2. IR(Image Replacement) 테크닉

2.1 개념

디자인적으로는 보이지 않지만 스크린리더나 브라우저를 위해 정보를 전달하는 텍스트를 html 곳곳에 숨겨두는 방법을 배워봅니다.

2.2 방법

 

2.2.1 카카오가 사용하는 방법들

 
  1. PC용 사용된 이미지내 의미있는 텍스트의 대체텍스트를 제공할때
.ir_pm{ display:block; overflow:hidden; Font-size:1px; line-height:0; text-indent:-9999px; }
 
  1. Mobile용 사용된 이미지내 의미있는 텍스트의 대체텍스트를 제공할때
.ir_pm{ display:block; overflow:hidden; font-size:1px; line-height:0; color:transparent; }
 
  1. 스크린리더가 읽을 필요는 없지만  마크업 구조상 필요한 경우
.screen_out { overflow: hidden; position: absolute; width: 0; height: 0; line-height: 0; text-indent: -9999px; }
 
  1. 중요한 이미지 대체텍스트로 이미지 off 시 에도 대체 텍스트를 보여주고자 할때
.ir_wa{ display:block; overflow:hidden; position:relative; z-index:-1; width:100%; height:100% }
 

2.2.2 네이버가 사용하는 방법

.blind { position: absolute; clip: rect(0 0 0 0); width: 1px; height: 1px; margin: -1px; overflow: hidden; }
 
*** clip 사용해보기 ***
 

2.2.3 마이너스 마진에 대한 논란

 
 

3. CSS Sprite 기법

여러가지의 이미지를 하나의 이미지 파일안에 배치하여 이미지로드 부담을 줄이는 방법입니다.
 
 
 

4. 레티나 디스플레이 대응법

 

4.1 레티나란?

  • 특정한 시야 거리에서 인간의 눈으로는 화소를 구분할 수 없는 화소 밀도(300 PPI가 넘을 경우)를 가진 애플 LCD 제품의 브랜드 이름입니다.
 

4.2 원인은 무엇일까?

  • 레티나(고해상도 화면)로 넘어오면서 논리픽셀(css에서 표현하는 화소의 기본 단위)과 물리픽셀(디바이스가 실제로 처리할 수 있는 화소의 기본 단위)의 차이가 발생합니다. 그러나 브라우저는 css에서 정의한 픽셀만큼 이미지를 렌더링 해야하기 때문에 원래는 물리픽셀에 맞게 렌더링된 이미지가 논리픽셀 만큼 커져버리게 됩니다.
    • notion imagenotion image
       
       

4.3 해결 방법

화면에 우리가 그리고자 하는 사이즈의 2배 되는 이미지를 준비합니다.
 
*** 실습해보기 ***
 
 
 

5. 반응형 컨텐츠 만들기

 

5.1 반응형 이미지

 

5.1.1 이미지 포맷

이미지 포맷의 종류 GIF(Graphics Interchange Format) : 256색의 컬러만 표현 가능하기 때문에 선명하진 않지만 용량이 적게 듭니다. 투명은 표현 가능하지만 그 정도를 조절하는건 불가능하며, 때문에 그림자 표현도 불가능합니다. 애니메이션 처리가 가능합니다. JPG/JPEG (Joint Photographic Expert Group image): 매우 화소가 높고, 용량도 적지만 투명처리가 불가능합니다. PNG (Portable Network Graphics) : 왠만한 컬러는 모두 표현 가능하여 투명 영역을 처리 가능하지만 용량이 큽니다. SVG (Scalable Vector Graphics) : SVG 형식의 벡터 이미지는 손실이나 품질 저하 없이 모든 크기에서 렌더링이 가능합니다. WebP (Web Picture Format) : 압축률이 좋다고 소문난 JPEG 이미지에 비해 무려 용량은 70% 수준으로 낮지만 더 뛰어난 색상을 지원하는 포맷입니다. 그럼에도 불구하고 PNG 처럼 투명도 표현 가능하며, GIF 처럼 애니메이션 표현도 가능한 만능 포맷입니다. AVIF (AV1 Image File Format) : WebP 처럼 뛰어난 색상표현, 애니메이션 지원, 투명도 표현 모두 가능하며 JPEG 이미지의 50% 수준인 용량을 자랑하는 차세대 이미지 포맷입니다. 아직 지원하지 않는 브라우저가 많음에 주의해야합니다.

5.1.2 반응형 이미지 만들기

  1. width: 100%
  1. max-width: 100%
 
 

5.2 반응형 백그라운드 이미지

 

5.2.1 백그라운드 사이즈 속성들

Background-size: px. —> 이미지의 크기를 고정합니다.
Background-size: auto —> 이미지의 종 횡비를 통해 자동으로 다른 축의 크기를 결정합니다.
Background-size: % —> %를 사용하면 컨테이너의 넓이에 비례하도록 사이즈를 조절할 수 있습니다.
Background-size: contain —> 컨테이너 전체를 덮지만 이미지를 자르지 않게 유지합니다.
Background-size: cover —> 컨테이너 전체를 완전히 덮습니다.
 

5.2.2 반응형 백그라운드 이미지 만들기

background: url("https://images.unsplash.com/photo-1477959858617-67f85cf4f1df?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxzZWFyY2h8Mnx8Y2l0eXxlbnwwfHwwfHw%3D&w=1000&q=80") center /cover no-repeat;
 
** 언제 contain을 혹은 cover를 사용하면 좋을까요?? **
 

5.3 반응형 동영상

 

5.3.1 동영상 상식

브라우저가 지원하는 비디오 포멧
 
Video 속성
preload =“none”, “auto”; : 페이지를 로드할때 영상을 미리 로드할지 말지 결정합니다.
Poster : 비디오를 내려받을 동안 혹은 영상을 재생할때까지 표시할 이미지를 지정합니다.
Controls : 브라우저가 재생에 핋요한 컨트롤러를 제공할지 지정합니다.
Autoplay:  파일이 다운로드가 완료되면 자동으로 재생될지 지정하는 속성입니다.
Muted: 소리를 끕니다.
Loop : 비디오가 끝나고 반복적으로 재생할지 지정합니다.
 

5.3.2 동영상 만들기

  1. video 태그로 만들기
<video autoplay controls loop src="next_level.mp4"></video>
 
  1. youtube 동영상으로 만들기
<iframe class="video-next-level" src="https://www.youtube.com/embed/4TWR90KJl84?autoplay=1&mute=1&loop=1&playlist=4TWR90KJl84&controls=1" title="YouTube video player" frameborder="0" allowfullscreen></iframe>
 

5.3.3 반응형 동영상 만들기

<article class="cont-video"> <iframe class="video-next-level" src="https://www.youtube.com/embed/4TWR90KJl84?autoplay=1&mute=1&loop=1&playlist=4TWR90KJl84&controls=1" title="YouTube video player" frameborder="0" allowfullscreen></iframe> </article>
.cont-video { position: relative; padding-top: 56.25%; /* padding-top, padding-bottom 속성의 % 값은 부모 요소의 넓이에 비례합니다. */ /* 예를 들어 부모의 넚이가 1200px 이라면 padding-top=50% 의 값은 600px 과 같습니다. */ } .video-next-level { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }