0044 CSS의 길이(length) 중 상대 길이(relative length)


앞에서 CSS절대 길이(absolute length)를 다루면서 웹페이지는 모니터 스크린에 구현되므로 절대 길이(absolute length) 중에서 픽셀(px)을 자주 사용한다는 점에 대해서 언급했다. 하지만 절대 길이(absolute length) 보다는 상대 길이(relative length)를 사용하는 경우가 훨씬 더 많다

       

상대 길이(relative length)란 것은 다른 기준이 되는 길이에 비례하여 결정되는 길이를 말한다. 여기에서 기준이 되는 길이를 어떤 것으로 잡느냐에 따라서 다양한 상대 길이(relative length)가 나온다. 

      

W3C의 튜토리얼에서 상대 길이(relative length)로 제시하는 단위들은 다음과 같다. 

     

em, ex, ch, rem, vw, vh, vmin, vmax, %


각각의 설명은 다음과 같다. 

     

em : 현재 요소의 텍스트 크기1em으로 하는 단위

ex : 현재 텍스트 크기에서 소문자 x의 높이1ex로 하는 단위

ch : 현재 텍스트 크기에서 숫자 "0"의 너비1ch로 하는 단위

rem : 루트 요소의 텍스트 크기1rem으로 하는 단위이다. 

vw : 화면(viewport) 너비(width)의 1%1vw로 하는 단위

vh : 화면(viewport) 높이(height)의 1%1vh로 하는 단위

vmin : 1vw와 1vh 중 작은 쪽1vmin으로 하는 단위

vmax : 1vw와 1vh 중 큰 쪽1vmax로 하는 단위

% : 부모 요소의 텍스트 크기에 비례하는 단위  (이 부분은 조금 잘못되었다.)


이 중에서 ex, ch, rem은 많이 사용하지 않는 단위들이고 vw, vh, vmin, vmax화면(viewport) 크기를 기준으로 상대적인 크기를 갖는 단위이므로 다음 기회에 살펴보고 가장 자주 사용하는 em% 자세히 살펴보자. 

    

최근 CSS 관련 포스팅을 하지 못하고 있는 이유는 em%의 개념이 헷갈려 이것 저것 찾다가 결국 결론을 내리지 못했기 때문이다.

     

em%에 대한 W3C 튜토리얼의 정의는 다음과 같다.

     

em : 현재 요소의 텍스트 크기를 1em으로 하는 단위

% : 부모 요소의 텍스트 크기에 비례하는 단위


