원하는 섹션으로 가려면 페이지를 다 읽어야 하나요? 시간이 너무 아까워요..
웹표준과 웹접근성을 잘 지원하여 만든 사이트가 있습니다. 만약 그 사이트를 스크린리더기로 읽는다면 아래 그림과 같은 순서로 읽어 나갈 것 입니다. 사이트 이미지는 다음을 예로 들었습니다. 마크업 순서는 헤더, LNB, 컨텐츠 영역, RNB, 푸터 순이라고 가정했습니다.

사용자 삽입 이미지

아마도 스크린 리더기는 위의 페이지를 로고가 있는 부분부터 읽어나갈 것 입니다. 그리고 번호가 붙은 순서대로 읽어나가 푸터가 있는 부분까지 차례로 읽어나갈 것 입니다.

이 부분에서 우리가 시각장애인의 웹접근성에 대해서 생각해 볼 것이 있습니다. 만약 스크린리더를 사용하는 한 유저가 있다고 가정합시다. 그 유저는 위의 사이트에서 9번 섹션에 있는 영화 컨텐츠를 주로 이용한다고 가정하겠습니다. 그러면 이 부분에서 접근성 저해 문제가 발생합니다.

이유는 이렇습니다. 9번 섹션을 이용하기 위해서 해당 유저는 매번 페이지를 1번 부터 읽어와야 하는 불편함이 생기기 때문입니다. 유저에게 상당한 시간 낭비일 수 있습니다. 그러면 이 문제를 해결하여 스크린리더를 사용하는 유저가 사이트에 접근하자마자 바로 원하는 섹션으로 접근하는 방법은 없을까요?

다행히도 간단하게 위의 접근성 문제를 해결할 수 있습니다.

스크린리더를 이용하는 유저, 원하는 섹션으로 바로 이동시키기

사용자 삽입 이미지

일단 각 섹션별로 ID값을 지정해줍니다. 이 ID네임을 이용하여 북마킹 기능을 활용할 것 입니다.

각 섹션별 모듈에 해당하는 div에 id값을 다음과 같이 주면됩니다.

<div id="shop_area">
  ... 컨텐츠 중략
</div>

위에 있는 다음(daum.net)의 예처럼 하시면 편리할 것 입니다. 각 섹션별로 id 값을 지정해줍니다.
그리고 페이지의 가장 상단에 다음과 같은 코드를 넣어줍니다. 페이지의 이름을 알 수 있는 헤드라인 태그 바로 아래에 오면 최적일 것 같습니다.

사용자 삽입 이미지

다음(daum.net)의 메인페이지 문서 구조입니다. 웹페이지 최상단에 h1 태그로 사이트의 이름을 지정해 주었습니다. 그리고 그 아래에 간단한 유틸리티와 캠페인 영역을 지나면 '목차'라는 부분이 있음을 알 수 있습니다. 이것이 바로 시각장애인을 배려한 웹접근성 향상 방법중에 하나입니다.

메인페이지의 각 섹션으로 바로 이동할 수 있는 기능을 제공합니다. 이 기능을 제공함으로서 사이트를 이용하는 시각장애인(스크린리더 이용자)들은 웹페이지 전체를 일일이 읽으면서 시간낭비를 할 필요가 없어졌습니다. 바로바로 원하는 섹션으로 이동할 수 있게 되었기 때문이죠. 각 섹션으로 이동시키는 방법은 a 태그의 북마크 기능을 이용합니다. 코드는 다음과 같습니다.

<a rel="bookmark" href="#shop_area">쇼핑 바로가기</a>

a 태그의 rel 속성은 'bookmark'로 해주고, href에는 각 섹션에서 지정한 #id 값을 입력해줍니다. 간단하죠?

섹션 바로 가기 링크는 어떻게 감추죠?
자, 그럼 여기서 의문점이 하나 생기는데요. 편의를 위한 서비스 제공은 좋지만 CSS를 적용한 실제 서비스에 위의 목차를 감추려면 어떻게 해야할까요? 얼핏 생각하기로 다음과 같이 하면 될 것 같은데 말이죠. 음..

HTML마크업
<div class="section_navi">
 ... 목차 내용 중략 ...
</div>

CSS
.section_navi { display: none; }

자, 시각장애인을 위해 만든 목차를 CSS를 적용한 실서비스에서 감추기 위해 위처럼 하면 될까요?
정답은 위의 예제처럼 하면 '안된다' 입니다. display: none; 을 이용하면 일부 스크린리더기가 이를 읽지 못합니다. 그래서 이를 보완하기 위한 방법이 필요하게 되었습니다. display: none; 처럼 컨텐츠를 완전히 감추어 버리는 것이 아니라, 실제로는 컨텐츠를 존재하게 만들면서 디자인상으로만 보이지 않게 하는 방법 말이죠.

HTML마크업
<div class="section_navi">
 ... 목차 내용 중략 ...
</div>

CSS
.section_navi { visibility: hidden; width: 0; height: 0; overflow: hidden; position: absolute; top: -10000px; line-height: 0; }

'다음'의 경우에 이렇게 되어있는데. 좋은 방법이라고 생각됩니다. 목차 div의 너비와 높이를 0으로 만들고 넘어가는 컨텐츠는 overflow: hidden으로 감추는 것이죠. 그리고 2중으로 visibility: hidden까지 자물쇠를 채워 눈에 안띄게 하였고 3중으로 position: absolute에 top: -10000px까지 주어 목차를 안드로메다로 날려버렸습니다. 그러나 dispaly: none처럼 아예 사라진 것이 아니기 때문에 스크린리더기에서도 잘 읽힙니다.

