├── README.md ├── coding-protocol ├── README.md └── tab2space ├── css ├── inuit.css │ ├── README.md │ ├── modules-1.jpg │ ├── modules-2.jpg │ ├── pt1.md │ └── pt2.md ├── oocss │ └── 2013-04-24-oocss.md └── smacss │ ├── 2013-02-08-pt1.md │ ├── 2013-02-22-pt2.md │ ├── 2013-03-11-pt3.md │ ├── 2013-03-14-pt4.md │ └── README.md ├── epub └── 2013-10-10 EPUB 제작시 알아둬야 할 점.md ├── git ├── 01-git-basic.md ├── 02-remote-repo,checkout.md ├── 03-branch,conflict.md ├── README.md └── memo.md ├── javascript └── maintainable_javascript │ └── 2013-04-26-turtle_book.md ├── php ├── 2013- 11-16 PHP와 UTF-8.md ├── 2013-08-28 암호 저장 ― phpass 라이브러리를 이용해 암호 해시와 비교하자.md ├── 2013-09-02 PHP 환경.md └── 2013-10-03 이메일 보내기.md └── process └── TDD ├── pt1.md └── pt2.md /README.md: -------------------------------------------------------------------------------- 1 | - Date: 2013-09-02 16:14:31 2 | 3 | 레프트21 웹개발팀 개발 자료 축적/공유 공간 4 | ================================ 5 | 6 | 레프트21 웹개발팀의 개발 정보 축적 공간입니다. 자료를 체계적으로 축적하는 데 github가 도움이 될 거라 생각했습니다. 7 | 8 | 물론 다른 분들께도 우리 경험과 공부 결과를 공유하고 도움이 되고자 만든 것이기도 합니다. -------------------------------------------------------------------------------- /coding-protocol/README.md: -------------------------------------------------------------------------------- 1 | - Date: 2013-09-02 16:14:31 2 | 3 | LEFT21 개발팀 코드 작성 규약 4 | ======================= 5 | 6 | ## 작명 7 | 8 | * PHP, js 단어 띄어쓰기는 `_`로 한다. CSS는 `-`로. CamelCase는 전혀 사용하지 않는다. PHP 클래스도. 9 | * CSS 레이아웃 클래스는 `l-` 접두어를 붙인다. 10 | * CSS 모듈 클래스는 접두어 없이 BEM 표기법을 따른다. 11 | * CSS 상태 클래스는 `is-` 접두어를 붙인다. 12 | * js에서 jQuery 객체를 담은 변수는 앞에 `$`를 붙인다. 13 | * 함수든 변수든 이름은 단어 세 개를 넘기지 않을 것을 권장한다. 14 | * 이름은 가급적 영어로 지을 것을 권장한다. 너무 복잡한 경우에만 한글로 짓는 것을 허용한다. 15 | * 이름을 영어로 지을 때는 정확한 단어로 짓는다. (모를시 원웅에게 문의할 것!) 16 | * 한글로 이름을 지을 때도 `get_`, `is_` 등의 접두어는 맨 앞에 영어로 넣는다. (자동완성을 위해.) 17 | * 데이터를 가져오는 함수는 `get_`으로 시작한다. 18 | * 상태를 검사하는 함수는 `is_` 혹은 `has_`로 시작한다. 19 | * 파일명에서 단어 구분은 `-`로 한다. 20 | * 실제 스타일에 관여하지 않고 js용으로만 사용하는 선택자는, `js-` 접두어를 붙인다. (예외는 등장했을 때 더 논의) 21 | * 변수명에서 복수인 경우 복수형을 우선 사용하고, 이름이 겹치면 타입을 명시한다. (`_str`, `_arr`) 22 | * 약어는 사회적으로 통용되는 것만 사용하고 따로 만들어서 사용하지 않는다. 23 | * `$i`, `$j`, `$tmp`, `$temp` 등은 알아서 쓴다. 24 | * 파일 구조는 폴더로만 구분하고 접두어로 구분하지 않는다. 접두어는 내용에 관련한 것만. 25 | * 파일 작명은 다음을 기본으로 한다. 26 | * person-detail.php 27 | * person-manage.php (입력/수정 통합) 28 | * person-action.php 29 | * person-list.php 30 | * person-delete.php 31 | * 함수 CRUD 작명은 다음을 기본으로 한다. 32 | * get_person 33 | * insert_person 34 | * update_person 35 | * delete_person 36 | 37 | ## 코드 포맷 38 | 39 | * `{}`는 절대로 생략하지 않는다. 40 | * 들여쓰기는 모든 경우 공백 4칸으로 한다. (물론 Sass는 안 되지만;;) 41 | * 모든 언어에서 한 줄은 80자로 하고, 넘어가는 경우 줄이 끝나지 않았더라도 (ex. HTML 여는 태그, SQL문) 엔터값을 넣는다. 한 줄이 끝나지 않은 채 넘어간 두 번째 줄은 들여쓰기를 두 번 더 한다. 42 | * CSS는 선택자와 속성을 한 줄에 절대로 쓰지 않으며, 한 줄에는 속성 하나만 들어가야 한다. 43 | * 모든 CSS 선택자는 2단계를 넘기지 않는다. 44 | * 모든 `{`는 줄을 띄우지 않고 한 줄에 쓴다. 45 | * 배열은 여러 줄로 쓴다. 닫는 괄호는 시작 부분과 들여쓰기를 맞추고, 배열 안의 요소들은 들여쓰기를 한 번만 더 한다.(아주 짧은 경우엔 예외) 46 | * 한 줄 주석(`//`)을 시작할 때는 무조건 바로 위의 한 줄을 띄운다. 47 | * 여러 줄 주석은 두 번째 줄부터 앞에 ` * `을 붙인다. 48 | * `switch`문에서 default가 없는 경우엔 주석으로 명시해 준다. 49 | * `switch`문에서 안쪽은 추가로 더 들여쓰기 한다. 50 | * PHP 안에서 HTML을 출력해야 할 때는 `echo`를 쓰지 말고 그냥 PHP 태그를 닫고 쓴다. 51 | 52 | ## 기타 코딩 규칙 53 | 54 | * CSS에서 선택자로 ID 사용을 금지한다. 55 | * 주석 코드 태그는 TODO(구현할 것)와 FIXME(고칠 것)를 사용한다. 56 | * 주석에는 날짜(yyyy-mm-dd)와 작성자를 쓴다. 57 | * jQuery에서 `$(document).ready(function(){})`를 사용하고 `$(funciton(){})`는 사용하지 않는다. 58 | * HTML 안에는 `style`과 `script`를 코딩하지 않는다. 59 | * `onclick` 등의 요소를 사용하지 않는다. 60 | * js 전역 변수는 하나만 만들어 본다. (객체로 만들어서 그 안에 다 때려 넣는다.) 61 | * `$_POST`와 `$_GET` 안에 담긴 변수를 웬만하면 밖으로 꺼내서 사용하지 않는다. 변수의 출처를 알기 위해서다. (특히 `extract`는 사용하지 않는다.) 62 | * CSS와 JS는 한 파일로 유지한다. 63 | * PHP 함수 안에서 `$_POST`와 `$_GET`을 사용하지 않는다. 필요하면 인자로 받아서 쓴다. 64 | * js 함수 안에서 `event` 객체를 사용하지 않는다. 필요하면 인자로 받아서 쓴다. 65 | * 모든 함수에 PHPDoc 주석을 단다. 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | -------------------------------------------------------------------------------- /coding-protocol/tab2space: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | for s in php js css html; do 4 | for f in $(find $1 -name "*.$s"); do 5 | expand --tab=4 $f > $f.notab 6 | mv $f.notab $f 7 | done; 8 | done; 9 | -------------------------------------------------------------------------------- /css/inuit.css/README.md: -------------------------------------------------------------------------------- 1 | - Date: 2013-09-02 16:14:31 2 | 3 | inuit.css CSS 프레임워크를 사용하기로 결정하다 4 | ======================================= 5 | 6 | CSS 생산성을 높일 방법을 고민해서 나온 결론 두 가지는 이거였다. 7 | 8 | 1. CSS 유지보수성을 향상시키기 위한 학습을 한다. 9 | 2. 다들, CSS 프레임워크를 사용하라고 하는데, 그래 어디 한 번 사용해 보자. 10 | 11 | 프레임워크를 고르는 기준은 그동안 여기저기서 읽은 것을 바탕으로 이렇게 정했다. 12 | 13 | 1. 지속적으로 유지될 프레임워크를 고르자. 14 | 2. OOCSS에 기반한 CSS 프레임워크를 고르자. 15 | 3. 혹시나 이 프레임워크가 나중에 망하더라도, 지금 버전으로 앞으로 상당 기간을 커버 가능한 그런 프레임워크를 고르자. 16 | 17 | 그래서 고른 게 [inuit.css](http://inuitcss.com/)다. 좀 허무한 이야기지만, OOCSS에 기반한 CSS 프레임워크는 두 개밖에 없었다. inuit.css를 제외하면 [Cascade Framework](http://jslegers.github.io/cascadeframework/)라는 놈이 있었는데, inuit.css를 사용하기로 했다. Cascade Framework는 너무 신생이라서 안정성에 대한 믿음이 없었고, 우리가 필요한 것에 비해 기능이 너무 많다는 생각도 들었다. 18 | 19 | 그러나 Cascade Framework는 IE6도 지원한다는 장점이 있다. 약간의 디자인과 자체의 아이콘 폰트도 제공한다. (inuit.css는 디자인을 **전혀** 제공하지 않는다.) inuit.css는 [4.1.5버전](https://github.com/csswizardry/inuit.css/archive/v4.1.5.zip)이 IE7을 지원하는 마지막 버전이다. [현재 버전은 5.0](http://inuitcss.com//2013/03/inuit-css-v5.0)이다. 그래서 우리도 v4.1.5를 사용하며, 여기서 탐구 대상으로 삼는 것도 v4.1.5다. 한국은 2013년 5월 현재를 기준으로 여전히 IE7 비율이 10%를 넘기 때문이다. 20 | 21 | 여튼간에, CSS 생산성을 높이기 위해 선택하고 공부하기 시작한 프레임워크가 바로 inuit.css다. -------------------------------------------------------------------------------- /css/inuit.css/modules-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/left21wm/dev-sharing/12f05f63d57a0bbb492f49bf641ac974042ea6cc/css/inuit.css/modules-1.jpg -------------------------------------------------------------------------------- /css/inuit.css/modules-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/left21wm/dev-sharing/12f05f63d57a0bbb492f49bf641ac974042ea6cc/css/inuit.css/modules-2.jpg -------------------------------------------------------------------------------- /css/inuit.css/pt1.md: -------------------------------------------------------------------------------- 1 | - Date: 2013-09-02 16:14:31 2 | 3 | 기본 파일 구조 4 | 5 | \ 6 | + watch.sh 7 | + _vars.scss 8 | + your-project.scss 9 | + inuit.css 10 | \+ inuit.scss 11 | + partials 12 | \+ base 13 | + generic 14 | + objects 15 | Generic 16 | -------- 17 | 18 | ### Mixins ### 19 | 20 | 다음 믹신은 수직적 리듬을 일정하게 유지하기 위한 것이다. 폰트 크기(`$font-size`)를 넘기면, 줄 높이를 언제나 `$base-line-height`의 정수배가 되도록 계산한다. 21 | 22 | @mixin font-size($font-size){ 23 | font-size:$font-size +px; 24 | font-size:$font-size / $base-font-size +rem; 25 | line-height:ceil($font-size / $base-line-height) * ($base-line-height / $font-size); 26 | } 27 | 28 | 그 다음엔 제조사별 접두어와 CSS 애니메이션을 위한 믹신이 나온다. 다음과 같이 쓰면 된다. 29 | 30 | @include vendor($property, $value); 31 | @include keyframe($animation-name); 32 | 33 | 마지막으로 말줄임표를 위한 믹신이다. 너비를 인수로 넘겨주면 된다. 34 | 35 | @include truncate($truncation-boundary); 36 | 37 | ### Reset ### 38 | 39 | inuit.css는 리셋 CSS를 차용했지만, 너무 고지식한 리셋은 없애버렸다. 그런 예로는: 40 | 41 | - 목록 스타일 리셋 42 | - `big`, `center`, `acronym`처럼 폐기될 요소들의 리셋 43 | - `fieldset` 테두리 리셋 44 | - 폰트 굵기 및 스타일 리셋 45 | - `u`와 `a`에서 밑줄 제거 46 | 47 | 기본 스타일을 재정의한 것도 있다. 48 | 49 | - 양식 요소에서 글꼴을 상속하게 함 50 | - `img`의 글꼴 스타일을 지정해서, 이미지 로드 실패시 나타나는 `alt` 텍스트가 본문과 구별되게끔 함 51 | - 그 밖에 텍스트 관련 요소들 52 | 53 | 저자는 빈번히 덮어쓰는 리셋은 제거할 것을 촉구한다. 54 | 55 | ### Clearfix ### 56 | 57 | inuit.css에서는 "micro clearfix"라는 방법을 쓴다. CSS로 요소의 앞과 뒤에 `display`가 `table`인 가짜 요소를 만들어서 위쪽 여백이 접히는 것을 막고, 요소 뒤쪽을 `clear`해주는 방식이다. Firefox 3.5 이상, Safari 4 이상, Chrome, Opera 9 이상, IE 6 이상에서 모두 지원된다. 다만 IE6, 7에서 hasLayout 프로퍼티를 켜고 부동(`float`) 요소를 포함하게 하려면 `*zoom: 1;`을 선언해야 한다. 58 | 59 | inuit.css에서는 `cf` 클래스를 를 일일이 붙여주기 보다는, 그 클래스를 확장하라고 한다. 60 | 61 | (익스플로러에서는 요소마다 hasLayout이라는 프로퍼티가 있어서 이것이 `true`이면 조상 요소에 의존하지 않고, 독자적으로 자신과 후손 요소들의 크기와 위치를 정하고, `false`면 조상 요소에 의존한다고 한다. 마이크로소프트는 "성능과 단순함"을 위해 이 프로퍼티를 도입했다고 하지만, 이것은 오히려 상황을 복잡하게 만들었다고 한다. `hasLayout`이 `false`인 `div`에 부동 요소가 있거나 절대 위치로 위치를 잡은 요소가 있으면, 내용이 사라지거나 이상하게 배치되거나, 창을 움직이거나 스크롤할 때 제대로 렌더링이 되지 않는 등 다양한 문제가 발생한다고 한다. 이런 문제는 `hasLayout`을 켜는 CSS 규칙을 선언함으로써 해결할 수 있다고 하는데, 그 중 하나가 `zoom`이다. 참고: ) 62 | 63 | (여백 접힘이란, 두 요소의 수직 여백이 맞닿아 있을 때에는 더 큰 여백이 살아남고, 작은 여백은 0으로 접힌다는 것이다. 부모와 자식 요소일 경우에도 여백이 맞닿기만 하면 모두 적용된다. 심이나 테두리를 넣으면 여백이 접히는 일을 막을 수 있다.(그런데 익스플로러 7까지는 `hasLayout` 프로퍼티가 있으면 여백이 아예 접히지 않았다고 한다). 다만 작은 여백이 음수일 경우에는 두 여백을 둘 다 적용한다. 부동 요소, 절대 위치 요소, 줄글-덩어리 요소, `overflow`가 `visible`이 아닌 요소, 루트 요소에서는 여백 접힘이 발생하지 않는다. 참고 64 | 65 | ### Shared ### 66 | 67 | 여기에는 몇몇 요소들과 객체의 여백이 지정돼 있다. 68 | 69 | 여기서 저자는 한 쪽 방향으로만(`margin-bottom`과 `margin-left`로만) 여백을 지정한다. 한 쪽 방향으로만 지정할 때의 이점은 70 | 71 | - 수직적 리듬을 규정하기 더 쉽다 72 | - 컴포넌트를 없애거나 이동시켜도 일정한 여백이 보장된다. 73 | - 따라서 컴포넌트들이 나열되는 순서에 종속되지 않게 된다. 74 | - 여백 접힘을 신경쓰지 않아도 된다. 75 | 76 | 여기서 지정된 여백의 값은 모두 $base-spacing-unit이며, $base-font-size를 기준으로 한 `rem` 값을 쓴다. 기본 여백이 지정된 요소와 객체들은 다음과 같다. 77 | 78 | - margin-bottom=$base-spacing-unit 79 | - `h1`~`6`, `hgroup`, `ul`, `ol`, `dl`, `blockquote`, 80 | `p`, `address`, `table`, `fieldset`, `figure`, `pre` 81 | - `.media`, `.island`, `.islet` 82 | - `%sass-margin-bottom` 83 | - `.islet & .islet`(절반) 84 | - `.landmark`(2배) 85 | - `hr`(줄의 두께인 2픽셀만큼만 뺌) 86 | - margin-left=$base-spacing-unit: `ul`, `ol`, `dd` 87 | 88 | Base 89 | ---- 90 | 91 | ### Main ### 92 | 93 | html요소의 스타일이다. $base-font-size가 여기에 적용된다. 94 | 95 | ### Headings ### 96 | 97 | 저자는 니콜 설리반의 아이디어를 따라 제목에 해당하는 클래스를 모두 만든다. 그렇게 하면 사이드 바에 있는 `h2`가 `h3`처럼 보이게 하고 싶다거나, 푸터에 있는 `h3`가 `h4`처럼 보이게 하고 싶을 때 코드를 줄일 수 있다고 한다. 제목 클래스의 이름은 그리스식 알파벳에서 따왔다. 98 | 99 | h1,.alpha {} 100 | h2,.beta {} 101 | h3,.gamma {} 102 | h4,.delta {} 103 | h5,.epsilon {} 104 | h6,.zeta {} 105 | 106 | 각 제목의 크기는 `$h1-size`...`$h2-size`이라는 변수로 설정하며, inuit.css는 이 값을 `font-size`라는 믹신의 인수로 넘긴다. 107 | 108 | `.hN` 클래스는 `hgroup` 요소나 수준이 딱히 정해지지 않은 제목 요소에 사용한다. 109 | 110 |
111 |

