반응형

ios에서 특정 버튼을 연속으로 클릭을 하게 되면

더블 탭 확대로 인식을해서 화면이 확대되고 버튼 클릭이 부자연스러워지는 경우가 있다.

 

위와 같은 경우에 touch-action 이라는 css 속성으로 해결할 수 있다.

 

1. touch-action

touch-action은 모바일이나 태블릿과 같이 터치 액션이 일어나는 디바이스에서 터치 이벤트를 처리할 때 특정 터치 액션만 가능하도록 적용하는 속성이다.

 

ex) touch-action:none 의 경우 모든 터치 이벤트를 비활성한다.

 

2. touch-action:manipulation

touch-action 속성 중 manipulation은 터치를 통한 수평, 수직 스크롤과 여러 손가락을 통한 확대/축소는 가능하게 해주고 그 외의 다른 동작들은 불가능하게 한다. 

.btn_tool {touch-action:manipulation;}

 

 

 

반응형
반응형

뷰포트 단위로 높이 값을 주고 싶을 때 vh 단위를 사용한다.

2020.04.22 - [Frontend/CSS] - [css 단위] vw, vh, vmin, vmax (Viewport 단위)

 

그치만 모바일 주소 표시줄 영역에 의해서 100vh로 높이 값을 설정했다고 하더라도

화면이 짤리는 경우가 발생할 수 있다.

이미지 출처 : https://css-tricks.com/the-trick-to-viewport-units-on-mobile/

 

그럴 때 해결할 수 있는 방법 중 하나는 

div {height:100vh; height:-webkit-fill-available;}

위와 같이 -webkit-fill-available 값을 height값에 적용하는 방법이 있는데

이 방법은 ios에서만 적용이 되고 안드로이드에서는 적용이 안되는 문제가 있기 때문에 권장하진 않는다.

 

이미지 출처 : https://blanche-toile.com/web/large-small-and-dynamic-viewport-units

 

1. dvh (Dynamic Viewport Height)

dvh는 주소 표시줄이 스크롤을 통해 축소가 되건 노출이 되고 있건 상관 없이

현재 보여지는 뷰포트 높이를 동적으로 가져온다. 

 

위 이미지의 예시 처럼 100dvh는 주소표시줄의 유무에 따라 값이 달라진다.

div {height:100dvh;}

 

2. svh (Short Viewport Height)

svh는 사용자 화면 기준으로 가장 짧은 뷰포트 값을 가져온다.

주소 표시줄이 없어져도 기존 주소표시줄의 높이 값을 뺀 나머지 값을 가져온다.

div {height:100svh;}

 

3. lvh (Large Viewport Height)

lvh는 svh와는 반대로 사용자 화면 기준으로 가장 긴 뷰표트 값을 가져온다.

주소 표시줄이 있더라도 주소 표시줄이 없을 때의 총 화면의 길이를 가져온다.

div {height:100lvh;}

 

 

위 3가지의 단위를 볼 때

주소 표시줄의 유무에 따라 뷰포트 높이가 가변적으로 변할 때를 고려해서

dvh를 사용하는 것이 가장 무난하고 우리가 원하는 화면을 보여주는데에 좋은 선택이 될 것이다.

 

 

*dvh, svh, lvh는 브라우저(pc, mobile) 하위 버전에서는 제공이 되지 않기 때문에 작업 환경을 고려한 적용이 필요하다.

 

 


참고

https://medium.com/quick-code/100vh-problem-with-ios-safari-92ab23c852a8

https://blanche-toile.com/web/large-small-and-dynamic-viewport-units

https://www.w3.org/TR/css-values-4/#viewport-relative-u'nits

 

 

 

 

반응형
반응형

css를 통해 animation을 사용하거나 마우스오버 혹은 특정 버튼을 클릭했을 때 클래스 추가하여 transform을 조정하게 될 경우 영역이 깜빡이거나 잠시 흐려지는 현상을 경험한 적이 있을 것이다.

 

1. CSS핵 (translateZ or translate3d) 사용

위와 같은 부자연스러운 transform, animation 현상이 발생하는 것을 해결하기 위해 '*하드웨어 가속'을 활성화해 대상이 되는 엘리먼트를 빠르게 렌더링 처리하는 방법을 사용했다.

*하드웨어 가속
- 하드웨어 가속은 중앙처리장치(CPU)가 하는 일을 그래픽 처리 장치(GPU)가 분담하여 처리해서 컴퓨터의 성능을 최대한으로 끌어올리고 브라우저 렌더링을 보다 빠르게 할 수 있게 만든다.

 

일반적인 css animation, transform, transition 속성에는 하드웨어 가속이 적용되지 않기 때문에 브라우저를 속여서 강제로 3D 처리를 하도록 브라우저에 지시해 하드웨어를 가속화 하는 방법을 사용했다.

그 방법이 translateZ 혹은 translate3d이다.

transform: translate3d(0,0,0);

transform: translateZ(0)

하지만 이러한 방법은 RAM이나 그래픽 처리 장치(GPU)의 사용량을 커지게하여 페이지에 병목 현상을 줘서 오히려 악영향을 끼치게 한다.

 

2. will-change

위 css핵을 대체할 수 있는 새로운 css 속성이 생겼다. 그 속성이 will-change 이다.

속성명 그대로 어떤 속성이 변경이 될 것인지 미리 엘리먼트에 적용하여 브라우저가 해당 css를 읽을 때 변경 될 속성을 알게하여 미리 그 변경에 대비할 수 있게 하는 것이다.

will-change: auto;		/* 기본 값 */
will-change: scroll-position;	/* 스크롤 위치가 변경 될 예정 */
will-change: contents;		/* 요소의 컨텐츠 내용이 변경 될 예정 */

/* 특정 css 속성 적용 */
will-change: transform;		/* transform 속성이 변경 될 예정 */
will-change: opacity;		/* opacity 속성이 변경 될 예정 */
will-change: left, top;		/* left, top 값이 변경 될 예정 */
will-change: transform, opacity

 

 

적용예시)

<style>
  .thmb {width:100px; height:100px; border-radius:50%; overflow:hidden;}
  .thmb img {transition:0.3s transform; will-change:transform;}
  .thmb:hover img {transform:scale(1.2);}
</style>

<!-- .thmb 마우스오버시 img 확대 -->
<div class="item">
  <div class="thmb">
    <img src="picture.jpg">
  </div>
</div>

위와 같은 소스상 .thmb에 마우스 오버시 img가 확대되는 효과를 구현하고자 할 때

transform을 통해 scale을 변경할 img태그에 미리 will-change 속성을 적용해줄 수 있다.

 

3. will-change 사용상의 주의사항

브라우저 성능을 최적화 하겠다고 will-change를 과다하게 사용하면 안된다.

브라우저는 기본적으로 브라우저가 사용할 수 있는 최적화를 최대한으로 적용한다.

그리고 브라우저가 적용한 최적화를 삭제하고 가능한한 빨리 브라우저가 처리해야할 다른 작업들을 실행한다.

그런데 will-change를 선언하게 되면 이러한 브라우저의 특성을 무시하고 브라우저가 최적화에 더 많은 시간을 쏟게 한다.

즉, 오히려 브라우저 최적화에 악영향을 끼친다.

 

그렇기 때문에 will-change는 정말 필요한 경우에만 적절하게 사용해야한다.

 

4. 자바스크립트를 이용한 will-change 적용

3번과 같은 브라우저 최적화 이슈가 있기 때문에 가능하면 will-change를 사용할 때는 자바스크립트를 사용해서 필요한 순간에만 적용하고 다시 will-change를 초기화 시키는 방법을 적용할 수 있다.

<!-- .thmb 마우스오버시 img 확대 -->
<div class="item">
  <div class="thmb">
    <img src="picture.jpg">
  </div>
</div>

<script>
  // 클릭할 때 애니메이션을 재생할 엘리먼트를 선택합니다.
  var item = document.querySelector('.item');

  // 엘리먼트의 조상 요소에 마우스 커서가 올라가면 will-change를 설정한다.
  item.addEventListener('mouseenter', hintBrowser);
  // 엘리먼트의 조상 요소에 마우스 커서가 내려가면 will-change를 초기화한다.
  item.addEventListener('mouseleave', removeHint);

  function hintBrowser() {
    this.querySelector('img').style.willChange = 'transform, opacity';
  }

  function removeHint() {
    this.querySelector('img').style.willChange = 'auto';
  }
 </script>

 

 


참조

https://dev.opera.com/articles/ko/css-will-change-property/

 

 

반응형
반응형

원하는 영역에 배너나 이미지 썸네일을 넣게 될 경우에 정확한 사이즈의 이미지를 받아서 넣거나 2배, 3배와 같은 배수의 이미지를 받아서 넣는 경우 이미지가 흐려보이는 경우는 없겠지만 작업을 하다보면 내가 원하는 사이즈의 이미지를 넣을 수 없는 경우도 있다.

 

이미지를 원래의 사이즈 혹은 원본 사이즈의 배수에 해당하는 사이즈로 넣지 않을 경우 이미지가 흐려(blur) 보이는 경우가 많이 있는데 특히 크롬에서 이 현상이 더 심하게 보인다.

좌측은 이미지의 원본 사이즈를 그대로 놓은 것이고 우측은 원본 이미지를 축소해서 노출을 시킨 것이다.

 

한 눈에 보더라도 우측 이미지가 흐릿하게 보인다는걸 알 수 있다. 일반적인 이미지일 경우에 눈감아줄 수 있을 정도의 흐림인 경우도 있지만 텍스트가 들어간 이미지인 경우 흐린 효과가 더 부각되어 보인다.

 

이러한 현상을 해결하기 위해 css 처리가 필요하다.

 

1. image-rendering(이미지 랜더링 방식 변경)

image-rendering은 확대, 축소이미지에만 적용이 되는 css 이다.

원본 이미지를 그 사이즈 그대로 사용하게 될 경우엔 css가 따로 적용되는 내용이 없지만 특정 이미지를 확대하거나 축소를 할 경우에 해당 css를 사용하면 효과를 발현한다.

.banner{
  image-rendering: -moz-crisp-edges; /* firefox */
  image-rendering: -o-crisp-edges; /* opera */
  image-rendering: -webkit-optimize-contrast; /* chrome(비표준) */
  image-rendering: crisp-edges;
}

crisp-edges는 이미지의 색상대조를 최적화하여 랜더링하게 만들어 흐리거나 번져보이는 효과를 많이 잡아줄 수 있다.

위와 같이 image-rendering을 사용하는데 우린 유독 흐림 효과가 심한 크롬에 적용할 목적이므로 -webkit-optimize-contrast를 적용한다.

 

2. translateZ

transform을 사용하여 이미지의 Z축을 0으로 초기화 시켜 입체감을 없앤다.

.banner{
  transform:translateZ(0);
}

 

3. backface-visibility

backface-visibility는 요소의 뒷면을 보여줄 것인지 보여주지 않을 것인지를 정하는 css이다.

.banner{
  backface-visibility:hidden;
}

위와 같이 이미지의 뒷면을 hidden처리하여 보이지 않게, 입체감이 없게 처리할 수 있다.

 

 

4. 정리

.banner{
  image-rendering:-webkit-optimize-contrast;
  transform:translateZ(0);
  backface-visibility:hidden;
}

해당 3가지 css를 사용하면 위 이미지 예시처럼 보다 뚜렷한 이미지를 얻을 수 있다.

 

물론 가능하다면 위 css를 사용하는 일 없이 영역에 맞는 사이즈의 이미지를 가져와서 사용한다면 더할나위 없이 좋을 것이다.

 

 


참조

https://intrepidgeeks.com/tutorial/chrome-image-blur

https://lpla.tistory.com/139

https://developer.mozilla.org/ko/docs/Web/CSS/backface-visibility

 

 

 

반응형
반응형

마우스를 오버해서 나타나는 드롭다운 메뉴를 만드는데에

html 구조와 css만을 이용해서 작업할 수 있다.

 

1. html 구조 만들기

단순히 css만 이용한다고해서 드롭다운 메뉴를 만들 수 있는 것은 아니다.

css의 :hover 가상클래스를 사용해서 드롭다운 메뉴를 노출시켜야 하기 때문에

:hover 가상클래스를 사용할 수 있는 구조로 만들어야 한다.

<ul class="menu">
  <li>
    <a href="#">MENU 1</a>
    <ul class="depth_1">
      <li><a href="#">MENU 1_1</a></li>
      <li><a href="#">MENU 1_2</a></li>
      <li><a href="#">MENU 1_3</a></li>
    </ul>
  </li>
  <li>
    <a href="#">MENU 2</a>
  </li>
  <li>
    <a href="#">MENU 3</a>
    <ul class="depth_1">
      <li><a href="#">MENU 3_1</a></li>
      <li><a href="#">MENU 3_2</a></li>
    </ul>
  </li>
</ul>

위와 같이 각 MENU 1 ~ MENU 3 영역과 그 내부에 있는 depth_1을 하나의 li태그에 넣어야

css로 제어할 수 있다.

 

2. css 사용

위 html 구조에서 설명한 바와 같이

:hover를 걸 요소와 노출을 시킬 드롭다운 영역을 부모 자식 요소로 배치를 해야

:hover 가상클래스를 걸 수 있다.