웹접근성 향상을 위한 다양한 아이디어와 노력이 돋보입니다. 혹시 다른 사이트에서도 이 같은 배려가 되어있는지 궁금하네요. 골프존(www.golfzon.com)에서도 스크린리더를 이용하는 유저를 위한 배려가 잘 되어 있습니다.

사용자 삽입 이미지

접근성 향상을 위한 다양한 노력들이 웹을 조금 더 평등하고 편리한 곳으로 만들어 나갑니다.
종종 웹표준화 작업을 하다보면 양이 방대해서 다른 UI개발자 분들과 협업을 할 때가 있습니다. 실력이 좋다고 소개를 받고 함께 일을 해보면 실제 명성보다 실력이 떨어지시는 분들이 많습니다. 온라인 상에서 유명한 분들임에도 불구하고, 막강한 이론 지식보다 필드에서 실력이 떨어지는 분들이 많은 것 같습니다. 그 분들께서 가장 많이 착각하시는 부분 중 하나가 W3C에서 제공하는 밸리데이터를 통과하면 웹표준을 지킨 사이트라고 믿는 것 입니다.

큰 그림을 봐야합니다, 명성에 비해서 실제 실력이 형편없는 분들이 많아
작은 부분들에 집착하여 작은 부분들에 대한 지식은 뛰어난데, 큰 그림을 보지 못하는 분들이 많습니다. 물론, 작은 부분들 모두 접근성과 표준에 부합하도록 페이지를 제작하는 것은 중요합니다. 그리고 그것은 기본입니다. 그러나, 큰 그림을 그리는 것 역시 중요합니다. 웹페이지는 하나의 문서입니다. 워드프로세서로 작성하는 문서를 생각해보세요. 문서의 큰 제목이 있고, 작은 제목이 있고, 그 아래에는 또 작은 제목이 있고, 컨텐츠들은 제목에 맞도록 순서대로 술술 읽혀야 합니다. 웹페이지 역시 그렇습니다. CSS를 깨보고 문서가 술술 읽혀야 됩니다. 물론 의미에 맞도록 술술 읽혀야 됩니다. 구석구석 밸리데이터은 통과하지만 큰 그림에서 문서의 구조가 엉망인 페이지를 만들고 웹표준을 지킨 웹사이트라고 고객에게 돈을 받고 영업을 하는 사례도 있더라구요.

핵심은 '시각장애우'
앞을 못 보는 분들께서 웹사이트를 이용한다고 생각해봅시다. 그 분들은 웹페이지를 이용하는데 전적으로 소리에 의존할 수 밖에 없습니다. 이를 위해서 웹표준에 의한 웹접근성 준수가 이루어져야 하는 것 입니다. 물론 표준을 지키면 다양한 기기에서 웹페이지를 이용할 수 있게 된다는 장점도 있지만 핵심은 시각장애우 분들께서 웹페이지를 편안하게 이용할 수 있나? 하는 것 입니다.

돈 받고 작업해 준 사이트가 웹접근성 준수율은 낙제점
웹서핑을 하다가 우연히 웹표준화 전문 서비스를 해주는 업체를 찾아냈습니다. 제 블로그에 있는 포스팅을 그대로 복사해가서 본인들의 영업용 자료로 쓰고 있었습니다. 그리고, 그 사이트는 일단 본인들의 웹사이트 조차 웹표준이 준수되어 있지 않았습니다. 물론 XHTML과 CSS, Java Script Validator는 통과되어 있었지만, 페이지를 찬찬히 뜯어보면, 시각장애우분들이 제대로 이용할 수 없는 사이트였습니다. 그 회사의 이름을 밝히지는 않겠습니다만, 그 회사에서 작업한 사이트 하나를 소개해드리겠습니다.

