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 문구 일부 수정




2019년 새해가 밝았으니 과거를 한번 돌아보자.


오늘은 Anki에서 제공해주는 통계를 보면서 그동안 학습한 결과를 정리해보자. 


Anki통계 및 그래프 읽는 법은 다음의 매뉴얼을 참조하면 된다. 


95_(그래프_및_통계)_통계_(Statics)

96_(그래프_및_통계)_카드_종류_및_오늘_통계_(Types_of_Cards_&_Today)

97_(그래프_및_통계)_그래프_(The_Graphs)


통계를 열어보면 아래에 옵션 선택 단추가 나타난다. 


그 동안 공부한 전체 카드에 대한 통계를 전기간에 걸쳐서 보려는 것이므로 [모음집][뭉치 일생]을 선택한다. 


첫 번째 나오는 것은 오늘이라는 표시와 함께 나타난다. 아침에 15개의 카드를 잠깐 보았다. 밥 먹으면서 커피를 끓이면서 설거지를 하면서 짜투리 시간을 이용하여 여유롭게 봤기 때문에 6분이나 걸린 것으로 나온다. 보통 카드 복습은 그렇게 많은 시간이 걸리지 않는다. 이는 나중에 좀 더 자세히 이야기해보도록 하자.




다음에 나오는 그래프는 앞으로 공부할 복습량을 예상(forecasting)한 그래프다. 


통계는 현재 복습할 카드들이 앞으로 학습 관리 원칙에 따라 그대로 공부할 경우 공부할 카드의 개수가 어떻게 줄어드는지 보여준다. 


즉, 현재 19,271개의 복습 카드가 있다. 이번 달(0달)은 2,800개 정도의 카드를 복습하고 다음날은 1,600개 그 다음날은 1,200개 순으로 줄어들다가 4년 2개월(50개월) 후에는 거의 복습할 카드가 없어진다는 것을 알 수 있다. 이렇게 복습할 카드의 개수가 기하급수적으로 줄어드는 모습은 앞서의 Anki로 하는 공부는 얼마나 효율적일까? 편에서 제시한 주별 일평균 카드수가 기하급수적으로 줄어드는 것과 똑같다. 




위의 그래프에서 제시된 카드들 중에서 성숙한 카드는 학습 간격이 21일 이상인 카드를 의미한다. 즉, 대략 4번 이상 반복된 학습으로 충분히 내용을 숙지한 카드를 성숙한 카드라고 하고 그 이전의 카드를 어린 카드라고 지칭한다.



다음 그래프는 처음부터 지금까지 답변한 질문의 개수를 나타낸 복습 횟수 그래프다.


155,859회 복습을 한 것으로 나타나는데 카드 하나를 여러 번 반복해서 학습했기 때문에 가능한 숫자다.


공부한 기간 85%는 매뉴얼에 별도의 설명이 없어서 스스로 추정해봤다. 공부한 기간은 전체 기간 중에 실제 공부한 날짜를 의미하는 것 같다. 즉, 1035일 중에서 883일 공부했다는 의미로 들린다. 즉, 2016년 3월 2일에 Anki를 이용하여 공부를 시작한 것으로 이제 대략 34개월 정도 공부한 셈이다.


공부한 기간 동안 평균은 실제 공부를 한 883일을 기준으로 평균을 내보면 하루에 176.5개 카드를 복습했다는 의미이고 전체 기간인 1,035일을 기준으로는 하면 하루 150.6개 카드를 공부했다는 의미다.




다음은 실제로 공부한 시간을 집계한 복습 시간 그래프인데 이건 정확히 믿기가 힘들다. Anki 모바일앱을 켜놓고 짜투리 시간이 날 때마다 한 번 들여다보거나 산책하면서 길을 걸으면서 조금씩 내용을 음미하면서 카드를 보는 방식으로 공부했기 때문에 실제 공부한 시간보다 오랜 시간 공부한 것으로 집계되었다. 그럼에도 공부한 기간 동안 평균 학습 시간은 하루에 73.8분으로 1시간 15분 정도밖에 되지 않는다. 즉, 176.5개의 카드를 보는데 최대 1시간 15분 정도 걸렸다는 의미이다. 개인적인 추정으로는 30분이면 될 것이다.




다음은 복습 간격 그래프다. 현재 카드들의 복습간격이 어떻게 분포되어 있는지 나타내는 그래프다. 복습간격이 1달 이내(0달)인 카드들이 780개 정도 있다. 복습간격이 12달과 13달인 카드들이 가장 많은 850개와 900개 정도인 것으로 나타난다. 카드들의 평균 복습 간격은 1.4년이고, 최대 복습 간격은 5.1년인 것으로 나타나니  하나의 카드가 가장 많이 반복된 회수가 8회 정도라는 것을 추정할 수 있다.