Best Framework. Ever!

113 |
114 | 115 | `.giga`, `.mega`, `.kilo`는 기존 제목 수준(`h1`...`h6`, `.alpha`...`.zeta`)에서 벗어나는 예외적인 커다란 제목에 쓰는 클래스다. 각각의 크기는 `$giga-size`, `$mega-size`, `$kilo-size`라는 변수로 설정하고, `font-size`라는 믹신으로 넘어간다. 116 | 117 | ### Paragraph ### 118 | 119 | 기사 첫 머리에 들어가는 요점이 들어간 한 두 문장짜리 문단을 Lede(Lead와 발음이 같고, 활판 인쇄에 쓰이는 Lead와 구분하기 위해 스펠링을 바꿨다고 한다)라고 한다. `.lede`나 `.lead`는 그런 문단에 쓰이는 클래스이며, 일반 문단보다 글꼴 크기가 12.5퍼센트 크다. 120 | 121 | ### Small Print ### 122 | 123 | 여기 있는 규칙들은 작은 글씨에 적용한다. `small` 요소는 `font-size`의 단위가 `em`이어서 언제나 부모 요소보다 글꼴이 작다. `.giga`, `.mega`, `.kilo`처럼 예외적인 글꼴(이번에는 예외적으로 작은 경우다)은 `.smallprint`,`.milli`,(글꼴 크기 변수 `$milli-size`)`.micro`(`$micro-size`)을 쓴다. 124 | 125 | ### Quote ### 126 | 127 | 인용 관련 요소인 `q`와 `blockquote`에 적용되는 규칙들이 여기서 선언된다. `q`로 둘러싸면 홅따옴표로 둘러싸고, 한번 더 `q` 둘러싸면 쌍따옴표로 둘러싼다. inuit.css에서 기본 설정을 덮어쓰지 않고 `q`로 쌍따옴표를 붙이는 방법은 없는듯하다. 128 | 129 | `blockquote` 요소를 쓰면 쌍따옴표를 쳐준다. 130 | 131 |
132 |