이 설명은 정확하지 않다. 위의 설명에 따르면 em % 모두 텍스트 크기를 기준으로 작동한다고 설명하고 있지만 실험해보면 em은 확실히 텍스트 크기를 기준으로 작동한다. 하지만 퍼센트(%)는 다양한 기준이 있다. 가령 다음과 같은 HTML을 작성해서 0044.html로 저장하고 실행해보자. (0044example.zip

     

<!DOCTYPE html>

    

<html>

<head>

<title>relative size</title>

</head>

<body style="font-size: 2em;">

<p style="font-size: 50%;">

첫 번째 p요소의 폰트 사이즈는 50%인 16px

</p>

<p style="font-size: 1em;">

두 번째 p 요소의 폰트 사이즈는 1em인 32px<br />

이미지는 높이 3em, 너비 100%<br />

<img src="sun.jpg" style="height: 3em; width: 100%;" alt="sun" />

</p>

</body>

</html>


모든 브라우저의 기본 텍스트 크기는 보통 16px로 설정되어 있다. 

       

따라서 <body> 요소에 적용되는 텍스트의 크기는 16px이고 이 상황에서 텍스트의 크기를 2em으로 설정되었을 때, 2em32px(2×16px)가 된다. 

     

<p> 요소는 <body> 요소의 을 받으므로 텍스트의 크기 32px로 설정된다. 

     

font-size 속성(property)에는 em이나 % 모두 동일하게 작용한다. em의 수치에 100을 곱하면 %가 나오는 관계로 아주 심플하다. 그래서 첫 번째 <p> 요소의 font-size50% 이므로 이는 0.5em이고 16px가 된다. 그리고 두 번째 <p> 요소의 font-size1em 이므로 이는 100%이고 32px가 된다. W3C에서 제시한 설명은 %는 부모 요소의 텍스트 크기를 기준으로 하고 em은 현재 요소의 텍스트 크기를 기준으로 한다고 설명되어 있지만 실제 font-size에 적용해보면 부모 요소를 기준으로 하거나 현재 요소를 기준으로 하는 경우에도 차이가 없다.

     

하지만 우리가 지금 이야기하고 있는 것은 텍스트의 크기 뿐만 아니라 상대 길이(relative length)에 대하여 이야기하고 있는 것이므로 이 상대 길이를 다른 것에 적용할 때 어떻게 달라지는지 살펴볼 필요가 있다. 

    

0044.html에는 <p> 요소 내부에 <img /> 요소를 중첩시켜 놓았다. 

그리고 그 <img /> 요소의 크기(size) style="height: 3em; width: 100%;" 으로 높이3em이고 비가 100%로 규정해놓았다. W3C에서 제시한 바에 따르면 이런 경우 너비<p> 요소의 텍스트 크기인 32px가 되어야 할 것이다.

       

이제 0044.html을 실행해보자. 



가장 위의 첫 번째 <p> 요소는 텍스트 크기가 16px로 설정되어 있고, 그 아래의 두 번째 <p> 요소는 32px로 나타난다. 텍스트 크기를 결정하는 font-size 속성(property)에서는 em%완전히 동일하게 작동한다. 

     

하지만 이미지의 크기에서는 전혀 다르다. 위의 결과에서 이미지의 높이3em으로 설정되어 있다. 해당 이미지의 여백까지 생각하면 얼추 96px(3×32px)로 제대로 작동하고 있는 것 같다. 하지만 너비(width)100%이므로 32px가 되어야 하는데 가로폭을 완전히 차지하는 모양으로 나타난다.

     

이는 브라우저 창의 가로폭을 이리저리 변화시켜 보아도 이미지는 항상 가로폭 전체에 걸쳐 나타나도록 변형되는 것을 다음과 같이 확인할 수 있다.



이는 결국, <img /> 요소의 너비로 부과된 100%브라우저 창의 가로폭 전체를 의미한다는 것을 알 수 있다. 즉, W3C에서 설명한 것과는 다르게 부모 요소의 텍스트 크기를 반영하는 것이 아니라 너비처럼 해당 CSS 속성(property)에 설정된 별도의 기준작동하는 것을 알 수 있다. 

      

반대로, em<img /> 요소의 크기를 결정하는 상대 길이(relative length)를 결정할 때에도 font-size를 기준으로 해당 크기를 적용하고 있다. 

     

이외에도 이리저리 실험을 계속해본 결과 다음과 같은 사실을 알게 되었다. 

      

em은 기존의 설명대로 현재 요소의 텍스트 크기를 1em으로 하는 단위라고 하면 된다. 하지만 %는 부모 요소의 텍스트 크기가 아닌 그냥 %가 쓰이는 해당 속성(property) 크기에 비례하는 단위로 수정하면 타당하다.

      

em은 해당 요소의 font-size1em으로 하는 값이고 이 값은 다른 CSS 속성에도 그대로 적용할 수 있다. 즉, 다른 CSS 속성의 길이(length)해당 요소의 텍스트 크기에 따라서 상대적인 길이로 조정되는 것이다. 

하지만 %는 각각의 CSS 속성 별로 정해진 별도의 길이를 기준으로 작동한다. font-size 속성에서는 %의 기준이 부모 요소font-size 속성값을 기준으로 비례하지만 해당 %width로 가져가면 이는 부모 요소width 속성값을 기준으로 비례하지 해당 요소의 font-size 속성을 기준으로 비례하지 않는다. 또, %는 어떤 경우에는 작동하지 않는 것 처럼 보이기도 한다. 

     

가령, CSS에서 border 속성경계선의 두께%로 주면 경계선이 나타나지 않는다. 즉, 다음과 같은 경우다.(참조 0044_1.html)

     

<p style="border: 100% solid red;">첫 번째 p 요소</p>

<p style="border: 1em solid red;">두 번째 p 요소</p>


실행해보면 다음과 같이 두 번째 <p> 요소에만 경계선이 1em 두께로 나타나는데 결론적으로 말하면 부모 요소인 <body> 요소에 경계선이 없어 두께0px이므로 이를 기준으로 하는 % 길이도 같이 0px가 되어 경계선이 나타나지 않는 것이다.



이리저리 실험해보고 내리고 생각해본 결과 em%의 차이를 나름 정리해보았다. 결국, W3C에서 em을 기준으로 작성하라고 권고하는 이유도 em텍스트의 크기를 기준으로 다른 CSS 속성(property)의 길이를 모두 규정할 수 있어 일관되면서도 광범위하게 사용할 수 있기 때문이 아닌가 싶다. 

    

이 내용들은 명쾌하고 믿을만한 자료를 찾지 못해서 임의로 이것저것 실험해보고 스스로 개인적인 확신으로 결론을 내렸으니 주의하시기 바랍니다.


Anki 파일


아래는 본 포스팅의 내용을 갈무리하기 위한 Anki 파일입니다. 참고하시기 바랍니다. 


Ankilog 파일:  0044 CSS의 길이(length) 중 상대 길이(relative length).apkg


2019/01/03 pm 2:40 Ankilog 문구 일부 수정




0039 클래스(class) 속성 사용해보기


바로 앞의 0038 클래스(class) 속성 포스팅에서 클래스(class) 속성에 대해서 알아보았으니 이제 이를 간단하게 사용해보자. 

    

다음은 같이 전 세계의 주요 여행지들 중에서 가고 싶은 곳을 추려 가나다순으로 나열해 놓은 0039_1.html

     

<!DOCTYPE html>

     

<html>

<head>

 <title>여행지들(가나다순)</title>

 <link rel="stylesheet" type="text/css" href="0039.css" />

</head>

<body>

 <ul>

   <li>경주</li>

   <li>광주</li>

   <li>교토</li>

   <li>뉴욕</li>

   <li>뉴저지</li>

   <li>도쿄</li>

   <li>런던</li>

   <li>몬트리올</li>

   <li>부산</li>

   <li>북경</li>

   <li>상해</li>

   <li>서울</li>

   <li>시카고</li>

   <li>아테네</li>

   <li>워싱턴</li>

   <li>오사카</li>

   <li>파리</li>

   <li>홍콩</li>

 </ul>

</body>

</html>


실행한 결과는 다음과 같다. 



여행지를 찾기 좋게 가나다순으로 나열해 놓았지만 조금 심심해 보인다. 만일 여행지를 고른다면 각 여행지가 도시인지 아니면 아름다운 자연과 전통적인 문화를 즐길 수 있는 시골인지에 따라 다를 것 같다. 

     

따라서 일단 도시"urban"시골"rural"로 나누어 나타내고 싶다. 그렇다면 이를 어떻게 HTML 요소에 반영할 수 있을까?

     

단순히 HTML로만 만든다고 한다면 중첩된 목록(nested list)을 이용하여 전체 여행지들을 도시"urban"시골"rural"로 나누어 다음과 같이 만들어 볼 수 있을 것이다. 0039_2(중첩된목록).html 참조



그런데 이렇게 분류해보니 조금 부족해 보인다. 일단, 가나다순으로 나열하겠다는 원칙이 무너진 것도 그렇고, 시골(rural)인 곳도 3군데 밖에 없어 좋은 분류가 아닌 것 같다. 차라리 원래의 가나다순으로 돌려놓고 각각의 여행지들 별로 특색을 표시해보는 것이 좋을 것 같다. 

     

바로 이런 경우에 필요한 것이 클래스(class) 속성이다. 전체 여행지들을 urban 클래스(class)rural 클래스(class)로 분류하여 다음과 같이 0039_3.html을 만들어 보자. 

     

<!DOCTYPE html>

     

<html>

<head>

 <title>여행지들(가나다순)</title>

 <link rel="stylesheet" type="text/css" href="0039.css" />

</head>

<body>

 <ul>

   <li class="rural">경주</li>

   <li class="urban">광주</li>

   <li class="rural">교토</li>

   <li class="urban">뉴욕</li>

   <li class="urban">뉴저지</li>

   <li class="urban">도쿄</li>

   <li class="urban">런던</li>

   <li class="urban">몬트리올</li>

   <li class="urban">부산</li>

   <li class="urban">북경</li>

   <li class="urban">상해</li>

   <li class="urban">서울</li>

   <li class="urban">시카고</li>

   <li class="urban">아테네</li>

   <li class="urban">워싱턴</li>

   <li class="rural">오사카</li>

   <li class="urban">파리</li>

   <li class="urban">홍콩</li>

 </ul>

</body>

</html>


아직, CSS를 만들지 않았으므로 바로 다음과 같이 0039.css 파일을 작성하여 0039_3.html 파일과 같은 디렉터리에 저장한다.

     

.urban { color: blue; }

.rural { color: green; }


CSS는 간단하게 도시(urban)파란색 글씨로, 시골(rural)녹색 글씨로 스타일을 적용해보았다. 

      

이제 실행해보면, 경주, 교토, 오사카의 글자색이 녹색(green)으로 바뀐 것을 확인할 수 있다. 



구별해놓고 보니 온통 파란색으로 여행지가 전부 도시(urban) 일색이다. 그렇다면 도시의 종류를 조금 나누어 보자. 도시 중에는 각국의 수도인 서울, 워싱턴 같은 곳들도 있고, 그저 번화한 도시인 곳들도 있다. 이번에는 각국의 수도에 경계선(boder)을 주어 다른 도시와 구별해보도록 하자. 

     

우선, 각국의 수도인 여행지는 "main" 클래스(class)에 속하도록 다음과 같이 0039_4.html 파일을 작성한다. CSS를 적용할 파일도 변경할 것이므로 <link /> 요소의 href 속성 "0039_1.css"로 수정한다. 


<!DOCTYPE html>

    

<html>

<head>

 <title>여행지들(가나다순)</title>

 <link rel="stylesheet" type="text/css" href="0039_1.css" />

</head>

<body>

 <ul>

   <li class="rural">경주</li>

   <li class="urban">광주</li>

   <li class="rural">교토</li>

   <li class="urban">뉴욕</li>

   <li class="urban">뉴저지</li>

   <li class="urban main">도쿄</li>

   <li class="urban main">런던</li>

   <li class="urban">몬트리올</li>

   <li class="urban">부산</li>

   <li class="urban main">북경</li>

   <li class="urban">상해</li>

   <li class="urban main">서울</li>

   <li class="urban">시카고</li>

   <li class="urban">아테네</li>

   <li class="urban main">워싱턴</li>

   <li class="rural">오사카</li>

   <li class="urban main">파리</li>

   <li class="urban">홍콩</li>

 </ul>

</body>

</html>


그리고 다음과 같이 0039_1.css 파일을 작성하여 0039_4.html 파일과 같은 디렉터리에 저장한다

    

.urban color: blue; }