.menu:after{display:block; content:''; clear:both;}
.menu > li{position:relative; float:left; margin-right:5px;}
.menu > li > a{display:block; padding:0 15px; background:#333; height:40px; line-height:40px; color:#fff;}
.menu > li:hover .depth_1 {display:block;}
.menu .depth_1{display:none; position:absolute; left:0; right:0; text-align:center;}
.menu .depth_1 a{display:block; padding:5px; background:#666; color:#fff;}

css를 넣을 때 주의 할 점은 .menu > li > a:hover 처럼 a태그에 hover를 걸게 되면

마우스가 a태그를 벗어나면 바로 .depth_1 영역이 닫히기 때문에 li태그에 :hover를 걸어줘야한다.

 

3. 예시

 

 

 

반응형
반응형

아이폰X로 들어서면서 아이폰에는 노치라는 영역이 생겼다.

표시된 부분이 노치 영역이다.

1. 노치 영역의 문제

노치라 불리는 이 영역은 작업을 진행할 때 많은 에로사항을 준다.

웹뷰에서는 문제없이 노출되던 영역들도 노치 영역 때문에 가려지거나 짤려 보이는 현상이 

아이폰X 이후로 나타나게 되었다.

 

예를 들어 가로모드로 화면을 봤을 때 오른쪽에 붙어서 노출되는 네비게이션을

만들었다는 가정을 하면 내가 의도했던 것과는 다르게

네비게이션 영역이 노치에 가려지는 현상을 보게 될 것이다.

위와 같이 네비 메뉴가 노치에 가려지는 현상이 생기기 때문에

우리는 이 방법을 해결하기 위한 내용을 알아봐야한다.

 

2. 노치에 가려지는 문제 해결

* html

먼저 노치 문제를 해결하기 위해서는 html 소스에서 viewport의 content 속성에

viewport-fit=cover 를 넣어줘야한다. (viewport-fit의 기본값은 auto이다.)

<meta name="viewport" content="viewport-fit=cover">

 

* css

html 소스에 viewport를 적용해주고 css에 env() 속성을 적용해주면 된다.

/* iOS 11.0 버전 */
constant(safe-area-inset-top)
constant(safe-area-inset-right)
constant(safe-area-inset-bottom)
constant(safe-area-inset-left)

/* iOS 11.2 이상 */
env(safe-area-inset-top)
env(safe-area-inset-right)
env(safe-area-inset-bottom)
env(safe-area-inset-left)

위와 같이 ios의 버전에 따라 입력되는 속성이 다른데

ios 11.0 버전에서는 constant() 속성을.

ios 11.2 버전 이상부터는 constant() 속성이 없어지고 env() 으로 대체되었기 때문에 env()로 사용한다.

 

ios 11.0과 11.2 버전 이상 모두를 만족하려면 두 속성을 다 적용하면 되겠다.

 

사용의 예

 

env() 미적용

.nav{right:0;}

 

 

env() 적용

.nav{right:0; right:constant(safe-area-inset-right); right:env(safe-area-inset-right);}

위쪽 env() 미적용 예시와 같이 단순 right:0만 입력하게 되면

노치가 있는 아이폰의 경우 해당 영역이 노치에 가려지게 된다.

 

하지만 env() 속성을 적용하게 되면

예시와 같이 노치 영역을 제외하고 right:0을 계산하기 때문에 노치에 가려지는 현상은 없게 된다.

 

 

 


참고

https://wit.nts-corp.com/2019/10/24/5731

https://velog.io/@devcmkim/IOS-%EB%85%B8%EC%B9%98%EB%8C%80%EC%9D%91-Css

 

 

 

 

반응형
반응형

2020.03.31 - [Frontend/CSS] - [css 속성] z-index 우선순위 주기, z-index -(음수) 처리

 

이전에 z-index의 특징과 함께 각 영역별 우선순위를 주는 방법에 대해 포스팅 한 적이 있다.

그와 더불어 z-index 값을 음수로 처리하게 되면 어떤 문제가 생기고 어떻게 해결해야할지에 대해서도 포스팅을 했다.

 

실무를 하면서 z-index를 사용하게 될 일이 많은데 

z-index가 생각보다 다루기 어렵고 여러가지 상황을 고려해야하는 속성이라는걸 사용할 때마다 느낀다.

 

z-index 버그 중 최근에 알게된 버그가 있어서 포스팅을 하게 되었다.

 

관련 내용은 '쌓임 순서 (Stacking Order)' 라는 내용으로 많은 포스팅이 있지만

우선 순전히 실무 작업용으로 간단하게 버그 내용과 해결방법을 소개해보려한다.

 

1. opacity와 함께 사용시

<style>
  .wrap{position:relative; width:130px; height:130px; background:#ccc; color:#fff; font-size:13px;}
  .wrap .inner_box{position:absolute; width:40px; height:40px;}
  .box1{opacity:0.9;}
  .box1 .inner_box{top:10px; left:18px; background:purple; z-index:10;}
  .box2 .inner_box{top:18px; left:10px; background:red; z-index:1;}
</style>
  
<div class="wrap">
  <div class="box1">
    <div class="inner_box">BOX1</div>
  </div>

  <div class="box2">
    <div class="inner_box">BOX2</div>
  </div>
</div>

위와 같은 css와 html을 적용했을 때

원하는 출력 화면은 box1이 box2보다 위에 있는 모습일 것이다.

 

우선 .box1, .box2 요소가 z-index를 따로 선언해주지 않았기 때문에 큰 영향이 없는 상황에서

.box1 .inner_box가 z-index:10

.box2 .inner_box가 z-index:1 을 주었기 때문에

생각하고있는 이론상엔 box1 영역이 제일 위로 와야하지만

box2 영역이 오히려 위쪽으로 위치하게된다.

 

그 이유는 바로 .box1에 적용한 opacity 값 때문이다.

.box1의 .inner_box에 아무리 높은 z-index를 주게되어도

.box1에 opacity값을 주게되면 .box1영역은 z-index:0으로 임의 지정이 되기 때문이다.

 

<style>
  .wrap{position:relative; width:130px; height:130px; background:#ccc; color:#fff; font-size:13px;}
  .wrap .inner_box{position:absolute; width:40px; height:40px;}
  .box1{opacity:0.9;}  /* .box1{opacity:0.9; --> z-index:0} */
  .box1 .inner_box{top:10px; left:18px; background:purple; z-index:10;}
  .box2 .inner_box{top:18px; left:10px; background:red; z-index:1;}
</style>

<div class="wrap">
  <!-- box1 = z-index:0 -->
  <div class="box1">
    <div class="inner_box">BOX1</div>
  </div>

  <!-- box2 = z-index:auto -->
  <div class="box2">
    <div class="inner_box">BOX2</div>
  </div>
</div>

위 css 내용처럼 가

 

.box1 (z-index:0)

.box2 (z-index:auto) 로 적용이 되기 때문에 .box2에 있는 영역들이 위쪽으로 위치하게 된다.

 

2. transform과 함께 사용시

opacity 사용 때와 마찬가지로 특정 영역에 transform을 사용하게 되면

해당 영역은 z-index:0으로 적용이 된다.

<style>
  .wrap{position:relative; width:130px; height:130px; background:#ccc; color:#fff; font-size:13px;}
  .wrap .inner_box{position:absolute; width:40px; height:40px;}
  .box1{transform:translateX(-1px);}
  .box1 .inner_box{top:10px; left:18px; background:purple; z-index:10;}
  .box2 .inner_box{top:18px; left:10px; background:red; z-index:100;}
</style>
  
<div class="wrap">
  <div class="box1">
    <div class="inner_box">BOX1</div>
  </div>

  <div class="box2">
    <div class="inner_box">BOX2</div>
  </div>
</div>

위의 소스도 달라진 내용은 opacity대신 transform을 사용한 것 뿐인데

역시나 box2 영역이 위쪽으로 위치하게 된다.

 

3. 해결방법

위와 같이 opacity, transform 을 사용하게 되면

자식요소에 아무리 z-index 값을 높게 줘도 부모요소에서 이미 z-index:0 이 적용되기 때문에

원하는 화면을 출력하는데에 어려움이 있다.

 

그렇기 때문에 이 문제를 해결하기 위해서는 내가 앞쪽에 위치시킬 영역의 부모요소와

그것과 겹치는 영역의 부모요소와의 z-index 값을 조정하는 것이 중요하다.

<style>
  .wrap{position:relative; width:130px; height:130px; background:#ccc; color:#fff; font-size:13px;}
  .wrap .inner_box{position:absolute; width:40px; height:40px;}
  
  .box1{position:relatvie; z-index:10; transform:translateX(-1px);}
  .box1 .inner_box{top:10px; left:18px; background:purple; z-index:10;}
  
  .box2{position:relative; z-index:1}
  .box2 .inner_box{top:18px; left:10px; background:red; z-index:100;}
</style>
  
<div class="wrap">
  <!-- box1 = z-index:10 -->
  <div class="box1">
    <div class="inner_box">BOX1</div>
  </div>

  <!-- box1 = z-index:1 -->
  <div class="box2">
    <div class="inner_box">BOX2</div>
  </div>
</div>

위의 소스와 같이 box1에 opacity를 줬지만 관련해서 생기는 문제를 해결하기위해

.box1에 z-index값을 새로 정의해주고

더불어 형제 요소인 .box2에 z-index값을 그보다 낮게 주는 방법으로

.box1 .inner_box 영역을 내가 원하는대로 더 위쪽으로 위치시킬 수 있게 되었다.

 

 

 

 

반응형
반응형

실무에서 css를 작성을 하다보면

간단한 페이지나 짧은 css 소스가 필요한 부분의 경우를 제외한

대규모의 페이지 및 여러명이 함께 작업을 해야할 경우의 페이지를 작업할 때에

 

각자 작성하는 마크업 방식이나 클래스 네이밍이 다르기 때문에

서로 작성해놓은 코드를 쉽게 알아보지 못해서

불필요한 소스가 생겨나고 유지보수에 어려움을 겪는 경우가 많아진다.

 

그렇기 때문에 css 방법론이 생겨났다.

css 방법론은 크게 SMACSS, BEM, OOCSS 3가지의 방법이 있는데

이 3가지는 각각 방법은 조금씩 다르지만

 

- 코드의 재사용성 높여 불필요하게 반복되는 css의 사용 최소화\

- 쉬운 유지보수

- 확장성 보장

- 의미있는 클래스명 사용을 통한 클래스명만으로 용도 파악

 

위 4가지의 형태를 추구하고자 한다.

 

1. SMACSS (Scalable and Modular Architecture for CSS)

SMACSS는 클래스명을 최대한 의미있게 사용하여 여러사람이 프로젝트를 진행해도

서로가 서로의 소스를 보다 쉽게 이해할 수 있도록 한다.

 

SMACSS는 5개의 규칙을 따른다.

 

1. Base (기본 규칙)

각 브라우저의 스타일 초기화를 위해

reset, normalize 등 페이지 전체에 기본 스타일을 적용한다.

이때, css !important는 사용하지 않는다.

2020.02.19 - [Frontend/CSS] - CSS Reset (초기화)

 

2. Layout (레이아웃 규칙)

- 페이지 큰 틀을 잡아주는 레이아웃과 관련된 스타일을 정의한다.

- header, footer, container, aside 등 주요 컴포넌트들과 그 하위 컴포넌트에 규칙을 적용한다.(nav, form...)

- 주요 컴포넌트는 #id, 하위 컴포넌트는 .class로 제어한다.

- 특정 상태에 따른 레이아웃을 변경하는 내용을 다루는 css 작성시 l- 혹은 layout- 클래스를 접두사로 붙인다.

#header{width:100%}
#footer{width:100%}

#header .nav{overflow:hidden;}
#footer .list{margin-top:5px;}

/* ex) fixed: 고정된 크기의 #header를 명시 */
.l-fixed #header{width:1200px;}

/* ex) flipped: floating된 .nav를 명시 */
.l-flipped #header .nav{float:left}

 

3. Module (모듈 규칙)

- 스타일 재사용을 위한 규칙 (버튼, 아이콘 등...)

- 재사용을 위해서 id 선택자, 태그(element) 선택자를 사용하지 않는다.

(단순 태그 선택자를 사용하게 된다면 .side_button > a 와 같이 '>' 직계자손 선택자를 사용한다.)

<style>
  .buttons{absolute; top:0; right:0}
  .buttons > a{display:block; border:1px solid blue;}
</style>

<div class="buttons">
  <a href="#">버튼</a>
</div>

 

4. State (상태 규칙)

- 요소의 상태에 따른 클래스 적용을 통한 변화 규칙

- 클래스 적용은 스크립트를 통해 (addClass) 특정 이벤트에 따라 적용한다.

- 클래스명은 주로 접두사 .is- 클래스 사용 (.is-on, .is-checked...)

<!-- 버튼 클릭 후 버튼이 on 되어있는 상태 -->
<div class="buttons is-on">
  <a href="#">버튼</a>
</div>

 

5. Theme (테마 규칙)

- 페이지 전체적인 테마색상에 대한 클래스를 적용하는 규칙

- 테마 적용을 위한 css를 별도로 분리하여 만들어 메인 css에 적용된 내용을 특정 테마에 따라 color값을 제어

- 주의 할 점은 메인 css 뒤에 테마용 css를 선언해야 한다는 점이다.

/* main.css */
.button{background:#fff;}

/* theme.css */
.button{background:skyblue;}

 

2. BEM (Block Element Modifier)

BEM은 클래스 사용을 각각 블록(block), 요소(element), 상태(modifier)로 구분하여 네이밍한다.

 

*장점

- 직관적인 클래스 사용을 통해 여러사람이 함께 작업을 진행하더라도 클래스를 알아보기 쉽게한다.

- 코드의 재사용성이 용이하다.

 

*단점

- 직관적인 클래스명을 사용하다보니 클래스명이 지나치게 길어져 복잡해지는 경우가 있다.

 

 

1. Block

- block의 속성을 가지고 재사용할 수 있는 독립적인 영역에 적용한다.

- block은 여백, 위치, 색상 등 상태에 대한 내용은 담지 않는다.

- 클래스명이 길어질 경우엔 하이픈(-) 으로 구분한다.

<!-- O -->
<div class="paging"></div>
<div class="btn-area"></div>

<!-- X -->
<!-- fixed, red와 같이 상태에 대한 내용은 클래스로 담지 않는다. -->
<div class="paging-fixed"></div>
<div class="btn-area-red"></div>

 

2. Element

- Block 안에 적용되는 내용들로 클래스명도 블록과 맥락이 이어져야한다.

- 클래스명은 언더바 2개(__) 로 작성한다.

<div class="button-area">
  <a href="#" class="button-area__button"></a>
  <span class="button-area__text"></span>
</div>

 

3. Modifiers

- block 혹은 element의 모양(color, size), 상태(position, disabled, checked)를 정의한다.

- 클래스명은 하이픈 2개(--)로 작성한다.

<div class="button">
  <div class="button__text">
    <span class="button__text--red"></span>
  </div>
</div>

 

3. OOCSS (Object Oriented CSS)

- css를 모듈 방식으로 적용해서 중복을 최소화 하는 것을 추구한다.

- id 선택자를 사용하지 않는다.

- 각 단어별 하이픈(-)으로 구분한다.

 

 

1. 구조와 외형을 분리

반복되는 기본 구조 및 외형과 관련된 내용을 공통 스타일화 하여 정의한다.

<style>
   /* 구조 스타일 */
  .button{width:100px; height:30px; text-align:center;}
  
  /* 외형 스타일 */
  .button-red{background:red; color:#fff;}
</style>

<a href="#" class="button button-red">버튼</a>

 

2. 컨텐츠와 컨테이너를 분리

- 어떤 요소(element)에 적용되어 있는게 중요한 것이 아니라 클래스를 적용한 컨텐츠 자체에 의미를 부여하고 사용한다.

- 태그가 변경되어도 적용한 클래스가 같다면 css를 바꿀 필요가 없다.

- 태그에 영향없이 클래스 자체에 스타일이 부여되기 때문에 재사용이 용이하다.

<h2 class="title"></h2>

<strong class="title"></strong>

 

 

위에 설명한 3가지의 css 방법론은 어디까지나 이러한 방법이 적용될 수 있다는 것을 의미한다.

 

반드시 해당 방법에 따라야 하는 것은 아니고 내가 작업하는 상황에 따라

해당 방법론들을 참고하여 나에게, 우리 팀에게 맞는 css 및 class 작성법을 연구하면

 

복잡한 페이지에서도 원활하게 작업할 수 있는 환경을 구축할 수 있을거라 생각한다.

 

 

 


참고

viaeoo.tistory.com/26#recentComments

wit.nts-corp.com/2015/04/16/3538

jmjmjm.tistory.com/44

 

 

반응형
반응형

최신 스펙의 css값을 사용할 때

해당 css를 제공하는 브라우저에 따라 맞춤형으로 적용할 수 있게

css를 선언할 수 있다.

 

방법은 바로 @supports 문법(기능 쿼리, feature query)을 이용하는 것이다.

 

1. @supports 의 사용

@supports 문법은 미디어 쿼리 문법을 사용하는 것과 유사하다.

@supports (display:flex) {
  .contents{display:flex; margin:0 5px; align-items:center; justify-content:space-between;}
  .contents div{flex-grow:1;}
}

@supports not (display:flex) {
  .contents{overflow:hidden;}
  .contents div{float:left; margin:0 5px;}
}

css 입력 영역에 @supports (조건) { 적용할 css내용 } 을 입력하면 된다.

 

위의 문법을 예시로 보면 display:flex 를 지원하는 브라우저에서는

.contents에 display:flex; margin:0 5px; align-items:center; justify-content:space-between;

.contents div 에 flex-grow:1 속성을 적용시키고

 

display:flex를 지원하지 않는 브라우저에서는

.contents에 overflow:hidden

.contents div에 float:left; margin:0 5px; 의 값을 적용시키게 한다는 내용이다.

 

 

이처럼 특정 css 속성이 지원하거나 지원하지 않는 상황에 따라

css값을 달리 적용할 수 있다.

 

2. @supports 의 응용

기본적으로 한 가지의 특정 css의 지원/미지원에 따른 css 적용 뿐만 아니라

and, or 같은 연산자를 사용해 특정 상황에 따른 css 적용 조건을 만들 수 있다.

 

1. and 연산자 : and를 기점으로 작성한 조건의 css가 모두 참일 경우 관련 css 값을 적용한다.

@supports (display:table) and (display:table-cell){
  .list{display:table;}
  .list li{display:table-cell;}
}

display:table과 display:table-cell을 동시에 지원하는 브라우저에서

.list와 .list li 에 입력한 css가 적용된다.

 

 

2. or 연산자 : or를 기점으로 둘 중 혹은 여러 개 중 하나라도 참일 경우 관련 css 값을 적용한다.

@supports (transform:rotate(45deg)) or (-webkit-transform:rotate(45deg)){
  .box{transform:rotate(45deg);}
}

transform:rotate(45deg) 나 -webkit-transform:rotate(45deg)의 css 중 하나라도 브라우저에서

지원을 하게된다면 .box에 입력한 css 가 적용된다.

 

3. @supports의 selector() 적용

브라우저에서 특정 선택자를 지원하는지도 @supports 문법을 통해 분별하고 스타일을 적용할 수 있다.

@supports selector(A > B){
  .contents > .box {background:#000;}
}

직계 자손 선택자 (>) 를 지원하는 브라우저일 경우에

.contents > .box에 입력한 css를 적용할 수 있게 만든다.

 

 

[!] selector() 를 사용할 때는 selector 문법 뒤에 띄어 쓰기 없이 selector(선택자 조건)을 입력한다.


selector (A ~ B){}   ---- X
selector(A ~ B){}    ---- O

 

 


 

developer.mozilla.org/ko/docs/Web/CSS/@supports

 

 

반응형
반응형

css를 이용해 position 값을 사용하다보면

주로 사용하는 position 값은 static, relative, absolute, fixed

이 4가지가 될 것이다.

 

그도 그럴것이 이번에 소개할 position 값인 sticky의 경우엔

IE(익스플로어)에선 아예 지원을 하지 않는 속성이기 때문에

평소에 사용하는데에 어려움이 있었다.

 

하지만 이젠 IE의 점유율이 줄어들어 IE를 고려하지 않는 작업이 많아지고

모바일 작업을 중점으로 하는 경우도 많기 때문에

position : sticky 에 대해 알아두면 좋을 것 같아서 포스팅 하게 되었다.

 

1. position : sticky 의 개념

sticky 라는 단어의 뜻에서 알 수 있듯이

sticky 속성값을 선언한 영역의 위치값을 고정시켜주는 역할을 한다.

 

백번의 설명보다 한 번의 예시가 더 도움이 될 것이다.

<style>
  .wrap{height:500px; overflow:hidden; overflow-y:scroll;}
  .inner{height:200px; background:skyblue;}
  .box{position:sticky; top:10px; left:10px; width:50px; height:50px; background:#000;}
</style>
<body>
  <div class="wrap">
    <div class="inner">
      <div class="box"></div>
    </div>
  </div>
</body>

위의 소스를 출력했다고 가정했을 때 아래와 같이 검은색 상자모양의 영역이 스크롤할 때에

고정이 되어 노출되는 것을 알 수 있다.

 

 

 

 

[!] 주의할 점은 position : sticky 를 사용하면 top, left와 같은 위치값을 반드시 작성해줘야 sticky 속성을 적용할 수 있다.

 

2. position : fixed와 position : sticky의 차이와 특징

위의 예시만 봤을 때 들 수 있는 생각은 fixed 속성과 sticky 가 뭐가 다르지? 라는

의문이 생길 수 있다.

 

아래의 예시를 보면 sticky의 특징을 더 잘 살펴봄과 동시에 fixed와의

차이점도 이해할 수 있다.

<style>
  .wrap{height:500px; overflow:hidden; overflow-y:scroll;}
  .inner{height:100px; background:skyblue;}
  .inner2{height:100px; background:#0f9d58;}
  .box{position:sticky; top:10px; left:10px; width:50px; height:50px; background:#000;}
</style>
<body>
  <div class="wrap">
    <div class="inner">
      <div class="box"></div>
    </div>
    <div class="inner2"></div>
  </div>
</body>

 

 

 
 

스크롤의 위치가 sticky 처리를 한 검은색 박스 영역의 부모 요소인

.inner 영역을 벗어나고 .inner2 영역으로 스크롤이 넘어가자

.box 영역은 더 이상 스크롤을 따라오지 않고 .inner 영역 끝 부분에 걸리게 된다.

 

즉 sticky 속성은 sticky 선언한 영역의 부모 요소 안에서만

고정되어 스크롤에 따라 움직이게 된다는 것을 알 수 있다.

 

그렇기 때문에 fixed와도 확연히 다르다는 것을 알 수 있다.

페이지 전체 영역을 기준으로 고정이 되는 fixed와 다르게

sticky의 경우는 부모요소를 기준으로만 움직이기 때문이다.

 

반응형
반응형

모바일 페이지 작업을 할 때 크롬 모바일 모드나 일반적인 디바이스에서는

문제없이 노출되던 텍스트들이

 

특정 디바이스 화면(몇몇 아이폰)에서 유독 크게 보이는 경우가 발생할 때가 있다.

이러한 경우 영역이 깨지거나 원하는 페이지를 표현하는데에 어려움이 생긴다.

 

이럴 때 사용하는 속성이 text-size-adjust 라는 css 속성이다.

 

text-size-adjust는 비표준 속성이므로 벤더 프리픽스를 사용해야한다.

 

1. text-size-adjust : none

default 속성(기본값)으로 화면의 크기에 따라 크기를 조정하지 않음을 명시한다.

 

2. text-size-adjust : auto

화면의 크기에 따라 크기를 자동으로 조정할 수 있게 한다.

(디바이스마다 그 크기가 달라질 수 있기 때문에 되도록 사용하지 않는다.)

 

3. text-size-adjust : % (퍼센트)

특정 퍼센트(%) 값을 줘서 크기를 조정한다.

100%의 값을 줘서 모든 디바이스에서 동일한 텍스트 크기를 만들 수도 있고

퍼센트 값을 낮게줘서 디바이스별로 동일하게 작게 줄 수도 있다.

 

 

 

사용하는 예시는 아래와 같다.

html, body{
  -webkit-text-size-adjust : none;  /* 크롬, 사파리, 오페라 신버전 */
  -ms-text-size-adjust : none;  /* IE */
  -moz-text-size-adjust : none;  /* 파이어폭스 */
  -o-text-size-adjust : none;  /* 오페라 구버전 */
}

 

 

주로 실무를 하면서 많이 사용했던 방법은

위의 소스와 같이 text-size-adjust : none 값을 선언하거나 100% 값을 주는 방법이다.

 

none의 경우 기본값이긴 하지만 특정 디바이스의 경우엔 해당 값이 무시되러 렌더링 되는 경우가

있기 때문에 한번 더 적용을 시킨다.

 

 

반응형
반응형

많이 사용하진 않지만 많이 사용하지 않기 때문에 놓치기 쉬운 css가 있다.

그 중 하나가 user-select 라는 속성인데

 

이 속성은 텍스트를 선택했을 때의 동작을 설정할 수 있는 속성이다.

* IE 작업시 IE9+ 부터 -ms- 프리픽스 적용 후 사용

1. user-select : auto (default)

기본 값은 auto로 텍스트를 더블클릭 혹은 드래그할 경우 선택된다.

 

테스트용 텍스트입니다. 이 부분을 클릭 혹은 드래그 하세요.

 

2. user-select : none

none의 경우 텍스트 영역이 클릭 및 드래그로 선택되지 않는다.

 

테스트용 텍스트입니다. 이 부분을 클릭 혹은 드래그 하세요.

 

3. user-select : all

all은 단순 클릭 한 번만으로 텍스트 영역이 선택된다.

 

테스트용 텍스트입니다. 이 부분을 클릭 혹은 드래그 하세요.

 

4. user-select : text

기본 값인 auto와 동일하게 텍스트를 더블클릭, 드래그로 선택할 수 있다.

(기본적으로 auto 값과 동일하게 생각하면 된다.)

 

테스트용 텍스트입니다. 이 부분을 클릭 혹은 드래그 하세요.

 

 

반응형

'Frontend > CSS' 카테고리의 다른 글

[css 속성] position sticky  (1) 2020.11.20
[css 속성] text-size-adjust (모바일 폰트 크기 조정 관련)  (0) 2020.10.13
[css 속성] border  (0) 2020.08.25
[css 속성] padding  (0) 2020.08.22
[css 속성] margin  (0) 2020.08.22
반응형

css로 원하는 영역에 테두리 효과를 주고싶을 때

border 속성을 사용한다.

 

1. border 속성의 특징

<style>
   .box {border:3px solid #333; background:yellow; width:300px; height:300px;}
</style>
<body>
   <div class="box"></div>
</body>
 

위와 같이 border 속성은 원하는 영역에 테두리 효과를 줄 수 있다.

border로 준 테두리는 실제 영역의 너비나 높이 값에 영향을 주게 되는데

 

위 예시의 경우 css로는 가로 300px, 세로 300px 의 값을 줬지만

실제 크기는 상하좌우 border 3px이 포함되어

총 너비는 가로 306px, 세로 306px이 된다.

 

2. border 속성의 사용

border는 margin, padding과 같이 상하좌우로 적용할 수 있고,

축약형으로도 사용이 가능하다.

 

ex) border-right: 1px solid #333 (우측에만 적용)  /  border:1px solid #333 (상하좌우에 적용)

 

뿐만 아니라

border는 1px solid #000 과 같이 한번에 속성들을 사용하는 것과 더불어

border-width, border-style, border-color 와 같이 각각의 사용도 가능하다.

border-width는 축약형과 마찬가지로
border-width: 1px 0  혹은  border-width: 1px 0 3px 1px 와 같이 사용할 수 있다.

border-width: 2px; (테두리 두께)

border-style: dashed; (테두리 스타일 - solid, dashed, dotted 등 여러 스타일이 있다.)

border-color: red (테두리 색상)

border: 2px dashed red (축약형)

 

 

반응형
반응형

margin과 비슷하게 padding은 간격을 조정할 때 주로 사용한다.

 

1. padding의 특징 (margin과 비교)

padding과 margin은 영역의 간격을 조정할 때 사용한다는 공통점이 있다.

하지만, padding은 margin과 다르게 padding의 값이 영역의 너비나 높이에 영향을 준 다는 점이 큰 차이점이라고 말할 수 있다.

<style>
  .box{padding:0 20px; width:200px; height:200px; background:skyblue;}
</style>
<body>
  <div class="box"></div>
</body>

해당 영역의 너비는 200px + 20px + 20px = 240px이다

 

위의 예시에서 확인할 수 있듯 padding값은 영역의 너비, 높이에 영향을 끼친다.

 

2. padding 값

padding은 margin과 마찬가지로

 

padding-top, padding-right, padding-bottom, padding-left 등의 세부 속성으로 사용할 수 있고,

padding: 0(위)  0(오른쪽)  0(아래)  0(왼쪽) 과 같이 축약형으로도 사용할 수 있다.

(축약형의 경우 위, 오른쪽, 아래, 왼쪽의 순서로 값을 적용한다.)

 

 

반응형

'Frontend > CSS' 카테고리의 다른 글

[css 속성] user-select (텍스트 선택, 드래그 설정)  (0) 2020.10.12
[css 속성] border  (0) 2020.08.25
[css 속성] margin  (0) 2020.08.22
[css 속성] box-sizing  (0) 2020.08.22
[css 응용] 이미지 세로 중앙 정렬  (0) 2020.05.23
반응형

마크업을 하면서 기본적인 요소들간의 간격을 위해서 margin값을 많이 사용한다.

단순한 간격을 비롯해 원한다면 특정 요소를 가운데로 정렬할 수도 있다.

 

1. margin 속성의 사용

margin값은 단순한 간격을 조정하는데에 가장 많이 사용한다.

특히 padding이나 border와는 다르게 영역의 너비나 높이 값에 영향을 주지 않는다.

 

width 200px, height 200px 의 영역이 있다고 했을 때

해당 영역에 padding:20px 을 적용할 때와 margin:20px 을 적용할 때의 너비, 높이는 다르다.

 

먼저, padding을 적용할 경우 width:240px, height:240px의 값을 갖게 되고

margin을 적용할 경우 width:200px, height:200px의 값을 그대로 갖게 된다.

 

2. margin 값

margin 속성은 상 하 좌 우 내가 원하는 요소에 값을 줄 수 있다.

<style>
  .box1{margin-top:5px;}
  .box2{margin-right:10px;}
  .box3{margin:5px 10px 0 0;}  /* 축약형 사용 */
</style>

margin-top, margin-right, margin-bottom, margin-left를 통해 원하는 방향에 원하는 값을 각각 줄 수도 있고,

margin: 0(위)  0(오른쪽)  0(아래)  0(왼쪽)와 같이 축약형을 사용해서 원하는 값을 한 번에 줄 수 있다.

(축약형의 경우 위, 오른쪽, 아래, 왼쪽의 순서로 값을 적용한다.)

 

3. margin 정렬 (auto)

margin을 사용해서 특정한 영역을 가운대로 정렬할 수 있다.

바로 margin의 auto값을 이용한 방법이다.

 

<style>
  .box{margin:0 auto; width:400px; height:200px; background:skyblue;}
</style>
<body>
  <div class="box"></div>
</body>

위와 같이 소스를 적용했을 때 

예시와 같이 특정 영역이 가운데 정렬한 모습을 볼 수 있다.

 

위와 같이 auto값을 사용할 때, 주의할 점이 있다.

너비 값(width)을 지정 해주지 않으면 가운데 정렬을 할 수 없다는 점이다.

 

 

반응형

'Frontend > CSS' 카테고리의 다른 글

[css 속성] border  (0) 2020.08.25
[css 속성] padding  (0) 2020.08.22
[css 속성] box-sizing  (0) 2020.08.22
[css 응용] 이미지 세로 중앙 정렬  (0) 2020.05.23
[css 단위] vw, vh, vmin, vmax (Viewport 단위)  (0) 2020.04.22
반응형

처음 css에 대해 배울 때 많이 헷갈리는 요소중에 하나가

border, padding 값이 포함된 영역의 너비, 높이 값을 정하는 작업이다.

 

1. 너비, 높이 값에 포함되는 속성

내가 원하는 너비와 높이 값을 지정을 했지만 개발자 도구나

실제 너비, 높이 값을 측정했을 때, 내가 지정한 값보다 너 크게 잡히는 경우가 있을 것이다.

 

이 경우 border, padding 값을 확인해봐야 한다.

<style>
  .box{width:200px; height:200px; background:skyblue;}
</style>
<body>
  <div class="box"></div>
</body>

위와 같은 코드인 경우 너비 200px, 높이 200px의 네모난 상자가 만들어 진다.

<style>
  .box{border:4px solid blue; padding:0 20px; width:200px; height:200px; background:skyblue;}
</style>
<body>
  <div class="box"></div>
</body>

하지만 위의 소스와 같이 border, padding 값이 들어간다면 값은 달라진다.

위의 이미지와 같이 기본 200px의 너비에 양쪽 border값 8px + 양쪽 padding 값 40px이 포함되어

너비는 248px이 된다.

 

높이 또한 기본 200px에 위 아래 border 8px 을 포함해 208px이 된다.

 

2. box-sizing의 사용

위와 같이 border, padding 값이 들어가게 되면 높이와 너비를 내가 원하는대로 맞추기가 어려워 진다.

실제로 너비 200px을 만들기 위해서는 padding, border 값을 뺀 기본 너비값을 입력을 해야한다.

예시와 같은 경우 200px - 8px(양쪽 border) - 40px(양쪽 padding) = 152px의 너비를 기본 너비값으로

css에서 정의를 해야한다.

 

하지만 box-sizing 속성을 사용하게 되면 border, paddding 값을 통해 일일이 너비 값을 계산하지 않아도 된다.

<style>
  .box{
    border:4px solid blue; 
    padding:0 20px; 
    width:200px; 
    height:200px; 
    background:skyblue; 
    box-sizing:border-box;
  }
</style>
<body>
  <div class="box"></div>
</body>

위와 같이 box-sizing:border-box 라는 값을 입력하면

내가 굳이 계산하지 않아도 200px을 width값으로 적용하면 border, padding 값을 계산해서

기본 너비값을 152px로 계산해준다.

 

3. box-sizing 속성

- content-box

box-sizing의 기본 값으로 너비나 높이 값에 border, padding의 값을 더해서 포함해 계산한다.

(width:100px; height:100px; padding:10px; box-sizing:content-box → width:120px, height:120px)

 

- border-box

너비나 높이 값에 border, padding값을 포함시키지 않고 기본 너비 값을 적용한다.

(width:100px; height:100px; padding:10px; box-sizing:boder-box → width:100px, height:100px)

 

 

반응형

'Frontend > CSS' 카테고리의 다른 글

[css 속성] padding  (0) 2020.08.22
[css 속성] margin  (0) 2020.08.22
[css 응용] 이미지 세로 중앙 정렬  (0) 2020.05.23
[css 단위] vw, vh, vmin, vmax (Viewport 단위)  (0) 2020.04.22
[css 속성] transition  (0) 2020.04.21
반응형

css를 사용하다보면

이미지를 세로 중앙 정렬이 필요한 경우가 매우 많이 있다.

 

그 방법에 대해 알아보려한다.

 

1. line-height와 vertical-align을 이용한 정렬

이미지를 감싸는 영역에 line-height값을 준 후에

img태그에 vertical-align:middle 속성을 사용하여 세로 중앙 정렬한다.

<style>
   .img_area{height:300px; line-height:300px;}
   .img_area img{vertical-align:middle;}
</style>
<body>
   <div class="img_area">
      <img src="./img/test.jpg" alt="test이미지">
   </div>
</body>

 

 2. 가상선택자 :after를 이용한 정렬

이미지를 감싸는 영역에 가상요소인 :after속성을 사용하여

세로 중앙 정렬을 한다.

<style>
   /* font-size:0을 사용하여 img_area영역 안에 여백을 없앤다. */
   .img_area{height:300px; font-size:0;}  
   .img_area:after{display:inline-block; height:100%; content:""; vertical-align:middle;}
   .img_area img{vertical-align:middle;}
</style>
<body>
   <div class="img_area">
      <img src="./img/test.jpg" alt="test이미지">
   </div>
</body>

위의 예시를 보면 img태그로 넣은 이미지 옆에

:after속성을 이용해 height:100%인 임의의 요소를 넣고

그 요소와 img태그와 vertical-align:middle 속성을 이용해 중앙 정렬을 맞춘다.

 

3. position:absolute 속성을 이용한 정렬

absolute를 이용해 중앙 정렬하는 방법은

크게 2가지로 나눌 수 있다.

 

고정된 이미지 크기를 가지고 있고

그 이미지의 크기를 확실히 알 경우에 쓸 수 있는

absolute와 margin-top 속성을 이용한 방법과

 

이미지 크기가 가변적이고

이미지 크기에 대한 정확한 정보가 없을 경우에 쓸 수 있는

absolute와 transform:translateY() 속성을 이용한 방법이 있다.

 

3-1. absolute & margin-top을 이용한 방법

<style>
   /* absolute를 사용하기 위해 감싸는 영역에 position:relative 적용 */
   .img_area{position:relative; height:300px;}  
   .img_area img{position:absolute; top:50%; margin-top:-100px; height:200px;} 
</style>
<body>
   <div class="img_area">
      <img src="./img/test.jpg" alt="test이미지">
   </div>
</body>

이미지 요소를 top 기준으로 50%만큼 이동 후에

이미지 높이값인 200px의 절반만큼을 margin-top의 마이너스 값으로 끌어 올린다.

 

이해를 쉽게하기 위해 아래의 예시를 준비했다.

위의 예시는 이미지 영역을 top:50%만 적용한 모습이다.

여기서 margin-top을 이미지의 높이값의 절반 만큼을 빼주면

위에 표시한 영역 만큼이 강제로 끌어올라가게 된다.

 

그래서 이미지 중앙 정렬을 맞출 수 있다.

 

3-2. absolute & transform 속성을 이용한 방법

<style>
   /* absolute를 사용하기 위해 감싸는 영역에 position:relative 적용 */
   .img_area{position:relative; height:300px;}
   /* 높이값이 고정되어 있지 않은 경우 */
   .img_area img{position:absolute; top:50%; transform:translateY(-50%);}
</style>
<body>
   <div class="img_area">
      <img src="./img/test.jpg" alt="test이미지">
   </div>
</body>

위쪽에서 설명한 absolute와 margin-top을 이용한 방법과 유사한 방법으로

margin-top은 정해진 px의 값을 빼서 끌어올린다면

 

transform:translate를 이용한 방법은 이미지 영역 높이의 퍼센트 값을 이용해서

끌어올리게 된다.

 

transform 속성의 특성상 ie9 이상부터 사용할 수 있다.

(ie9 버전의 경우 -ms- 프리픽스를 사용해서 속성을 추가해야한다.)

 

 

위에서 설명한 방법 외에도

display:table-cell을 사용하거나 display:flex를 사용하여

이미지 정렬을 쉽게 할 수 있는 방법들이 있다.

 

작업하는 환경과

상황에 맞춰서 알맞게 사용하면 좋을 것이다.

 

 

 

 

반응형

'Frontend > CSS' 카테고리의 다른 글

[css 속성] margin  (0) 2020.08.22
[css 속성] box-sizing  (0) 2020.08.22
[css 단위] vw, vh, vmin, vmax (Viewport 단위)  (0) 2020.04.22
[css 속성] transition  (0) 2020.04.21
[css 속성] z-index 우선순위 주기, z-index -(음수) 처리  (0) 2020.03.31
반응형

css에서 단위를 작성할 때,

주로 사용하는 px 외에도 pt, rem, em 등과 함께

vw, vh, vmin, vmax 라는 단위도 존재한다.

 

각 단위는 디바이스 혹은 브라우저의 크기 즉, viewport에 비례해서

크기가 적용되는 단위이다.

 

 

1. vw (Viewport Width)

뷰포트의 너비에 비례해서 값이 적용된다.

 

디바이스의 높이는 고려하지 않고

디바이스의 너비가 768px인 경우

100vw는 768px이 되고 1vw는 7.68px이 된다.

 

2. vh (Viewport Height)

뷰포트의 높이에 비례해서 값이 적용된다.

 

디바이스의 너비는 고려하지 않고

디바이스의 높이가 1024px인 경우

100vh는 1024px이 되고 1vh는 10.24px이 된다.

 

<style>
   .wrap{width:10vh; height:10vw;}
</style>

<body>
   <div class="wrap"></div>
</body>

768x1024 크기의 디바이스가 있다는 가정하에 (너비 768, 높이 1024)

 

위와 같이 .wrap 이라는 클래스의 영역에 width:10vh, height:10vw의 단위로

값을 지정하였을 경우

 

width는 높이 기준의 vh이기 때문에 102.4px

height는 너비 기준의 vw이기 때문에 76.8px 의 값이 지정된다.

 

3. vmin (Viewport Minimum)

뷰포트의 너비와 높이 중 더 작은 값이 적용된다.

 

<style>
   .wrap{width:10vmin; height:10vmin;}
</style>

<body>
   <div class="wrap"></div>
</body>

768x1024 의 디바이스 사이즈 기준

 

위와 같이 소스를 작성하게 된다면

너비와 높이 중 너비가 더 작은 값이니 768px을 기준으로

 

.wrap의 width, height 값은 76.8px이 된다.

 

4. vmax (Viewport Maximum)

뷰포트의 너비와 높이 중 더 큰 값이 적용된다.

 

<style>
   .wrap{width:10vmax; height:10vmax;}
</style>

<body>
   <div class="wrap"></div>
</body>

768x1024 의 디바이스 사이즈 기준

 

위와 같이 소스를 작성하게 된다면

너비와 높이 중 높이가 더 큰 값이니 1024px을 기준으로

 

.wrap의 width, height 값은 102.4px이 된다.

 

5. viewport 단위 사용시 주의사항

vw, vh, vmin, vmax와 같이 viewport 단위를 사용할 때는

브라우저 호환성을 고려해야한다. 일반적인 px이나 pt, em, rem과는 다르게

 

- vw와 vh의 경우 ie9+ 부터 적용이 가능하다.

- vmin의 경우 ie9에서는 vm 이라는 단위로 사용이 가능하다. (vmin -> vm)

- vmax는 ie에서는 지원이 되지 않는다.

 

위와 같은 주의사항이 있다.

 

https://caniuse.com/#search=vw

 

 

 

반응형
반응형

transition 은 css3에 추가된 속성으로 ie10 이상부터 사용이 가능하다.

 

명시적으로 원하는 영역에 어떤 속성을 움직이게 할지,

언제 애니메이션을 시작하게 할지, 얼마나 애니메이션을 지속할지,

그리고 어떻게 애니메이션을 실행할지에 대한 값을 지정하는 속성이다.

 

속성 설명
transition

transition 속성을 사용하는 축약형으로, 순서대로 작성시

transition: property || duration || timing-function || delay

순서로 작성하게 된다.

transition-property transition 효과를 줄 css 속성을 설정한다.
transition-duration transition 효과가 지속될 시간을 설정한다.
transition-timing-function transition 효과가 실행될 때의 효과를 설정한다. (easing)
transition-delay transition 효과를 시작하기 전까지의 대기 시간을 설정한다.

 

1. transition-property

원하는 css 속성에 transition 효과를 지정할 수 있고

지정한 css 속성만이 transition 효과를 가질 수 있다.

<style>
   .box{margin-bottom:8px; width:50px; height:50px; background:skyblue;}
   .box1{transition-property:all;}   /* 모든 css 속성(all)에 transition을 적용한다. */
   .box2{transition-property:width;}   /* width 속성에만 적용 */
   .box3{transition-property:width, height;}  /* width, height 속성에 적용 */
</style>
<body>
   <div class="box box1"></div>
   <div class="box box2"></div>
   <div class="box box3"></div>
</body>

 

2. transition-duration

transition 효과의 지속 시간을 정한다.

<style>
   .box{
     margin-bottom:8px;
     width:50px;
     height:50px;
     background:skyblue;
     transition-duration:0.5s;  /* transition 효과를 2초 동안 지속 */
   }
   .box1{transition-property:all;}
   .box2{transition-property:width;}
   .box3{transition-property:width, height;}
</style>
<body>
   <div class="box box1"></div>
   <div class="box box2"></div>
   <div class="box box3"></div>
</body>

 

3. transition-timing-function

transition 효과가 일어나는 효과를 줄 수 있다.

기본 값은 ease 효과이고

linear, steps, ease-in, ease-out

그리고 cubic-bezier(n,n,n,n)을 이용해서 원하는 효과를 만들 수도 있다.

<style>
   .box{
     margin-bottom:8px;
     width:50px;
     height:50px;
     background:skyblue;
     transition-duration:0.5s;
   }
   /* 기본 효과인 ease */
   .box1{
     transition-property:all;
   }
   /* ease-in 효과 */
   .box2{
     transition-property:width;
     transition-timing-function:ease-in;
   }
   /* steps 효과 */
   .box3{
     transition-property:width, height;
     transition-timing-function:steps(4, end);
   }
</style>
<body>
   <div class="box box1"></div>
   <div class="box box2"></div>
   <div class="box box3"></div>
</body>

 

4. transition-delay

transition 효과가 일어나기 전 대기 시간을 정한다.

<style>
   .box{
     margin-bottom:8px;
     width:50px;
     height:50px;
     background:skyblue;
     transition-duration:0.5s;
   }
   .box1{
     transition-property:all;
     transition-delay:0.5s;
   }
   .box2{
     transition-property:width;
     transition-timing-function:ease-in;
     transition-delay:0.3s;
   }
   /* transition-delay값 미입력시 delay없음 */
   .box3{
     transition-property:width, height;
     transition-timing-function:steps(4, end);
   }
   
   /* transition 확인을 위한 hover시 효과 적용 */
   .box:hover{width:100px; height:100px; background:red;}
</style>
<body>
   <div class="box box1"></div>
   <div class="box box2"></div>
   <div class="box box3"></div>
</body>

 

위에서 배운 transition 효과를 적용한 화면을 보자면 아래와 같다.

 

첫 번째 상자는 delay가 0.5초가량 된 후 width, height, background의 transition 효과가 적용이되고

 

두 번째 상자는 width값만 ease-is의 효과를 가지며 transition이 적용된다.

 

세 번째 상자는 width, height 값이 steps 효과를 가지며 transition이 적용된다.

 

 

 

 

 

 

 

반응형
반응형

css를 작성하면서 내가 원하는 컨텐츠가 다른 컨텐츠 뒤에 가려져서

난감한 경우가 종종 있다.

 

그런 경우를 해결하기 위해 사용하는 속성이 바로 z-index라는 속성이다.

 

z-index의 기본값은 auto 이고

보통 1, 9, 100, -1, -100등의 숫자로 그 속성의 값을 지정한다.

 

1. z-index 특징 (position값과의 연관성)

z-index의 가장 중요한 특징 중 하나는

아무 요소나 다 z-index를 넣는다고 해서 우선순위를 넣을 수 는 없다는 점이다.

 

z-index 속성이 적용되기 위해서는 

z-index를 적용한 영역이 position:static 값이 아니어야 한다.

<style>
   .wrap{position:relative;}
   .box1{background:skyblue; width:100px; height:100px; z-index:10;}
   .box2{position:absolute; top:0; left:0; background:pink; width:50px; height:50px; z-index:1;}
</style>
<body>
   <div class="wrap">
      <div class="box1">BOX1</div>
      <div class="box2">BOX2</div>
   </div>
</body>

 

BOX1
BOX2

분명 .box1 영역이 z-index:10 으로 설정해놓았기 때문에

더 위쪽에 위치해야할 것 같지만

실제로 출력되는 화면을 보면 .box2 영역이 .box1 영역을 덮고 있다.

 

그 이유가 바로 .box1에 position 값이 지정되어있지 않기 때문에

z-index 속성이 먹히지 않아서 이다.

 

그렇다면 .box1에 position:relative를 주게되면 어떻게 될까?

BOX1
BOX2

그렇게되면 위의 모습과 같이 z-index:10을 준 .box1 영역이 더 위쪽으로 오는 것을

확인할 수 있다.

 

2. z-index 특징 (같은 형제 요소와의 비교)

z-index의 가장 중요하면서 헷갈리기 쉬운 특징 중에 하나는

z-index의 비교 대상을 확인하는 것이다.

 

z-index는 같은 형제 요소에 선언된 z-index끼리 비교를 한다.

만약 같은 형제 요소끼리에서 z-index가 선언된 내용이 없으면

자식 요소의 z-index값을 가지고 확인한다.

 

위 내용을 예를 들면

<style>
 .wrap{position:relative;}
 .box1{position:absolute; top:0; left:0; background:skyblue; width:40px; height:40px; z-index:10;}
 .box2{position:absolute; top:0; left:0; background:pink; width:80px; height:80px; z-index:1;}
 .box2-1{position:absolute; top:0; left:0; background:red; width:60px; height:60px; z-index:999;}
</style>
<body>
   <div class="wrap">
      <div class="box1">
         BOX1
      </div>
      <div class="box2">
         BOX2
         <div class="box2-1">BOX2-1</div>
      </div>
   </div>
</body>

위의 소스를 보면 .box2-1 클래스영역에 z-index 값이 999이기 때문이 그 어느것보다도 

앞에 위치할 것 같은데...

BOX1
BOX2
BOX2-1

 

 

 

 

막상 노출되는 화면을 보면 위와 같이 box1 영역이 가장 위쪽으로 위치하게된다.

 

이는 .box1과 .box2 두 형제 요소끼리의 z-index 비교에서

이미 .box2영역이 z-index:1로 .box1의 z-index:10에서 밀리기 때문에

.box2 자식 요소로 있는 영역에 아무리 z-index를 많이 줘봤자

밀리게 된다.

 

원래 원하던대로 .box2-1를 가장 위쪽으로 위치하게 하기 위해선

.box2에 설정된 z-index:1; 을 제거하면 된다.

<style>
 .wrap{position:relative;}
 .box1{position:absolute; top:0; left:0; background:skyblue; width:40px; height:40px; z-index:10;}
 .box2{position:absolute; top:0; left:0; background:pink; width:80px; height:80px;}
 .box2-1{position:absolute; top:0; left:0; background:red; width:60px; height:60px; z-index:999;}
</style>
<body>
   <div class="wrap">
      <div class="box1">
         BOX1
      </div>
      <div class="box2">
         BOX2
         <div class="box2-1">BOX2-1</div>
      </div>
   </div>
</body>

 

BOX1
BOX2
BOX2-1

 

 

 

그렇게되면 .box1과 .box2-1의 z-index값을 비교하게 되어

원하는 값을 출력받을 수 있다.

 

3. z-index의 음수(-) 값

z-index로 우선순위를 지정하다보면

필요에 따라서 음수(-) 값을 주게되는 경우가 있다.

 

그런 경우 어떤 경우에는 내가 원하는대로 기존 값들의 뒤쪽에

잘 배치가 되는가하면

 

어떠한 경우에는 아예 내가 조정하려는 영역이 화면에서 사라지게 된다.

<style>
 .wrap{position:relative; height:100px; background:#fff;}
 .box1{position:absolute; top:0; left:0; background:skyblue; width:40px; height:40px;}
 .box2{position:absolute; top:0; left:0; background:pink; width:80px; height:80px;}
</style>
<body>
   <div class="wrap">
      <div class="box1">BOX1</div>
      <div class="box2">BOX2</div>
   </div>
</body>

위와 같은 소스가 있다고 가정하여

출력을 한다면

BOX1
BOX2

 

 

 

위와 같이 .box2 영역이 .box1을 덮는 형태로 출력이 될 것이다.

 

이 경우 .box1의 z-index를 조정하지 않고

.box2에 z-index를 음수(-) 로 줘서 조정할 수 있다고 생각할 수 있다.

 

실제로도 z-index를 음수 값을 줘서 조정하는 경우도 있다.

 

하지만 위의 소스같은 경우 .box2에 z-index 값을 음수로 주게되면

.box2 영역이 사라지는 것을 볼 수 있다.

<style>
 .wrap{position:relative; height:100px; background:#fff;}
 .box1{position:absolute; top:0; left:0; background:skyblue; width:40px; height:40px;}
 .box2{position:absolute; top:0; left:0; background:pink; width:80px; height:80px; z-index:-1;}
</style>
<body>
   <div class="wrap">
      <div class="box1">BOX1</div>
      <div class="box2">BOX2</div>
   </div>
</body>

 

BOX1
BOX

 

위의 소스를 출력하면 위와 같은 화면으로 출력이 된다.

 .box2는 어디에도 없다...

 

그 이유는 .wrap에 적용된 background:#fff 값 때문에 그렇다.

z-index 속성이 음수(-) 처리가 되면 기본적인 영역들의 바닥에 깔리게 되는데

 

부모 속성인 .wrap에 #fff 색상의 장판을 깔아서

그 아래에 들어간 .box2가 보이지 않게 된 것이다.

 

그래서 z-index 값을 음수(-)로 사용할 때는

부모 요소에 background가 없는지 확인하고

 

가능하면 이런 문제를 피하기 위해 음수가 아닌 양수의 값을

사용하도록 하는 것이 좋다.

 

 

반응형
반응형

css로 작업을 하다보면 내가 원하는 영역을

좌측 혹은 우측에 배치를 해야하는 경우가 많다.

 

텍스트의 경우는 text-align으로 배치를 할 수 있지만

텍스트가 아닌 일반 영역들 같은 경우는 다른 방법이 필요하다.

 

이럴 때 사용하는 것이 float라는 속성이다.

 

1. float 속성

float 속성에서 주로 사용하는 것은 float:left, float:right 속성이다.

말 그대로 원하는 영역을 왼쪽으로 정렬시키거나 오른쪽으로 정렬시키는 속성이다.

<style>
   .float_left{float:left; background:skyblue; width:150px; height:50px;}
   .float_right{float:right; background:greenyellow; width:150px; height:50px;}
</style>
<body>
   <div class="wrap">
      <div class="float_left">왼쪽정렬</div>
      <div class="float_right">오른쪽정렬</div>
   </div>
</body>

이런식으로 .float_left 클래스 영역은 왼쪽으로 .float_right 영역은 오른쪽으로 정렬할 수 있다.

 

그리고 텍스트와 float 설정된 영역이 같이 노출이 되는 경우엔 아래와 같이 노출된다.

<style>
   .float_left{float:left; background:skyblue; width:150px; height:50px;}
</style>
<body>
   <div class="wrap">
      <div class="float_left">왼쪽정렬</div>
      <p>텍스트가 노출이 되는 경우에는 float 속성이 어떻게 될지 궁금합니다. 
      텍스트가 노출이 되는 경우에는 float 속성이 어떻게 될지 궁금합니다. 
      텍스트가 노출이 되는 경우에는 float 속성이 어떻게 될지 궁금합니다. 
      텍스트가 노출이 되는 경우에는 float 속성이 어떻게 될지 궁금합니다.</p>
   </div>
</body>

 

<style>
   .float_right{float:right; background:greenyellow; width:150px; height:50px;}
</style>
<body>
   <div class="wrap">
      <div class="float_right">오른쪽정렬</div>
      <p>텍스트가 노출이 되는 경우에는 float 속성이 어떻게 될지 궁금합니다. 
      텍스트가 노출이 되는 경우에는 float 속성이 어떻게 될지 궁금합니다. 
      텍스트가 노출이 되는 경우에는 float 속성이 어떻게 될지 궁금합니다. 
      텍스트가 노출이 되는 경우에는 float 속성이 어떻게 될지 궁금합니다.</p>
   </div>
</body>

 

2. float 해제 (clearfix)

위와 같이 float를 사용하여 왼쪽 혹은 오른쪽 정렬을 했을 경우에

생각지도 못한 상황이 발생하곤 한다.

<style>
   .float_left{float:left; background:skyblue; width:150px; height:50px;}
   
   .text p{color:red;}
</style>
<body>
    <div class="wrap">
        <div class="float_left">왼쪽정렬</div>
        <p>왼쪽 영역에 대한 텍스트 내용입니다.</p>
    </div>
    <div class="text">
        <p>안녕하세요 반갑습니다.</p>
    </div>
</body>

위와 같이 float를 사용한 영역 아래에

.text라는 클래스를 사용해서 별도의 영역을 만들고자 했을 때,

원하던 모습이 아닌 .text 영역의 위치가 .wrap 영역과 겹쳐서 보이는 것을 확인할 수 있다.

 

이것은 float 속성 때문에 그렇게 되는건데

 

float를 사용하면 사용한 영역 자체가 화면에서 아예 띄워지게 된다.

position:absolute 하는 것과 마찬가지로 띄워지게 돼서

 

그 영역을 감싸고 있는 부분이 float한 부분까지 너비나 높이를 인식하지 못한다.

 

그렇기 때문에 .wrap의 영역은 .float_left 영역의 높이값이 무시된 상태로

p태그에 텍스트 영역만 높이을 인정받아 .text영역의 위치가 위와 같이 노출이 된 것이다.

 

이를 해결하기 위해서는 float 설정해놓은 것을 해제해줘야한다.

 

그래야 올바른 높이값을 잡고 레이아웃을 바로할 수 있다.

 

float를 해제할 수 있는 방법은 크게 3가지가 있다.

1. float한 요소의 부모요소에 overflow:hidden 속성 사용

2. float한 요소의 부모요소에 가상선택자 :after를 사용하여 clear해제

3. 임의의 div를 만들어 clear 속성을 사용한 해제

 

2-1. overflow:hidden 사용

<style>
   .wrap{overflow:hidden;}  /* float를 사용한 .float_left의 부모인 .wrap에 overflow:hidden 사용 */

   .float_left{float:left; background:skyblue; width:150px; height:50px;}
   
   .text p{color:red;}
</style>
<body>
    <div class="wrap">
        <div class="float_left">왼쪽정렬</div>
        <p>왼쪽 영역에 대한 텍스트 내용입니다.</p>
    </div>
    <div class="text">
        <p>안녕하세요 반갑습니다.</p>
    </div>
</body>

 

2-2. 가상선택자 :after 를 사용하여 clear 처리

float된 영역의 부모 요소에 :after 사용하여

 

display:block; clear:both; content:"";

 

속성을 사용하여 해제

<style>
   .wrap:after{display:block; clear:both; content:"";} /* 부모요소 wrap에 가상 요소를 사용하여 clear */

   .float_left{float:left; background:skyblue; width:150px; height:50px;}
   
   .text p{color:red;}
</style>
<body>
    <div class="wrap">
        <div class="float_left">왼쪽정렬</div>
        <p>왼쪽 영역에 대한 텍스트 내용입니다.</p>
    </div>
    <div class="text">
        <p>안녕하세요 반갑습니다.</p>
    </div>
</body>

 

2-3. 임의의 div에 clear 속성 사용하여 해제 (비추천)

<style>
   .float_left{float:left; background:skyblue; width:150px; height:50px;}
   
   .clearfix{clear:both;}  /* 임의의 div에 clear 속성을 추가하여 float 해제 */
   
   .text p{color:red;}
</style>
<body>
    <div class="wrap">
        <div class="float_left">왼쪽정렬</div>
        <p>왼쪽 영역에 대한 텍스트 내용입니다.</p>
    </div>
    <div class="clearfix"></div>
    <div class="text">
        <p>안녕하세요 반갑습니다.</p>
    </div>
</body>

위와 같은 방법은 불필요한 div가 clear를 위해서

추가되는 방법이라 가능하면 비추천한다.

 

 

위의 3가지 방법 중에 보통은 부모 요소에 overflow:hidden 속성을 사용해서

float를 해제하거나

 

부모 요소를 넘어가는 레이어나 다른 요소들이 있는 경우에는

(부모 요소의 범위를 넘어서 ui를 표현해야하는 경우)

 

가상요소 :after를 사용해서 float 해제해주는 방법을 추천한다.

 

반응형
반응형

css에서 position 속성은 내가 원하는 위치로 원하는 컨텐츠를 배치할 수 있는

중요한 속성이다.

 

static을 제외한 relative, absolute, fixed는 

top, left, bottom, right 속성과 함께 쓸 수 있다.

.test{position:absolute; top:0; left:100px;}

 

* 아래의 속성 외에 sticky라는 속성도 존재한다.

2020/11/20 - [Frontend/CSS] - [css 속성] position sticky

 

[css 속성] position sticky

css를 이용해 position 값을 사용하다보면 주로 사용하는 position 값은 static, relative, absolute, fixed 이 4가지가 될 것이다. 그도 그럴것이 이번에 소개할 position 값인 sticky의 경우엔 IE(익스플로어)에..

abcdqbbq.tistory.com

 

1. static

기본값으로 아무런 position값을 주지 않았을 경우 static이 적용된다.

position : static 일 경우 top, left 등의 조정 값들은 먹히지 않는다.

 

2. relative

주로 position : absolute; 속성과 함께 쓰이는 속성이다.

자식 요소에 적용된 absolute의 위치에 대해 기준을 잡는다.

 

3. absolute

position : relative 속성과 함께 쓰이는 속성이다.

가장 가까운 부모 요소에 있는 relative를 찾아서

그 요소의 위치를 기준으로 위치를 잡는다.

※ relative 뿐만 아니라 부모 요소에 fixed나 absolute로 설정이 되어있어도
   그 부모의 위치값을 기준으로 absolute를 잡는다.
<style>
  .wrap{padding:20px;}

  .box1{position:relative; border:1px solid #333; width:100px; height:100px;}
  .box2{background:skyblue; width:200px; height:200px;}

  .inr{position:absolute; top:0; left:0; width:50px; height:50px; color:#fff;}
  .box1 .inr{background:blue;}
  .box2 .inr{background:red;}
</style>
<body>
  <div class="wrap">
     <div class="box1">
        <div class="inr">box1 inr</div>
     </div>
     <div class="box2">
        <div class="inr">box2 inr</div>
     </div>
  </div>
</body>

위와 같은 상황을 예로 들었을 때,

 

.box1 안에 .inr는 .box1에 설정된 relative를 기준으로 top:0, left:0 이 적용 되었고

 

.box2 안에 .inr는 .box2가 relative가 설정되어있지 않고 그 위에 다른 부모 요소들에도

relative가 없어 기준을 잡을 부모가 없기 때문에 body태그에 top:0, left:0의 위치로 잡혔다.

 

4. fixed

absolute가 relative를 기준으로 위치를 잡는다면

fixed는 화면을 기준으로

말 그대로 아예 고정을 시켜버리는 것을 말한다.

<style>
  .wrap{padding:20px;}

  .box1{position:fixed; top:0; right:0; border:1px solid #333; width:100px; height:100px;}
  .box2{background:skyblue; width:200px; height:200px;}

  .inr{position:absolute; top:0; left:0; width:50px; height:50px; color:#fff;}
  .box1 .inr{background:blue;}
  .box2 .inr{background:red;}
</style>
<body>
  <div class="wrap">
     <div class="box1">
        <div class="inr">box1 inr</div>
     </div>
     <div class="box2">
        <div class="inr">box2 inr</div>
     </div>
  </div>
</body>

위의 예로 봤을 때,

.box1을 화면 기준으로 오른쪽으로 위로 고정을 시켜버렸고

그 안에 .inr도 fixed가 된 .box1을 기준으로 위치를 잡고있다.

 

fixed시킨 경우 화면을 기준으로 위치를 잡는거라 스크롤을 한다해도
항상 그 위치를 유지한다.

 

 

 

반응형
반응형

css 속성들 모든 것들이 다 중요하겠지만

특히나 전체적인 레이아웃을 이해하고 잡아나갈 때 중요한 것이

display 라는 속성이다.

 

이전에 따로 포스팅한 적이 있는 인라인, 블록 요소도

이 display 속성과 관련된 내용이다.

 

 

기본적으로 블록 요소의 특성을 가진 태그들은 (ex. div, p, h1~h6, ul, li...)

display:block의 속성을 기본 값으로 갖고있고

 

인라인 요소의 특성을 가진 태그들은 (ex. a, span, strong, em...)

display:inline의 속성을 기본 값으로 갖는다.

 

1. display 속성 값 (block, inline)

가장 기본적으로 사용되는 속성 값으로는

block, inline 속성이 있다.

 

html의 특성상 기본으로 가지고 있는 특성을

css에서 display라는 속성을 이용해 바꾸고 레이아웃을 잡아나갈 수 있다.

 

예를들어,

a태그를 가지고 사각형의 도형을 만들려할 때,

<style>
   a{width:50px; height:50px; background:#999;}
</style>

<body>
   <a href="#">test1</a>
</body>

위와 같은 소스를 작성하게 되면 아래와 같은 형태로 출력이 될 것이다.

그 이유는 a태그는 기본적으로 display:inline의 특성을 갖고 있기 때문에

inline은 width, height 값을 적용할 수 없기 때문에

 

width, height 값을 주기 위해서는  a태그의 display 속성을 변경해줘야한다.

<style>
   a{display:block; width:50px; height:50px; background:#999;}
</style>

<body>
   <a href="#">test1</a>
</body>

위의 소스 같이 a태그에 display:block 값을 적용하니

아래의 형태로 제대로 출력 되는 것을 볼 수 있다.

 

inline, block에 대한 좀 더 자세한 내용은 아래의 링크에서 확인할 수 있다.

2020/02/11 - [HTML] - HTML inline(인라인) vs block(블록) 요소

 

HTML inline(인라인) vs block(블록) 요소

HTML의 태그 요소는 HTML5 이전에 inline(인라인) 요소와 block(블록) 요소로 구분 되어왔다. HTML5에 들어서는 태그들을 단순히 인라인, 블록으로 구분하는 것이 아닌 Contents Model(컨텐츠 모델)로 각 태그별..

abcdqbbq.tistory.com

 

2. display 속성 값 (inline-block)

inline-block은 말 그래도 inline 속성 + block 속성을 더한 값이라고 생각할 수 있다.

inline 처럼 한 줄로 나열이 되면서

block 처럼 width나 height, margin, padding 등의 값을 줄 수 있다.

<style>
   a{display:inline-block; margin-right:5px; width:50px; height:50px; background:#999;}
</style>

<body>
   <a href="#">test1</a>
   <a href="#">test2</a>
   <a href="#">test3</a>
   <a href="#">test4</a>
</body>

위의 코드 작성시 아래의 화면처럼 출력 된다.

width, height, margin 값을 다 주면서도 일렬로 나열되는 모습을 볼 수 있다.

 

3. display 속성 값 (table)

table 태그를 사용하지 않아도

div나 다른 태그에 table의 속성을 부여해 table 태그처럼 사용할 수 있다.

 

<style>
   .div_table{display:table; border-collapse:collapse; width:400px; table-layout:fixed;}
   .div_table_row{display:table-row;}
   .div_table_cell{display:table-cell; border:1px solid #333; background:skyblue; color:#fff;}
</style>
<body>
   <div class="div_table">
      <div class="div_table_row">
         <div class="div_table_cell">table-cell1</div>
         <div class="div_table_cell">table-cell2</div>
      </div>
   </div>
</body>

위의 코드같이 작성을 하면 아래와 같은 형태로 출력이 된다.

display:table을 사용해서 .div_table 클래스를 table태그와 같게 만들고

display:table-row를 사용해서 .div_table_row 클래스를 tr태그와 같게 만들고

display:table-cell을 사용해서 .div_table_cell 클래스를 td태그와 같게 만들어서

 

table태그를 사용하지 않고 table 형태를 만들 수 있다.

 

* table 관련 display 속성

속성 설명
table <table> 태그의 역할로 사용
table-caption <caption> 태그의 역할로 사용
table-column-group <colgroup> 태그의 역할로 사용
table-header-group <thead> 태그의 역할로 사용
table-footer-group <tfoot> 태그의 역할로 사용
table-row-group <tbody> 태그의 역할로 사용
table-cell <td> 태그의 역할로 사용
table-column <col> 태그의 역할로 사용
table-row
<tr> 태그의 역할로 사용

 

4. 그 밖의 display 속성 값

flex(유동적 레이아웃), grid(그리드 레이아웃), list-item(li와 같이 리스트 표현) 등의 속성이 있다.

 

 

 

반응형
반응형

css를 배우고 실무에서 사용하다 보면 가상 클래스와 가상 요소 선택자라는 단어를 많이 들어볼 것이다.

 

실제로 두 선택자의 차이를 구분하지 못하고 두루뭉술하게 아는 경우가 많다.

 

그래서 가상 클래스와 가상 요소 선택자의 특징을 알아보고 차이점에 대해서 알아보려한다.

 

1. 가상 클래스

먼저 가상 클래스란

실제로 존재하는 요소에 특정 이벤트나 환경에 맞춰 가상으로 클래스를 줘서

css로 제어하는 것을 말한다.

 

예를 들어,

특정 a태그에 마우스를 올리면 색상을 변경하려고 한다.

이때 가상 클래스를 사용하지 않는다고 가정하면

 

a태그에 스크립트로 mouseover 이벤트를 걸어서

해당 a태그에 마우스 오버시 색상이 변경되는 클래스를 주게 만들어 처리를 해야할 것이다.

<style>
   a{color:#333;}
   a.on{color:#fff000;}   /* 마우스 올렸을 때 색상 변경용 클래스 */
</style>
<body>
   <a href="#">Button</a>

   <script>
      $("a").on("mouseover", function(){
         $(this).addClass("on");
      }).on("mouseout", function(){
         $(this).removeClass("on");
      });
   </script>
</body>

이처럼 하게되면 불필요한 스크립트나 클래스가 들어가게 된다.

 

 

이러한 상황에선 마우스 오버라는 이벤트 상황에 맞춰

실제로 존재하는 a태그에 가상으로 :hover라는 클래스를 줘서

간단하게 css로 색상을 제어할 수 있다.

<style>
   a{color:#333;}
   a:hover{color:#fff000;}   /* 마우스 올렸을 때 가상 클래스 :hover 사용해 색상 조정 */
</style>
<body>
   <a href="#">Button</a>
</body>

이처럼 css 가상 선택자만으로 간단하게 제어를 할 수 있다.

가상 클래스 설명
:active 해당하는 요소를 활성화 했을 때 즉, 클릭한 상태일 때 스타일 부여
:checked input 태그의 type이 checkbox나 radio일 경우 해당 태그가 체크 되어있을 때 스타일 부여
:disabled

선택, 클릭, 입력 등을 할 수 있는 요소에 비활성을 했을 때 스타일 부여

ex) input, button, a태그

:enabled

:disabled의 반대로 활성화 되어있는 요소에 스타일 부여

:empty 자식 요소가 없는 태그에 스타일 부여
:focus input 태그에 focus를 한 상태일 때 스타일 부여
:hover 해당 요소에 마우스를 올렸을 때 스타일을 부여
:link 미방문 링크에 스타일 부여
:visited 이미 방문한 링크에 스타일 부여
:not(selector)

(selector)를 제외한 나머지 요소들에 스타일 부여

ex) .main p:not(.cmt){color:red}

(.main 클래스 하위에 있는 p태그 중 .cmt 태그를 제외하고 color:red를 적용)

:read-only (읽기전용) input 태그에 readonly 속성을 지정한 요소에 스타일 부여
:required (필수입력) input 태그에  required 속성을 지정한 요소에 스타일 부여
:first-child

형제 요소 중 첫 번째 자식요소(맨 앞)에 스타일 부여

ex) .main div:first-child{color:red;}

(.main 클래스 자식 요소인 div 중 첫 번째 div에 color:red 적용)

 

* 만약 div 이전 형제요소 중 다른 태그가 있으면 스타일 적용이 어렵다.

<div class="main">

   <p>test1</p>

   <div>test2</div>

</div>

.main div:first-child{color:red}   ->  아무런 스타일 변화가 없다.

:first-of-type

형제 요소 중 해당하는 태그의 제일 첫 요소에 스타일 부여

ex)

<div class="main">

   <p>test1</p>

   <div>test2</div>

</div>

.main div:first-of-type{color:red}  ->  div태그 (test2)에 color:red가 적용된다.

:last-child 형제 요소 중 가장 마지막 요소에 스타일 부여
:last-of-type 형제 요소 중 해당하는 태그의 가장 마지막 요소에 스타일 부여
:nth-child(n)

n번째 요소에 스타일 적용,

n에 숫자 뿐만 아니라 even(짝수), odd(홀수), 2n+1 등 특정 수식을 줄 수 있다.

:nth-last-child(n) 뒤에서 n번째 요소에 스타일 부여
:only-child

형제 요소 중 유일하게 있는 요소에 스타일 부여 (다른 형제 요소가 있으면 스타일 적용x)

ex)

<div class="main">

   <div>test1</div>

   <p>test2</p>

</div>

 

.main div:only-child{color:red}  ->  div의 형제에 p태그가 있으므로 스타일 적용 x

:only-of-type

형제 요소 중 같은 유형의 형제가 없이 유일한 요소에 스타일 부여

 

ex)

<div class="main">

   <div>test1</div>

   <p>test2</p>

</div>

 

.main div:only-child{color:red}  ->  형제 요소 중 div는 하나기 때문에 스타일 적용

 

 

2. 가상요소

실제로 존재하는 요소에 가상으로 클래스를 주던 가상클래스와는 다르게

실제로 존재하지 않는 가상의 요소를 만들어 스타일을 주는 것을 말한다.

 

보통 콜론(:)을 사용하지만 가상 클래스와의 구분을 하기 위해

이중콜론(::)의 사용을 권장하고 있다.

 

(이중 콜론(::)은 ie9 이상 부터 지원한다.)

 

가상요소 설명
::before

지정된 요소의 앞에 가상의 요소 생성

<div class="main">

   <p>test1</p>

</div>

 

.main p:before{content:"- "}   ->  - test1로 출력된다. (- 표시를 before로 삽입)

::after 지정된 요소의 뒤에 가상의 요소 생성
::first-letter 지정된 요소의 첫 번째 글자에 스타일 적용
::first-line 지정된 요소의 첫 번째 줄에 스타일 적용

 

 

 

반응형
반응형

문서에 CSS를 적용한 후에 화면을 확인했을 때

 

내가 원하던 화면이 나오지 않은 경우가 있다.

 

<head>
   <style>
       section .dtl p{color:blue}
       .txt{color:red}
   </style>
</head>
<body>
   <section>
      <div class="dtl">
         <p>Test Text01</p>
         <p class="txt">Test Text02</p>
      </div>
   </section>
</body>

예를 들어 위의 소스와 같이 

section 영역 아래 .dtl 태그 자식요소로 있는 p 태그에 공통으로 파란색 컬러값을 주고

 

css를 조금 더 깔끔하게 쓰기 위해 다른 색상을 주고 싶은 p태그에 .txt 클래스를 준 뒤

.txt클래스에 빨간색 컬러값을 주면 출력되는 화면은

 

위의 화면과 같이 "Test Test01"과 "Test Test02" 둘 다 파란색의 컬러값이 출력이 될 것이다.

 

분명 원하던 색상은 "Test Test02" 영역이 빨간색으로 출력이 되어야 하지만 그렇게 되지 않았다.

 

이러한 문제는 css의 우선순위에 대해 고려를 하지 않아 생긴 문제이다.

 

 

1. CSS 우선순위

위의 예제를 보면 분명 .txt라는 클래스를 사용해서 p태그에 특정 색상을 적용했지만

적용되지 않았다.

 

그 이유는 .txt 값 이전에 .section .dtl p의 스타일 값 때문이다.

 

즉, .section .dtl p 에 적용된 스타일이 더 우선순위가 높기 때문이다.

 

★ css 우선순위 적용되는 스타일 (1 ~7 순위)

1.  !important
2.  <div style=""> (인라인 스타일)
3.  id (아이디값)
4.  class (클래스)
5.  :pseudo-class (가상 선택자)
6.  tag (일반 태그)
7.  * (전체 선택자)

 

* css의 우선순위표 (css를 입력하는 상황에 따라 점수로 계산을 한다.)

  1점 10점 100점 총점
!important 무조건 1등
#content (아이디값) 0 0 100 100
.section (클래스) 0 10 0 10
:fisrt-child (가상선택자) 0 10 0 10
p (태그) 1 0 0 1
p#content (아이디 + 태그) 1 0 100 101
#content.section (아이디 + 클래스) 0 10 100 110
p.section (클래스 + 태그) 1 10 0 11
#content .section (아이디 + 클래스) 0 10 100 110
ul li a (태그 + 태그 + 태그) 3 0 0 3
p:last-child (가상선택자 + 태그) 1 10 0 11
* (전체 선택자) 0 0 0 0

 

2. 실제 적용

아까 맨위에서 적용했던 "Test Text01", "Test Text02" 영역의 컬러값 적용 문제는

위의 CSS 우선순위 영역으로 확인해볼 때

section .dtl p{color:blue}  /* 클래스1 + 태그2 = 12점 */
.txt{color:red} /* 클래스1 = 10점 */

위와 같이 우선순위상 "Test Text02"의 색상값이 적용되는 p태그는 10점의 점수로

section .dtl p 영역의 스타일 값에 적용된 우선순위에서 밀리기 되므로 

color:red 스타일이 적용이 되지 않았다.

 

이를 해결하기 위해서는 .txt에 적용한 스타일의 우선순위를 높여주거나

.section .dtl p에 적용된 우선순위를 낮추는 방법이 있겠다.

section p{color:blue}   /* 태그2 = 2점 */
.txt{color:red}   /* 클래스1 = 10점 */

3. 동일한 우선순위일 때

클래스나 태그 등 동일한 우선순위의 점수를 가지고 있는 경우엔

더 뒤쪽에 스타일이 작성된 스타일이 적용되게 된다.

 

<head>
   <style>
       section .dtl p{color:blue}  /* 클래스1 + 태그2 = 12점 */
       .section div p{color:red}   /* 클래스1 + 태그2 = 12점 */
   </style>
</head>
<body>
   <section class="section">
      <div class="dtl">
         <p>Test Text01</p>
         <p>Test Text02</p>
      </div>
   </section>
</body>

(더 아래쪽에 적용한 스타일인 color:red가 적용되었다.)

 

 

 

반응형
반응형

앞서 HTML 소스가 있는 문서에 CSS를 적용하는 3가지 방법에 대해 살펴 보았다.

 

2020/02/18 - [CSS] - CSS 적용을 위한 3가지 방법

 

인라인, 내부스타일, 외부스타일 적용 방법 외에 추가로

css를 적용하는 방법이 바로 @import 방식이다.

 

@import 방식은 다른 스타일 시트에서 또 다른 스타일을 가져올 때 사용한다.

 

예를 들면 default.css 라는 파일을 외부 스타일 방식을 적용해서

문서에 적용시킨 후에 해당 css파일 안에 또 다른 css를 불러 오는 방법이다.

 

 

1. @import 적용 방법

 

1. 문서에 default.css 파일 적용

<link rel="stylesheet" href="/css/default.css">

 

2. default.css 파일 내에 header.css 를 @import (문자형식으로 적용하거나 url 형식으로 적용)

@charset "utf-8";

@import "header.css";      /* 문자 형식 */
@import url("header.css"); /* url 형식 */

 

2. @import 방식 vs link 방식(외부 스타일)

@import 방식과 link 방식 중 어떤 방법이 더 효율적일까를 고민해보았다.

 

결론부터 말하자면 link 방식 (외부 스타일) 방식이 더 효율 적이다.

 

@import 방식의 경우 @import 된 css들을 직렬 로딩 방식으로 불러오고

 

외부 스타일 방식의 경우 병렬 로딩 방식으로 css를 불러온다

 

쉽게 예를 들자면

charset "utf-8";

@import "test1.css";  /* 1번째 */
@import "test2.css";  /* 2번째 */
@import "test3.css";  /* 3번째 */

위와 같은 @import 방식의 경우 test1.css를 불러온 뒤에 test2.css, test3.css를 차례로 불러온다.

 

즉, css를 하나하나 순차적으로 불러오기 때문에(직렬 로딩)

css의 양이 얼마 되지 않는다면 크게 상관이 없겠지만

css의 양이 방대해진다면 페이지 로딩속도가 현저히 느려질 것이다.

 

 

<link rel="stylesheet" href="test1.css">
<link rel="stylesheet" href="test2.css">
<link rel="stylesheet" href="test3.css">

반면 link 방식 (외부 스타일 방식)의 경우 

test1.css와 test2.css, test3.css가 동시에 로딩하여 불러오기 때문에(병렬 로딩)

 

페이지 로딩 속도가 @import 방식에 비해 빠르고 효율적이다.

 

3. @import 방식의 Edge 브라우저 적용 문제

@import 방식은 익스플로어나 크롬, 파이어폭스 등 다른 브라우저에서는

별 문제 없이 잘 적용을 할 수 있지만

 

엣지(Edge) 브라우저에서는 @import 한 css 내용을 문서에 적용시키지 못하는 버그가 있다.

 

 

로딩 문제나 Edge 브라우저 버그 문제 등을 생각해본다면

특별한 경우가 아니라면 @import 방식이 아닌 외부 스타일 방식으로 css를 적용하는 편이 좋을 것 같다.

 

 

 


참조

https://www.w3schools.com/cssref/pr_import_rule.asp

 

CSS @import Rule

CSS @import Rule Example Import the "navigation.css" style sheet into the current style sheet: @import "navigation.css"; /* Using a string */ or @import url("navigation.css"); /* Using a url */ More examples below. Definition and Usage The @import rule all

www.w3schools.com

 

반응형

'Frontend > CSS' 카테고리의 다른 글

[css 속성] display (block, inline, inline-block, table)  (0) 2020.03.06
가상 클래스 vs 가상 요소  (0) 2020.03.06
CSS 우선순위  (0) 2020.03.04
CSS Reset (초기화)  (0) 2020.02.19
CSS 적용을 위한 3가지 방법  (0) 2020.02.18
반응형

각 브라우저마다 설정 되어있는 기본 스타일이 다 다르다.

 

이러한 점을 개선하기 위해 CSS를 작성할 때, 초기화를 시킨다.

 

기본적으로 태그가 가지고 있는 간격이나 색상 등을 통일 시키는 작업이다.

 

 

CSS 초기화를 위해 사용하는 몇몇 Reset css를 소개해보려고 한다.

 

아래의 Reset css를 본인이 필요한 부분을 추가하고 보완하면서

필요에 맞게 수정해서 사용하면 되겠다.

 

1. Eric Meyer’s “Reset CSS” 2.0

Eric Meyer 라는 분이 만든 Reset css 이다.

매우 기본적인 내용들을 담고 있다.

 

/* http://meyerweb.com/eric/tools/css/reset/ 
   v2.0 | 20110126
   License: none (public domain)
*/

html, body, div, span, applet, object, iframe,
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
a, abbr, acronym, address, big, cite, code,
del, dfn, em, img, ins, kbd, q, s, samp,
small, strike, strong, sub, sup, tt, var,
b, u, i, center,
dl, dt, dd, ol, ul, li,
fieldset, form, label, legend,
table, caption, tbody, tfoot, thead, tr, th, td,
article, aside, canvas, details, embed, 
figure, figcaption, footer, header, hgroup, 
menu, nav, output, ruby, section, summary,
time, mark, audio, video {
	margin: 0;
	padding: 0;
	border: 0;
	font-size: 100%;
	font: inherit;
	vertical-align: baseline;
}
/* HTML5 display-role reset for older browsers */
article, aside, details, figcaption, figure, 
footer, header, hgroup, menu, nav, section {
	display: block;
}
body {
	line-height: 1;
}
ol, ul {
	list-style: none;
}
blockquote, q {
	quotes: none;
}
blockquote:before, blockquote:after,
q:before, q:after {
	content: '';
	content: none;
}
table {
	border-collapse: collapse;
	border-spacing: 0;
}

 

2. Normalize.css 1.0

가장 기본적인 Eric Meyer의 reset.css 와는 다르게

세부적인 항목을 초기화 시키고 약간의 스타일도 가미 되어있는 css이다.

 

/*! normalize.css v3.0.2 | MIT License | git.io/normalize */

/**
 * 1. Set default font family to sans-serif.
 * 2. Prevent iOS text size adjust after orientation change, without disabling
 *    user zoom.
 */

html {
  font-family: sans-serif; /* 1 */
  -ms-text-size-adjust: 100%; /* 2 */
  -webkit-text-size-adjust: 100%; /* 2 */
}

/**
 * Remove default margin.
 */

body {
  margin: 0;
}

/* HTML5 display definitions
   ========================================================================== */

/**
 * Correct `block` display not defined for any HTML5 element in IE 8/9.
 * Correct `block` display not defined for `details` or `summary` in IE 10/11
 * and Firefox.
 * Correct `block` display not defined for `main` in IE 11.
 */

article,
aside,
details,
figcaption,
figure,
footer,
header,
hgroup,
main,
menu,
nav,
section,
summary {
  display: block;
}

/**
 * 1. Correct `inline-block` display not defined in IE 8/9.
 * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.
 */

audio,
canvas,
progress,
video {
  display: inline-block; /* 1 */
  vertical-align: baseline; /* 2 */
}

/**
 * Prevent modern browsers from displaying `audio` without controls.
 * Remove excess height in iOS 5 devices.
 */

audio:not([controls]) {
  display: none;
  height: 0;
}

/**
 * Address `[hidden]` styling not present in IE 8/9/10.
 * Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22.
 */

[hidden],
template {
  display: none;
}

/* Links
   ========================================================================== */

/**
 * Remove the gray background color from active links in IE 10.
 */

a {
  background-color: transparent;
}

/**
 * Improve readability when focused and also mouse hovered in all browsers.
 */

a:active,
a:hover {
  outline: 0;
}

/* Text-level semantics
   ========================================================================== */

/**
 * Address styling not present in IE 8/9/10/11, Safari, and Chrome.
 */

abbr[title] {
  border-bottom: 1px dotted;
}

/**
 * Address style set to `bolder` in Firefox 4+, Safari, and Chrome.
 */

b,
strong {
  font-weight: bold;
}

/**
 * Address styling not present in Safari and Chrome.
 */

dfn {
  font-style: italic;
}

/**
 * Address variable `h1` font-size and margin within `section` and `article`
 * contexts in Firefox 4+, Safari, and Chrome.
 */

h1 {
  font-size: 2em;
  margin: 0.67em 0;
}

/**
 * Address styling not present in IE 8/9.
 */

mark {
  background: #ff0;
  color: #000;
}

/**
 * Address inconsistent and variable font size in all browsers.
 */

small {
  font-size: 80%;
}

/**
 * Prevent `sub` and `sup` affecting `line-height` in all browsers.
 */

sub,
sup {
  font-size: 75%;
  line-height: 0;
  position: relative;
  vertical-align: baseline;
}

sup {
  top: -0.5em;
}

sub {
  bottom: -0.25em;
}

/* Embedded content
   ========================================================================== */

/**
 * Remove border when inside `a` element in IE 8/9/10.
 */

img {
  border: 0;
}

/**
 * Correct overflow not hidden in IE 9/10/11.
 */

svg:not(:root) {
  overflow: hidden;
}

/* Grouping content
   ========================================================================== */

/**
 * Address margin not present in IE 8/9 and Safari.
 */

figure {
  margin: 1em 40px;
}

/**
 * Address differences between Firefox and other browsers.
 */

hr {
  -moz-box-sizing: content-box;
  box-sizing: content-box;
  height: 0;
}

/**
 * Contain overflow in all browsers.
 */

pre {
  overflow: auto;
}

/**
 * Address odd `em`-unit font size rendering in all browsers.
 */

code,
kbd,
pre,
samp {
  font-family: monospace, monospace;
  font-size: 1em;
}

/* Forms
   ========================================================================== */

/**
 * Known limitation: by default, Chrome and Safari on OS X allow very limited
 * styling of `select`, unless a `border` property is set.
 */

/**
 * 1. Correct color not being inherited.
 *    Known issue: affects color of disabled elements.
 * 2. Correct font properties not being inherited.
 * 3. Address margins set differently in Firefox 4+, Safari, and Chrome.
 */

button,
input,
optgroup,
select,
textarea {
  color: inherit; /* 1 */
  font: inherit; /* 2 */
  margin: 0; /* 3 */
}

/**
 * Address `overflow` set to `hidden` in IE 8/9/10/11.
 */

button {
  overflow: visible;
}

/**
 * Address inconsistent `text-transform` inheritance for `button` and `select`.
 * All other form control elements do not inherit `text-transform` values.
 * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.
 * Correct `select` style inheritance in Firefox.
 */

button,
select {
  text-transform: none;
}

/**
 * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`
 *    and `video` controls.
 * 2. Correct inability to style clickable `input` types in iOS.
 * 3. Improve usability and consistency of cursor style between image-type
 *    `input` and others.
 */

button,
html input[type="button"], /* 1 */
input[type="reset"],
input[type="submit"] {
  -webkit-appearance: button; /* 2 */
  cursor: pointer; /* 3 */
}

/**
 * Re-set default cursor for disabled elements.
 */

button[disabled],
html input[disabled] {
  cursor: default;
}

/**
 * Remove inner padding and border in Firefox 4+.
 */

button::-moz-focus-inner,
input::-moz-focus-inner {
  border: 0;
  padding: 0;
}

/**
 * Address Firefox 4+ setting `line-height` on `input` using `!important` in
 * the UA stylesheet.
 */

input {
  line-height: normal;
}

/**
 * It's recommended that you don't attempt to style these elements.
 * Firefox's implementation doesn't respect box-sizing, padding, or width.
 *
 * 1. Address box sizing set to `content-box` in IE 8/9/10.
 * 2. Remove excess padding in IE 8/9/10.
 */

input[type="checkbox"],
input[type="radio"] {
  box-sizing: border-box; /* 1 */
  padding: 0; /* 2 */
}

/**
 * Fix the cursor style for Chrome's increment/decrement buttons. For certain
 * `font-size` values of the `input`, it causes the cursor style of the
 * decrement button to change from `default` to `text`.
 */

input[type="number"]::-webkit-inner-spin-button,
input[type="number"]::-webkit-outer-spin-button {
  height: auto;
}

/**
 * 1. Address `appearance` set to `searchfield` in Safari and Chrome.
 * 2. Address `box-sizing` set to `border-box` in Safari and Chrome
 *    (include `-moz` to future-proof).
 */

input[type="search"] {
  -webkit-appearance: textfield; /* 1 */
  -moz-box-sizing: content-box;
  -webkit-box-sizing: content-box; /* 2 */
  box-sizing: content-box;
}

/**
 * Remove inner padding and search cancel button in Safari and Chrome on OS X.
 * Safari (but not Chrome) clips the cancel button when the search input has
 * padding (and `textfield` appearance).
 */

input[type="search"]::-webkit-search-cancel-button,
input[type="search"]::-webkit-search-decoration {
  -webkit-appearance: none;
}

/**
 * Define consistent border, margin, and padding.
 */

fieldset {
  border: 1px solid #c0c0c0;
  margin: 0 2px;
  padding: 0.35em 0.625em 0.75em;
}

/**
 * 1. Correct `color` not being inherited in IE 8/9/10/11.
 * 2. Remove padding so people aren't caught out if they zero out fieldsets.
 */

legend {
  border: 0; /* 1 */
  padding: 0; /* 2 */
}

/**
 * Remove default vertical scrollbar in IE 8/9/10/11.
 */

textarea {
  overflow: auto;
}

/**
 * Don't inherit the `font-weight` (applied by a rule above).
 * NOTE: the default cannot safely be changed in Chrome and Safari on OS X.
 */

optgroup {
  font-weight: bold;
}

/* Tables
   ========================================================================== */

/**
 * Remove most spacing between table cells.
 */

table {
  border-collapse: collapse;
  border-spacing: 0;
}

td,
th {
  padding: 0;
}

 

3. 그 밖의 초기화 CSS

- HTML5 Doctor CSS Reset : Eric Meyer의 Reset css를 기반으로 작성

https://cssreset.com/scripts/html5-doctor-css-reset-stylesheet/

 

- Yahoo! (YUI 3) Reset CSS : Yahoo에서 만든 Reset css

https://cssreset.com/scripts/yahoo-css-reset-yui-3/

 

 

 


 

참고 사이트

 

 

https://cssreset.com/

 

CSS Reset - 2019's most common CSS Resets to copy/paste, with documentation / tutorials

This short post talks about creating a stylish focus effect on input text elements using a pure CSS solution. The animation shows a colored bottom border gradually appearing on the input text focus and completing the animation in half of […] Read Article A

cssreset.com

 

반응형
반응형

HTML 문서를 작성하고 스타일을 입히기 위해선

CSS를 적용해야 한다.

 

CSS를 적용하는 방법에는 크게 3가지가 있다.

 

1. 인라인 방식

태그에 직접 style="" 속성을 사용하여 스타일을 적용하는 방법이다.

 

<div style="text-align:center;">
   <p style="font-size:13px;">Hello World</p>
   <span style="color:#999; font-size:11px;">안녕하세요</span>
</div>

 

 

2. 내부 스타일 방식 (style태그)

<style> 태그를 사용해서 css를 작성한다.

주로 <head></head> 태그 안에 작성한다.

 

그리고 HTML5 이전엔 <style> 태그에 type 속성을 사용하였다.

<style type="text/css"> 라는 style 태그가 text/css의 타입으로 작성 되었다는 명시가 필요했지만

HTML5 이후론 더 이상 필요하지 않다.

 

<head>
   <style>
      div{text-align}
      p{font-size:13px;}
      span{color:#999; font-size:11px;}
   </style>
</head>

 

 

3. 외부 스타일 방식 (link태그)

<head>태그 안에 <link> 태그를 사용해서 별도의 css파일을 불러온다.

속성 설명
rel

연결된 문서와의 관계

type

연결된 문서의 타입

href

연결된 문서의 위치 (css파일의 위치)

 

<head>
   <link rel="stylesheet" type="text/css" href="./css/layout.css">
</head>

 

반응형

'Frontend > CSS' 카테고리의 다른 글

[css 속성] display (block, inline, inline-block, table)  (0) 2020.03.06
가상 클래스 vs 가상 요소  (0) 2020.03.06
CSS 우선순위  (0) 2020.03.04
CSS 적용을 위한 또 다른 방법, @import  (0) 2020.03.03
CSS Reset (초기화)  (0) 2020.02.19

+ Recent posts