Insanity: doing the same thing over and over again and expecting 133 | different results.

134 | Albert Einstein 135 |
136 | 137 | `.source` 클래스는 "—"를 본문 앞에 붙여준다. `p`요소의 본문 첫줄은 쌍따옴표 너비만큼 내어쓴다(음수로 지정한 들여쓰기, `text-indent`). `p`요소에 자동으로 붙는 쌍따옴표는 요소 덩어리가 아니라 그 안에 있는 텍스트에 자동으로 붙는다. 이것은 `:last-of-type` 선택자를 활용한 것으로 IE8까지는 지원이 안된다고 한다. 138 | 139 | ### Code ### 140 | 141 | 코드를 인용하는 스타일에 대한 것인데, 당장은 쓸 일이 없을 것이므로 생략하겠다. 선언된 클래스: `.code-comment`, `.numbered`, `.numbered__numberes`, `.numbered__numberes code` 142 | 143 | ### Link ### 144 | 145 | inuit.css는 기본적으로 링크에서 밑줄을 없앴고, 마우스를 올리면 밑줄이 생기게 했다. 저자는 마우스를 올릴 때 부정적 반응(뭔가 없어진다거나, 더 흐려진다거나 하는 등의 반응)이 아니라 긍정적 반응(뭔가 생긴다거나, 더 진해진다거나 하는 등)을 보이도록 해야 한다고 주장한다. 146 | 147 | 다만 이렇게 할 경우 색맹에게는 링크가 구별이 잘 안 될 수도 있다고 말하며, 이럴 때를 대비해서 링크와 본문의 색상 대비를 높이라고 주문한다. 148 | 149 | `.current`는 링크 목록에서 현재 페이지를 나타낼 때 쓰는 클래스이며, 밑줄이 들어가 있고, 마우스를 올려도 커서는 `text`로 유지된다. 150 | 151 | ### Image ### 152 | 153 | `img` 요소는 너비가 `100%`를 넘지 않게끔 돼 있다. 154 | 155 | img{ 156 | max-width:100%; 157 | height:auto; 158 | } 159 | figure > img{ 160 | display:block; /* 원래는 inline이다 */ 161 | } 162 | 163 | ### List ### 164 | 165 | 중첩된 목록은 수직 여백(inuit.css에서는 `margin-bottom`)을 없앴다. 166 | 167 | ### Table ### 168 | 169 | 기본 표 스타일은 다음과 같다. 170 | 171 | table{ width:100%; } 172 | th, 173 | td{ 174 | padding:$base-spacing-unit / 4 +px; 175 | @media screen and (min-width:480px){ 176 | padding:$half-spacing-unit +px; 177 | } 178 | text-align:left; 179 | } 180 | 181 | [colspan]{ text-align:center; } 182 | [colspan="1"]{ text-align:left; } 183 | [rowspan]{ vertical-align:middle; } 184 | [rowspan="1"]{ vertical-align:top; } 185 | .numerical{ text-align:right; } 186 | 187 | .t5 { width: 5% } 188 | .t10 { width:10% } 189 | .t12 { width:12.5% } /* 1/8 */ 190 | .t15 { width:15% } 191 | .t20 { width:20% } 192 | .t25 { width:25% } /* 1/4 */ 193 | .t30 { width:30% } 194 | .t33 { width:33.333% } /* 1/3 */ 195 | .t35 { width:35% } 196 | .t37 { width:37.5% } /* 3/8 */ 197 | .t40 { width:40% } 198 | .t45 { width:45% } 199 | .t50 { width:50% } /* 1/2 */ 200 | .t55 { width:55% } 201 | .t60 { width:60% } 202 | .t62 { width:62.5% } /* 5/8 */ 203 | .t65 { width:65% } 204 | .t66 { width:66.666% } /* 2/3 */ 205 | .t70 { width:70% } 206 | .t75 { width:75% } /* 3/4*/ 207 | .t80 { width:80% } 208 | .t85 { width:85% } 209 | .t87 { width:87.5% } /* 7/8 */ 210 | .t90 { width:90% } 211 | .t95 { width:95% } 212 | 213 | 여기에서 확장되는 테이블용 클래스는 다음과 같다. 214 | 215 | - `.table--bordered`: 테두리 있는 표 216 | - `.table--striped`: 아무 스타일이 없는 표 217 | - `.table--data`: 데이터용 표(글꼴 크기가 2/3다). 218 | 219 | ### Forms ### 220 | 221 | 1. `input[type=text]`나 `input[type=email]`, `input[type=password]` 등은 `type` 어트리뷰트를 불문하고 모두 텍스트 입력란으로 나온다. 그래서 텍스트 입력란은 `[type]` 선택자가 아니라, `.text-input`이라는 클래스로 스타일을 매긴다. 222 | 2. 여러 필드는 목록으로 처리한다. 하나의 항목(`li` 요소)에는 `label` 요소(`display`는 `block`임)와 `input` 요소가 차례대로 들어간다. 223 | 3. `label`과 동일한 효과를 내는 `.label`이라는 클래스가 있어서, `label` 요소를 쓰기에는 부적절하지만 라벨의 기능을 하는 요소에 적용할 수 있다. (가령 4지선다 문항에서, 질문에 해당하는 부분) 224 | 4. 체크리스트 목록은 `.check-list` 안에 넣는다. 225 | 5. "내 이름은 __입니다"와 같은 구어체 입력란의 경우에는 라벨을 `.spoken-form`의 자식 요소로 둔다. 그럴 경우 라벨은 `block`이 아니라 `inline-block`이 된다. 226 | 6. `.additional`: 라벨에 들어가는 추가적인 도움말에 적용한다. 227 | 7. `.extra-help`: 앞에 나오는 `input` 요소가 포커스 되거나 활성화되면 나타나는 도움말 메시지 228 | 229 | Objects 230 | ------- 231 | 232 | ### grid ### 233 | 234 | 격자는 기본적으로 `.grid-wrapper`(줄여서 `.gw`)로 둘러싼다. 기본적으로는 왼쪽에서 오른쪽으로 격자를 채우지만, `.grid-wrapper--rev`(줄여서 `.gw--rev`)를 덧붙이면 오른쪽에서 왼쪽으로 격자를 채운다. 235 | 236 | ### flexbox ### 237 | 238 | Flexbox는 향후 CSS에 포함될 레이아웃 모드이며, `display`가 `flexbox`인 다양하게 배치할 수 있다(가로, 세로, 가운데 정렬(세로로도), 공간의 균등 분할, 심지어 순서도 바꿀 수 있다고도 한다). 239 | 240 | 다만 inuit.css에서는 그냥 `display`가 `table`인 요소이며, 이 모듈 안에 들어간 요소들은 공간을 균등하게 분배 받는다. 241 | 242 | ### text-cols ### 243 | 244 | 컬럼을 구현한 모듈인데, 익스플로러는 전혀 지원하지 못하는 듯하다. 245 | 246 | ### nav ### 247 | -------------------------------------------------------------------------------- /css/inuit.css/pt2.md: -------------------------------------------------------------------------------- 1 | - Date: 2013-09-02 16:14:31 2 | 3 | 보조 클래스 4 | -------------- 5 | 6 | 1 .one-whole 7 | 8 | 1/2 .one-half 9 | 10 | 1/3 .one-third 11 | 2/3 .two-thirds 12 | 13 | 1/4 .one-quarter 14 | 2/4 .two-quarters 15 | 3/4 .three-quarters 16 | 17 | 1/5 .one-fifth 18 | 2/5 .two-fifths 19 | 3/5 .three-fifths 20 | 4/5 .four-fifths 21 | 22 | 1/6 .one-sixth 23 | 2/6 .two-sixths 24 | 3/6 .three-sixths 25 | 4/6 .four-sixths 26 | 5/6 .five-sixths 27 | 28 | 1/8 .one-eighth 29 | 2/8 .two-eighths 30 | 3/8 .three-eighths 31 | 4/8 .four-eighths 32 | 5/8 .five-eighths 33 | 6/8 .six-eighths 34 | 7/8 .seven-eighths 35 | 36 | 1/10 .one-tenth 37 | 2/10 .two-tenths 38 | 3/10 .three-tenths 39 | 4/10 .four-tenths 40 | 5/10 .five-tenths 41 | 6/10 .six-tenths 42 | 7/10 .seven-tenths 43 | 8/10 .eight-tenths 44 | 9/10 .nine-tenths 45 | 46 | 1/12 .one-twelfth 47 | 2/12 .two-twelfths 48 | 3/12 .three-twelfths 49 | 4/12 .four-twelfths 50 | 5/12 .five-twelfths 51 | 6/12 .six-twelfths 52 | 7/12 .seven-twelfths 53 | 8/12 .eight-twelfths 54 | 9/12 .nine-twelfths 55 | 10/12 .ten-twelfths 56 | 11/12 .eleven-twelfths 57 | 58 | pull-- 59 | push-- 60 | 61 | .brand 62 | .brand-face 63 | .brand-color 64 | 65 | - .fr: float right 66 | - .fl: float left 67 | - .text-center 68 | - .full-bleed: .island의 내용을 꽉차게 69 | - .informative: help 커서 70 | - .proceed: "더 보기"용 오른쪽 정렬 71 | - .go:after: 뒤에 "»"를 붙여줌 72 | - .caps: 대문자화 73 | - .accessibility: `display: none`을 쓰지 않고 숨기기 74 | 75 | 디버그 76 | ------ 77 | 78 | - 황색 경보 79 | - 빈 요소 80 | - `img` 요소에 `alt` 어트리뷰트가 없는 경우 81 | - `a` 요소에 `title` 어트리뷰트가 없는 경우 82 | - `a`의 `href`가 `#`이거나 `javascript`를 포함한 경우 83 | - `a` 요소에 `target` 어트리뷰트가 있는 경우 84 | - `th` 요소에 `scope` 어트리뷰트가 없는 경우 85 | - `table`의 새끼 중에(후손 말고) `tr`인 경우 86 | - `tbody`가 `tfoot`보다 먼저 오는 경우 87 | - 인라인 스타일이 있는 요소 88 | - `id`가 있는 요소 89 | - 적색 경보 90 | - `ol`,`ul` 속에 `li`가 아닌게 있을 경우 91 | - `form` 요소에 `action` 어트리뷰트가 없는 경우 92 | - `input` 요소에 `type`이 없는 경우 93 | - `textarea`에 `row`와 `cols`가 없는 경우 94 | - `input`의 `type`가 `submit`인데 `value`가 없는 경우 95 | - `.gw`의 새끼 중에 `.g`가 아닌 녀석이 있는 경우 -------------------------------------------------------------------------------- /css/oocss/2013-04-24-oocss.md: -------------------------------------------------------------------------------- 1 | - Date: 2013-09-02 16:14:31 2 | 3 | [OOCSS][] 4 | ----- 5 | 6 | 좁은 의미로는 [니콜 설리반][](Nicole Sullivan)이 만든 CSS 프레임워크를 뜻하지만, 이 프레임워크를 만든 접근법을 지칭하는 말로도 쓰인다. 여기서는 접근법을 지칭하겠다. OOCSS는 Object Oriented CSS의 약자이며, 반복되는 시각적 패턴을 독립적인 HTML, CSS, 자바스크립트 코드 조각으로 분리해서 재사용하는 것을 말한다. 이 재사용 되는 코드가 객체 지향 언어에서의 객체에 비유된다. 7 | 8 | [OOCSS]: https://github.com/stubbornella/oocss/wiki 9 | [니콜 설리반]: http://www.stubbornella.org/content/ 10 | 11 | 2009년에 니콜 설리반은 통상 '좋은 CSS 코딩 방법'으로 통하던 방식, 말뜻에서 벗어나는 요소를 배제하고, 클래스 사용을 자제하며, CSS의 계단식 세계관에 맞춰서 후손 선택자를 사용하라는 통설에 [의문을 제기했다][니콜 설리반 발표]. 12 | 13 | [니콜 설리반 발표]: http://www.stubbornella.org/content/2011/04/28/our-best-practices-are-killing-us/ 14 | 15 | 니콜 설리반은 이러한 방법이 선택자 점수(specifity) 경쟁을 일으켜서 CSS를 엉망으로 만든다고 주장했다. 요소 선택자와 ID를 이용해서 스타일을 지정하면, 변종을 만들 때 마다 더 점수가 높은 선택자를 써야하기 때문이다. 가령 16 | 17 | h3 { 18 | color: #333; 19 | font-size: 17px; 20 | font-weight: bold; 21 | } 22 | #sidebar h3 { 23 | color: #797979; 24 | font-size: 12px; 25 | font-weight: bold; 26 | border bottom: 1px solid #c5c5c5; 27 | padding-bottom: 5px; 28 | } 29 | #sidebar .account h3 { 30 | color: #333; 31 | font-size: 13px; 32 | font-weight: bold; 33 | background-color:#deeef8; 34 | } 35 | #sidebar .weatherMod h3 { 36 | color: #fff; 37 | text-transform: uppercase; 38 | } 39 | 40 | /* 출처: http://www.stubbornella.org/content/2011/04/28/our-best-practices-are-killing-us/ */ 41 | 42 | 사이드바에 모듈이 추가될 때마다 원하는 모습을 얻기 위해 점수가 높은 선택자를 사용하게 되고, 이런 상황은 모듈이 중첩될 때 더 악화된다. 결국 개발자들이 파이어버그로 코딩을 하게되고 급기야는 원하는 겉모양을 얻을 수 없는 지경에 이른다는 것이다. 게다가 상위 모듈이 선언한 스타일을 덮어쓰느라 코드를 중복하게 된다. 43 | 44 | 니콜 설리반이 밝힌 [OOCSS의 두가지 원칙][]은 다음과 같다. 45 | 46 | 1. __골격과 겉모양의 분리__: 반복되는 시각적 특징은 골격과 별개인 겉모양(skin)으로 분리시켜서, 이것을 결합시키면 다양한 결과물을 얻을 수 있다. 이것은 겉모양을 위한 클래스를 만들고, 필요하다면 겉모양을 위한 요소도 추가할 수 있다는 것을 뜻한다. 47 | 2. __내용과 내용을 담는 그릇을 분리하기__: 이것은 "위치에 의존하지 않는 스타일"을 뜻한다. 즉 하위 선택자를 되도록 쓰지 않는다는 것을 뜻한다. 예를 들어 `.sidebar h3`와 같은 선택자보다는 `

` 요소에 클래스를 매겨서 `.article-heading`를 선택자로 쓴다는 것이다. 48 | 49 | [OOCSS의 두가지 원칙]: https://github.com/stubbornella/oocss/wiki#two-main-principles-of-oocss 50 | 51 | 이처럼 OOCSS는 대부분 클래스에 의존해서 스타일을 준다. 클래스 이름을 어떻게 지어야하는지에 대해서 니콜 설리반은 다음과 같은 [가이드라인][]을 제시한다. 52 | 53 | - 간결함: 되도록 짧게 54 | - 명료함: 스타일과 작동 방식이 고스란히 드러나게 55 | - 분명한 말뜻(Semantics): 어떻게 생겼는지가 아니라, 어떤 모듈인지 56 | - 포괄성: 대부분의 사이트에서도 적용되도록 57 | - 화면 중심성: 종이나 다른 매체가 아닌 모니터를 기준으로 58 | 59 | [가이드라인]: https://github.com/stubbornella/oocss/wiki/FAQ#is-this-semantic-will-i-end-up-with-classes-like-formyellow-or-tinyblueh2 60 | 61 | 스타일을 클래스에 의존하기 때문에 클래스 작명은 CSS 설계의 핵심이 된다. OOCSS는 클래스 이름에서도 말뜻을 분명히 할 것을 권장하기 때문에, 클래스 범벅(classitis)과는 다르다. 다음은 말뜻이 분명치 않은 클래스 이름의 전형적인 사례다.(예시 출처는: ) 62 | 63 | Twitter 64 | Facebook 65 | 66 | 전통적인 방법론에서는 이런 클래스를 피하고 최대한 말뜻이 분명하게 할 것을 요구한다. 67 | 68 | 69 | 70 | 71 | 그러나 이는 많은 중복을 낳는다. 72 | 73 | .twitterbtn { 74 | border: 3px solid #000; 75 | padding: 10px; 20px; 76 | color: #fff; 77 | border-radius: 10px; 78 | background: red; 79 | } 80 | 81 | .facebookbtn { 82 | border: 3px solid #000; 83 | padding: 10px; 20px; 84 | color: #fff; 85 | border-radius: 10px; 86 | background: blue; 87 | } 88 | 89 | OOCSS에서는 말뜻이 분명한 클래스에서 시각적 패턴을 분리한 새로운 클래스를 신설한다. 이렇게 하면 코드를 재사용할 수도 있다. 90 | 91 | 92 | 93 | 94 | .btnbase { 95 | border: 3px solid #000; 96 | padding: 10px; 20px; 97 | color: #fff; 98 | border-radius: 10px; 99 | } 100 | 101 | .twitter { background: red; } 102 | .facebook { background: blue; } 103 | 104 | 그러나 때로는 설리반 자신도 `.md-hd`(medium heading)처럼 말뜻에 표현 방식(presentation)이 포함된 클래스 이름을 쓰기도 한다. 실제로 마이크로포맷을 제외하면 클래스 이름은 검색 엔진이나 스크린리더에게 아무런 의미가 없다. 그래서 [니콜 설리반이 말하듯][니콜 설리반의 입장] 가이드라인이 충돌할 때에는 실용적으로 접근할 수 밖에 없다고 본다. 105 | 106 | [니콜 설리반의 입장]: https://github.com/stubbornella/oocss/wiki/FAQ#is-this-semantic-will-i-end-up-with-classes-like-formyellow-or-tinyblueh2 107 | 108 | OOCSS에서의 객체는 SMACSS에서 말하는 모듈과 비슷하다. 다만 SMACSS에서는 모듈을 구성하는 컴포넌트에 매길 클래스에 모듈의 클래스를 접두어로 쓸 것을 요구한다. 이렇게 하면 일단 모듈의 독립성을 보장할 수 있고, 다른 컴포넌트들과 이름이 충돌하는 것을 막을 수 있다. 그리고 각 컴포넌트들은 모듈화 해야할 시점이 왔을 때 하면 되지 않을까 추측한다. 109 | 110 | 이처럼 클래스에 의존하면 선택자 점수가 균일하기 때문에 재사용할 수 있는 코드 조각을 만들 수 있다. 덕분에 수많은 컴포넌트들이 중첩돼 있고, 중첩 관계가 다양해서 모든 컴포넌트를 계층화할 수 없는 대규모 사이트에서 빠른 속도로 개발을 할 수 있다. 111 | 112 | 한편 재사용되는 코드가 많다는 것은 사이트 어느 곳에서나 사용되는 코드가 많다는 것이고, 이것은 브라우저가 캐싱할 가능성이 높아진다는 것을 뜻한다. 그래서 사이트의 성능을 크게 향상시키는 데에 도움이 된다. 113 | 114 | 하지만 다중 클래스에 크게 의존하는만큼 HTML 마크업을 어질러서 유지 보수성을 떨어뜨린다는 비판도 있다. 게다가 OOCSS는 HTML 측에 대한 완전한 통제력을 전제하기 때문에, HTML 마크업을 건드릴 수 없는 경우에는 적용하기 어렵다. 그러나 전처리자를 사용하면 가능하다. Sass에서는 `@extend`를 이용해서 HTML쪽에 클래스를 추가하지 않고도 객체를 적용한 효과를 낼 수 있다. (예시 출처는: ) 115 | 116 | .btnbase { 117 | border: 3px solid #000; 118 | padding: 10px; 20px; 119 | color: #fff; 120 | border-radius: 10px; 121 | } 122 | 123 | .twitter { @extend .btnbase; background: red; } 124 | .facebook { @extend .btnbase; background: blue; } 125 | 126 | 위 파일을 Sass로 컴파일하면 다음과 같은 css가 생성된다. 127 | 128 | .btnbase, .twitter, .facebook { 129 | border: 3px solid #000; 130 | padding: 10px; 20px; 131 | color: #fff; 132 | border-radius: 10px; 133 | } 134 | 135 | .twitter { background: red; } 136 | .facebook { background: blue; } 137 | 138 | sass가 컴파일해준 css는 공유하는 시각적 특징으로 선택자를 몰아줬다. 이것은 사실 DRY CSS의 방법론이기도 하다. 서로 다른 접근법이 하나로 만나는 순간이다. 139 | 140 | sass 3.2부터는 가상 객체를 만들 수도 있다. 이 가상 객체는 호출될 때에만 css를 출력한다. 이것을 이용하면 말뜻 없는 클래스를 하나도 만들지 않고서도, OOCSS를 구현할 수 있다. 141 | 142 | 컴파일 전: 143 | 144 | %btnbase { 145 | border: 3px solid #000; 146 | padding: 10px; 20px; 147 | color: #fff; 148 | border-radius: 10px; 149 | } 150 | 151 | .twitter { @extend %btnbase; background: red; } 152 | .facebook { @extend %btnbase; background: blue; } 153 | 154 | 컴파일 후: 155 | 156 | .twitter, .facebook { 157 | border: 3px solid #000; 158 | padding: 10px; 20px; 159 | color: #fff; 160 | border-radius: 10px; 161 | } 162 | 163 | .twitter { background: red; } 164 | .facebook { background: blue; } 165 | 166 | 물론 이런 방식을 쓸 경우에도 몇가지 한계는 있다. 167 | 168 | 1. 어떤 클래스가 어느 클래스에서 상속을 받았는지가 불분명해질 수 있다(SMACSS에서 제시하는 작명 규칙을 따르면, 번거롭기는 하지만 클래스 이름을 이용해서 어느 정도 이 단점을 보완할 수는 있다. 물론 자바스크립트를 걸 때에는 더더욱 번거로울 수도 있다). 169 | 2. `@extend`가 선택자 점수를 바꿔주진 않기 때문에, 선택자 점수가 낮은 규칙으로 높은 규칙을 확장하려는 헛된 시도를 할 수 있다. 170 | 3. 확장된 규칙이 확장하기 전의 규칙과 선택자 점수가 같기 때문에 규칙을 어디서 선언하느냐가 중요하게 된다. 171 | 172 | ### 그 밖에 참고한 문헌 ### 173 | 174 | - 175 | - 176 | -------------------------------------------------------------------------------- /css/smacss/2013-02-08-pt1.md: -------------------------------------------------------------------------------- 1 | - Date: 2013-09-02 16:14:31 2 | 3 | SMACSS(이하 '스맥스')는 대규모 프로젝트를 위한 스타일링 지침이다. 4 | 5 | 스타일의 다섯가지 유형 6 | --------------------- 7 | 8 | 스맥스는 스타일을 다섯가지로 분류하고, 각 유형에 맞는 선택자(selector)와 작명법(naming convention), 코딩 기법을 제시한다. 9 | 10 | 1. 기초(Base) 11 | 2. 레이아웃(Layout) 12 | 3. 모듈(Module) 13 | 4. 상태(States) 14 | 5. 테마(Theme) 15 | 16 | ### (1) 기초 스타일 ### 17 | 18 | 흔히 말하는 reset 스타일류를 말하는 것이다. 19 | 20 | - __기능__: 요소(elements) 스타일의 기본값 지정 21 | - __선택자__ 22 | - 주로 **요소 선택자**(ex. `input[type=text]` 같은 것) 23 | - 필요에 따라서 자식(child) 선택자, 자매 선택자, 24 | 어트리뷰트(attribute) 선택자 등 25 | - `!important`를 쓸 이유가 없다. 26 | 27 | #### 예 28 | 29 | html, body, form { margin: 0; padding: 0; } 30 | input[type=text] { border: 1px solid #999; } 31 | a { color: #039 } 32 | a:hover { color: #03C; } 33 | 34 | ### (2) 레이아웃 스타일 ### 35 | 36 | - __기능__: 페이지를 구획하는 스타일(예: 헤더, 푸터, 그리드 ...) 37 | - __선택자__: 아이디나 클래스 38 | - 아이디는 CSS에서 클래스와 성능 차이가 없으며, 오히려 선택자 우선순위 점수(specificity) 때문에 함정에 빠질 우려가 있으므로, 신중하게 써야 한다. 39 | - __작명법__ 40 | - 아이디에는 이름 공간(namespace)을 할당하지 않아도 무방(이름 공간은 SMACSS에서 사용하는 접두어를 말한다. 예컨대 layout은 `l-`이라는 접두어를 붙인다.) 41 | - 클래스는 '`l-`'을 앞에 붙여서 다른 유형의 클래스와 구분 42 | 43 | 레이아웃 스타일은 재사용성에 따라 큰 레이아웃 스타일과 작은 레이아웃 스타일로 구분된다. 44 | 45 | #### 큰 레이아웃 스타일 #### 46 | 47 | 예시: 48 | 49 | #header, #article, #footer { 50 | width: 960px; 51 | margin: auto; 52 | } 53 | 54 | #article { 55 | border: solid #CCC; 56 | border-width: 1px 0 0; 57 | } 58 | 59 | #### 작은 레이아웃 스타일 #### 60 | 61 | `960.gs`와 같은 레이아웃 프레임워크를 쓸 경우다. 아이디가 아니라 클래스를 매겨서 요소를 재사용한다. 62 | 63 | #### 재사용성 #### 64 | 65 | 저자는 아이디를 매기기 전에 해당 요소의 재사용성을 숙고하라고 한다. 예시: 66 | 67 | 75 | 76 | div#featured ul { 77 | margin: 0; 78 | padding: 0; 79 | list-style-type: none; 80 | } 81 | div#featured li { 82 | float: left; 83 | height: 100px; 84 | margin-left: 10px; 85 | } 86 | 87 | 위 코드는 다음과 같은 가정이 깔려있다. 88 | 89 | 1. 격자가 딱 한번만 사용된다. 90 | 2. 항목은 왼쪽부터 띄운다(float). 91 | 3. 항목의 높이는 100픽셀이다. 92 | 93 | 위 코드를 아래와 같이 개선하면 94 | 95 | .l-grid { 96 | margin: 0; 97 | padding: 0; 98 | list-style-type: none; 99 | } 100 | 101 | .l-grid > li { 102 | display: inline-block; 103 | margin: 0 0 10px 10px; 104 | 105 | /* IE7 hack */ 106 | *display: inline; 107 | *zoom: 1; 108 | } 109 | 110 | 다음과 같은 이점이 있다. 111 | 112 | 1. 어느 박스에서나 그리드 레이아웃을 만들어낼 수 있다 113 | 2. depth of applicability(나중에 다룰 것임)를 1로 줄였다 114 | 3. 선택자의 우선순위 점수를 줄였다 115 | 4. 가장 높은 항목의 높이에 따라 열의 높이가 바뀐다 116 | 117 | 다음과 같은 단점이 있긴 하지만 118 | 119 | 1. 자식 선택자(`>`) 때문에 IE6이 배제된다(자식 선택자를 쓰지 않는 식으로 이 문제를 해결할 수 있다). 120 | 2. CSS의 크기와 복잡성이 증가했다. 121 | 122 | 재사용성이 증가했기 때문에, 코드를 중복하지 않아도 되고, 선택자의 우선순위 점수를 줄였기 때문에 레이아웃을 확장하기에 좋다. 123 | 124 | ### (3) 모듈 스타일 ### 125 | 126 | - __기능__: 레이아웃 요소 안에 들어가는 더 작은 부분들(예: 네비게이션 바, 말풍선, 대화 상자, 위젯 ...) 127 | - __선택자__ 128 | - 클래스 129 | - 모듈에 포함된 요소는 후손 선택자나 자식 선택자로. (그냥 띄어쓰는 게 후손 선택자고, `>`로 연결하는 게 자식 선택자다. 후손 선택자는 `.my-module li`, 후손 선택자는 `.my-ul>li`) 130 | - 요소 선택자(`a` 같은 태그 선택자)는 피한다.(충돌을 피할 자신이 없다면) 131 | - 내용을 반영하는 선택자일수록 좋다. 132 | 133 | #### 하위 클래스 만들기(sub-classing) ### 134 | 135 | 모듈의 변종은 언제나 하위 클래스로 스타일링한다. 136 | 137 | 나쁜 예: 138 | 139 | .pod { 140 | width: 100%; 141 | } 142 | .pod input[type=text] { 143 | width: 50%; 144 | } 145 | #sidebar .pod input[type-text] { 146 | width: 100%; 147 | } 148 | 149 | 위 예에서 새로운 하위 클래스를 추가하면 선택자가 번잡해진다. 150 | 151 | .pod { 152 | width: 100%; 153 | } 154 | .pod input[type=text] { 155 | width: 50%; 156 | } 157 | #sidebar .pod input[type=text] { 158 | width: 100%; 159 | } 160 | .pod-callout { 161 | width: 200px; 162 | } 163 | #sidebar .pod-callout input[type=text], 164 | .pod-callout input[type=text] { 165 | width: 180px; 166 | } 167 | 168 | 다음은 좋은 예다: 169 | 170 | .pod { 171 | width: 100%; 172 | } 173 | .pod input[type=text] { 174 | width: 50%; 175 | } 176 | .pod-constrained input[type=text] { 177 | width: 100%; 178 | } 179 | .pod-callout { 180 | width: 200px; 181 | } 182 | .pod-callout input[type=text] { 183 | width: 180px; 184 | } 185 | 186 | 하위 클래스 적용하기: 187 | 188 | .pod.pod-callout { } 189 | 190 |
...
191 | 192 | ### (4) 상태별 스타일 ### 193 | 194 | - __기능__: 다른 스타일에 덧붙이거나 덮어 씌워서 상태를 나타냄(예: 펼침과 접힘, 성공과 실패 등) 195 | - __선택자__ 196 | - 클래스 선택자 한개 197 | - `!important`를 쓸 수도 있다(최소화 할 것) 198 | - 같은 모듈에 두 상태를 적용하지 말 것 199 | - __작명법__ 200 | - '`is-`'를 앞에 붙인다 201 | - 특정 모듈에 한정된 상태는 모듈 이름도 그 뒤에 붙인다.(예: `is-tab-active`) 202 | - __유의__: 전역 상태 스타일은 모듈 상태 스타일과 구분한다. 모듈 상태 스타일은 모듈 스타일과 병기한다. 203 | 204 | #### 예시 205 | 206 | 215 | 216 | - `#header` 217 | - 레이아웃 요소임을 알 수 있다. 218 | - `.is-collapsed`로 접힌 상태임을 알 수 있다. 219 | - `.msg` 220 | - 모듈이다. 221 | - `.is-error`로 오류 상태임을 알 수 있다. 222 | - `#searchbox` 223 | - 연관된 라벨은 숨겨져 있다. 224 | - 라벨이 마크업 된 이유는 스크린 리더기를 위한 것 225 | 226 | #### 모듈과 다른 점 #### 227 | 228 | - 모듈과 레이아웃 둘 다에 적용할 수 있다 229 | - 페이지가 로드된 이후의 상태 변화를 나타내므로 __자바스크립트에 의존한다.__ 230 | 231 | ### (5) 테마 스타일 ### 232 | 233 | 사용자가 테마를 선택할 수 있는 경우를 염두에 두고, 색상이나 이미지를 불변하는 스타일과 분리하는 것이다. 거의 사용할 일은 없지만 필요할 때가 있다. 234 | 235 | 예시 236 | 237 | /* 모듈 스타일 */ 238 | .mod { 239 | border: 1px solid; 240 | } 241 | 242 | /* 테마 스타일 */ 243 | .mod { 244 | border-color: blue; 245 | } 246 | 247 | - 적용 범위가 넒은 테마는 `theme-`를 접두어로 붙여서 혼란을 피한다 248 | - `i18n` 등을 염두에 두고 글꼴도 사용자가 바꿀 수 있게 하기 위해 글꼴 스타일도 따로 분류할 수 있다. 그러나 굳이 글꼴 별로 클래스를 만들 것 까지는 없다 249 | -------------------------------------------------------------------------------- /css/smacss/2013-02-22-pt2.md: -------------------------------------------------------------------------------- 1 | - Date: 2013-09-02 16:14:31 2 | 3 | 상태 바꾸기 4 | ----------- 5 | 6 | ### 클래스 이름으로 바꾸기 ### 7 | 8 | 버튼을 눌러서 요소를 숨기는 방법. 9 | 10 | $('.btn-close').click(function(){ 11 | $(this).parents('dialog').addClass('is-hidden'); 12 | }); 13 | 14 | 버튼을 눌러서 메뉴를 보이는 방법(버튼을 누르면 버튼이 눌린 상태가 되고, 메뉴는 보이는 상태가 된다) 세가지. 15 | 16 | #### 작명 규칙(naming-convention)을 활용한 방법 #### 17 | 18 | 마크업 19 | 20 |
21 |
22 | 23 |
24 |
25 | 28 | 29 | - `data-action` 어트리뷰트가 어떤 자바스크립트 코드를 호출할지 결정한다. 30 | - 버튼을 클릭하면 버튼의 아이디를 토대로 메뉴를 찾는다. 31 | 32 | $('#btn-new').click(function(){ 33 | $(this).addClass('is-pressed'); 34 | $('#menu-' + $(this).id.substr(4)).removeClass('is-hidden'); 35 | }); 36 | 37 | #### 메뉴와 버튼을 이웃하게 하기 #### 38 | 39 | 마크업 40 | 41 |
42 |
43 | 44 | 47 |
48 |
49 | 50 | 1. `div.toolbar`에 '.is-active'를 추가하고 스타일을 매기는 방법 51 | 52 | .is-active .btn { color: #000; } 53 | .is-active .menu { display: block } 54 | 55 | 메뉴와 버튼이 같은 요소 안에 있어야만 하고, 다른 항목이 툴바에 들어가도 안된다. 56 | 57 | 2. 형제 선택자(`+`)를 이용하는 방법 58 | 59 | .btn.is-active { color: #000; } 60 | .btn.is-active + .menu { display: block; } 61 | 62 | 여전히 HTML 구조에 의존한다. 언제건 버튼과 메뉴가 이웃한다는 일관성을 지킬수만 있다면야 상관 없다. 63 | 64 | "버튼 메뉴"를 위한 위 규칙들은 어디에서 선언해야 할까? 버튼? 메뉴? 버튼에 다는 게 낫다. 65 | 66 | ### 어트리뷰트 선택자로 상태 바꾸기 ### 67 | 68 | 이점 69 | 70 | - 레이아웃 클래스나 모듈 클래스와 구분돼 보인다. 71 | - 여러가지 상태로 쉽게 전환할 수 있다. 72 | 73 | 예시: 74 | 75 | .btn[data-state=default] { color: #333; } 76 | .btn[data-state=pressed] { color: #000; } 77 | .btn[data-state=disabled] { opacity: .5; pointer-events: none; } 78 | 79 | HTML5는 `data-`로 시작하는 어트리뷰트를 허용한다. 80 | 81 | ### CSS 애니메이션이 있는 클래스 기반 상태 변화 ### 82 | 83 | __딜레마__: CSS는 모습, 자바스크립트는 페이지의 작동을 규정한다. 84 | 그러나 애니메이션은 주로 자바스크립트로 처리돼왔다. 85 | 86 | 나타났다 사라지는 메시지의 예: 87 | 88 | JS: 89 | 90 | function showMessages (s) { 91 | var el = document.getElementById('message'); 92 | el.innerHTML = s; 93 | el.className = 'is-visible'; 94 | setTimeout(function() { 95 | el.className = 'is-hidden' 96 | }, 3000); 97 | } 98 | 99 | CSS: 100 | 101 | @keyframes fade { 102 | 0% { opacity:0; display:block; } 103 | 100% { opacity:1; display:block; } 104 | } 105 | 106 | .is-visible { 107 | display: block; 108 | animation: fade 2s; 109 | } 110 | 111 | .is-hidden { 112 | display: none; 113 | admination: fade 2s reverse; 114 | } 115 | 116 | 자바스크립트는 상태를 바꾸고, 상태에 따른 모습은 CSS가 담당한다. 117 | 그러나 많은 브라우저가 이를 구현해주지 않는다. 다행히도 CSS3 애니메이션 권고에 따라 브라우저들이 바뀌고 있는 중이다. 당분간은 윗 부분을 다음과 같은 방식으로 써야 하고, is-removed 클래스를 추가해야한다. 118 | 119 | @-webkit-keyframes fade { 120 | ... 121 | } 122 | 123 | ... 124 | 125 | .is-removed { display: none; } 126 | 127 | 자바스크립트는 다음과 같이 쓴다. 128 | 129 | function showMessages (s) { 130 | var el = document.getElementById('message'); 131 | el.innerHTML = s; 132 | el.className = 'is-visible'; 133 | setTimeout(function() { 134 | el.className = 'is-hidden' 135 | setTimeout(function(){ 136 | el.className = 'is-removed'; 137 | }, 2000); 138 | }, 3000); 139 | } 140 | 141 | ### 의사(pseudo) 클래스 이름으로 상태 바꾸기 ### 142 | 143 | 예시: 144 | 145 | .btn { background-color: #333; } 146 | .btn:hover { background-color: #336; } 147 | .btn:focus { box-shadow: 0 0 3px rgba(48,48,96,.3); } 148 | 149 | 하위 모듈을 만들시 규칙을 다시 맞춰서 써야할 수도 있다. 150 | 151 | .btn { background-color: #333; } 152 | .btn:hover { background-color: #336; } 153 | .btn:focus { box-shadow: 0 0 3px rgba(48,48,96,.3); } 154 | 155 | .btn-special { background-color: #DEDB12; } 156 | .btn-special:hover { background-color: #B8B50B; } 157 | 158 | 여기에 클래스로 상태를 나타내면 더 복잡해진다. 159 | 160 | .btn { ... } 161 | .btn:hover { ... } 162 | .btn:focus { ... } 163 | 164 | .btn-special { ... } 165 | .btn-special:hover { ... } 166 | 167 | .btn.is-pressed { ... } 168 | .btn.is-pressed:hover { ... } 169 | 170 | .btn-special.is-pressed { ... } 171 | .btn-special.is-pressed: hover { ... } 172 | 173 | ### 미디어 쿼리 ### 174 | 175 | 예시: 176 | 177 | @media screen and (max-width: 400px) { 178 | #content { float: none; } 179 | } 180 | 181 | SMACSS에서는 특정 모듈에 적용되는 스타일을 분리해야하므로, 분기점을 하나만 만들기보다는 미디어 쿼리를 모듈의 상태와 함께 둬야한다. 182 | 183 | .nav > li { float: left; } 184 | @media screen and (max-width: 400px) { 185 | .nav > li { float: none; } 186 | } 187 | 188 | 미디어 쿼리 선언을 여러번 해야할테지만, 모듈에 대한 정보를 한 곳에 다 모을 수 있다. 그러면 테스트하기에도 좋고, 모듈화해서 템플릿과 CSS를 따로 불러와도 된다. 189 | 190 | 적용 깊이(Depth of Applicability) 191 | -------- 192 | 193 | __뜻__: 규칙에 영향을 받는 세대의 수. "`body.article > #main > #content > #intro > p > b`"는 6. 같은 페이지에서 "`.article #intro b`"도 6. 194 | 195 | 적용의 깊이가 크면 HTML 구조에 더 많이 의존하게 된다. 그러면 컴포넌트를 이동시키기 어려워진다. 사이드바에 있는 모듈을 푸터에도 만드려는 경우: 196 | 197 | #sidebar div, #footer div { border: 1px solid #333; } 198 | #sidebar div h3, #footer div h3 { margin-top: 5px; } 199 | #sidebar div ul, #footer div ul { margin-bottom: 5px; } 200 | 201 | 이 모듈의 루트는 `div` 요소이고, 여기서 모듈을 만들면 된다. 202 | 203 | .pod { border: 1px ... } 204 | .pod > h3 { ... } 205 | .pod > ul { ... } 206 | 207 | 1. 모듈을 쓸 때마다 클래스에 `pod`를 써줘야 하지만, 이렇게 하면 적용 깊이를 줄일 수 있는 이점이 있다. 그러면 동적 콘텐츠를 위한 템플릿을 자유자재로 쓸 수 있다. 208 | 209 |
210 |

{{heading}}

211 |
    212 | {{#items}} 213 |
  • {{item}}
  • 214 |
215 |
216 | 217 | 2. 더 유연한 구조가 필요치 않다면, `h3`나 `ul`에 클래스를 매길 필요는 없다. 그러나 더 유연하려면 반드시 클래스를 매겨야 한다. 가령 `ul` 대신에 `ol`, `div`가 들어가는 경우: 218 | 219 | .pod > ul, .pod > ol, .pod > div { ... } 220 | 221 | 이렇게 스타일을 매길 수도 있지만, 클래스를 붙이면 다음과 같이 축약할 수 있다. 222 | 223 | .pod-body { ... } 224 | 225 | 선택자의 성능 226 | ------------ 227 | 228 | Steve Souders의 연구에 따르면 CSS 선택자의 성능은 기껏해야 0.05초 밖에 나지 않는다. 그러므로 너무 신경쓸 필요는 없지만 알아두긴 하자. 229 | 230 | 선택자는 오른쪽부터 계산된다. `.module h3`의 경우 브라우저는 페이지 내에 있는 모든 `h3`를 먼저 찾아낸다. 그 다음 `.module`에 속한 것을 찾는다. 그러므로 오른쪽에 요소 선택자를 두면 성능이 떨어진다. 그래서 구글에서는 모든 요소에 클래스를 붙여 쓰지만, 저자는 실용적으로 접근하자고 한다. 231 | 232 | HTML5와 SMACSS 233 | --------------- 234 | 235 | HTML5이든 HTML4이든 SMACSS가 효과적인 이유 236 | 237 | 1. HTML 페이지에 말뜻(semantic value)을 더해준다. 238 | 2. HTML 구조에 덜 의존한다. 239 | 240 | HTML5에는 좀더 말뜻이 분명한 요소가 추가됐다.(e.g. `section`, `header`, `aside`) 241 | 242 | 그러나 태그가 모듈을 대체할 수는 없다. 다음 `nav`가 같은 `nav`일까? 243 | 244 | 248 | 249 | 253 | 254 | `nav.nav-primary`는 페이지 상단에 있는 수평 네비게이션이겠지만, `nav.secondary`는 아마 사이드바에 들어갈 네비게이션 같다. 255 | 256 | nav.nav-primary li { display: inline-block; } 257 | nav.nav-secondary li { display: block; } 258 | 259 | 근데 클라이언트가 와서 수평 메뉴에 수직 메뉴를 추가해달라고 한다. 260 | 261 |

263 | 271 | 272 | 273 | 그럼 하위 메뉴에 있는 `li`가 수평으로 나열되지 않게 하려면? 274 | 275 | 1. `ul`을 `