.rural { color: green; }

.main { border: 2px solid red; }


실행 결과는 다음과 같다.


 


Anki 파일


아래는 본 포스팅의 내용을 갈무리하기 위한 Anki 파일입니다. 참고하시기 바랍니다. 


Ankilog 파일:  0039 클래스(class) 속성 사용해보기.apkg







0038 클래스(class) 속성


이제 클래스(class)를 다루어보자. 

    


1. HTML에서 클래스(class)


클래스(class)요소(element)들을 특정 클래스(class)로 묶는 속성(attribute)이다. 

    

HTML에서 클래스(class) 속성(attribute)은 주로 동일한 클래스에 속한 요소들에게 동일한 스타일을 적용하는 용도로 사용된다. 

     

HTML 요소(element)에 클래스(class)를 부여하는 형식은 다음과 같다. 

     

<요소명 class="클래스명1 클래스명2 ...">


실제 사용례는 다음과 같다.

      

<hr class="answer" />

<p class="explaination">내용(content)</p>

<h3 class="urban country">내용(content)</h3>

<li class="urban metro main">내용(content)</li>


클래스(class) 속성아이디(id) 속성처럼 모든 요소에 부가될 수 있는 전역 속성(global attribute)이므로 <p><li><h2> 요소 등 서로 다른 요소들이 동일한 클래스로 묶일 수 있다

     

그런데 이렇게 요소들을 클래스로 묶다 보면 하나의 요소가 여러 클래스에 속할 때가 있기 마련이다. 그런 경우 해당 요소클래스는 여러 개의 클래스명속성값으로 갖는다. 이런 경우에는 순서에 상관없이 클래스명공백으로 띄어서 구분해주기만 하면 된다. 

    


2. CSS에서 클래스(class)


CSS에서 클래스(class)에 따라서 요소를 선택하려면 요소클래스점(.)으로 이어 다음과 같은 형식으로 클래스 선택자를 만들면 된다. 

     

요소명.클래스명 or .클래스명


클래스(class)에 속한 요소 중에서 특정 요소만 선택할 경우에는 요소명.클래스명 형식으로 선택하고, 특정 클래스에 속한 요소들을 모두 선택할 경우에는 앞의 요소명을 생략하여 .클래스명 형식으로 작성하면 된다. 

     

실제 사용례는 다음과 같다.

     

p.urban : urban클래스 p요소

h2.rural : rural클래스 h2요소

.rural : rural클래스 모든 요소

.urban : urban클래스 모든 요소

li.rural : rural클래스 li요소

li.urban : urban클래스 li요소


클래스(class) 속성(attribute)아이디(id) 속성과 마찬가지로 대소문자를 가리므로 선택자를 작성할 때는 대소문자를 정확하게 기입해주어야 한다. 

    


3. 클래스(class)아이디(id)의 차이


아이디(id)클래스(class)는 모두 HTML 요소(element)들을 구분하고 분류하여 특정하는 용도로 사용되는 속성들이지만 두 가지 큰 차이점이 있다는 점을 다시 한번 상기하도록 하자. 

     

첫 번째아이디(id)요소 1개만 고유하게 특정하지만 클래스(class)는 여러 요소들을 묶는다는 것이다.


두 번째요소는 단 한 개의 아이디(id)만 가지지만 여러 개의 클래스(class)를 가질 수 있다는 점이다. 



Anki 파일


아래는 본 포스팅의 내용을 갈무리하기 위한 Anki 파일입니다. 참고하시기 바랍니다. 


Ankilog 파일:  0038 클래스(class) 속성.apkg





