'분류 전체보기'에 해당되는 글 151건

  1. 2011.01.24 HTML5 표준 기술과 서비스 생태계 변화
  2. 2011.01.04 css 텍스트 말줄임 1
  3. 2011.01.04 텍스트 줄바꿈 처리 word-break, white-space
  4. 2010.12.20 이미지 롤오버
  5. 2010.12.16 모바일 코딩시 참고사항
  6. 2010.12.16 아이폰용 모바일 웹페이지 디자인 팁 2
  7. 2010.12.16 아이폰 웹 코딩시 유의점
  8. 2010.12.14 CSS Hack 1
  9. 2010.12.08 td 안에 div height:100% 만들기
  10. 2010.12.08 텍스트 줄바꿈 1

HTML5 표준 기술과 서비스 생태계 변화

HTML 2011. 1. 24. 09:22


HTML5는 단지 웹의 변화만을 요구하는 것은 아니다. 모바일의 중심 아키텍처가 되어 새로운 변화와 방향을 주도하고 있으며 나아가 서버 애플리케이션마저도 변화를 요구하고 있다. 또한 이런 요구는 궁극적으로 서비스 생태계 방향의 재정립을 요구하고 있으며 이에 발맞춰 나가지 않으면 무인도에서 홀로 사는 모습이 될 수 있다. 눈 덮인 히말라야 산 골짜기에서 혼자만의 외침이 될 수 있다.

김영보 www.corechain.com|자바스크립트 라이브러리 CoreChain 개발자이면서 『HTML5 차세대 웹 표준, 기술』의 저자다.

필자는 이 글을 통해 태풍처럼 밀려오는 HTML5의 거대한 요구를 서비스 생태계와 연계해 어떻게 대처할 것인가를 생각해 보려고 한다. 이 글은 어쩌면 필자 자신의 독백이 될 수 있으며 소프트웨어 개발자인 필자 자신의 지침이 될 수도 있다. 한편 그릇된 점도 있을 수 있으며 뒤처지거나 훨씬 미래에 발생할 수도 있다. 이 글을 읽는 독자의 환경에 따라 생각의 척도가 다를 수 있으므로 판단은 독자의 몫으로 남기려 한다.

서비스 중심에 콘텐츠가 있다
우리 개발자들이 밤낮으로 고생해서 만드는 최종적인 결과물은 콘텐츠이며 이를 인간에게 제공하는 것이 궁극적인 목적이다. 인간에게 제공하지 못하는, 인간이 사용하지 않는, 사용의 필요성이 없는 콘텐츠를 개발하는 것은 의미가 없다. 서버의 블랙박스 안에 들어가는 제어용 프로그램도 개발하지만 이 또한 간접적으로 인간에게 콘텐츠를 제공하게 된다.

우리가 만든 콘텐츠는 인간에게 제공될 때 비로소 가치를 인정받게 되며 소정의 목적을 달성할 수 있다. 인간이 사용하지 않는 프로그램을 개발한들 소용이 없다. 기술 중심의 마인드를 가진 개발자들이 실수하는 가장 큰 이유 중의 하나가 이 점을 염두에 두지 않고 기술적으로 접근하기 때문이다. 기술과 프로그램은 콘텐츠를 제공하기 위한 바탕이지만 여기에 너무 치우치면 사용자에게 외면 받는 소프트웨어가 될 수 있다. 사용자는 기술이 아닌 콘텐츠를 보고 사용 여부를 결정하기 때문이다. 기술적인 측면을 고려하는 것은 한참 지난 후이며 그나마도 뜻 있는 일부 사용자가 한다.

HTML5는 서비스 지향 아키텍처다!
HTML5는 단지 HTML4에서 HTML5로 숫자가 바뀐 것이 아니므로 웹 페이지를 표현하는 태그 중심 개념으로 접근해서는 곤란하다. 그러면 아무것도 보이지 않으며 느낄 수도 없다. HTML5는 서비스 지향 아키텍처다.

그 동안의 HTML4 개념에서 보면 브라우저에 탑재된 하나의 언어인 것을 아키텍처라고 표현한 것에 대해 받아들이기가 어려울 수 있으며 논리에 맞지 않다고 생각할 수도 있다. 필자 또한 이 점에 동의한다. 하지만 브라우저 관점이 아닌 HTML5 밑바탕에 깔려있는 근본적인 모습을 보면 아키텍처라고 해도 틀림이 없다.

HTML5는 기능이 아니라 사상이라고 필자는 생각한다. HTML5라고 명명되어 한정된 느낌이 들게 하지만 현재 HTML5에 포함된 기능과 앞으로 전개될 기능을 고려하면 기능이 아니라 사상이다. 인간에게 콘텐츠를 제공하기 위한 근본적인 아키텍처다.

<그림 1> HTML5 분류

<그림 1>의 HTML5 분류에서 볼 수 있듯이 HTML5는 크게 엘리먼트(Element)를 통해 콘텐츠를 표현하는 마크업 부분과 다양한 기능을 제공하는 API 부분으로 나눌 수 있다. 한편 HTML5라고 표기하고 있는 관계로 인해 마크업 기능만을 가진 것으로 착각할 수 있으며 API 단어만을 보고 기능을 제공하기 위한 인터페이스로 한정 지을 수 있다.

여기서 중요하게 생각할 것은 마크업도 콘텐츠를 제공하기 위한 것이고 API도 콘텐츠를 제공하기 위한 것이라는 점이다. 즉, 인간에게 콘텐츠를 제공하기 위한 아키텍처를 구비한 것이다. 