마지막 그래프는 카드 유형 그래프이다. 


그 동안 총 21,400개의 카드를 만들었고 그 중 2,124개의 카드를 제외한 19,276개의 카드를 학습한 셈이다. 대부분 성숙한 카드이고 보지 않은 카드들은 새 카드로 만들었지만 한 번도 학습하지 않은 카드들이다. 



과거 3년 정도 학습한 내용이 일목요연하게 보이니 재미있고 신기하다. 이제는 단지 추상적으로 열심히 공부했다고 말하지 않고, 구체적으로 그 동안 19,276개의 카드를 공부했어라고 말할 수 있으니 스스로 공부한 양을 구체적인 수치로 확인한 셈이다. 게다가 이 카드들은 그저 책을 읽듯 읽고 넘어간 것이 아니고 이해하고 암기하고 있으며 추후에도 계속 이해하고 외우고 있을 것을 확신한다는 점에서 마치 재산을 축적한 것 마냥 뿌듯한 느낌이 든다. 올해에도 더욱 발전하고 지식이라는 재산을 더 늘려가고 싶다.


Happy New Year!


Anki가 카드의 앞뒷면을 이용한 학습도구라는 점에 대해서 계속 이야기해왔고 분명히 Anki는 지식을 효과적으로 다루고 볼 수 있게 해주는 훌륭한 카드 학습도구다. 그렇지만 그런 이유 때문에 Anki를 사용하고 있는 것은 아니다. Anki의 진정한 가치는 개별 카드의 학습을 매우 효율적으로 관리해주기 때문에 사용하는 것이다.

      

앞서 처음 암기(Anki)한 이야기에서 언급한 대로 헤르만 어빙하우스 망각 곡선의 원칙에 따라서 공부를 해보고 싶다는 생각에 망각곡선에 따라 지식을 관리하고 조절할 수 있는 학습 관리 시스템을 찾았다. 그러다가 마주친 것인 Anki였다. 

      

Anki학습 관리 원칙망각 곡선과는 조금 달랐다. 망각 곡선의 원리와 완전히 다른 원칙을 적용하고 있는 것이 아니라 망각 곡선 외에 더 많은 요소를 고려한 복잡하고 섬세한 원칙을 적용하고 있다. 어떤 카드를 공부했을 때, 이 카드를 공부한 횟수가 많을수록 더 카드의 노출 간격이 길어지면서 더 드문드문 그 카드와 마주치게 된다는 점은 망각 곡선과 유사하다. 하지만 카드를 학습한 후 학습자가 평가한 난이도에 따라 조금씩 간격이 길어지거나 짧아지고 항상 비슷한 카드들이 비슷한 순서로 나타나는 것을 막기 위하여 약간의 무작위적 변동(±α)이 적용되도록 한 점 등 좀 더 섬세하게 바뀐 점이 많다. 이런 Anki의 학습 관리 시스템은 결국 카드의 노출 간격을 적절히 조절하여 학습 효과를 극대화하는 것이므로 간격 반복 시스템(spaced repetition system)이라고 부른다. 

      

Anki간격 반복 시스템에 대해서는 다음을 참조하기 바란다.

01_Introduction(개요)_Anki_2.0 유저 매뉴얼

107_(FAQ)_자주_묻는_질문_2.0_유저_매뉴얼



그렇다면 이러한 간격 반복 시스템은 실제 얼마나 효율적일까?

     

우선 카드를 처음 만들면 새 카드를 익히는 과정을 거치고 나서 충분히 익혔다고 판단되면 복습카드로 변한다. 그리고 복습카드 부터는 한번 공부할 때마다 간격 반복 시스템이 적용되어 해당 카드가 나타나는 노출 간격이 늘어나므로 실제 카드가 나타나는 빈도수는 줄어들게 된다. 

     

이 때, 카드의 간격은 기본적으로 앞서의 간격의 2.5배±α 가 증가하는 식으로 늘어난다. 

     

카드의 간격은 기본적으로 2.5배씩 늘어나지만 응답시간이나 난이도 평가에 따라서 조금씩 그 비율이 변경된다. 이 부분에 대해서는 나중에 다루고 이번에는 기본 간격인 2.5로만 이야기를 진행하도록 하자.

     

±α는 카드들이 매번 동일하게 나타나는 것을 막기 위하여 도입된 변동 요소다. 

     

아래의 그림을 보자 ±α가 없을 때 1,000개의 카드가 시간이 지나가면서 어떻게 나타나는지 보여주고 있다. 2.5배씩 간격이 벌어지지만 매번 하루에 1,000개의 카드가 나타난다


±α가 있으면 양상이 달라진다. 간격이 벌어지면서 카드들이 여러 날에 걸쳐서 분산되기 시작한다.