0037 HTML 요소의 아이디(id) 속성CSS아이디(id) 선택


앞서, 요소 선택자(element selector)를 이용하여 CSS 규칙을 요소에 적용시켜 보았다. 하지만 이러한 요소 선택자는 해당 요소들을 가리지 않고 일괄적으로 모두 선택하는 문제가 있다. 

    

다음과 같이 0037_1.html 파일을 작성하여 실행해보자.

     

<!DOCTYPE html>

   

<html>

<head>

 <title>아이디 속성 선택자</title>

 <style>

  p

   color: blue;

   border: 3px solid gray;

  }

 </style>

</head>

<body>

 <p>1번 블록</p>

 <p>2번 블록</p>

 <p>3번 블록</p>

 <p>4번 블록</p>

</body>

</html>


이것을 실행하면 다음과 같이 나타난다. 



요소 선택자<p> 요소를 선택하여 스타일을 적용했기 때문에, 4개의 <p> 요소 모두 동일한 스타일의 적용을 받는다.

    


하지만 우리는 동일한 요소들에게 각각 서로 다른 스타일을 적용하고 싶다. 어떻게 해야 하나?

    

이때, 각각의 요소를 고유하게 만들어주는 아이디(id) 속성을 이용하면 된다. 

     

아이디(id) 속성에 대해서는 0019 HyperText 링크를 제공하는 앵커(anchor)의 a요소 01 사용법 및 href 속성에서 <a> 요소를 이용하여 특정 아이디(id)를 가진 요소로 이동할 수 있다는 내용으로 다룬바 있다. 

    

아이디(id) 속성(attribute)HTML 요소에 고유한 아이디(id)를 부여하는 속성이다. 따라서 그 속성상 당연히 하나의 웹페이지에서 각각의 아이디(id)는 중복되지 말고 고유해야 한다. 아이디(id)가 하나의 웹페이지에서 중복되면 웹 표준 위반이다. 

   

이러한 아이디(id) 속성을 이용하여 요소(element)가 고유해지면 CSS는 이 고유한 요소(element)를 선택하여 꾸미거나 필요한 작업을 수행할 수 있게 된다.

    

CSS에서는 특정 아이디(id)의 요소를 선택하기 위해서는 해쉬(#) 문자를 아이디(id) 속성값 앞에 붙여 해당 아이디(id)를 가진 요소를 선택하는 선택자를 만들 수 있다.

     

이제 다음과 같이 수정해서 0037_2.html보자. 

    

<!DOCTYPE html>

    

<html>

<head>

 <title>아이디 속성 선택자</title>

 <style>

  #first

   color: red;

   border: 3px solid red;

  }

  #second

   color: green;

   border: 3px solid green;

  }

  #third

   color: blue;

   border: 3px solid blue;

  }

  #fourth

   color: black;

   border: 3px solid black;

  }

 </style>

</head>

<body>

 <p id="first">1번 블록</p>

 <p id="second">2번 블록</p>

 <p id="third">3번 블록</p>

 <p id="fourth">4번 블록</p>

</body>

</html>


처음 작성한 0037.html 파일과 달리 각각의 <p> 블록에 아이디(id) 속성들이 주어졌고, 이러한 아이디(id)를 가진 요소를 선택하기 위하여 CSS에서는 #first, #second, #third, #fourth로 각각의 아이디(id) 속성을 가진 요소들에게 개별적으로 스타일을 적용하고 있다.

     

실행해보면 다음과 같이 동일했던 <p> 블록들이 각자 서로 다른 <p> 블록들로 나타난다.



아이디(id) 속성은 모든 HTML 요소에 사용할 수 있는 전역속성(global attribute)이다. 아이디(id)의 속성값최소 1개의 문자가 있어야 하며 스페이스나 탭 등의 공백(whitespace)은 허용되지 않는다이 때, 아이디(id)의 속성값은 대소문자를 가리므로 선택자를 작성할 때 주의해야 한다. 


2019. 1. 2일 아이디(id) 속성값에 대하여 다음과 같은 내용을 추가함. 

HTML 5 이후로 아이디(id) 속성값은 은 상기와 같은 규칙으로 바뀌었다고 W3C 튜토리얼에서 확인했으나 실제 아이디(id)를 숫자로 시작하거나 하이픈, 밑줄, 콜론, 마침표가 아닌 특수 문자를 쓸 경우 아이디(id) 속성이 작동하지 않는 것을 확인하고 아래와 같은 HTML 4.01 기준이 여전히 작동하고 있는 것을 확인함

아이디(id)의 속성값 항상 문자(A-Z, a-z)로 시작해서 그 뒤로 어떤 숫자(0-9), 하이픈(-), 밑줄(_), 콜론(:), 마침표(.)들이 올 수 있고 공백은 안된다. 숫자로 시작하는 실수가 많다.

    


다음은 아이디(id)의 속성값이 잘못 기입된 사례이다. 

    

id="" 최소 1개의 문자

id="fir st"  공백

id="fir!st" ← 느낌표(!)

id="1st" ← 숫자로 시작

id="Jack Daniel" ←공백


아이디(id)와 비슷한 것으로 클래스(class)가 있다. 아이디(id)는 오직 하나의 고유한(unique) 요소를 식별하기 위하여 부여하는 속성이라면 클래스는 다양한 요소들을 묶어서 특정한 클래스(class)로 만들기 위한 속성이다. 클래스(class)에 대해서는 다음에 알아보도록 하자.


Anki 파일


아래는 본 포스팅의 내용을 갈무리하기 위한 Anki 파일입니다. 참고하시기 바랍니다. 


Ankilog 파일:   0037 HTML 요소의 아이디(id) 속성과 CSS의 아이디(id) 선택.apkg



2019/01/02 1:19 AM 아이디(id) 속성값 작성 규칙 수정 및 Ankilog 파일 수정



0036 External 방식의 CSS 적용


이제 <link /> 요소에 대해서 알았으니 외부의 CSS 파일을 HTML 페이지에 링크하는 External 방식의 CSS 적용을 시도해보도록 하자. 

     

우선, 우리가 할 일은 HTML 문서를 만들고 해당 문서에 스타일을 적용하기 위한 외부의 CSS 파일을 만드는 것이다. 

      