마크업은 HTML5에 추가된 엘리먼트 부분과 엘리먼트 기능을 다시 정의한 부분으로 나눌 수 있다. 추가 부분에서 첫째, 콘텐츠를 구성하는 모델 개념이 도입되었다. 엘리먼트를 구조적으로 나열해서 콘텐츠를 구성하는 것이 아니라 데이터베이스 모델링, 비즈니스 모델링, 도메인 모델링 등의 모델링을 하듯이 콘텐츠를 모델링하는 개념이다. 모델링의 최종 목적은 최적화라고 할 수 있다. 즉, 콘텐츠 모델링을 통해 인간에게 최적화된 콘텐츠를 제공하기 위한 것이다. 또한 모델링하는 사람을 모델러라고 하듯이 웹 퍼불리셔를 콘텐츠 모델러라고 불러야 한다.

둘째, <video><section>과 같은 엘리먼트의 추가다. 애플이 플래시를 지원하지 않겠다고 해서 큰 파란이 일었던 기술적인 배경은 하나의 엘리먼트를 지원하지 않은 것에서 발생했다. 이와 같이 엘리먼트 지원 여부에 따라 동반되는 기술에 영향을 미치게 된다. <video><audio>도 마찬가지다. 이 엘리먼트를 지원하게 됨에 따라 비디오, 오디오를 지원하는 체계의 변화가 생겼다. 어떤 회사는 이를 위해 기술력을 가진 회사를 인수하기도 했다. 이렇게 HTML5는 기능이 아닌 서비스 생태계를 변화시키는 아키텍처를 갖고 있다.

API는 <canvas>, <svg>와 같이 엘리먼트에 직접 콘텐츠를 표현하는 API와 Web Sockets, Database와 같이 간접적으로 콘텐츠를 제공하는 API로 나눌 수 있다. 또한 앞으로 어떤 API가 HTML5에 포함될지 모른다. TV에 브라우저가 탑재되듯이 HTML5에는 각종 디바이스(Device)에 브라우저가 탑재될 수 있는 아키텍처가 준비되어 있다.

바로 이 점이 HTML5를 다시 보고 생각해야 하는 이유다. 이미 브라우저를 지원하는 TV가 출시되고 있으며 향후 오디오로, 냉장고로 무한대의 발전이 예상되고 있다. 디바이스에 브라우저가 탑재되면 모바일, PC를 통해 이를 제어할 수 있게 된다. 즉, 이런 모든 제어를 위한 아키텍처를 HTML5가 제공하게 된다. 그래서 HTML5는 아키텍처다.

Web SocketsWeb Sockets는 클라이언트와 서버 간의 양방향 동시 통신을 규정한 API다. 일반적으로 클라이언트에서 서버의 애플리케이션을 호출하면 서버에서 요청한 클라이언트로 데이터를 전송하게 된다. 즉 클라이언트에서 요청이 있어야 한다는 전제 조건이 있으며 그때서야 서버 애플리케이션이 실행되어 데이터를 전송하게 된다. 하지만 Web Sockets는 한 번만 클라이언트에서 서버와 통신 경로를 열어두면 클라이언트의 요청이 없더라도 서버에서 클라이언트로 데이터를 전송할 수 있다. 물론 클라이언트에서 서버로 데이터를 전송할 수도 있다.

필자가 개발했던 간이 빙고 게임 프로그램의 시나리오를 통해 Web Sockets 형태를 살펴본다. 전반적인 처리 흐름과 기능을 살펴보는 것이 목적이다.

<화면 1> 빙고 게임

<화면 1>에서 보는 빙고 게임의 실행 환경은 클라이언트에 웹 소켓 서버를 설정했으며 Java로 서버용 애플리케이션을 작성했다. 왼쪽의 빙고 보드는 크롬 브라우저에서 실행한 것이고 오른쪽의 빙고 보드는 사파리 브라우저에서 실행한 것이다. 원고를 쓰는 시점에 두 브라우저에서 웹 소켓을 지원한다. 개략적인 시나리오는 오른쪽 빙고 보드의 숫자를 마우스로 클릭하면 값이 서버로 전송되고 서버 애플리케이션은 빙고 게임이 연결된 클라이언트로 데이터를 전송한다. 그리고 각 클라이언트에서 이 값을 받아 값과 일치하는 번호에 파란색을 칠한다. 전형적인 빙고 게임과 조금 차이가 있는 것은 의도적으로 웹 소켓 흐름 파악에 중점을 두었기 때문이다. 아래 시나리오에서 클라이언트는 HTML5, CSS, 자바스크립트, 캔버스를 의미한다.

● 시나리오
1.  사용자가 브라우저를 통해 빙고 게임을 실행한다.
1.1.  클라이언트는 랜덤으로 숫자를 추출해서 빙고 보드에 표시한다.
1.2.  클라이언트는 웹 소켓 오브젝트를 생성해 서버와 통신 경로를 개설한다.

2.  사용자가 오른쪽 빙고 보드에서 마우스로 숫자를 선택한다.
2.1.  클라이언트는 입력한 값을 서버로 전송한다.
2.2.  서버는 연결된 모든 클라이언트에 값을 다시 전송한다.

3.  클라이언트는 서버에서 데이터가 전송된 것을 인식한다.
3.1.  {메모} 이벤트 핸들러가 웹 소켓 오브젝트에 설정된 상태이므로 이벤트가 발생하면 자동으로 핸들러 함수가 실행된다.

3.2.  {메모} 이를 메시징 방법이라고 한다.
3.3.  빙고 보드에서 일치하는 번호를 찾아 바탕색을 파란색으로 칠한다.