그 회사에서 표준화 작업을 했다고 하는 결혼정보업체 '선우'의 홈페이지 입니다. (https://www.couple.net/)

XHTML페이지를 뜯어보았습니다. Validator는 통과했습니다. 그러나 문서의 구조는 100점 만점에 20점 정도 밖에 안되는 수준이였습니다. 도저히 문서의 구조와 형체를 알아볼 수 없을 정도로 웹페이지를 만들어 놓았습니다. 웹페이지 설계의 실패이고, 웹접근성은 낙제점수 입니다.

사용자 삽입 이미지

좌측에 있는 스크린샷이 결혼정보업체 선우에서 웹표준 전문 업체에 맡겨서 작업을 완료했다는 웹페이지의 모습입니다. 웹페이지의 문서 구조를 이해하기가 어렵습니다. 일단 문서의 설계 자체가 잘못되어 있습니다. 저라면 오른쪽의 모습처럼 웹페이지를 설계 했을 것 같습니다. (5분 정도 시간내어 선우의 XHTML페이지를 만들어 보았습니다.)

일단 문서의 구조가 잘못되었으니, 의미있는 마크업은 거의다 빠져있다고 보시면 됩니다. 이렇게 문서의 구조화가 엉망인 페이지는 SEO도 잘 안된다고 보시면 됩니다. 하지만 업체에서는 웹표준화를 통해서 SEO도 해준다고 홍보하고 있군요. 위의 부분 외에 세세한 부분들도 너무나 시정할 부분이 많지만, 일단 간단하게 몇 군데만 맛배기로 짚어보고 가겠습니다.

사용자 삽입 이미지

'스페이서'이미지를 덕지덕지 사용하였습니다. 이렇게 되면 CSS코딩 할 필요가 없어집니다. 페이지 곳곳에 스페이서 이미지가 접근성을 저해합니다. 이 이미지들이 링크를 대체하고 있습니다.

사용자 삽입 이미지

선우에서 방문객들에게 전하는 메세지 '풍성한 추석되세요'부분은 이미지에 alt태그가 적용되어 있지 않아서, 시각장애우 분들은 이 내용을 전혀 인지할 수 없습니다.

뿐만 아니라, 사이트 로고에는 alt가 적용되어 있기는 하나, alt의 내용은 '로고'입니다. 이 역시 의미에 맞지 않습니다. '선우 홈페이지 바로가기' 정도만 해두었어도 좋을 듯 싶습니다.

사용자 삽입 이미지

로그인 박스 부분은 접근성이 현저하게 떨어집니다. 우선 Tab-index가 엉망입니다. 아이디를 입력하고 패스워드를 입력한 다음 탭을 누르면 탭이 일시적으로 다른 곳으로 포커싱이 되었다가 다시 탭을 눌러야 로그인 버튼으로 돌아옵니다. 그리고 폼 요소는 fieldset 태그로 묶어서 처리하는 방법이 옳을 듯 싶습니다. 그리고 자바스크립트 창이 뜨는 것 역시 좋지 않습니다.

이 밖에도 지적할 부분이 너무 많지만 지면상 줄입니다.

제가 이 'V모사'에 화가 나는 이유는 몇 가지가 있습니다만, 우선은 본인들이 만든 컨텐츠가 아니면서도 이를 영업에 이용하고 있다는 점 때문입니다. 웹표준화 작업 이외에도 위젯마케팅이니 뭐니 다른 사업 부분도 영위한다고 하는데, 제품이나 서비스 설명은 죄다 다른 곳에서 퍼온 이미지나 자료들입니다. 위젯 마케팅은 제가 이전에 근무했던 인사이트미디어의 위젯을 그대로 가져다가 사용을 했더군요.

그렇지만, 궁극적으로 제가 화나는 이유는 따로 있습니다.

팀장님 눈가리고 고객 눈가리고 아웅하면 그만?
업체에서 일하시는 분들중에도 팀장님이 잘 모른다고, 대강대강 코딩해서 페이지를 개발팀에 던져버리는 경우를 종종 목격했습니다. 그리고 웹표준화나 접근성을 가지고 사업을 하시는 분들 역시 위의 사례처럼 대강 밸리데이터만 통과 시키고 고객에게 작업물을 넘겨버리는 경우를 종종 목격합니다. 소위 말하는 '이빨까기'의 달인들이 이런 행각을 많이 합니다.

그런 분들에게 감히 한 말씀 드리고 싶습니다. 프로페셔널 해지십시오. 스스로에게 말입니다. 웹접근성이라고 하는 것은 일단 다른 이점도 많지만, 시각장애우분들의 권리를 지켜준다는 점에서 소중한 작업입니다. 시각장애우분들이 웹에 투자하는 시간은 일반인들의 상상을 뛰어넘습니다. 이제야 그 분들께서 웹사이트를 편안하게 이용할 수 있는 분위기가 조성되어 가고 있습니다.

헌데, 여러분들께서 눈가리고 아웅하는 방식으로 땜질해버린 웹사이트는 여전히 그 분들이 이용하는데 불편함이 많이 생깁니다. 앞을 못 보는 그분들에게 희망과 꿈과 편리함을 준다는 사명감으로 임하셔야 합니다. 엉망으로 만들어진 사이트는 후에 반드시 대가를 치르게 될 것 입니다.

웹접근성이나 웹표준이 생각만큼 쉽지 않습니다. 이렇게 글을 쓰는 저도 많이 배우고 있는 단계입니다. 사업을 시작하는 분들도 부디 생각을 잘 하시고 일을 시작하셨으면 좋겠습니다.
웹표준과 웹접근성에 대한 관심과 중요도가 날로 증대되고 있습니다. 더불어 곧 장애인차별금지법이 발효되면, 일정 규모 이상의 모든 웹사이트들은 웹접근성을 반드시 준수해야 됩니다. 웹접근성과 웹표준에 부합하는지 검사하는 도구들 몇 가지를 소개해드리겠습니다.

웹접근성 평가 소프트웨어 - KADO-WAH

사용자 삽입 이미지

한국정보화진흥원에서 배포하고 있는 도구입니다. 웹접근성 평가 마법사를 이용하시면 간단하게 웹사이트의 URL을 입력하는 것만으로 사이트의 웹접근성 준수율을 자동으로 체크하여 보고서로 만들어 줍니다.

KADO-WAH 2.0 다운로드
KADO-WAH 2.0 Patch 다운로드

WAVE

사용자 삽입 이미지

KADO-WAH와 더불어 웹접근성 평가를 할 때 가장 많이 사용하는 서비스 중 하나 입니다. KADO-WAH가 보고서 형식으로 접근성 평가 항목을 만들어서 보여준다면, WAVE는 화면 레이아웃에 잘못된 부분과 사용된 엘리먼트들을 그대로 나열해서 보여줍니다. 접근성 평가항목은 KADO-WAH보다 개수가 적습니다. 평가할 사이트의 URL을 입력하시거나 파일을 업로드 하시면 됩니다.

WAVE 서비스 바로가기

W3C HTML & CSS Validator

사용자 삽입 이미지

너무나 유명한 W3C의 밸리데이터 입니다. HTML(XHTML)과 CSS가 문법에 맞게 잘 작성되었는지 체크할 수 있습니다. 검사할 사이트의 URL을 입력하거나, 파일을 업로드하면 검사가 됩니다. 또한 코드의 일부분만 떼어서 바로 테스트 할 수 있구요.

CSS Validator 바로가기
HTML Validator 바로가기

그리고 파이어버그의 확장 도구인 Web developer 최신버전을 설치하시면  아래의 화면에서 보시는 것 처럼 W3C사이트를 접속하지 않고도 바로바로 HTML과 CSS, 그리고 스크립트의 표준준수 여부를 확인할 수 있습니다.

사용자 삽입 이미지

왜 웹표준인가? 2008/02/10 03:47

여러분 가게에 물건 구경하겠다는 손님을 그냥 내쫓겠습니까?
손님이 시각장애인이라는 이유로 물건을 팔지 않겠습니까?

웹표준을 지키지 않으면 알게 모르게 놓치는 것들이 많습니다!

웹표준? 웹접근성? 그게 뭐길래?

웹표준을 지킨다 즉, 웹접근성을 높인다는 말은 무엇이고.
웹표준을 지키면 뭐가 좋길래 사람들이 웹표준, 웹표준 할까요?
똑같은 데이터를 가지고 있는 웹사이트가 있습니다.

사용자 삽입 이미지

웹표준을 지키면 검색엔진 노출이 잘 됩니다. 반면 그렇지 않으면 검색엔진 노출도 힘들어 집니다. 또한, 웹표준을 지키지 않으면 어렵사리 찾아온 고객을 내쫓는 경우도 발생합니다.


웹표준을 지키면 브라우저나, 장치, 기기에 관련없이 조금더 많은 사람에게 정보전달을 할 수 있습니다. 또한 검색엔진 유입량도 늘어납니다. 웹표준을 지키지 않으면, 우리 웹사이트에서 가지고 있는 정보가 모두에게 전달될 수 없습니다. 제한된 일부 사람들에게만 전달될 뿐이지요. 이것은 매우 비효율적 입니다. 똑같은 데이터를 가지고 있는데 웹표준을 지원하고 안하고는 웹사이트의 정보를 더욱 많은 사람에게 전달할 수 있고 못하고의 차이를 가져옵니다. 그 이외에 웹표준을 지키면 다양한 장점이 있습니다. 그 장점들을 소개해 드리겠습니다.

크로스브라우징
혹시 익스플로러에 최적화하여 사이트를 제작하셨습니까? 파이어폭스나, 사파리, 오페라 등 다른 브라우저에서 웹사이트 레이아웃이 문제없이 출력되며, 문제없이 작동되는지 확인해보셨나요? 웹표준을 지킨 웹사이트는 일단 크로스브라우징을 가능하게 해줍니다. 내가 만든 웹사이트를 방문하는 방문객이 익스플로러를 사용하든, 파이어폭스를 사용하던, 사파리나 오페라 등의 특이한 브라우저를 사용하든 늘 한결같은 모습을 보여줍니다. 아래의 그림을 보시면 이해가 쉽게 되시리라 생각됩니다.

사용자 삽입 이미지
물론 익스플로러의 점유율에 비하면, 아직은 보잘것 없는 파이어폭스나 사파리등의 점유율 입니다. 그렇지만, 단 한 명이라도 방문객을 더 유치하기 위해서라면 웹표준은 반드시 지켜야겠지요.

데이터와 디자인의 분리?!
이 말은 처음 웹표준을 접하는 분들께는 언뜻 이해하기 어려운 개념일 수 있습니다. 하나의 웹페이지를 흔히 우리가 다루는 A4 용지의 문서처럼 하나의 문서라고 가정합시다. 그렇다면 해당 웹페이지는 디자인을 배제하고 기본적으로 문서의 형태를 띄고 있어야 합니다. 그 기본적인 문서의 형태를 띄면서 데이터를 가지고 있는 것이 HTML 입니다. 그리고 이 HTML 페이지를 좀 더 다양하고 보기좋게 디자인 해주는 역할을 하는 것이 바로 CSS입니다.

사용자 삽입 이미지
사용자 삽입 이미지

CSS Zen garden의 웹사이트 입니다. HTML 문서를 보세요. 큰 제목부터 작은 제목, 그리고 단락별로 들어가는 내용까지... HTML 문서의 구조화가 잘 되어있지요? HTML 파일에는 손 하나도 안대고, CSS 만 교체하여 전혀 색다른 느낌의 웹사이트 디자인을 만들 수 있습니다. 잊지마세요. HTML은 문서!(데이터) CSS는 디자인 속성 저장!


모바일 기기를 위한 웹표준
CSS가 지원되지 않는 모바일 기기에서 여러분의 웹사이트는 접속을 원하는 이용자에게 정보전달을 제대로 하고 있나요? HTML데이터와 CSS디자인을 완벽하게 분리하여 웹표준에 따라 작성된 웹페이지는 CSS가 지원되지 않는 모바일 기기에서도 원하는 정보를 완벽하게 전달할 수 있습니다. (단, 와이브로나 휴대폰 전용 서비스로 개발된 웹페이지 제외)


사용자 삽입 이미지

CSS가 지원되지 않는 모바일기기에서 접속해도 충분히 원하는 정보를 얻을 수 있도록 데이터와 디자인이 잘 분리되어 있는 '다음'메인페이지의 경우(우측 핸드폰 사진은 합성한 것입니다)


사용자 삽입 이미지

데이터와 디자인의 분리가 되지 않은 사이트는 모바일 기기가 아예 웹페이지를 해석하지 못하기도 합니다. 또한 CSS없이 사이트를 읽어들이면 아래 사진처럼 사이트가 폭격을 맞은냥 깨져서 출력됩니다. 사이트 이용이 전혀 불가능하게 됩니다. 조사결과 웹표준을 지키는 컴퓨터학원 홈페이지는 한군데도 없었고, 홈페이지 제작업체들도 웹표준을 거의 지키지 않고 있었습니다. 명색이 홈페이지로 돈벌어 먹고 사는 사람들이 말입니다. (위 사진은 합성된 이미지 입니다)



시각장애인을 위한 스크린리더기의 지원
웹은 평등합니다. 웹은 사람을 차별하지 않습니다. 하지만 언제부턴가 우리나라는 많은 디자이너/개발자분들께서 의미를 담은 웹페이지는 신경을 쓰고 있지 않습니다. 사이트는 테이블로 통자이미지를 덕지덕지 붙여서 보여주기에만 급급한 경우가 많고, 필요없는 플래시 U.I.를 남발하여 웹페이지의 의미를 알아볼 수 없게 만들고 있습니다. 앞을 못보는 시각장애인을 위한 사이트를 고려해보셨습니까? 웹표준을 지키면 시각장애를 가진 분들도 웹사이트를 편안하게 이용할 수 있게 해줄 수 있습니다. 그래서 웹접근성도 한층 높아집니다.

사용자 삽입 이미지
계속 강조하는 것이지만, HTML 문서를 코딩할 때는 꼭 의미에 맞는 코딩을 해야합니다.
예를 들어서, 강조하고 싶은 문장이 있는데, 해당 부분을 <b> 태그로 감싸면 글씨만 굵어질 뿐, 브라우저나 스크린리더기는 해당 문장을 중요문장으로 취급하지 않습니다. 웹표준에 맞는 태그는 <b>태그가 아니라 <strong>입니다. 이처럼 웹표준에 부합하는 태그들이 있습니다. 숙지하시어 사용하시기를 권장합니다.

사이트 디자인 관리 시간 단축
데이터와 디자인의 분리. 즉, HTML 페이지는 말그대로 문서상태이고, CSS를 통해서 웹페이지를 디자인 합니다. 그러면, CSS를 여러개 만들었을 경우, CSS 파일의 경로를 변경하는 것 만으로 새로운 디자인으로 사이트를 리뉴얼 할 수 있습니다. 또한 기존에는 사이트에 이미지나 스타일 하나만 변경하더라도 페이지마다 다 바꿔주어야 하는 번거로움이 있었습니다. 하지만 HTML 과 CSS의 분리는 이런 작업시간까지 단축시켜 주었습니다. CSS에서 코드 한 줄만 수정해주면, 수백~수천페이지의 디자인이 한꺼번에 변경이 가능하게 되었습니다. 이것은 추가적으로 웹사이트 관리 비용절감의 효과도 가져옵니다.

사용자 삽입 이미지

디자인을 수정해야하는 페이지가 12500페이지라면 여러분의 선택은?


검색결과 상단에 노출되고 싶으세요? 그럼 웹표준을 지키세요!
실제로 똑같이 그래픽 처리가 된 두개의 웹사이트가 있다고 가정합시다. 하나의 사이트는 데이터와 디자인 분리를 하지 않고 많은 사이트이고, 다른 하나는 데이터와 디자인을 완벽하게 분리하여, 웹페이지의 내용과 의미를 정확하게 담고 있습니다. 겉보기는 똑같지만 속은 완전히 다른 사이트이지요. 한 쪽은 페이지의 의미를 정확하게 담고 있고, 한쪽은 페이지의 의미가 해석불분명하니까요.

이것은 검색결과에 상당한 영향을 미칩니다. SEO에서 웹표준은 많은 부분을 차지합니다.

검색엔진의 검색결과 상단에 노출되기 위해서 메타태그나 title 태그의 활용, 본문에서 주력 단어의 빈도수 노출 등 많은 부분이 널리 알려져서 활용되고 있습니다. 그렇지만 아직까지, 웹표준을 지키면 검색엔진의 검색결과 상단에 컨텐츠가 노출된다는 사실은 그다지 많이 알려져 있지 않습니다.

대표적으로 H1, H2, H3 ... 제목 태그인 h 태그의 SEO는 막강합니다.

사용자 삽입 이미지

저의 블로그 제목은 '쏭군은 열정 드리머' 입니다만, CSS를 이용하여 MONOEYES라는 블로그 제목으로 이미지 치환 해두어 텍스트는 감추어 두었습니다. 보이지만 않을뿐 문서의 대제목은 '쏭군은 열정 드리머'라는 속성을 항상 가지고 있는 것입니다. 구글에서 검색한 결과 최상단에 H1 태그가 검색되어 출력됩니다.



사용자 삽입 이미지

포스팅 제목의 경우 검색엔진에서 검색되는 빈도가 많아야 하는 중요한 부분인 만큼, 문서 대제목인 H1 다음으로 H2를 주었습니다. H1 보다 중요도는 떨어지지만, 단락의 대제목으로서 검색엔진 검색결과에서 만족스러운 노출을 보여줍니다. 위의 사진은 CSS를 제거했을 때, 포스트 제목이고, '디올 어딕트'라는 디올의 제품을 구글에서 검색했을 때, 가장 상단에 쏭군의 블로그가 노출되는 것을 보실 수 있습니다.


DIV와 TABLE 논란은 문제의 본질이 아닙니다
많은 분들이 DIV=웹표준, TABLE=비표준이라는 인식을 가지고 계십니다. 문제는 DIV냐 TABLE이냐가 아닙니다. DIV나 TABLE은 모두 웹페이지를 작성하기 위한 '도구'일 뿐이지, 그 자체가 '웹표준이냐 아니냐'를 가늠하는 목적이 될 수 없습니다.

TABLE은 데이터를 출력하기 위해 존재하지 레이아웃 짜라고 존재하는 것이 아닙니다
테이블은 말그대로 데이터들을 표형식으로 출력해야 할 필요성이 있을때만 사용합니다. 테이블로 레이아웃을 만들게 되면, 웹페이지의 로드 속도도 느리게 되고, 웹페이지를 수정할 곳이 생기면 자칫 페이지 전체를 뜯어내야하는 대공사가 발생될 수 있습니다.

TABLE에 없는 DIV의 장점
모듈화? 디자인을 하시는 분들께는 말이 어렵지요. 하지만 간단한 뜻입니다. 필요한 부분을 마음껏 떼어서 쓸 수 있게 웹사이트를 만들 수 있다고 생각하시면 됩니다. 예를 들어, 테이블로 웹사이트 레이아웃을 구성하면 로그인 박스 하나를 바꾸기 위해서 웹페이지의 다른 부분도 영향을 주거나, 웹페이지 전체를 뜯어내야 하는 경우가 대부분입니다. 그렇지만 DIV로 작업을 하면 원하는 박스만 떼어서 디자인을 수정할 수 있고, 또 그 박스는 얼마든지 다른 페이지에 자유롭게 붙였다 뗐다 하면서 재활용이 가능합니다.

게다가 TABLE 레이아웃을 구성할때보다, 작업의 속도나 사이트 관리적인 측면에서 훨씬 이득을 볼 수 있고, 페이지 로드도 테이블 레이아웃 보다 빠릅니다.

하지만 TABLE이 꼭 필요한 곳은 테이블을 쓰세요
테이블을 이용해서 웹사이트의 레이아웃을 짜면 나쁜 것 입니다. 하지만 반드시 테이블이 들어가야 할 곳이 있습니다. 반드시 데이터형식을 표방식으로 보여주어야 하는 곳은 테이블을 쓰는편이 낫습니다.

사용자 삽입 이미지

테이블을 유용하게 활용하고 있는 올블로그와 네이버


만약 위의 프리미어리그 점수판을 표를 사용하지 않고 DIV나 LI 를 이용해서 표현했다고 가정합시다. 그 페이지의 CSS가 지원되지 않을때 오히려 팀별로 득점이나 승점을 보기가 힘들어집니다. 이런 표형식의 데이터는 TABLE을 사용하는 것이 더욱 웹표준에 부합합니다. 또한 CSS를 깼을때도 점수표를 깔끔하게 출력할 수 있구요. 반드시 이런 데이터처리에만 TABLE을 쓰시고 어지간하면 사용하지 않는 것을 권장드립니다. 더구나 TABLE로 레이아웃을 짜는 비통한 일은 다시는 있어서는 안 되겠지요. 데이터를 표시하라고 하사한 TABLE 이거늘.. 그걸로 홈페이지 레이아웃을 만들면 원래 목적에 어긋납니다.

스크립트 사용시

될 수 있으면 스크립트 사용을 자제하는 것이 좋습니다. 부득이 스크립트를 사용해야 하는 경우라면, 모든 브라우저에서 작동되는 스크립트를 사용하시고, 스크립트가 지원되지 않는 환경을 위해서 스크립트 없이도 웹사이트를 이용할 수 있도록 차선책을 미리 만들어 두시는 것을 권장합니다.

서버 부하를 덜어줌
디자인 정보를 CSS에 저장함으로서, 관련 소스코드를 획기적으로 줄일 수 있습니다.
또한, CSS는 캐싱되어 웹사이트에 최초 접속할 때 한번만 로드되므로, 서버 부하를 획기적으로 줄여줄 수 있고, 규모가 큰 사이트라면 비용 절감 효과도 가져올 수 있습니다.

긴 글 읽느라 고생 많으셨습니다. 글쓴이를 표기하신다면 본 문서를 상업적으로 이용하셔도 되고, 어디에나 퍼가셔도 됩니다. 웹표준을 처음 접하시는 분들께 도움이 되고자 작성한 문서인데. 조금이나마 도움이 되셨으면 좋겠습니다.

대한민국 모든 사이트가 웹표준화가 되는 날까지..!
대한민국 모든 사이트의 접근성이 좋아지는 그날까지..! 쏭군은 뜁니다!

웹표준 코딩을 위한 파이어폭스의 다양한 확장기능을 이용해봅시다!

우선 파이어폭스를 다운로드 받습니다.

파이어폭스는 웹디자이너나 코더, 개발자를 위한 실로 다양한 기능을 제공합니다.
파이어폭스를 설치하셨다면 모질라사이트의 Addon 다운로드 페이지로 이동합니다.

사용자 삽입 이미지

파이어버그를 다운로드 받습니다


사용자 삽입 이미지

웹디벨롭퍼를 다운로드 합니다. 위의 두 프로그램을 다운로드 하실때는 파이어폭스에서 하면 편리하게 자동으로 애드온이 설치됩니다. 우선 파이어버그와 웹디벨로퍼를 설치하셨다면 파이어폭스를 실행하시고, 나름 잘 만들었다고 생각하시는 사이트에 접속을 해봅니다... 아니~ 꼭 잘 만든 사이트가 아니어도 되요~

저는 파이어폭스로 올블로그에 접속을 해보았습니다~


사용자 삽입 이미지
파이어폭스 우측하단에 있는 녹색 버튼을 클릭하면 파이어버그 창이 뜹니다. 이 기능이 정말 막강한데요, 제가 실무에서 자주 쓰는 유용한 기능을 중심으로 설명을 드릴게요^^ 나머지 기능을 알아가는 것은 여러분의 몫~ ^_~

사용자 삽입 이미지
하단 소스창에서 하위 레벨 태그로 접근을 하면, 웹사이트의 레이아웃을 분석해 볼 수 있습니다. div, table, tr, td 는 물론이고 이미지맵, 링크 등 세밀한 레이아웃을 알 수 있습니다. 화면은 올블로그의 실시간 인기글 내 반복되는 박스 div 에 마우스를 올렸을때 해당 소스가 나타내주는 레이아웃을 보여주는 화면입니다. 우측에는 사용된 CSS 코드까지 자동으로 매칭이 됩니다. 정말 환상적이죠? +_+)=b 굿!