±α가 있음으로 인하여 카드들은 공부한 회차가 늘어날수록 점점 여러 날에 걸쳐 나타나게 되기 때문에 카드를 공부할수록 1,000개의 카드가 점점 넓게 여러날로 분산되고 그만큼 매일매일 공부하는 부담도 같이 줄어들게 된다

     

±α 값은 공개된 값을 찾지 못해 임의로 추정하여 적용한 값이다. 



간격 반복의 가장 기본적인 원칙을 살펴 보았으니 이번에는 간단한 사례로 실제로 카드가 시간에 따라서 어떻게 나타나는지 확인해보자. 


우선, 카드 1개가 어떻게 나타나는지 보자. 

    

카드의 노출 간격은 앞선 간격의 대략 2.5배로 늘어난다. (±α는 평균적으로 0이므로 개별 카드 1개의 기간을 계산할 때는 고려하지 않는다.)

      

그러면 첫날 공부한 카드는 3일, 9일, 26일, 75일, 218일, 632일 순으로 노출 간격이 늘어나게 된다. 이를 표로 나타내면 다음과 같다. 

       

카드 학습 횟수 

간격 

학습기간 

 1회

 1일

1일 

 2회

 3일

4일 

 3회

 9일

13일 

 4회

 26일

39일 

 5회

 75일

114일

 6회

 218일

332일 

 7회

 1.7

2.6 

 8회

 5.0

7.7 

 9회

 14.6

 22.2



즉, 하나의 카드를 9번 공부하는데 걸리는 시간이 22.2년이므로 평생 1개의 카드를 9번 정도 반복해서 공부하게 된다. 바꿔서 생각해보면 한 개의 카드를 9번만 반복해서 익히면 평생 해당 기억을 유지할 수 있다는 말이니 얼마나 효율적인 학습인지 가늠할 수 있다. 물론, 매순간마다 제대로 학습한다는 전제하에서 하는 말이다.



학습을 하면서 전체 학습하는 카드가 줄어드는 양상을 살펴보면 얼마나 효과적인 학습인지가 분명해진다. 가령, 1,000개의 카드를 매번 적절하게 학습한다고 가정할 때 카드의 개수가 어떻게 변화하는지 시뮬레이션 해보자

      

1,000개의 카드는 대략 2일 후에 500개 3일 후에 500개 정도의 카드로 반으로 쪼개져서 나타난다. 

     

그래서 첫 주는 첫날 1,000개의 카드와 3일 500개, 4일 500개로 2,000개의 카드를 7일 동안 학습하게 되므로 첫 번째 주에는 일평균 286개의 카드를 학습한다. 하지만 두 번째 주부터는 일평균 카드의 수가 143개로 반으로 줄어들고 매주 마다 거의 절반 수준으로 일평균 카드의 수가 줄어들다가 반년(26주)이 지나면 이제 주당 1~2개의 카드 정도를 학습하게 된다.



Anki의 간격 반복 시스템은 결국, 학습할 카드들을 대략 9번 정도 반복하면서 그 때마다 간격을 크게 늘리고 카드를 분산시켜 극한의 효율로 학습할 수 있도록 관리하고 있다.  

      

그렇다면 이렇게 터무니없게 공부량이 줄어드는데 과연 제대로 학습이 이루어지는가 하는 의문이 생길 것이다. 최적의 실험을 설계해서 이를 철저히 검증하면 좋겠지만 너무 많은 시간과 비용이 들어가므로 Anki에서 주장하는 그 학습 관리 원칙이 옳은지 틀린지는 개인으로 검증하긴 어렵다. 그래서 할 수 있는 이야기라고는 Anki를 사용하고 있는 나 자신의 경험상 Anki 학습 관리 원칙에 따른 학습은 매우 만족스럽다는 정도에 불과하다.

      

마지막으로 카드를 학습할수록 카드들이 획기적으로 줄어든다는 사실을 알게 되니 공부하기가 한결 수월해졌다. 왜냐하면 지금 이 고비만 넘어가면 그 다음부터는 카드의 개수가 훨씬 줄어든다는 것을 알기 때문에 힘들 때에도 속으로 “이번만 잘 넘기면 다음부턴 훨씬 쉬워”라고 뇌까리면서 카드를 끝까지 공부하게 된다. 그리고 다음에 파격적으로 줄어드는 카드의 개수를 볼 때마다 기분이 좋아지고 후련하게 된다. 이런 식의 선순환 덕분에 나의 Anki 공부는 카드를 치워서 점점 부담이 줄어들고 후련해진다는 식으로 자리잡게 되었고 지금은 매일매일 카드를 치워 버릴 때마다 느끼는 후련함에 중독되어 버렸다

+ Recent posts