웹 소켓은 클라이언트에서 var obj = new WebSocket(‘http ://www.corechain.com/socket’)과 같이 생성자 함수의 파라미터에 애플리케이션을 지정하면 통신이 개설된다. 그리고 생성한 오브젝트인 obj에 obj.onmessage = this._onmessage와 같이 onmessage 이벤트가 발생했을 때 실행할 이벤트 핸들러 함수를 지정한다. 그러면 서버에서 웹 소켓을 통해 데이터를 전송하면 자동으로 this._onmessage 함수가 실행된다. 이와 같이 간단하고 쉽게 통신을 행할 수 있다. 

여기서 중요한 것은 HTTP 통신을 하게 되면 Header 정보가 통신할 때마다 전송되지만 웹 소켓 통신은 처음 한 번만 전송되고 두 번째부터는 header 정보는 전송하지 않고 데이터만 전송한다는 점이다. 그러니 당연히 처리 속도가 빠르다. 

또한, 메시징 기법을 다른 API에도 적용했다는 점이다. 예를 들면 클라이언트의 데이터베이스에서 데이터를 추출할 때 조건을 지정해 데이터베이스의 메소드를 호출하면, 데이터 추출을 완료한 후 이벤트를 발생시키므로 자동으로 이벤트 핸들러 함수가 실행된다. 이와 같이 HTML5는 같은 메커니즘을 갖고 있다.

Canvas
캔버스(Canvas)는 동적으로 2차원 그래픽을 구현할 수 있는 API다. 여기서 동적으로 그래픽을 구현한다는 점이 특징이다. 또한, <canvas> 엘리먼트에 직접 그래픽을 표현할 수 있다. 동적이 아닌 정적인 그래픽은 HTML4의 <img><object> 엘리먼트를 사용해서 표현할 수 있다.

그래픽을 표현하기 위한 요소로는 위치를 나타내는 X/Y 좌표, 도형/선을 그리는 형태와 색상을 들 수 있다. 즉, 캔버스는 이를 위한 메소드와 프로퍼티를 제공한다. 또한 자바스크립트 프로그램으로 캔버스의 메소드와 프로퍼티를 조합해 그래픽을 표현하게 된다.

<화면 2>의 캔버스 도형에서 볼 수 있듯이 바탕색이 다른 원이 5개 그려졌다. 또한 다음은 이를 그린 코드다.

<화면 2> 캔버스 도형

var context = document.getElementById(‘idOne’).getContext (‘2d’);
var arcFill = function(x, y, r, g, b, radius){
    context.beginPath();
    context.fillStyle  = ‘rgba(‘ + r + ‘, ‘ + g + ‘, ‘ + b + ‘, 0.7)’;
    context.arc(x + 650, y + 180, radius, 0, Math.PI * 2, false);
    context.fill();
}

arcFill(50, 40, 255, 130, 130, 30);
arcFill(50, 90, 43, 255, 40, 30);
arcFill(100, 40, 64, 161, 255, 30);
arcFill(100, 90, 158, 64, 255, 30);
arcFill(75, 65, 255, 255, 223, 25);

첫 번째 줄에서 도큐먼트에 작성된 <canvas> 엘리먼트를 엘리먼트 오브젝트로 생성하면 오브젝트에 getContext()가 설정되어 있으므로 이를 호출할 수 있다. getContext()는 캔버스 오브젝트를 반환하는 생성자 함수다. 캔버스가 API이므로 new 연산자를 사용해서 오브젝트를 생성해야 하나 new 연산자를 사용하지 않고 생성자 함수를 불러 오브젝트를 생성한다. 또한, 캔버스를 표현할 수 있는 메소드와 프로퍼티가 캔버스 오브젝트에 설정되어 있으므로 이를 사용할 수 있다. 

아래의 arcFill()의 파라미터에 원이 표시될 X/Y 좌표, 바탕색의 RGB 값, 원의 반지름을 지정해 호출하면 원을 그리게 된다. 단순한 것 같으므로 하나 더 살펴본다.

<화면 3> 캔버스 차트

<화면 3>은 캔버스로 그린 차트다. 서버에서 데이터를 받아와서 차트를 그릴 수 있으며 직접 데이터를 지정해 그릴 수도 있다. 여기서 중요한 것은 동적 그래프라는 점이다. 만약 주식 동향 그래프를 제공한다고 할 때 고정된 그래프가 아닌 동적으로 서버에서 데이터를 받아와 그려야 하며 데이터 값에 의해 그래프가 그려져야 한다. 또한 프로그램도 데이터에 따라 움직여야 하므로 고정 값을 지정한 형태가 아닌 옵션을 지정해 프로그램이 수행되는 형태가 되어야 한다. 이와 같이 Canvas API는 동적으로 그래프를 그리는 데 유용하다.

최근의 동향을 보면 모바일에서 웹 페이지를 쉽게 볼 수 있도록 하기 위해 되도록이면 이미지 파일을 사용하지 않으려는 경향이 있다. 캔버스를 사용해서 이미지를 표현하면 모바일에 탑재된 모든 브라우저에서 캔버스 API를 지원하므로 웹과 모바일 모두 통용될 수 있다. 이미지 파일이 다운로드될 때까지 기다리지 않아도 된다.

이미지 파일을 되도록 사용하지 않으려는 또 하나의 이유는 통신이 연결되지 않은 오프라인 상태에서도 모바일은 애플리케이션을 실행할 수 있다는 점 때문이다. 이때 <html> 태그에 실행할 파일과 이미지 파일의 URL을 지정한다. 그런데 캔버스로 이미지를 표현하면 이미지 파일이 필요 없으므로 지정하지 않게 된다. 물론, 지정하는 것이 어려운 것은 아니지만 이미지 파일의 URL이 변경되거나 동적으로 이미지를 표현해야 하는 경우에는 부담이 될 수 있다. 즉 유지보수의 어려움이 있다. 하지만 캔버스로 이미지를 표현하면 동적으로 이미지를 표현할 수 있으며 프로그램만 수정하면 자동으로 반영되므로 이미지 파일의 URL을 바꾸지 않아도 된다.

또 다른 방법으로 CSS3를 사용하는 것을 생각할 수 있는데, 모바일의 브라우저는 지원하지만 IE 6/7/8에서 지원하지 않으므로 웹 페이지에 적용하기에는 어려움이 있다. 물론 Canvas도 IE 6/7/8에서 지원하지 않지만 구글에서 개발한 캔버스 라이브러리를 사용하면 네이티브가 아니므로 다소 처리 속도가 떨어지더라도 이미지를 그릴 수 있다. 필자가 이를 제시하는 것은 대안, 다른 방법을 제시하기 위한 것이며 이렇게 해야 한다는 것은 아니다.

Web Storage
웹 스토리지(Web Storage)는 클라이언트에 데이터를 저장하기 위한 API다. 쿠키를 사용해서 데이터를 저장할 수도 있지만 용도와 방법이 다르다. 쿠키는 쿠키에 접근할 때마다 서버로 전송하지만 웹 스토리지는 전송하지 않는다. 또한 쿠키는 크기(4 KB)에 제한이 있지만 웹 스토리지는 사이트 단위로 5MB를 HTML5 스펙에서 권장하고 있다. 하지만 이는 권고이며 확정된 것은 아니다. 쿠키는 유효 기간을 설정할 수 있으며 이 기간이 지나면 자동으로 지워지지만 웹 스토리지는 유효 기간이 없으며 사용자가 의도적으로 지우지 않으면 영구 보관된다. 

웹 스토리지는 키와 값 형태로 저장된다. 일명 Hash로 {key : value} 형태다. 현재 문자열을 지원하는 브라우저가 있을 수 있는데, 이는 이전 스펙에서는 문자열로 지원하도록 되어 있기 때문이며 최근 스펙에서 변경되었다.

웹 스토리지는 두 가지 유형의 로컬 스토리지와 세션 스토리지를 제공한다. 로컬 스토리지는 사이트 단위를 지원하며 세션 스토리지는 브라우징 콘텍스트 단위로 지원한다. 브라우징 콘텍스트란 브라우저에서 다수의 탭을 사용할 때 각각의 탭을 의미한다. 로컬 스토리지 값은 영구 보관되며 세션 스토리지는 브라우저를 닫으면 자동으로 지워진다.

여기서 하나 생각할 것은 왜 이런 메커니즘을 갖느냐는 것이다. 필자가 웹 스토리지 API를 개발한 것이 아니므로 바로 이것이라고 단언할 수는 없지만 우선 생각할 수 있는 것은 통신을 최소화할 수 있다는 점이다. 같은 데이터를 매번 서버에서 가져오지 않고 웹 스토리지에 저장된 데이터를 사용하면 속도도 훨씬 빠를 뿐 아니라 서버의 부하도 줄일 수 있다. 특히 통신이 끊긴 오프라인 상태에서 실행되는 모바일에서 더욱 진가를 발휘할 수 있다. 

예를 들어 고객과 상담 중에 주문을 받았다고 했을 때 그 자리에서 주문을 모바일에 입력할 수 있다. 이때 웹 스토리지에 주문 입력을 위한 기본 데이터가 저장되어 있다면 서버와 연결하지 않아도 된다. 고객과 같이 모바일을 보면서 주문 내용을 입력할 수 있다. 또한 이어서 다루고 있지만 입력한 데이터를 데이터베이스 API를 사용해서 모바일에 저장할 수 있다.

여기서 중요한 것은 통신이 끊긴 상태에서도 처리할 수 있다는 점이다. 오프라인 상태에서 웹 스토리지 또는 데이터베이스에 데이터를 저장하고 필요한 시점에 서버와 연결해 저장된 데이터를 전송한다. 이와 같이 HTML5는 통신이 끊어진 오프라인 상태에서도 처리할 수 있는 아키텍처와 메커니즘을 제공한다.

Database
HTML5는 두 가지 유형의 Web SQL Database와 Indexed Database를 제공한다. Web SQL 데이터베이스는 ‘select * from table_name’과 같이 일반적으로 알려진 SQL을 사용해서 데이터를 저장/추출할 수 있으며 Indexed 데이터베이스는 인덱스를 사용해서 데이터를 저장/추출할 수 있다. 그런데 Web SQL 데이터베이스는 개발이 중단되었으며 Indexed 데이터베이스가 표준으로 채택될 가능성이 높다.

Indexed 데이터베이스는 {key: value} 형태에 인덱스를 부여해 데이터를 저장한다. 따라서 key 또는 인덱스로 데이터를 저장/추출할 수 있다. 물론, 처리 속도가 떨어질 수 있지만 value로도 추출할 수도 있다. 인덱스는 데이터베이스에서 자동으로 설정한다. 

여기서 {key: value} 형태는 앞서 다뤘던 웹 스토리지와 같다. 다만 Indexed 데이터베이스는 인덱스를 부여하며 저장하므로 key가 중복되더라도 값을 저장할 수 있다. 예를 들어 회원번호를 가진 회원이 다수의 주문을 한다고 할 때 주문번호가 아닌 회원번호를 사용해서 데이터를 저장할 수 있다. 또한 데이터베이스에서 지원하는 커서(cursor) 기능을 제공하므로 데이터를 보다 빠르게 추출할 수 있다.

서버에서 모든 것을 하던 시대는 끝났다

HTML5에는 지금까지 살펴본 것 이외에도 다수의 API가 있다. 하지만 지면 관계도 있고 본 내용이 API를 소개하는 것이 목적이 아니므로 전체를 다루지 않았다. 

그럼 지금까지 살펴본 API의 핵심은 무엇일까? 우선 모든 API가 브라우저에 탑재되어 있으며 클라이언트에서 실행된다는 점이다. 따라서 브라우저가 실행될 수 있는 환경이면 어디서든지 HTML5를 제공할 수 있으며 이의 궁극적인 목적은 인간에게 콘텐츠를 제공하는 데 있다.

30년 전 필자가 처음 프로그램을 개발할 때는 모든 것이 메인 컴퓨터에 있었다. 그리고 어느 정도 시간이 흐른 후 클라이언트/서버 시대가 도래했다. 메인 컴퓨터에서 실행되던 프로그램이 클라이언트에서 실행되는 형태로 유저 인터페이스와 관련된 프로그램이 클라이언트에서 실행되었다.

한편 이 무렵에 웹이 태동했으며 브라우저가 클라이언트 프로그램 역할을 하게 되었다. 하지만 이때의 브라우저는 HTML5가 탑재된 현재의 브라우저하고는 기능도 다르고 처리 방법, 범위도 달랐다. 웹 페이지를 표현하는 것이 주된 기능이다.

브라우저를 사용해서 데이터를 표현하려면 반드시 서버용 애플리케이션이 있어야 한다. 서버용 애플리케이션에서 보내준 데이터를 받아 이를 표현하는 형태로 동기 또는 비동기 방식으로 데이터를 주고 받는다. 이런 환경으로 인해 서버용 애플리케이션은 데이터를 제공하는 형태로, 브라우저는 유저 인터페이스 중심으로 데이터를 표현하는 형태로 발전되었다.

하지만 이런 구조는 사용자의 다양한 요구를 만족시키기에 한계가 있으며 특히 모바일과 다양한 디바이스 환경의 사용자 요구를 만족시키기에 더욱 한계가 있다. 이에 대처할 방법이 바로 HTML5인 것이다. 지금까지 살펴봤듯이 HTML5는 서비스 지향 아키텍처이며 메커니즘을 제공한다.

HTML5는 브라우저만으로 PC, 모바일, 디바이스에서 서버 기능의 대부분을 단독으로 처리할 수 있다. 다른 프로그램이 필요한 것도 아니며 OS가 다른 디바이스 환경에 제약을 받는 것도 아니다. 데이터를 저장할 수 있는 데이터베이스도 있으며 클라이언트의 파일을 읽거나 쓸 수도 있으며 그래프를 표현할 수도 있으며 필요할 시점에 매우 빠르게 다른 디바이스와 통신할 수도 있다. 간단한 애플리케이션이라면 서버와 연결하지 않고 단독으로 처리할 수 있다. 비록 지금은 작은 애플리케이션이지만 가까운 미래에 디바이스 용량이 커지면 큰 애플리케이션도 실행할 수 있게 된다. 이는 하드웨어적인 면으로 지금까지의 경험으로 볼 때 그야말로 눈 깜짝할 사이에 실현될 것이다.

이제, 클라이언트와 서버가 브라우저에 통합되어 손바닥 안에서 실행하게 된다. 손바닥 위에서 무릎 위에서 손가락으로 콘텐츠를 보고 생성하는 시대가 도래한 것이다. 서버와 연결하지 않고도 유려한 인터페이스를 사용해서 보다 인간적으로 친근하게 콘텐츠를 처리할 수 있다. 이제 서버에서 모든 것을 제공하던 시대는 끝났다. 이제 남은 것은 서버와 클라이언트가 융합해 보다 나은 콘텐츠를 어떻게 사용자에게 제공할 것인가를 생각하고 행동하는 것이다. 그리고 그 중심에 HTML5가 있다. 인간에게 선택 받지 못한 콘텐츠는 더 이상 존재 가치가 없다는 점을 상기해 보며 글을 마친다.

출처:
http://www.imaso.co.kr/?doc=bbs/gnuboard.php&bo_table=article&wr_id=36440

'HTML' 카테고리의 다른 글

비디오  (0) 2011.05.12
펌] 폼(Form) 디자인 잘했다는 소리를 듣기 위한 방법론  (0) 2011.03.09
아이프레임 투명하게 만드는 방법  (0) 2010.11.18
파비콘  (0) 2010.05.14
올바른 Table 사용  (0) 2010.04.01
:

css 텍스트 말줄임

CSS 2011. 1. 4. 18:19


height: 높이값;
white-space:nowrap;
overflow:hidden;
text-overflow:ellipsis;  
-o-text-overflow:ellipsis;
-ms-text-overflow:ellipsis;

테이블일 경우 + table-layout : fiexd;


xml은 파폭 적용이 안되더라....말줄임이 안나옴.
:

텍스트 줄바꿈 처리 word-break, white-space

CSS 2011. 1. 4. 16:44
작업을 하다보면 텍스트가 정해진 width를 넘어가는 경우 어떻게 처리해야 하나 고민이 될 때가 있습니다. 그럴 때는 상황에 따라서 이 것들을 사용해서 해결해주면 좋을 듯 합니다.

word-break


word-break 는 말 그대로 단어를 자르는 겁니다. 기복적으로 줄이 넘어갈 때는 단어단위로 잘려서 넘어가게 되어 있습니다. 그래서 띄어 쓰기를 하지 않고 글을 쓴다면 한 단어로 인식하여서 width 를 넘어가도 줄바꿈이 되지 않습니다. 그럴 때 word-break 를 사용해주면 줄바꿈이 가능하게 됩니다.


.selector {word-break:break-all;}

위와 같은 속성을 주게되면 위의 그림의 아래 부분과 같이 단어 중간에서도 줄바꿈이 가능하게 됩니다. 위의 그림이 잘 이해가 가지 않는다면 이 그림을 보시면 단번에 이해가 가실 것 입니다.