우선 사용할 HTML 파일은 앞서 만든 0034_1.html과 거의 유사하지만 <head> 영역에 <style> 요소 대신에 다음과 같은 <link /> 요소를 넣어 0036.html 파일을 만들도록 하자.

    

<link rel="stylesheet" type="text/css" href="0036.css" />


0036.css 는 우리가 앞으로 만들 외부 CSS 파일 이름이다. 해당 파일을 만들고 0036.html 파일과 0036.css 파일을 같은 디렉터리에 두면 정상적으로 웹페이지에 스타일이 적용될 것이다. 

    

물론, <title> 요소를 수정하여 웹페이지 제목도 변경한다.

   

다음과 같이 0036.html을 작성해보자. 

    

<!DOCTYPE html>

    

<html>

<head>

 <title>External CSS 적용</title>

 <link rel="stylesheet" type="text/css" href="0036.css" />

</head>

<body>

 <h1>h1 블록</h1>

 <h2>첫 번째 h2 블록</h2>

 <p>p블록 시작 <br /><br />p블록 끝</p>

 <h2>두 번째 h2 블록</h2>

 <p>2번 p블록 시작 <br /><br />2번 p블록 끝</p>

</body>

</html>


<head> 영역 내의 <link /> 요소에서 외부 CSS 파일을 링크하고 있지만 아직 해당 CSS 파일이 만들어지지 않았으므로 어떤 CSS 규칙도 HTML에 적용되지 않은 상황이다. 실행 결과는 다음과 같다.



이젠 외부(external) CSS 파일을 만들 차례다. 

    

메모장이나 텍스트 에디터를 열어 다음과 같이 작성하고 0036.css 파일로 저장해보자(0036.html 파일과 같은 디렉터리에 두어야 한다.).

    

/* h1 요소와 h2 요소의 

공통으로 글꼴(font)과 

글자색(color)을 설정 */

h1, h2 {

  font-family: sans-serif;

  color: blue;

}

/* h1 요소에 1픽셀 

두께의 빨간 실선으로 

밑줄을 만든다. */

h1 {

  border-bottom: 1px solid red;

}

/* 블록인 p 요소의 

텍스트를 가운데로 

정렬하고 글자색은 

빨간색으로 설정 */

p {

  text-align: center;

  color: red;

}


그리고 다시 0036.html을 새로고침 하거나 재실행해보면 그 결과는 다음과 같다. 



아래와 같이 CSS에서 주석(comment)을 다는 방법은 HTML과 다르다. 

    

HTML 주석 형식     <!-- 주석(comment) 내용 --> 

CSS 주석 형식   /* 주석(comment) 내용 */


위의 실행 결과에서 보듯이 주석은 웹페이지에 어떤 영향도 미치지 않는다. 그리고 여러 줄에 걸쳐서 주석을 달 수 있다. 

    

CSSborder 속성(property)이 경계선을 주는 속성이라면 border-bottom밑줄을 주는 속성이다. 속성을 정의하는 방식은 border와 동일하다.

    

border: 1px solid red;

border-bottom: 1px solid red;


위의 boder-bottom 선언(declaration)으로 1픽셀 두께의 빨간 실선으로 밑줄이 생김

   

그리고 text-align 속성은 텍스트의 정렬을 설정한다. 속성값을 center로 하면 텍스트가 가운데로 정렬된다.


Anki 파일


아래는 본 포스팅의 내용을 갈무리하기 위한 Anki 파일입니다. 참고하시기 바랍니다. 


Ankilog 파일:  0036 External 방식의 CSS 적용.apkg







0034 CSS 요소 선택자(element selector)


선택자CSS규칙(Rule)에서 어떤 HTML 요소(element)규칙을 적용할지 지정하는 역할을 하는 것으로 CSS 뿐만 아니라 jQuery에서도 사용하고 있어 알아두면 매우 유용하다.

    

선택자는 요소의 이름, 아이디(id), 클래스(class), 속성(attribute) 등 그 외에 수많은 방식으로 HTML 요소(element)를 선택하지만 이번에는 가장 기본적인 요소 선택자(element selector)를 살펴보자. 

    

요소 선택자(element selector)요소의 이름으로 해당 요소를 선택한다. 가령, <p> 요소는 p<body> 요소는 body<h1> 요소는 h1으로 선택한다. 

    

규칙선택자를 요소로 하면 해당 웹페이지의 모든 요소들은 일괄적으로 CSS 규칙이 적용을 받는다. 동일한 요소에서 스타일을 다르게 하는 방법은 나중에 논하도록 하자. 

   

우선, 다음과 같이 0034_1.html을 작성해보자. 

    

<!DOCTYPE html>

    

<html>

<head>

 <title>요소 선택자</title>

 <style></style>      내부가 비어 있음

</head>

<body>

 <h1>h1 블록</h1>

 <h2>첫 번째 h2 블록</h2>

 <p>p블록 시작 <br /><br />p블록 끝</p>

 <h2>두 번째 h2 블록</h2>

 <p>2번 p블록 시작 <br /><br />2번 p블록 끝</p>

</body>

</html>


<head> 섹션 내의 <style> 요소에는 어떤 CSS 규칙도 없는 상황이다. 실행해보면 다음과 같다.



CSS 규칙이 전혀 없어도 브라우저가 자체적인 기준으로 HTML 문서를 최소한으로 스타일링하고 있다. 즉, 글꼴(font)과 글자 크기 등이 설정되어 있다.

    

이번에는 요소를 선택하여 CSS 규칙을 적용해보자. 

    

HTML 문서에서 눈에 보이는 부분을 담당하는 영역인 <body>HTML의 요소이므로 이에 적용하는 CSS 규칙을 만들어 볼 수 있을 것이다. 그렇다면 요소 선택자는 body가 될 것이다. <style></style> 사이에 다음과 같이 넣고 이름을 바꿔 0034_2.html로 작성하여 실행해보자. 

    

body { 

 background-color: black; 

 color: white;

 font-family: Arial;

}


위의 구문을 말로 옮기면 이렇다. <body> 요소에 배경색(background-color)검게(black), 글자색(color)은 하얗게(white), 글꼴(font-family)Arial로 적용한다.

   

0034_2.html 파일을 실행한 결과를 처음의 0034_1.html과 같이 놓고 비교해보았다.