사용자 삽입 이미지

이와는 반대로 홈페이지의 원하는 부분을 찍어서 해당부분의 소스코드를 바로 찾아주는 기능이 있는데, Inspect 를 이용하시면 됩니다. Inspect 버튼을 눌러서 활성화 시킨 상태에서 홈페이지에 마우스 포인터를 가져가보면, 레이어, 테이블, 링크, 이미지, 셀 등의 단위로 소스코드를 바로 찾아줍니다. 역시 우측하단에 CSS 스타일 시트까지 같이 찾아주는 모습입니다~^^

사용자 삽입 이미지

인스펙트로 레이아웃 수정을 원하는 부분을 선택후, CSS 스타일 시트를 껐다 켰다 하는 모습입니다. 해당 스타일을 적용했을때 안 했을때 모습을 볼 수 있으며, 또한 값의 수정도 가능합니다. 정말 편리한 기능입니다~

사용자 삽입 이미지
Layout 탭도 요긴한 기능이니 활용해보세요~ 패딩, 보더, 마진값등을 임의로 입력해보고 페이지의 레이아웃이 어떻게 변경되는지 한눈에 알아볼 수 있는 기능입니다~

자~ 그럼 여기서~ 웹표준코딩의 하이라이트!!
HTML 데이터와 / CSS 디자인 파일의 분리!!!

사용자 삽입 이미지
정말 완벽한 웹2.0 시대의 시맨틱한 웹표준 코딩을 자랑하고 있는 CSS 젠 가든의 홈페이지입니다.
http://www.csszengarden.com

아까 설치했던 파이어폭스의 웹디벨롭퍼의 기능을 이용해서 CSS 파일을 꺼 보겠습니다
사용자 삽입 이미지

놀라지 마십시오! 정말 완벽한 구조의 문서원문이 출력됩니다.

사용자 삽입 이미지
아까 접속한 CSS 젠 가든의 CSS를 적용시키지 않은 모습입니다.
웹2.0 시대에서 ajax, ucc, 블로그 등 많은 부분의 이슈가 있지만, 그래도 역시 가장기본적이고 중요한 것은 웹표준 코딩입니다.

웹표준 코딩의 기본은 HTML 과 CSS 의 분리입니다

구조화가 잘 된 HTML 파일하나면 있으면 CSS 파일만 여러개를 만들어가면서 손쉽게 디자인 리뉴얼을 할 수 있는 최대장점이 있습니다.
아직까지 대부분의 한국 사이트는 웹표준 규격을 준수하지 못하고 있습니다. 지금 수 많은 디자이너가 활동하고 있지만 웹표준을 공부하지 않는다면 정말 혼쭐이 나거나, 디자이너 숫자가 줄어들거나, 웹표준을 하고 못하고에 따라서 신분상의 위치마저 달라질지도 모릅니다. 너무 겁을 줬나요.. ㅎㅎ
여튼 파이어폭스의 이 부가기능을 잘 활용해가면서 작업하시면 많은 도움이 되리라 생각됩니다.

사용자 삽입 이미지
파이어폭스의 CSS 메뉴에서 View CSS 메뉴를 클릭하면 손쉽게 해당 사이트의 CSS소스를 볼 수 있습니다.

사용자 삽입 이미지
CSS 젠가든의 CSS 소스를 보고 있습니다~

파이어폭스의 확장기능은 어마어마하게 많지만, 제가 실무에서 주로 사용하는 기능을 소개해 드렸습니다. 아직 모르고 계셨더라면 도움이 되었으면 합니다~ 웹표준 때문에 잠 못 이루는 모든 디자이너분들께 화이팅을 고하며!
포털사이트에서 공간활용과 좁은 공간에 효율적인 컨텐츠 배치를 하기 위해서 많이 사용하는 멀티탭입니다.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ko">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>tab dialog </title>
<style type="text/css">
legend {display:none;}

.form_multitab {
        width:500px;
}

.form_multitab fieldset.tab {
        border:none;
}

.form_multitab fieldset {
        border:none;
        clear:both;
}

.tab_menu {
        clear:both;
        height:32px;
}
.tab_menu div {
        display:block;
        float:left;
        padding:5px;
        margin:2px;
        background-color:#EDF;
}

.tab_menu .tab_label_selected {
        background-color:#FDE;
}
.tab_body {
        background-color:#EEE;
        padding:5px;
       
}
</style>
<script type="text/javascript">
<!--//        
// 여기서부터        
function getElementsByClass(_class, el_id) {
        var parent, els, returnArr = new Array(), i = 0;
        parent = (el_id) ? document.getElementById(el_id) : document;
        els = parent.getElementsByTagName('*') || parent.all;
        for (i; i < els.length; i++)
                if (els[i].className == _class)
                        returnArr[returnArr.length] = els[i];
        return returnArr;
}
function multitab_init(objId) {
        var multitab = document.getElementById(objId);
        multitab.showTab = showTab;
        var colFieldset = getElementsByClass("tab", objId);
        var colTabarea = getElementsByClass("tab_menu", objId);
        var tabarea = colTabarea[0];
       
        for(var i = 0; i < colFieldset.length; i++) {
                var childs = colFieldset[i].childNodes;
                for(var j = 0; j < childs.length; j++) {
                        if (childs[j].tagName == "LEGEND") {
                                var obj = document.createElement("DIV");
                                obj.id = "menu_" + i;
                                obj.className = "tab_label";
                                var aObj = document.createElement("A");
                                aObj.id = "a_menu_" + (i + 1);
                                aObj.href = "#tab_" + (i + 1);
                                aObj.tabIndex = ((i + 1) * 10);
                                aObj.multiTab = objId;
                                aObj.targetValue = i;
                                aObj.tabButton = obj.id;
                                aObj.onclick = clickTab;
                                aObj.onfocus = clickTab;
                                aObj.innerHTML = childs[j].innerHTML;
                                obj.appendChild(aObj);
                                tabarea.appendChild(obj);
                        }
                }
        }
        multitab.showTab(0);
}

function clickTab() {
        var multiTab = document.getElementById(this.multiTab);
        multiTab.showTab(this.targetValue);
       
        var colTabButton = getElementsByClass("tab_label_selected", this.multiTab);
        for(var i=0; i < colTabButton.length; i++) {
                colTabButton[i].className="tab_label";
        }
        document.getElementById(this.tabButton).className = "tab_label_selected"
}

function showTab(val) {
        var colFieldset = getElementsByClass("tab", this.id);
        for(var i = 0; i < colFieldset.length; i++) {
                if (i != val) {
                        colFieldset[i].style.display = "none";
                } else {
                        colFieldset[i].style.display = "block";
                }
        }       
}
// 여기까지를 별도의 js로 묶어두면 편하겠죠.

function init() {
        multitab_init("something");
}

window.onload = init;
//-->
</script>
</head>
<body>
<form id="something" class="form_multitab" method="post" action="" >
        <div class="tab_menu"></div>
        <div class="tab_body">
                <fieldset id="tab_1" class="tab">
                        <legend>tab 1</legend>
                        <fieldset>
                                <label for="item_1">item 1</label>
                                <input type="text" tabindex="11" id="item_1" name="item_1" />
                        </fieldset>
                        <fieldset>
                                <label for="item_2">item 2</label>
                                <input type="text" tabindex="12" id="item_2" name="item_2" />
                        </fieldset>
                        <fieldset>
                                <label for="item_3">item 3</label>
                                <input type="text" tabindex="13" id="item_3" name="item_3" />
                        </fieldset>
                </fieldset>
                <fieldset id="tab_2" class="tab">
                        <legend>tab 2</legend>
                        <fieldset>
                                <label for="item_4">item 4</label>
                                <input type="text" tabindex="21" id="item_4" name="item_4" />
                        </fieldset>
                        <fieldset>
                                <label for="item_5">item 5</label>
                                <input type="text" tabindex="22" id="item_5" name="item_5" />
                        </fieldset>
                        <fieldset>
                                <label for="item_6">item 6</label>
                                <input type="text"  tabindex="23" id="item_6" name="item_6" />
                        </fieldset>
                </fieldset>
                <fieldset id="tab_3" class="tab">
                        <legend>tab 3</legend>
                        <fieldset>
                                <label for="item_7">item 7</label>
                                <input type="text" tabindex="31" id="item_7" name="item_7" />
                        </fieldset>
                        <fieldset>
                                <label for="item_8">item 8</label>
                                <input type="text" tabindex="32" id="item_8" name="item_8" />
                        </fieldset>
                        <fieldset>
                                <label for="item_9">item 9</label>
                                <input type="text" tabindex="33" id="item_9" name="item_9" />
                        </fieldset>
                </fieldset>
                <fieldset id="tab_4" class="tab">
                        <legend>tab 4</legend>
                        <fieldset>
                                <label for="item_10">item 10</label>
                                <input type="text" tabindex="41" id="item_10" name="item_10" />
                        </fieldset>
                        <fieldset>
                                <label for="item_11">item 11</label>
                                <input type="text" tabindex="42" id="item_11" name="item_11" />
                        </fieldset>
                        <fieldset>
                                <label for="item_12">item 12</label>
                                <input type="text" tabindex="43" id="item_12" name="item_12" />
                        </fieldset>
                </fieldset>
                <fieldset class="operation">
                        <button type="submit">ok</button>
                </fieldset>
        </div>
</form>
</body>
</html>
소스 작동 예제 페이지 : http://eouia0.cafe24.com/temp/css_multitab/index.html
소스 출처 : http://css.macple.com/forum

어렵지 않으니 필요하신 분들은 연구해보세요~^ㅁ^~