단어의 중간에서 줄바꿈이 되는 효과입니다. 이 것의 반대 속성은 nowrap, keep-all 등을 주면 된다는데 제가 실험해본 결과 잘 안되는 것 같습니다. 그래서 이번에 같이 소개할 white-space 를 사용하시면 됩니다.

white-space


white-space는 여러가지 값이 있는데, 정리를 해보자면 이렇습니다.

inherit  말그대로 상속 받는 것
normal  일반적인 것, default
nowrap  줄바꿈을 하지 않는다
pre  <pre>태그와 같은 기능, 마크업에서 앤터로 줄바꿈 한것 만 적용이 되고 넘어가는 것에는 줄바꿈 하지 않는다
pre-line  마크업에서 줄바꿈 한 것이 적용 되면서 width를 넘어가는 텍스트도 자동으로 줄바꿈이 된다
pre-wrap  pre-line 과 비슷

말로 길게 설명해 무엇합니까? 그렇다면 눈으로 확인해 봅시다.

HTML 마크업은 다음과 같이 했습니다. 줄바꿈은 왼쪽에 보이는 라인넘버에서 알 수 있듯이 2번 하였습니다. 다시말해 단락이 3개라는 뜻 입니다. 스타일은  넓이를 400px 을 주고 사방으로 padding 을 10px 씩 주었습니다.