<body> 요소가 보이는 영역 전체이므로 웹페이지의 모든 배경색이 전부 검게 칠해진다. <h1>, <h2>, <p> 요소 모두 배경색(background-color)검게(black) 칠해지고 글자색(color)하얗게(white) 글꼴(font-family)Arial로 변경되었다. 

   

이는 <body> 요소에 적용된 규칙<body> 요소 내에 중첩(nesting)<h1>, <h2>, <p> 요소들에게 상속되기 때문이다. 자세하게 살피면 상속되는 속성이 있고 상속되지 않는 속성이 있지만 일단, 위의 예문에서 <body> 요소에 적용된 규칙은 모두 상속되고 있다.

    

만일, 상속된 속성을 사용하지 않고 각각의 <h1>, <h2>, <p> 요소들을 <body> 요소와 다르게 스타일링을 하고 싶다면 해당 요소를 선택자로 가진 규칙을 작성하여 상속을 재정의 하면 된다. 

    

이번에는 <h1><h2><p> 요소에 CSS 규칙을 작성하여 <style></style> 사이에 다음과 같이 넣고 0034_3.html로 작성하여 실행해보자. 

    

body

 background-color: black; 

 color: white;

 font-family: Arial;

}

h1 {

 background-color: white; 

 color: black;

}

h2 {

 background-color: white; 

 color: black;

}

p {

 background-color: yellow; 

 color: blue;

 font-family: serif;

}


실행 결과는 다음과 같다. 



<h1><h2> 요소는 배경색(background-color)검은색에서 하얀색(white)으로 바뀌었고 글자색(color)흰색에서 검은색(black)으로 변했다. 글꼴(font)은 별도로 지정한 바가 없으므로 <body> 요소의 Arial을 그대로 유지하고 있다. 

    

<p> 요소는 배경색(background-color)노랗게(yellow) 바뀌었고 글자색(color)파랗게(blue) 변했으며 글꼴(font)serif로 변경되었다. 

    

즉, <body> 요소에 적용된 규칙<body> 요소 내부의  <h1><h2><p>에 적용된 규칙과 같은 속성(property)에서 서로 다른  속성값을 갖는 경우 각각의 요소에 적용된 규칙의 속성이 우선적으로 적용되는데 이것을 이용하여 상속을 재정의 한다.

    

위에서 <h1><h2> 요소의 CSS 규칙동일하다. 이런 경우에는 다음과 같이 요소들끼리 쉼표로 구분하여 규칙을 한꺼번에 작성할 수 있다. 

    

h1, h2 {

 background-color: white; 

 color: black;

}


CSS에서 border 속성(property)블록 주위에 경계선을 넣는 속성으로 다음과 같이 쓴다.

    
border: 5px solid red;  
→ 경계선을 5픽셀(5px) 두께에 빨간색(red) 실선(solid)으로

<h1><h2> 요소의 CSS 규칙이 동일한 상황에서 추가적으로 <h2> 요소에만 별도로 border 속성(property)를 부여한다고 해보자. 이런 경우 다음과 같이 별도로 작성하는 규칙만 따로 떼어내서 규칙을 작성하면 된다. 
   

h1, h2 {

 background-color: white; 

 color: black;

}

h2 { border: 5px solid red; }


작성한 0034_4.html파일을 실행하면 다음과 같다. 




Anki 파일


아래는 본 포스팅의 내용을 갈무리하기 위한 Anki 파일입니다. 참고하시기 바랍니다. 


Ankilog 파일:  0034 CSS 요소 선택자(element selector).apkg







0033 HTMLCSS 적용하고 기본 문법 알아보기


CSSHTML 문서에 적용하는 방법은 다음의 3가지 방식이다. 

  

Inline - 개별 요소에 style 속성으로 적용

Internal - <head>의 영역에 있는 <style> 요소에 스타일 시트 설정

External - 외부의 CSS 파일을 링크로 연결하여 적용


인라인(inline) 방식HTMLstyle 속성에서 다루었기 때문에 0025 HTML style 속성(attribute) 및 배경색 설정을 참조하자. 

    

CSSHTML 문서에 적용할 때 가장 자주 사용하는 방법은 외부에 CSS 파일을 만들어서 이를 HTML 문서에 링크하는 External 방식이다. 하지만 External 방식은 나중세 살펴보고 이번에는 우리는 주로 보기 쉽고 이해하기 편한 Internal 방식으로 기본적인 CSS 문법을 익혀보자. 

    

Internal CSS를 사용하는 경우는 하나의 HTML 페이지를 꾸미는 경우다. 이는 하나의 요소만을 대상으로 꾸미는 Inline CSS와 대조된다. 

     

Internal CSS를 사용하기 위해서는 <head> 섹션에 <style> 요소를 중첩시킨다. 

    

다음과 같이 0033.html 파일을 만들어 실행해 보자. 

    

<!DOCTYPE html>

    

<html>

<head>

 <title>간단한 CSS 적용 사례</title>

 <style>

   p

       color: white;

       background-color: red;

   }

 </style>

</head>

<body>

 <p>1번 p블록 시작<br /><br />1번 p블록 끝</p>

 <p>2번 p블록 시작<br /><br />2번 p블록 끝</p>

</body>

</html>


위의 예문은 <style></style> 요소 내에 CSS를 집어넣어 사용하는 Internal CSS 사용방식을 보여준다. 작성한 예문을 실행해보면 다음과 같이 나타난다. 



위에서 작성한 CSS가 어떻게 작성되었는지 기본적인 내용들을 살펴보자.

    

다음은 <p>요소를 선택하여 배경색(background-color) 속성(property)빨간색(red)으로 선언한 규칙이다. 



이 전체를 하나의 규칙(Rule)이라고 부른다. 그리고 규칙(Rule)어떤 요소에 어떤 속성을 적용할지 결정한다. 

    

CSS에서 작성된 규칙이 어떤 HTML의 요소에 적용되는지 나타내는 것을 선택자(selector)라고 한다. 위의 예문에서는 선택자로 <p> 요소를 선택하여 모든 <p> 요소가 해당 규칙의 적용을 받아 서로 다른 2개의 <p> 요소 블록에 동일한 CSS 규칙이 모두 적용되는 것을 확인할 수 있다. 

    

