따라쟁이

승근이의 LifeLog – We learn many things by imitation!

Archive for the ‘Front-end’ Category

@font-face rule

one comment

@font-face는 새로운 font-family를 생성하는 CSS rule로, 이를 이용하면 local이 아닌 remote server 상에 있는 폰트로 웹 페이지를 렌더링 할 수 있습니다. 원래는 Internet Explorer 4에서부터 독자적으로 지원했었던 기능이었지만, CSS 3에서 공식적으로 채택되어 현재 Firefox 3.5, Safari 3.1, Opera 10에서도 지원하고 있습니다. 다만 IE에서는 Embedded OpenType (EOT) 포맷만을 지원하고 있고, 최근에 지원하기 시작한 FF, Safari, Opera의 경우 TrueType과 OpenType만을 지원하고 있습니다.

Syntax

font-face를 정의하는 syntax는 다음과 같고,

@font-face {
font-family: <a-font-name>;
src: <source> [,<source>]*;
[font-weight: <weight>];
[font-style: <style>];
[unicode-range: <U+nnn-nnn> [,<U+nnn-nnn>]*];
}

실제 사용은 다음과 같이 합니다. @font-face에서 명시한 font-family를 일반적인 폰트 이름처럼 사용하면 됩니다.

@font-face {
font-family: Graublau Sans Web;
src: url(GraublauWeb.otf) format("opentype");
}
body {
font-family: Graublau Sans Web, Lucida Grande, sans-serif;
}

새로 알게된 내용들

local hint : src descriptor에는 서버에 있는 폰트 url을 명시하는 url hint 외에도 local hint를 이용해서 로컬에 있는 폰트를 지정할 수 있습니다. 또한 소스를 하나 이상 명시할 수 있습니다. 이들을 사용하는 이유는, 해당 폰트가 설치되어 있으면 설치된 폰트를 사용하고 그렇지 않은 경우에만 다운로드 받도록 하기 위함입니다.

@font-face {
font-family: MyHelvetica;
src: local("Helvetica Neue"),
local("HelveticaNeue"),
url(MgOpenModernaRegular.ttf);
}

format hint : 여러 가지 유형의 폰트를 지원할 수 있으므로 source의 포맷을 명시하는 format hint 키워드가 있습니다. CSS Fonts Module Level 3(W3C Working Draft 18 June 2009) 문서에서는 “truetype”, “opentype”, “truetype-aat”, “embedded-opentype”, “svg”를 예제로 들고 있는데, 실제 브라우저에 따라 지원의 차이가 있을 수 있고 또 다른 포맷이 생길수도 있습니다. 참고로 IE에서는 format hint를 인식하지 못하며 포함된 경우 이를 무시하게 됩니다.

@font-face {
font-family: Gentium;
src: url(Gentium.ttf) format("opentype");
}

Cross Browsed @font-face

IE의 경우 eot 파일을, 그 외 브라우저(위에서 언급한 것들)에서는 TrueType 및 OpenType만을 지원하므로 크로스 브라우징이 가능하게끔 코딩을 해야 합니다. 앞서 언급한 src descriptor의 format hint를 이용하여 다음과 같이 코딩할 수 있습니다. 다음 코드에서 어떤 @font-face를 먼저 코딩하는지가 중요합니다.

@font-face { /* for IE */
font-family: Gentium;
src: url('Gentium.eot');
}
@font-face { /* for non-IE */
font-family: Gentium;
src: url('Gentium.ttf') format('opentype');
}

Ajaxian의 @font-face: How to embed it, and how it looks across browsers에서는 하나의 @font-face에 src descriptor를 두 번 선언해서 사용하고 있습니다. 이런식으로도 가능하다면 위 코드는 다음과 같이 변경할 수 있습니다.

@font-face {
font-family: Gentium;
src: url('Gentium.eot');
src: url('Gentium.ttf') format('opentype');
}

Bulletproof @font-face syntax

Bulletproof @font-face syntax을 읽고 추가한 사항입니다.

위의 Cross Browsed @font-face 단락에서 제시한 방법 모두 겉으로 보기에는 크로스 브라우징에는 문제가 없으나, IE에서 조금 이상한 request가 발생하는 문제(?)가 있습니다. IE에서는 먼저 Gentium.eot 파일을 요청(HTTP request)하고 다음번 src에 대해서는 Gentium.ttf’)%20format(’opentype 로 요청을 발생시킴니다. IE가 src를 파싱하는 구조때문인것으로 보이는데 이 경우 404 응답(response)이 올 것입니다.

다음 코드는 이러한 문제를 해결하기 위한 것으로 ttf를 요청할 때 반드시 local hint를 먼저 입력하는 방식입니다. 이 방식은 non-IE 브라우저에서는 로컬에 설치된 경우 이를 사용할 수 있다는 장점이 있으며, IE에서는 local hint 자체를 인식하지 못하므로 파싱 오류가 발생할 것이고 어떤 요청도 하지 않게 됩니다. 참고로 local hint가 2번 사용된 것은 OS X의 Safari에서는 전체 폰트 이름과 Postscript 이름이 틀린 경우 Postscript 이름만을 사용하기 때문에 이를 추가해 준 것입니다(두번째 local hint에 있는 이름).

@font-face {
font-family: 'Graublau Web';
src: url('GraublauWeb.eot);
src: local('Graublau Web Regular'), local('Graublau Web'),
url('GraublauWeb.otf') format('opentype');
}

다음과 같은 방식으로도 불필요한 요청(request)이 발생하지 않게 할 수 있다고 하지만 너무 tricky한 코드라 사용하지 않는게 좋을듯 하네요.

@font-face{
font-family:'Graublau Web';
src: url('GraublauWeb.eot'); /* here you go, IE */
}
@font-face{
font-family:'Graublau Web';
src: url(//:) format ('no404'), url('GraublauWeb.otf') format('opentype'); /* tricky! */
}

의문 사항

font-weight, font-style: font-weightfont-style을 지정할 경우 해당 font-family는 한가지 스타일만을 가질 수 있는 것일까요?

unicode-range 지원 : CSS Fonts Module Level 3(W3C Working Draft 18 June 2009) 문서에서는 존재하지만 MDCMSDN에서는 찾아볼 수 없습니다. 만일 Firefox에서 지원하고, font-family 글에서 언급한 동작방식을 고려한다면 한글과 영문 폰트를 css font-family에 명시되는 순서에 무관하게 사용할 수 있을것 같습니다.

References

본 문서에 나온 예제 코드들은 모두 아래의 문서들에서 가져온 것들입니다.

Written by suguni

October 25th, 2009 at 12:06 am

Posted in Front-end

More – IE6 bug : Horizontal scroll bar in frame.

leave a comment

제목은 NARADESIGN:BLOG포스트 제목을 그대로 채용한 것입니다.

위 포스트에서 제시한 “적당한 문제 해결 방법”을 사용할 경우 가장 치명적인 문제는, frame 문서 내에 absolute position 된 요소가 있을 경우 이 요소가 스크롤을 덮는다는 것입니다. 다음은 이에 대한 예제 화면.

IE6 - frame bug

그래서 “좀 더 적당한 문제 해결 방법”은 frame의 scroll 속성은 auto로 하고(auto가 기본값이니 scroll 속성은 없어도 됩니다) frame 문서의 css에 다음을 추가하는 것입니다.

html { overflow-y:scroll; }

장접
  • absolute position 요소가 스크롤을 덮는 버그 없어짐
  • 수평 스크롤은 필요시에만 생김
단점
  • 수직 스크롤이 항상 생긴다는 점에서는 원래의 해결 방법과 동일
  • 프레임 내 문서를 수정할 수 없다면 적용할 수 없음

Frameset을 사용하면서 단일 프레임만 보여주는 페이지 구성을 할 경우 필수 적용해야 할 듯 합니다(경험상 ^^). 또 IE에서만 발생하는 문제 및 해결법이니, IE Conditional Comment 혹은 IE css hack을 사용해서 적용하면 되겠습니다.

Written by suguni

May 18th, 2009 at 1:58 am

Posted in Front-end

Tagged with , ,

웹 개발자의 의무 – 브라우저 버그 리포팅

one comment

John Resig 아저씨가 A Web Developer’s Responsibility 라는 제목이 붙은 장문의 포스팅을 했습니다. 이 글에서는 웹 개발자는 브라우저 버그를 찾고 이를 수정할 수 있게 알려줘야 하는 의무가 있고, 이를 수행하기 위해 항상 버그 리포팅하고 최신 빌드를 이용해 테스트 하라 라고 하고 있습니다. 글의 대부분은 브라우저 (Mozilla/Firefox, WebKit/Safari, Internet Explorer 8, Google Chrome / V8 JavaScript Engine, Opera)에 따라 어떻게 버그 리포팅 해야 하는지에 대해 소개하고 있습니다.

오픈 소스 참여, 버그 리포팅 이런게 생각보다 쉽지 않습니다. 일단 해당 프로젝트에서 사용하는 도구를 익히고 이를 그들의 문화에 맞게 사용하는 방법을 체득해야 하는데… 쉽지 않죠. 이런 점에서 이 글은 자세하게 설명해 주고 있습니다. 브라우저 버그 리포팅하고 싶지만 구체적인 방법을 모르는 분들께는 좋은 글입니다.

저에게는 사실 … 영어가 문제죠 ^^;

Written by suguni

January 14th, 2009 at 11:12 pm

Posted in Front-end

Tagged with ,

AS3 – Singleton pattern

leave a comment

ActionScript 3에서 완벽하게는 singleton pattern을 구현할 수 없는데, 그 이유는 private인 생성자를 만들 수 없기 때문입니다. 그래서 몇 가지 팁이 있는데 “Extremely safe singleton classes” 포스트에서는 inline class (접근자가 명시되지 않은 class를 나타내는 듯 합니다. package 내에서는 기본 접근자는 internal이며 이는 동일한 package 내에서만 접근 할 수 있음을 의미합니다)를 이용하는 방법을 사용하고 있습니다.

Singleton class의 생성자에 파라미터가 존재하고 해당 파라미터는 동일한 package 내에 있는 class의 instance입니다. 그런데 해당 class가 internal 접근자를 가지므로 해당 package 외부에서는 instance를 생성할 수 없습니다. 따라서 다른 package에서는 singleton class를 일반적인 방법(new)으로 생성할 수 없고, 반드시 getInstance() method를 사용해야 합니다.

하지만 package 내에서는 new를 이용해 새로운 instance를 생성할 수 있으므로 완벽하지 않습니다. 아직까지 제가 본 바로는 완전한 singleton class를 생성할 수 있는 방법은 없는듯.

Written by suguni

November 15th, 2008 at 11:19 pm

Posted in Front-end

Tagged with , ,

AS3 – Activate, Deactivate event와 wmode

leave a comment

Flash Player의 경우 wmode의 설정이 문제를 일으키는 경우가 종종 있습니다. 사실 자세히 따져보면 문제가 아닐수도 있지만, 내가 원하는 동작이 제대로 일어나지 않을 때 이 원인이 전혀 상관 없을거 같은 wmode로 인한 것임을 알게 될때 황당함을 느끼게 되죠. 물론 이런 문제가 대부분의 경우 내가 Flash Player의 동작 방법에 대한 잘 모르기 때문이라고 생각하려고 하지만, Adobe의 행동들을 볼때면 짜증이 나기도 합니다. Flash player 10 릴리즈 할 때 아무런 예고도 없이 beta 버전에서 지원되던 기능을 빼다든지 하는 경우들을 보면 참 그렇죠.

암튼 본 포스트에서의 사례는 activate와 deactive 이벤트와 관련이 있습니다. 해당 이벤트는 flash player가 operating system의 focus를 얻을 때(activate)와 잃어버릴 때(deactivate) 발생합니다. 문제는 이 이벤트가 flash를 embed할 때 wmode=”transparent”로 설정한 경우 발생하지 않는다는 점입니다. 저 같은 경우 다행히도 해결책을 바로 찾았지만(wmode 값 설정 부분을 제거했습니다) 잘못했으면 엄청난 삽질을… 후덜덜..

Written by suguni

November 13th, 2008 at 10:10 pm

Posted in Front-end

Tagged with , , , ,