일반적으로 랜더링하면 단어 단위로 줄바꿈이 된 형태로 나오게 되는데 여기에서 속서을 하나씩 주면 기능을 한 눈에 알 수 있습니다.

우선 inherit 은 상속되는 것이므로 넘어가고 (IE8에는 인식을 못한다고 합니다.) normal 은 기본인데 Original 과 동일하다고 보시면 됩니다. nowrap 속성을 주게되면 줄바꿈이 되지 않습니다.


그리고 pre 속성은 <pre> 태그와 동일한 역할을 합니다. 마크업에서 줄바꿈 (앤터) 해준 것을 적용해주는 것인데요, 여기서는 두번 줄바꿈을 하였기 때문에 3 단락으로 나뉘어져 있습니다. 그리고 width 를 넘어가는 텍스틑는 줄바꿈이 되지 않습니다.


다음으로 pre-line 속성을 주게되면 pre를 준 것과 같이 마크업에서 줄바꿈 한 부분에서도 줄바꿈이 되고, width 값을 넘어가는 부분에 대하여 줄바꿈이 됩니다.


per-wrap 속성을 주면 pre-line 을 적용해준 것과 동일한 결과가 나오는데 구체적인 차이는 잘 모르겠습니다. 자세한 내용은 w3cschool 을 참조해 보시는 것이 더 좋을 듯 합니다.



출처: http://htglss.tistory.com/31

'CSS' 카테고리의 다른 글

텍스트 세로 중앙 정렬에 관한 문제.  (0) 2011.02.14
css 텍스트 말줄임  (1) 2011.01.04
td 안에 div height:100% 만들기  (0) 2010.12.08
텍스트 줄바꿈  (1) 2010.12.08
a태그 점선 없애기  (0) 2010.10.25
:

이미지 롤오버

script 2010. 12. 20. 18:04

function changeImage(img) {
   img.src = img.src.replace(".gif", "_on.gif");
   }
   function changeImage2(img) {
   img.src = img.src.replace("_on.gif", ".gif");
   }


<li><a href="#"><img src="../../../../../images/btn/btn_quick01.gif" onmouseover="changeImage(this)" onmouseout="changeImage2(this)" alt="Mail" /></a></li>

'script' 카테고리의 다른 글

javascript 2 논리연산자  (0) 2011.04.18
javascript 1  (0) 2011.04.18
텍스트 클릭으로 div 보이고 감추기  (0) 2010.12.03
selet 박스에 디자인 입히기  (0) 2010.10.05
토글 메뉴  (0) 2010.04.29
:

모바일 코딩시 참고사항

모바일 2010. 12. 16. 14:24

데스크탑과 마찬가지로 모바일폰도 플랫폼 별로 서체가 다 틀립니다. 애플고딕, 굴림, 삼성고딕 등 종류가 다양하고 가로/세로일때 서체가 커지기도 하고 같은 옴니아라고 해도 설치하는 브라우저별로 다 다르고 지원되는 서체 크기도 3단계~5단계로 다르고 등의 이유 때문에 폰트를 고려해서 디자인 하는 것 보다, 폰트의 모양과 크기가 바뀌어도 잘 나오게 유동적인 디자인으로 만드는게 중요합니다.

서체는 별로 신경쓰지 마시고 serif인지 sans-serif인지만 명확히 해 주세요.

font-family: serif;
font-family: sans-serif;

사이즈는 0.7em ~ 0.8em을 주로 썼습니다.
:

아이폰용 모바일 웹페이지 디자인 팁

모바일 2010. 12. 16. 10:55

아이폰용 모바일 웹페이지 디자인 팁


모바일 디바이스의 웹브라우저에는 모바일 디바이스에 최적화 할 수 있는 여러 기능들이 추가로 존재합니다. 대부분의 디바이스 및 웹브라우저에서 공통적으로 지원하는 기능들도 있고, 특정 디바이스 및 웹브라우저에서만 지원하는 기능들도 있습니다.

본 포스팅에서는 아이폰 및 아이패드의 iOS와 모바일 사파리를 기준으로 알아보겠습니다.

Viewport

모바일 웹브라우저의 기본 화면 크기 및 확대/축소 배율등을 정하는 모바일 웹사이트 및 웹앱을 만들시 제일 중요한 Meta 태그입니다. 기본적으로 아이폰의 사파리 웹브라우저는 넓이가 980 px인 해상도로 보여주기 때문에 아이폰에서 아이폰3G(S)에 맞춰 디자인 한 웹페이지(320 x 480 px)를 본다고 가정한 경우 뷰포트를 설정하지 않는다면 가로 좌우 여백이 330 px의 여백이 남는 아주 작은 화면을 보게 됩니다.

다음처럼 뷰포트를 사용하면 1:1 비율로 아이폰의 해상도에 맞게 최적화 할 수 있습니다.

1
2
<meta name="viewport" content="width=device-width, initial-scale=1.0,
      minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"/>

width : 넓이 – device-width | N px (200~10000 px, default 980 px)
height : 높이 – device-height | N px (223~10000 px)
initial-scale : 초기 확대/축소 배율
minimum-scale : 최소 축소 배율 – N (0~10, default 0.25)
maximum-scale : 최대 확대 배율 – N (0~10, default 1.6)
user-scalable : 확대/축소 가능 여부 – yes | no (default yes)

각각의 설정 값과 기본 값은 위와 같으며, 사용자에 따라 최적화된 환경을 제공할 수 있도록 각각의 속성을 설정하는것이 중요합니다.

홈 화면 아이콘