현재는 <p> 요소를 선택하고 있지만, <body> 요소, <h1> 요소 등 다른 요소를 선택할 수 있고 그 외에도 id 속성, class 속성 등 굉장히 다양한 방식으로 선택이 가능하다(나중에 자세히 살펴보자.). 

    

중괄호({ })로 감싸져 있는 부분 안에는 속성(property)속성값(value)이 위치한다. 속성속성값콜론(:)으로 연결되어 있고 여러 개의 속성값이 하나의 속성(property)에 적용되는 경우는 다음과 같이 공백으로 속성값을 구분한다. 

    

border: 10px solid white;


속성(property)속성값(value)은 합쳐서 하나의 단위를 이루고 이 단위를 선언(declaration)이라고 한다. 


그리고 선언(declaration)은 반드시 세미콜론(;)으로 마무리 한다. 

※ 이어지는 다음 선언이 없는 마지막 선언세미콜론(;)을 쓰지 않아도 되지만 그런 습관으로 오류가 발생할 수 있으므로 세미콜론(;)으로 마무리하는 것을 습관으로 하자.

     

여러 개의 선언(declaration)을 한 줄에 또는 여러 줄에 걸쳐서 한 번에 작성할 수 있다.

    

p { color: white; background-color: red; }


또는 


p {

    color: white;

    background-color: red;

  }


하나 또는 여러 개의 선언(declaration)들은 중괄호({ })로 둘러싸이는데 이렇게 중괄호({ })로 묶인 것선언(declaration) 블록이라고 한다. 

    

선택자중괄호 사이, 중괄호선언(declaration) 사이, 선언선언 사이에는 공백을 넣거나 줄을 바꿔 구별하는 것을 권장하는 것 같다. 실제로 공백을 넣지 않아도 작동하는 경우도 있지만 그렇지 않은 경우도 있어서 권장하는 것으로 알고 있다. 



Anki 파일


아래는 본 포스팅의 내용을 갈무리하기 위한 Anki 파일입니다. 참고하시기 바랍니다. 


Ankilog 파일:   0033 HTML에 CSS 적용하고 기본 문법 알아보기.apkg






0025 HTML style 속성(attribute) 및 배경색 설정


스타일링이라 함은 폰트, 크기, 테두리, 색깔 등을 이용하여 예쁘게 꾸미는 것을 말하고 HTML 문서를 스타일링 할 때는 CSS(Cascading Style Sheet)라는 별도의 언어체계를 이용한다.

    

이 때,  HTML개별 요소(element) 하나를 CSS를 이용하여 꾸미고 싶을 때에는 style 속성을 사용하면 된다.

   

HTMLstyle 속성은 다음과 같은 구문으로 사용된다. 

    

<태그명 style="속성:속성값;">


위 구문에서 속성CSS에서 사용하는 속성(property)이고, 속성값CSS에서 사용하고 있는 속성값(value)이다. 즉, style 속성은 개별 요소에 CSS를 적용하기 위한 속성인 것이다. 

    

따라서 이 style 속성을 다루면서 익히게 될 속성(property)속성값(value)은 모두 CSS에서도 그대로 사용할 수 있다.

    

또, 당연히 style은 모든 요소에 적용할 수 있는 전역 속성(global attribute)이다.

    

추후에 CSS를 공부하면서 상세하게 다룰 내용이지만 참고적으로 간단히 언급하면 CSS를 적용하는 것은 아래와 같이 세 가지 방법이 있는데 그 중 마지막 방법이 이 style 요소를 사용하는 방법이다.

    

하나는 <head> 요소 내부에 중첩된 <style> 요소에 CSS를 작성하는 것이다. 

둘은 <link> 요소를 이용하여 외부에서 CSS 파일을 불러 읽는 것이다.

마지막은 개별 요소에 style 속성을 부가하여 CSS를 이용하는 것이다.


보통 첫 번째와 두 번째 방법으로 CSS를 사용하지만 이러한 방법은 일괄적으로 HTML 페이지의 스타일을 설정하기 때문에 이에 대한 예외적인 스타일이 적용되어야할 요소(element)들은 개별 요소에 style 속성을 이용하여 CSS를 부여하기도 한다(이는 CSS 상속과 적용 범위의 문제이므로 나중에 다시 보도록 하자.).

    

앞서 0017 이미지를 보여주는 img 요소 02 대체할 문구 및 크기 결정에서 <img> 요소의 크기를 style 속성으로 결정하는 예문을 아래와 같이 다루면서 최근 style 속성을 사용하여 이미지의 크기를 결정하는 이유를 CSS 스타일 시트에서 일괄적으로 이미지의 크기를 조작할 때 그 적용을 피하기 위해서라고 언급한 바 있는데 이것이 바로 위와 같은 이유이다.

    

<img src="sun.jpg" style="width:100px;height:100px" alt="떠오르는 태양" />


위의 예문에서 style 속성으로 CSS 속성인 widthheight를 이용하고 있고 속성값으로 픽셀수(px)를 이용하고 있다. 



배경색(Background Color)


HTML 요소의 배경색을 결정하는 CSS 속성은 background-color 속성이다. 요소의 배경색을 이용하여 앞서 공부한 블록 요소인라인 요소의 차이점을 다시 한번 살펴보자.

       

background-color 속성은 다음과 같이 사용한다.

     

<태그명 style="background-color:색상이름;">


색상이름red, blue, purple, yellow, white, black, powderblue 등 영문의 색상이름이 그대로 적용되고 더 디테일한 색상을 다룰 때에는 색상의 일련번호로 집어넣을 수도 있다.


다음과 같이  0025.html 파일을 만들어 실행해보자.


<!DOCTYPE html>

    

<html>

<head><title>배경색</title></head>

<body style="background-color:black;">

<h1 style="background-color:red;">h1 요소</h1>

<p style="background-color:white;"

  p요소<br />

 <strong style="background-color:yellow;">중요한 텍스트</strong><br />

 <em style="background-color:purple;">강조 텍스트</em><br />

  a 요소 <a href="https://deliciouslearning.tistory.com/" style="background-color:blue;">책 씹어먹는 즐거움</a>

</p>

</body>

</html>


<body> 요소에 중첩된 각각의 요소에 전부 배경색을 다르게 설정해보았다. 그리고 실행해보면 다음과 같이 나타난다. 



블록 요소인라인 요소에 따라서 배경색이 다르게 설정되어 있는 것을 알 수 있다. 블록 요소는 해당 행의 가로폭을 전부 차지하는 요소이므로 실제 내용이 얼마 안되더라도 해당 행의 전체에 배경색이 칠해진다. 반면, 인라인 요소는 배경색이 꼭 필요한 부분으로 한정되는 것을 알 수 있다. 

    

CSS에서 사용하고 있는 다양한 속성과 속성값을 이 자리에서 전부 살펴보는 것은 적합하지 않은 것 같다. 우선 배경색만 살펴보고. 또, 다른 요소들을 다루면서 관련된 스타일 속성은 그때그때 알아보도록 하자.


Anki 파일


아래는 본 포스팅의 내용을 갈무리하기 위한 Anki 파일입니다. 참고하시기 바랍니다. 


Ankilog 파일:  0025 HTML style 속성(attribute) 및 배경색 설정.apkg





0021 HyperText 링크를 제공하는 앵커(anchor)의 <a>요소 03 target 속성


HyperText 링크를 클릭하면 목적지 주소(destination address)로 지정된 페이지나 페이지 내의 요소를 열게 된다. 이 때, 어떤 식으로 새로운 페이지를 창(window)에 띄울지 결정하고 싶을 수 있다. 이러한 내용을 선택할 수 있는 것이 target 속성이다. 

    

즉, 링크된 문서를 어디에 열지 결정하는 속성이 target 이다.

   

target은 속성값으로 다음의 5가지를 가진다. 

    

_blank : 링크된 문서를 새로운 창이나 탭에 연다.

     

_self : 링크된 문서를 링크가 있는 현재 창의 현재 프레임에 연다. target 속성을 별도로 지정하지 않으면 기본으로 이 속성값으로 지정된다.

     

_parent : 링크된 문서를 상위(부모) 프레임에 연다.

     

_top : 링크된 문서를 현재의 전체 창에 연다.

    

framename : 지정된 이름의 프레임에 링크된 문서를 연다.


다음의 그림을 보면 target의 속성값의 역할이 조금 명확해진다. 



프레임이라는 것은 웹 페이지 안에 웹 페이지를 넣을 수 있는 틀이다. 나중에 이것에 대해서 자세히 다루는 것으로 하고 이번에는 간단하게만 다루도록 하자.

    

위의 그림은 전체 웹 페이지가 Frame 1, Frame 2, Frame 3의 3개의 프레임으로 나누어지고 각각의 프레임에 별도의 웹 페이지가 표시되어 있는 것이다. Frame 1Frame 2는 별도의 프레임이고 Frame 3Frame 2 안에 들어있는 하위(자식) 프레임이다. 

    

웹 페이지가 이와 같이 짜여져 있는 상황에서 Frame 3에 위치한 링크가 target 속성에 따라서 어떻게 작동하는지 하나하나 살펴보자.

    

#1링크를 클릭하면 target의 속성값이 "_blank"이므로 새로운 (TAB)이나 (window)에 링크된 문서가 열린다.

    

#2링크를 클릭하면 target의 속성값이 "_self"이므로 현재 링크가 위치한 프레임인 Frame 3에서 링크된 문서가 열린다. 

    

#3링크를 클릭하면 target의 속성값이 "_parent"이므로 현재 링크가 위치한 Frame 3의 상위(부모) 프레임인 Frame 2에서 링크된 문서가 열린다. 

    

#4링크를 클릭하면 target의 속성값이 "_top"이므로 링크된 문서가 가장 상위의 프레임인 현재 창이나 탭(TAB)의 전체 화면으로 열린다. 

     

#5링크를 클릭하면 target의 속성값이 "framename"이므로 링크된 문서가 지정된 프레임에서 열린다.


마지막으로 전역 속성(global attribute) title 속성과 달리 target 속성은 <a> 요소에서만 사용되는 속성이다.


Anki 파일


아래는 본 포스팅의 내용을 갈무리하기 위한 Anki 파일입니다. 참고하시기 바랍니다. 


Ankilog 파일:   0021 a요소 03 target 속성.apkg





0020 HyperText 링크를 제공하는 앵커(anchor)의 <a>요소 02 title 추가하기


3. <a> 요소의 title 속성


title 속성은 요소(element)에 대한 추가적인 정보를 보여주기 위하여 사용하는 속성이다.

    

요소(element)title 속성을 부여하면 해당 요소 위에 마우스 포인터를 위치시킬 때 작은 툴팁(tooltip)으로 title 속성에 부여한 문구가 나타난다. 

    

툴팁(tooltip)말풍선이라고도 불리는 그래픽 사용자 인터페이스 중 하나이다. 마우스 포인터라 불리는 커서로 특정 항목을 클릭하지 않고 가리키기만 하면 조그마한 상자가 나타나 보충 설명을 보여준다. 

   

다음과 같이 <a> 요소에 title 속성을 부여해 보자. 

    

<a href="https://deliciouslearning.tistory.com/" title="Ankilog를 제공">책 씹어먹는 즐거움</a>


그러면 아래와 같이 마우스 포인터를 링크에 올렸을 때, 우리가 작성한 title 속성의 문구가 툴팁으로 나오는 것을 확인할 수 있다.

    


위 예제는 0020.html 파일이다.

     

title 속성은 <a> 요소에만 부여되는 속성이 아니라 다른 모든 요소들에도 부여될 수 있는 속성이다. 이러한 속성을 전역 속성(global attribute)이라고 한다. 

    

앞에서 배운 id 속성 lang 속성도 전역 속성(global attribute)이다.

    

title 속성은 위의 <a> 요소에서 사용된 것처럼 아래의 형식(syntax)으로 사용된다. 

    

<요소명(element) title="text">


title 속성은 툴팁으로 간단한 문구를 보여주기 때문에 속성값으로 텍스트 형식을 갖는다.

     

title 속성은 <head> 요소의 <title> 요소가 아니다.


Anki 파일


아래는 본 포스팅의 내용을 갈무리하기 위한 Anki 파일입니다. 참고하시기 바랍니다. 


Ankilog 파일:  0020 a요소 02 title 추가하기.apkg






+ Recent posts