아이폰의 경우 웹 페이지를 앱처럼처럼 홈 화면에 바로가기를 추가할 수 있습니다. 단순히 아이콘만 설정 가능한 것이 아니라 아이폰의 홈 화면 아이콘들의 공통점인 라운드 박스 효과는 기본적으로 적용되고, 반사광 효과의 적용 유무를 추가로 선택이 가능합니다.

1
2
// 반사광 효과를 주는 경우
<link rel="apple-touch-icon" href="home-icon-name.png">
1
2
// 반사광 효과가 없는 경우
<link rel="apple-touch-icon-precomposed" href="home-icon-name.png">

apple-touch-icon.png / apple-touch-icon-precomposed.png 의 파일명으로 도메인의 최상위 경로에 올려두면 위의 link 태그를 적용하지 않아도 홈 화면에 추가시 아이콘이 적용됩니다.

전체화면 모드

웹 페이지를 홈 화면으로 추가하면 특정 Meta 태그를 통해 웹 브라우저의 상단의 주소 표시줄과 하단의 버튼 Bar를 없앨 수 있습니다. 단 홈 화면에 추가한 후 홈 화면의 아이콘을 통해 접속 했을 경우에만 적용이 됩니다.

1
<meta name="apple-mobile-web-app-capable" content="yes">

자바스크립트의 window.navigator.standalone의 결과값(true/false)으로 전체화면 모드 유무를 알 수 있습니다.

추가로 자바 스크립트로 웹 페이지에 접속시 자동으로 스크롤을 상단의 주소 표시줄만큼 내려 상단의 주소표시줄이 사라진 것 처럼 만들수 있습니다.

1
2
3
4
5
<script type="text/javascript">
    window.addEventListener("load",function(){
        setTimeout(scrollTo,0,0,1);
        },false);
</script>

상태바 색상 설정

아이폰 상단의 상태 Bar의 경우 3가지 테마를 Meta 태그로 설정할 수 있습니다. 특별한 기능이 있는건 아니지만 디자인을 좀 더 통일성 있게 만들수 있다는 점에서 원하는 색상으로 적용하시면 됩니다.

1
2
// 기본 밝은 계열
<meta name="apple-mobile-web-app-status-bar-style" content="default">
1
2
// 검정색
<meta name="apple-mobile-web-app-status-bar-style" content="black">
1
2
// 반투명 검정색
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">

Splash Screen

스플래시 스크린이란 웹 페이지를 홈 화면에 추가한 후 실행할때 잠깐동안 로고나 이미지를 보여주고 사라지는 화면입니다. 스플래시 스크린을 추가하는 방법은 간단합니다.

1
<link rel="apple-touch-startup-image" href="startup.png">

해당 이미지의 사이즈가 320 x 460 px 로 맞춰야 하며, 3. 전체화면 모드에서 설명한 apple-mobile-web-app-capable Meta 태그를 적용해야 스플래시 스크린도 적용됩니다.

폰트 사이즈 고정하기

모바일 디바이스의 경우 화면을 가로/세로로 전환할 수 있습니다. 웹킷 기반의 웹 브라우저는 뷰포트의 크기에 따라 폰트 사이즈가 변경되는데 보통 그러한 기능이 화면을 깨트리는 경우가 발생하여 CSS를 이용해 폰트 사이즈를 고정시키기도 합니다.

폰트 사이즈를 고정시키려면 고정시킬 곳에 다음 CSS를 추가하면 됩니다.

1
-webkit-text-size-adjust:none;

-webkit-text-size-adjust – auto | none | N% (default auto)

이상 추가적인 팁들도 있지만 그러한 것들은 차후에 다뤄보도록 하고, 먼저 기본적이고 쉬우면서도 중요하다고 생각되는 팁들을 위주로 정리했습니다.


출처: http://qwerty.kr/wp/2010/11/%EC%95%84%EC%9D%B4%ED%8F%B0%EC%9A%A9-%EB%AA%A8%EB%B0%94%EC%9D%BC-%EC%9B%B9%ED%8E%98%EC%9D%B4%EC%A7%80-%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%81/

:

아이폰 웹 코딩시 유의점

모바일 2010. 12. 16. 10:16

아이폰 웹페이지 이것만 알아도 유용하다.
<head></head>사이에 아래의 한줄을 집어넣어보자.

<meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.0; user-scalable=0;" />  

위의 한줄을 집어넣음으로써 아이폰의 해상도에 적절하게 화면이 표시될 것이다.
간단한 내용이지만 한부분씩 살펴보겠다.

width=device-width; 
이부분은 영문 그대로 웹페이지의 너비를 기기의 너비대로 보여주라는 얘기다.
아이폰은 320 x 480의 해상도를 갖고 있으므로 320px에 맞춰주는 역할을 한다.

initial-scale=1.0;
초기화면 로딩시 몇배로 보이게 할 것인가를 지정해주는 부분이다.
당연한 얘기지만 1.0으로 지정하면 1배로 보이게 된다.

maximum-scale=1.0;  1배 까지 확대가능. 즉, 확대 불가를 의미한다.
아이폰은 멀티터치를 이용해서 화면을 맘대로 키우거나 줄일 수 있다. 
그러나 때로는 웹사이트가 멀티터치로 화면크기 조절이 안되는걸 볼 수 있는데 
이는 바로 이 옵션이 1로 적용되었기 때문이다.

maximum-scale=10.0; 이렇게 지정하면 10배까지 확대가 가능해진다.

user-scalable=0; 이부분은 멀티터치를 확용한 확대를 허용할 것인가의 여부를
결정하는 부분이다. 위에서 maximum-scale의 숫자를 키우면 해당 숫자 배수까지
화면이 커질 수 있다고 설명했지만 user-scalable가 0으로 되어있으면 작동하지 않는다.

반대로 user-scalable가 1이 적용되어 확대조절을 허용하더라도 
maximum-scale이 1.0으로 되어있으면 화면 확대가 안된다.

 

아래에 예제 하나를 제시한다.

<meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=10.0; user-scalable=1;" /> 

 위의 예제의 설정은 웹페이지를

1) 아이폰 화면에 맞추며,
2) 처음 크기는 1배로,
3) 그러나 10배까지 키울 수 있다.


아이폰을 위한 웹페이지의 가장 기초적인 부분이지만, 응용해서 좋은 웹사이트를 제작하시길 바랍니다.


출처: http://misojium.com/435

:

CSS Hack 1

크로스브라우징 2010. 12. 14. 13:19

CSS Hack
IE6 이하
* html { … }
IE7 이하 (두가지 동시에 사용)
*:first-child+html { … } * html { … }
IE7에서만
*:first-child+html { … }
IE6 제외한 최신 브라우져 (ex. IE7, Mozila, Opera)
html>body { … }
IE7 제외한 최신 브라우져
html>/**/>body { … }
Comment Hack
<!–StartFragment–><!–[if IE]>
According to the conditional comment this is Internet Explorer
<![endif]–>

<!–[if IE 5]>
According to the conditional comment this is Internet Explorer 5
<![endif]–>

<!–[if IE 5.0]>
According to the conditional comment this is Internet Explorer 5.0
<![endif]–>

<!–[if IE 5.5]>
According to the conditional comment this is Internet Explorer 5.5
<![endif]–>

<!–[if IE 6]>
According to the conditional comment this is Internet Explorer 6
<![endif]–>

<!–[if gte IE 5]>
According to the conditional comment this is Internet Explorer 5 and up
<![endif]–>

<!–[if lt IE 6]>
According to the conditional comment this is Internet Explorer lower than 6
<![endif]–>

<!–[if lte IE 5.5]>
According to the conditional comment this is Internet Explorer lower or equal to 5.5
<![endif]–>


'크로스브라우징' 카테고리의 다른 글

word-break 이런 문제가....  (0) 2011.05.31
ie HTML5 에서 border-radius 사용제한  (0) 2011.04.07
ie7 li 주위로 3px정도 공간이 생기는 버그  (0) 2010.08.04
min-height  (0) 2010.07.10
ie6 position 버그  (0) 2010.07.09
:

td 안에 div height:100% 만들기

CSS 2010. 12. 8. 15:18

감싸고 있는 엘리먼트들을 쭉 따라 올라가면서 최상위 body를 거쳐 html까지 height:100%를 만들면 된다.

html, body, table, td, div {height:100%;}

<td class="lb">
      <div class="lt"><div class="rb"><div class="rt">
       <a href="#" id="date">1</a> 
       <span>내용등록2010-12-082010-12-082010-12-082010-12-082010-12-08</span>
      </div></div></div>
 </td>


ㅋㅋㅋㅋㅋㅋ 익스 안되네 .-ㅅ- ie6은 완전 틀어져 ㅋㅋㅋ

'CSS' 카테고리의 다른 글

css 텍스트 말줄임  (1) 2011.01.04
텍스트 줄바꿈 처리 word-break, white-space  (0) 2011.01.04
텍스트 줄바꿈  (1) 2010.12.08
a태그 점선 없애기  (0) 2010.10.25
font  (0) 2010.10.25
:

텍스트 줄바꿈

CSS 2010. 12. 8. 14:39


1번과 2번은 특수문자의 종류에 따라서 결과가 다를 수도 있으니 주의하세요~


 

1. 아무 처리도 하지 않았을 경우,
IE - 숫자/특수문자는 줄바꿈 안됨. 영문은 단어별로 줄바꿈 됨. 한글은 강제 줄바꿈 됨.
(단 특수문자의 종류에 따라서 줄바꿈이 되는 것도 있습니다. 예를 들어 %는 줄바꿈이 됩니다.)
 

FF - 숫자/특수문자는 줄바꿈 안됨. 영문은 단어별로 줄바꿈 됨. 한글은 강제 줄바꿈 됨.

 

2. word-break:break-all
IE - 숫자, 특수문자, 영문, 한글 모두 강제 줄바꿈됨
(단, 특수문자의 종류에 따라서 줄바꿈이 되지 않는 것도 있으니 주의해야함)
 

FF - 숫자/특수문자는 줄바꿈 안됨. 영문은 단어별로 줄바꿈 됨. 한글은 강제 줄바꿈 됨.

 

3. word-break:keep-all
IE – 영문,숫자,특수문자 띄어쓰기 없이 썼을 경우 줄바꿈 안됨, 한글 단어 단위로 줄바꿈 됨.


FF – 영문, 숫자, 특수문자 띄어쓰기 없이 썼을 경우 줄바꿈 안됨, 한글 강제 줄바꿈 됨.

 

4. word-wrap:break-word
IE - 영문, 숫자, 특수문자 띄어쓰기 없이 썼을 경우 줄바꿈 됨. 영문 단어 단위로 줄바꿈됨. 한글 강제 줄바꿈 됨.


FF - 영문, 숫자, 특수문자 띄어쓰기 없이 썼을 경우 줄바꿈 됨. 영문 단어 단위로 줄바꿈됨. 한글 강제 줄바꿈 됨.

 

5. word-break:keep-all; word-wrap:break-word
IE – 영문,숫자, 특수문자 띄어쓰기 없이 한줄로 썼을 경우 줄바꿈 됨, 영문/한글 단어 단위로 줄바꿈 됨,
 

FF - 영문,숫자, 특수문자 띄어쓰기 없이 한줄로 썼을 경우 줄바꿈 됨, 영문 단어 단위로 줄바꿈 됨, 한글 강제 줄바꿈 됨.

원본 출처:
http://butygal.blog.me/50089735557

'CSS' 카테고리의 다른 글

텍스트 줄바꿈 처리 word-break, white-space  (0) 2011.01.04
td 안에 div height:100% 만들기  (0) 2010.12.08
a태그 점선 없애기  (0) 2010.10.25
font  (0) 2010.10.25
select 안에 이미지 넣기  (0) 2010.10.18
: