<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Jay.log</title>
        <link>https://velog.io/</link>
        <description>그림쟁이 개발자</description>
        <lastBuildDate>Tue, 08 Feb 2022 08:55:38 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>Jay.log</title>
            <url>https://images.velog.io/images/jay_kimjh/profile/c6431246-5eeb-412a-a0f9-4edf0b1a6d4c/P20181116_192604150_D5D6675C-EA04-4358-9452-264039076EFB.JPG</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. Jay.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/jay_kimjh" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[제이쿼리 라이브러리(jQuery Library)]]></title>
            <link>https://velog.io/@jay_kimjh/%EC%A0%9C%EC%9D%B4%EC%BF%BC%EB%A6%AC-%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%ACjQuery-Library</link>
            <guid>https://velog.io/@jay_kimjh/%EC%A0%9C%EC%9D%B4%EC%BF%BC%EB%A6%AC-%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%ACjQuery-Library</guid>
            <pubDate>Tue, 08 Feb 2022 08:55:38 GMT</pubDate>
            <description><![CDATA[<p>※ 본 포스팅은 책『실전 프로젝트 반응형 웹 퍼블리싱』의 내용을 바탕으로 작성되었음</p>
<h1 id="제이쿼리-라이브러리jquery-library">제이쿼리 라이브러리(jQuery Library)</h1>
<p>본격적으로 jQuery를 학습하기 전에 jQuery(이하 제이쿼리)의 개념에 대하여 잠깐 언급하겠다. 제이쿼리는 <strong>자바스크립트의 가장 대표적인 라이브러리 언어</strong>라고 할 수 있다.</p>
<blockquote>
</blockquote>
<p><strong>라이브러리(Library)란?</strong>
제이쿼리에는 일반 자바스크립트에서 볼 수 없는 다양한 애니메이션 효과의 구현을 위한 기능적인 함수들이 많이 추가되어 있다. 이렇게, 그대로 불러와 사용할 수 있도록 구성된 기능적인 함수나 작은 프로그램의 집합을 라이브러리(Library)라고 한다.</p>
<p>따라서, 그 다양한 기능을 사용하려면 우선 <a href="http://jquery.com/download">jQuery.com</a>에 접속하여 &#39;제이쿼리 라이브러리&#39; 파일을 다운로드해야 한다.</p>
<p>제이쿼리의 연동 방식에는 두 가지가 있다.</p>
<p>첫 번째는 직접 제이쿼리 파일을 &#39;다운로드&#39; 받아서 연결하는 방식이며, 두 번째는 직접 링크 주소를 입력하여 불러오는(import) &#39;CDN 호스트 링크 방식&#39;이다.</p>
<h2 id="다운로드-방식">다운로드 방식</h2>
<p>[Download] 버튼의 위를 보면 <strong>&#39;minifield(축소)&#39;</strong>와 <strong>&#39;uncompressed(원본)&#39;</strong> 버전 중 한 가지를 체크할 수 있따. 우선 minified 방식을 체크하고 [Download] 버튼을 클릭한다.</p>
<p><strong>&#39;minified&#39;</strong> 방식은 <strong>코드의 줄바꿈이나 개발을 위한 주석(설명) 등이 생략된 버전</strong>이다.
<strong>&#39;uncompressed&#39;</strong> 파일은 그에 비해 <strong>큰 용량을 차지하지만 줄바꿈과 코드 내에 주석이 달려있어</strong> 제이쿼리를 개발할 때 편리하게 사용된다.</p>
<p>현재 우리는 새로운 제이쿼리 라이브러리를 개발하는 것이 아닌, 구현되어 있는 기능을 불러와 사용할 목적이므로 용량이 가벼운 &#39;minified&#39; 방식으로 다운로드한다. 다운로드한 *.js 파일을 HTML 파일의 하나위에 임의로 만든 [js] 폴더에 저장한다.</p>
<p>이렇게 다운로드한 js 파일은 다음과 같이 HTML의 <code>&lt;head&gt;</code> 요소 안에서 불러올 수 있다.</p>
<pre><code class="language-html">&lt;head&gt;
  &lt;script type&quot;text/javascript&quot; src=&quot;js/jquery-1.8.1.min.js&quot;&gt;&lt;/script&gt;
&lt;/head&gt;</code></pre>
<h2 id="cdn-호스트-링크-방식">CDN 호스트 링크 방식</h2>
<p>제이쿼리를 제공하는 기업별 주소들이다. 그 중 <a href="http://code.jquery.com/jquery-latest.js">http://code.jquery.com/jquery-latest.js</a>를 사용하면 <strong>가장 최신의 버전으로 자동 연동</strong>된다.</p>
<blockquote>
</blockquote>
<p><strong>google</strong> --- <a href="http://ajax.googlrapis.com/ajax/libs/jquery/1.8.1/jquery.min.js">http://ajax.googlrapis.com/ajax/libs/jquery/1.8.1/jquery.min.js</a>
<strong>microsoft</strong> --- <a href="http://ajax.aspnetcdn.com/ajax/jquery/jquery-1.8.1.js">http://ajax.aspnetcdn.com/ajax/jquery/jquery-1.8.1.js</a>
<strong>jquery</strong> --- <a href="http://code.jquery.com/jquery-1.8.1.min.js">http://code.jquery.com/jquery-1.8.1.min.js</a> / <a href="http://code.jquery.com/jquery-latest.js">http://code.jquery.com/jquery-latest.js</a></p>
<p>참고로, 위 다운로드 방식 등 설명에 등장한 &#39;1.8.1&#39; 버전은 참고하고 있는 도서가 집필된 2012년 9월 기준이다. 더욱 최신의 버전이 새롭게 공개되었을 수 있으니 기본적으로 가장 최신의 라이브러리도 연동시키는 마지막 링크(~latest.js)를 권장한다고 한다.</p>
<p>앞의 링크 중 하나를 골라 다음과 같이 링크 방식으로 삽입할 수 있다.</p>
<pre><code class="language-html">&lt;head&gt;
  &lt;script type=&quot;text/javascript&quot; src=&quot;http://code.jquery.com/jquery-latest.js&quot;&gt;&lt;/script&gt;
&lt;/head&gt;</code></pre>
<h1 id="선택자-및-속성selector--attribute">선택자 및 속성(Selector &amp; Attribute)</h1>
<p>앞 장 &#39;자바스크립트 기본 다지기&#39;에서 살펴 본 바로는 DOM(문서 객체)을 불러오는 선택자에 따라 &#39;표준방식 브라우저(크롬, 파이어폭스, 사파리 등)&#39;와 &#39;비표준 방식 브라우저(IE8 이하 버전)&#39; 간의 호환성에 문제가 있었지만 제이쿼리에는 그러한 문제점들이 없다.</p>
<p>자바스크립트는 기본적으로 인터프리터 언어이므로, 실행문을 윗줄부터 순서대로 수행한다. 제이쿼리에서 선택자를 사용할 경우, &#39;$(document).ready(function(){실행문})&#39;의 형식으로 실행 함수를 작성해야 한다.</p>
<p>이유는 제이쿼리가 <code>&lt;body&gt;</code>요소보다 위에서 import(삽입)되기 때문에 문서의 모든 요소들이 로딩된 이후에야 요소 선택자를 사용할 수 있기 때문이다.</p>
<pre><code class="language-javascript">$(document).ready(function(){
  실행문;
});</code></pre>
<p>다음과 같이 $를 사용하여 간단히 줄여 써도 결과는 같다.</p>
<pre><code class="language-javascript">$(function(){
  실행문;
});</code></pre>
<p><span style="color : red;"><strong>※ 선택자</strong></span>
HTML 문서의 특정 요소를 선택하고자 할 때 사용하며, 그 종류는 다음과 같다.</p>
<blockquote>
</blockquote>
<p><strong>$(&quot;*&quot;)</strong> --- 전체 요소 선택
<strong>$(&quot;태그명&quot;)</strong> --- 태그명으로 요소 선택
<strong>$(&quot;#아이디명&quot;)</strong> --- 아이디명으로 요소 선택
<strong>$(&quot;.클래스명&quot;)</strong> --- 클래스명으로 요소 선택
<strong>(&quot;태그명1 태그명2&quot;)</strong> --- 태그명1의 하위 요소 중 태그명2의 요소들 선택
<strong>(&quot;태그명1&gt;태그명2&quot;)</strong> --- 태그명1의 자식 요소 중 태그명2의 요소들 선택
<strong>$(&quot;선택 요소&quot;).parent()</strong> --- 선택 요소를 기준으로 부모 요소를 선택
<strong>$(&quot;선택 요소&quot;).children(&quot;태그명&quot;)</strong> --- 선택 요소를 기준으로 자식 요소들 선택
<strong>$(&quot;선택 요소&quot;).prev()</strong> --- 선택 요소들 기준으로 형제 요소 중 이전 요소 선택
<strong>$(&quot;선택 요소&quot;).next()</strong> --- 선택 요소를 기준으로 형제 요소 둥 다음 요소 선택
<strong>$(&quot;선택 요소&quot;).siblings(&quot;태그명&quot;)</strong> --- 선택 요소를 기준으로 형제 요소들 모두 선택
<strong>$(&quot;:종류&quot;);</strong> --- 폼의 input 요소 중 종류(type)가 일치하는 요소들 선택</p>
<p>예를 들어, 표에 정리된 선택자를 사용하여 특정 css 스타일을 적용하려면 &#39;선택자.css(&quot;속성&quot;, &quot;속성값&quot;)&#39;의 형태로 쓸 수 있다. 즉, $(&quot;h1&quot;).css(&quot;color&quot;,&quot;red&quot;) 형식이 되겠다.</p>
<h1 id="문서-객체-조작dom-control">문서 객체 조작(DOM Control)</h1>
<h2 id="탐색-선택자">탐색 선택자</h2>
<p>탐색 선택자는 좀 더 정확히 요소 선택을 가능하게 하는데, 그 종류는 다음과 같다.</p>
<blockquote>
</blockquote>
<p><strong>$(&quot;ul li:odd&quot;)</strong> --- <code>&lt;ul&gt;</code>의 <code>&lt;li&gt;</code>요소 중 홀수 인덱스 요소만 선택
<strong>$(&quot;ul li:even&quot;)</strong> --- <code>&lt;ul&gt;</code>의 <code>&lt;li&gt;</code>요소 중 짝수 인덱스 요소만 선택
<strong>$(&quot;ul li:first&quot;)</strong> --- <code>&lt;ul&gt;</code>의 <code>&lt;li&gt;</code>요소 중 첫 번째 요소만 선택
<strong>$(&quot;ul li:last&quot;)</strong> --- <code>&lt;ul&gt;</code>의 <code>&lt;li&gt;</code>요소 중 마지막 요소만 선택
<strong>$(&quot;ul li:eq(1)&quot;), $(&quot;ul li&quot;).eq(1)</strong> --- <code>&lt;ul&gt;</code>의 <code>&lt;li&gt;</code>요소 중 두 번쨰 요소만 선택(인덱스 0부터 시작)
<strong>$(&quot;ul li:lt(2)&quot;)</strong> --- <code>&lt;ul&gt;</code>의 <code>&lt;li&gt;</code>요소 중 세 번째 이전 요소만 선택
<strong>$(&quot;ul li:gt(2)&quot;)</strong> --- <code>&lt;ul&gt;</code>의 <code>&lt;li&gt;</code>요소 중 세 번째 이후 요소만 선택
<strong>$(&quot;ul li:nth-child(2n)&quot;)</strong> --- <code>&lt;ul&gt;</code>의 <code>&lt;li&gt;</code>요소 중 2의 배수 번째 요소만 선택
<strong>$(&#39;ul li:contains(&#39;문자&#39;)&quot;)</strong> --- <code>&lt;ul&gt;</code>의 <code>&lt;li&gt;</code>요소 중 &quot;문자&quot;가 포함된 요소만 선택
<strong>$(&quot;ul li:has(&#39;span&#39;)&quot;)</strong> --- <code>&lt;ul&gt;</code>의 <code>&lt;li&gt;</code>요소 중 span 태그를 포함하는 요소만 선택
<strong>$(&quot;ul li&quot;)fitter(&quot;.theObj&quot;)</strong> --- <code>&lt;ul&gt;</code>의 <code>&lt;li&gt;</code>요소 중 class=&#39;theObj&quot;인 요소만 선택
<strong>$(&quot;ul li&quot;).find(&quot;a&quot;)</strong> --- <code>&lt;ul&gt;</code>의 <code>&lt;li&gt;</code>요소가 포함되는 <code>&lt;a&gt;</code>요소만 선택
<strong>$(&quot;ul li:visible&quot;)</strong> --- <code>&lt;ul&gt;</code>의 <code>&lt;li&gt;</code>요소 중 보이는 요소만 선택
<strong>$(&quot;ul li:hidden&quot;)</strong> --- <code>&lt;ul&gt;</code>의 <code>&lt;li&gt;</code>요소 중 숨겨져 있는 요소만 선택
<strong>$(&quot;h1, h2&quot;)</strong> --- h1, h2 요소들만 선택
<strong>$(&quot;ul li&quot;).not(:emoty)</strong> --- <code>&lt;ul&gt;</code>의 <code>&lt;li&gt;</code>요소 중 내용을 가진 요소만 선택</p>
<h2 id="문서-객체-조작-메서드">문서 객체 조작 메서드</h2>
<p>문서 객체의 생성, 복제, 추가, 삭제 및 속성에 대한 변경, 삭제할 때 사용한다.</p>
<blockquote>
</blockquote>
<p><strong>$(&quot;선택 요소&quot;).html()</strong> --- 선택한 요소의 하위 요소들을 반환
<strong>$(&quot;선택 요소&quot;).html(&quot;새 요소&quot;)</strong> --- 선택한 요소의 하위 요소들을 새 요소들로 변경
<strong>$(&quot;선택 요소&quot;).text(&quot;새 텍스트&quot;)</strong> --- 선택한 요소의 텍스트를 새 텍스트로 변경
<strong>$(&quot;새 요소&quot;)</strong> --- 새 요소를 생성
<strong>$(&quot;선택 요소&quot;).append(&quot;새 요소&quot;)</strong> --- 선택 요소의 마지막 자식요소로 새 요소를 추가
<strong>$(&quot;선택 요소&quot;).prepend(&quot;새 요소&quot;)</strong> --- 선택 요소의 첫 자식 요소로 새 요소를 추가
<strong>$(&quot;새 요소&quot;).appendTo(&quot;요소 선택&quot;)</strong> --- 선택 요소의 마지막 자식 요소로 새 요소를 추가
<strong>$(&quot;새 요소&quot;).prependTo(&quot;요소 선택&quot;)</strong> --- 선택 요소의 첫 자식 요소로 새 요소를 추가
<strong>$(&quot;새 요소&quot;).insertBefore(요소 선택)</strong> --- 선택 요소 이전 위치에 형제요소로 새 요소를 추가
<strong>$(&quot;새 요소&quot;).insertAfter(요소 선택)</strong> --- 선택 요소 다음 위치에 형제요소로 새 요소를 추가
<strong>$(&quot;선택 요소&quot;).clone(true / false)</strong> --- 선택 요소를 복제 (true:하위요소 포함 복제)
<strong>$(&quot;선택 요소&quot;).remove()</strong> --- 선택 요소를 삭제
<strong>$(&quot;선택 요소&quot;).empty()</strong> --- 선택 요소의 하위 요소들 모두 삭제
<strong>$(&quot;선택 요소&quot;).attr(&quot;속성&quot;)</strong> --- 선택 요소의 특정 속성을 지정
<strong>$(&quot;선택 요소&quot;).attr(&quot;속성&quot;, &quot;값&quot;)</strong> --- 선택 요소의 지정한 속성을 새 값으로 변경
<strong>$(&quot;선택 요소&quot;).addClass(&quot;클래스명&quot;)</strong> --- 선택 요소에 새 클래스명을 부여
<strong>$(&quot;선택 요소&quot;).removeClass(&quot;클래스명&quot;)</strong> --- 선택 요소에 지정된 클래스명을 삭제
<strong>$(&quot;선택 요소&quot;).toggleClass(&quot;클래스명&quot;)</strong> --- 선택 요소에 클래스명이 없으면 추가, 있으면 삭제
<strong>$(&quot;선택 요소&quot;).hasClass(&quot;클래스명&quot;)</strong> --- 선택 요소에 클래스명이 있으면 true를 반환
<strong>$(&quot;선택 요소&quot;).wrap(&quot;<code>&lt;div&gt;&lt;/div&gt;</code>&quot;)</strong> --- 선택 요소를 <code>&lt;div&gt;</code>요소로 둘러 쌈
<strong>$(&quot;선택 요소&quot;).wrapAll(&quot;<code>&lt;div&gt;&lt;/div&gt;</code>&quot;)</strong> --- 선택 요소들 전체를 <code>&lt;div&gt;</code>요소가 한 번에 둘러 쌈</p>
<h1 id="이벤트event">이벤트(Event)</h1>
<p>앞서 자바스크립트 영역에서 설명한 바와 같이, 웹 브라우저 내에서 벌어지는 버튼 클릭이나 마우스의 움직임 등 모든 행위를 &#39;이벤트&#39;라고 한다. 그리고 이벤트가 발생했을 때 함수 또는 실행문이 수행되도록 해당 이벤트를 지정해두는 요소를 이벤트 핸들러라 하는데, 이벤트의 종류는 다음과 같다.</p>
<blockquote>
</blockquote>
<p><strong>click()</strong> --- 선택 요소를 클릭했을 때 발생
<strong>dblclick()</strong> --- 이벤트 대상에 더블클릭했을 때 발생
<strong>mouseover()</strong> --- 마우스를 이벤트 대상에 올려놓았을 때 발생
<strong>mouseout()</strong> --- 마우스가 이벤트 대상에서 벗어났을 때 발생
<strong>focus()</strong> --- 이벤트 대상에 포커스가 생겼을 대 발생
<strong>blur()</strong> --- 이벤트 대상에 포커스가 잃었을 때 발생
<strong>focusin()</strong> --- 이벤트 대상에 포함된 input 요소에 포커스가 있으면 발생
<strong>focusout()</strong> --- 이벤트 대상에 포함된 input 요소에 포커스를 잃었을 때 발생
<strong>keydown()</strong> --- 키를 눌렀을 때 발생
<strong>keypress()</strong> --- 키를 눌렀을 때 발생
<strong>mouseenter()</strong> --- 마우스가 선택 요소 내로 들어오면 발생
<strong>mouseleave()</strong> --- 마우스가 선택 요소 밖으로 나가면 발생
<strong>mousemove()</strong> --- 마우스가 움직일 때마다 발생
<strong>resize()</strong> --- 윈도우 창에 사이즈를 조절할 때마다 발생
<strong>submit()</strong> --- 양식(form)에서 전송 버튼을 누를 때 발생
<strong>reset()</strong> --- 양식(form)에서 취소 버튼을 누를 때 발생
<strong>toggle()</strong> --- 클릭할 때마다 순차적으로 함수를 번갈아가면서 실행
<strong>hover()</strong> --- 마우스 올렸을 때와 마우스가 벗어났을 때 각각의 함수를 실행
<strong>unload()</strong> --- 문서를 종료했을 때 실행
<strong>change()</strong> --- 값이 바뀌고, 포커스가 옮겨졌을 때 실행
<strong>bind()</strong> --- 여러 개의 이벤트를 적용 시 사용</p>
<p>이벤트 함수는 아래의 <strong>[기본형식]</strong> 과 같이 작성한다. 자바스크립트에서는 이벤트 핸들러에 &#39;on&#39;을 붙였지만 제이쿼리에서는 붙이지 않는다. <strong>단, 이때에도 제이쿼리 실행문을 잊으면 안된다!</strong></p>
<p><strong>[기본형식]</strong></p>
<pre><code class="language-javascript">$(&quot;선택 요소&quot;).click(function() {
  실행문;
});</code></pre>
<h1 id="효과effects">효과(Effects)</h1>
<p>효과 메서드를 사용하면, 선택 요소를 숨기거나 노출할 때 다양한 효과를 적용할 수 있으며, 이러한 효과들로 인해 보다 다이내믹하고 인터랙티브한 사이트의 제작이 가능하다. 효과 메서드에는 다음과 같은 종류가 있다.</p>
<blockquote>
</blockquote>
<p><strong>$(&quot;요소선택&quot;).hide()</strong> --- 선택 요소를 숨김
<strong>$(&quot;요소선택&quot;).show()</strong> --- 선택 요소를 노출
<strong>$(&quot;요소선택&quot;).toggle()</strong> --- 선택 요소가 보이면 숨기고, 숨겨져 있으면 노출
<strong>$(&quot;요소선택&quot;).slideUp()</strong> --- 선택 요소를 말아 올라가듯 숨김
<strong>$(&quot;요소선택&quot;).slideDown()</strong> --- 선택 요소를 말아 내리듯 노출
<strong>$(&quot;요소선택&quot;).slideToggle()</strong> --- 위의 slideUp/slideDown 효과를 번갈아 적용
<strong>$(&quot;요소선택&quot;).fadeOut()</strong> --- 선택 요소를 서서히 사라지게 함
<strong>$(&quot;요소선택&quot;).fadeIn()</strong> --- 선택 요소를 서서히 나타나게 함
<strong>$(&quot;요소선택&quot;).fadeToggle()</strong> --- 위의 fadeIn/fadeOut 효과를 번갈아 적용
<strong>$(&quot;요소선택&quot;).fadeTo()</strong> --- 선택 요소를 원하는 만큼 투명화시킴</p>
<p>효과 메서드에는 속도와 콜백함수를 입력하는데, 입력값에 따라 효과의 진행 속도가 달라진다. 속도는 slow, normal, fast 등의 문자형식이나 시간(milliseconds)을 표시하는  숫자형식을 사용할 수 있다. 콜백함수란, 효과의 진행이 끝난 뒤에 실행되는 함수이다.</p>
<p><strong>[기본형식]</strong></p>
<pre><code class="language-javascript">$(&quot;선택 요소&quot;).hide(&quot;속도&quot;, 콜백함수);</code></pre>
<p>※속도 : slow, normal, fast 또는 milliseconds(천분의 1초, &lt;예&gt; 1000 = 1초)
※콜백함수 : 메소드가 모두 완료된 후에 실행될 함수(생략 가능)</p>
<h1 id="애니메이션animation">애니메이션(Animation)</h1>
<p>선택 요소를 움직이거나 크기를 변형시킬 때에는 애니메이션 효과를 적용한다.</p>
<p>다음 <strong>[기본형식]</strong> 과 같이 반응 속도에 따라 애니메이션 진행 속도는 달라진다.  콜백함수는 애니메이션 효과의 진행이 끝난 후 실행되는 함수이며, 역시 생략할 수 있다.</p>
<p><strong>[기본형식]</strong></p>
<pre><code class="language-javascript">$(선택요소).animatee({애니메이션 속성}, 반응속도, 콜백함수);</code></pre>
<p>※반응속도 : slow, normal, fast 또는 millisecond(천분의 1초, &lt;예. 1000 = 1초0
※콜백함수 : 메소드가 모두 완료된 훙에 실행될 함수(생략 가능)</p>
<p>애니메이션의 구현을 위해서는 &#39;방향(top, left, bottom, right)&#39;이나 &#39;크기(width, height)&#39;, &#39;위치(position)&#39;에 대한 옵션이 필요하며 경우에  따라 투명도(opaacity)를 조정하기도 한다.</p>
<blockquote>
</blockquote>
<p><strong>Tip</strong>
<strong>버튼을 여러 번 클릭하면 요소가 혼자서 움직인다. 이런 현상을 어떻게 막을 수 있을까?</strong>
요소를 클릭한 수만큼의 &#39;실행 명령&#39;이 메모리의 대기열(queue, 큐)에 쌓여서 다시 버튼을 누르지 않아도 대기 중이던 효과들이 모두 진행되는 현상이다. 이를 막으려면 clearQueue 메서드로 큐를 비우거나 stop 메서드로 강제 종료해야 한다.
※clearQueue() : 큐에 쌓인 효과들을 삭제한다.
※stop() : 현재 진행 중인 효과를 정지시킨다.</p>
<h1 id="제이쿼리-모바일jquery-mobile">제이쿼리 모바일(jQuery Mobile)</h1>
<p>제이쿼리(jQuery)는 데스크탑 PC 환경의 웹 브라우저에 최적화된 기능을 제공한다. 그래서 최근 급성장하는 스마트폰이나 태블릿 등의 모바일 기기에서는 구현할 수 없는 기능들이 존재한다. 예를 들어, 우리가 앞에서 학습한 이벤트 중에는 스마트폰이나 태블릿에서의 기본적인 입력 방식인 &#39;스크린 터치&#39;와 관련된 이벤트가 없었다.</p>
<p>하지만 &#39;제이쿼리 모바일(jQuery Mobile)&#39;을 사용하면 스마트폰이나 태블릿 등 모바일 기기에 최적화된 췝 프레임워크를 제공받을 수 있다.</p>
<h2 id="제이쿼리-모바일-준비과정">제이쿼리 모바일 준비과정</h2>
<ul>
<li>우선 제이쿼리 모바일 홈페이지 <a href="www.jquerymobile.com">www.jquerymobile.com</a> 에 접속한다.</li>
<li>제이쿼리 라이브러리를 다운로드 했듯 이제 &#39;제이쿼리 모바일 라이브러리(library)&#39;를 설치해야 하는데, 이 또한 제이쿼리와 비슷하게 링크를 사용하여 라이브러리 파일을 연동하는 CDN 호스트 링크 방식과 직접 다운로드하여 연동하는 방식 등 2가지를 제공한다.</li>
<li>다음과 같이 <code>&lt;head&gt;</code>요소 안에 css와 js파일을 연동시키면 되는데, 주의할 점은 제이쿼리 라이브러리 연동이 제이쿼리 모바일에 대한 것보다 상위에 위치해야 한다는 것이다.<pre><code class="language-html">&lt;head&gt;
&lt;title&gt;Page Title&lt;/title&gt;
&lt;meta http-equiv=&quot;content-type&quot; content=&quot;text/html ; charset = utf-8&quot; /&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;../js/jquery-1.8.1.min.js&quot;&gt;&lt;/script&gt;
&lt;link rel=&quot;stylesheet&quot; href=&quot;http://code.jquery.com/mobile/1.1.1/jquery.mobile-1.1.1.min.css&quot; /&gt;
&lt;script src=&quot;http://code.jquery.com/mobile/1.1.1/jquery.mobile-1.1.1.min.js&quot;&gt;&lt;/script&gt;
&lt;/head&gt;</code></pre>
</li>
</ul>
<h2 id="제이쿼리-모바일-기본-구조">제이쿼리 모바일 기본 구조</h2>
<p>제이쿼리 모바일 기본 구조는 다음과 같이 <strong>각 영역에 data-role 속성으로 역할 표시</strong>를 한다. data-role값으로는 한 페이지의 전체 영역을 의미하는 &#39;page&#39;와 페이지 내부에서의 영역 구분을 위한 &#39;header&#39;, &#39;content&#39;, &#39;footer&#39; 등이 있으며, 모두 <code>&lt;div&gt;</code>로 둘러싸게 된다.</p>
<p><strong>[기본 구조]</strong></p>
<pre><code class="language-html">&lt;body&gt;
  &lt;div data-role=&quot;page&quot;&gt;
    &lt;div data-role=&quot;header&quot;&gt;
      &lt;h1&gt;메인 타이틀&lt;/h1&gt;
    &lt;/div&gt;
    &lt;!-- /header --&gt;

    &lt;div data-role=&quot;content&quot;&gt;
      &lt;p&gt;컨텐츠 내용 영역&lt;/p&gt;
    &lt;/div&gt;
    &lt;!-- /content --&gt;

    &lt;div data-role=&quot;footer&quot;&gt;
      &lt;h4&gt;푸터 영역&lt;/h4&gt;
    &lt;/div&gt;
    &lt;!-- /footer --&gt;
  &lt;/div&gt;
  &lt;!-- /page --&gt;
&lt;/body&gt;</code></pre>
<p>다음은 페이지를 2개로 나누어 작성한 예이다. 각각 &#39;mainPage&#39;와 &#39;subPage1&#39;라는 id를 부여한 <code>&lt;div&gt;</code>를 작성하고 &#39;data-role&#39;을 &#39;page&#39;로 작성함으로써 서로 다른 페이지가 된다.</p>
<pre><code class="language-html">&lt;!DOCTYPE html&gt; 
&lt;html&gt; 
&lt;head&gt; 
&lt;title&gt;jquery mobile&lt;/title&gt; 
 &lt;meta http-equiv=&quot;content-type&quot; content=&quot;text/html; charset=utf-8&quot; /&gt;
&lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1&quot;&gt;
&lt;style type=&quot;text/css&quot;&gt;
* { margin:0; padding:0; }
&lt;/style&gt; 
&lt;script type=&quot;text/javascript&quot; src=&quot;js/jquery-1.8.1.min.js&quot;&gt;&lt;/script&gt;
&lt;link rel=&quot;stylesheet&quot; href=&quot;http://code.jquery.com/mobile/1.1.1/jquery.mobile-1.1.1.min.css&quot; /&gt;
&lt;script src=&quot;http://code.jquery.com/mobile/1.1.1/jquery.mobile-1.1.1.min.js&quot;&gt;&lt;/script&gt;
&lt;/head&gt; 
&lt;body&gt; 
&lt;div data-role=&quot;page&quot; data-theme=&quot;b&quot; id=&quot;mainPage&quot;&gt;
    &lt;div data-role=&quot;header&quot;&gt;
        &lt;h1&gt;메인 타이틀&lt;/h1&gt;
    &lt;/div&gt;&lt;!-- /header --&gt;
    &lt;div data-role=&quot;content&quot;&gt;    
        &lt;p&gt;&lt;a href=&quot;#sub1&quot; data-transition=&quot;slidedown&quot;&gt;서브 페이지1&lt;/a&gt;&lt;/p&gt;        
    &lt;/div&gt;&lt;!-- /content --&gt;
    &lt;div data-role=&quot;footer&quot;&gt;
        &lt;h4&gt;풋터영역&lt;/h4&gt;
    &lt;/div&gt;&lt;!-- /footer --&gt;
&lt;/div&gt;&lt;!-- /page --&gt;

&lt;div data-role=&quot;page&quot; id=&quot;sub1&quot;  id=&quot;sub1&quot; data-add-back-btn=&quot;true&quot; data-theme=&quot;a&quot;&gt;
    &lt;div data-role=&quot;header&quot;&gt;
        &lt;h1&gt;sub1 타이틀&lt;/h1&gt;
    &lt;/div&gt;&lt;!-- /header --&gt;
    &lt;div data-role=&quot;content&quot;&gt;    
        &lt;p&gt;컨텐츠 내용 영역&lt;/p&gt;        
    &lt;/div&gt;&lt;!-- /content --&gt;
    &lt;div data-role=&quot;footer&quot;&gt;
        &lt;h4&gt;풋터영역&lt;/h4&gt;
    &lt;/div&gt;&lt;!-- /footer --&gt;
&lt;/div&gt;&lt;!-- /page --&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<p>이제, 첫 페이지의 컨텐츠 영역에 있는 &#39;서브페이지1&#39;이라는 링크를 터치하면 slidedown 효과가 자동으로 적용되어 다음 페이지가 위에서 미끄러지듯이 내려오고, 서브페이지가 열리면 상단에는 [뒤로 가기]버튼이 배치된다. 또한, <strong>&#39;data-theme&#39;</strong>은 디자인에 관련된 &#39;테마&#39; 기능으로, a~z까지 제공하므로 연습 시 활용해 볼 수 있다.</p>
<h2 id="제이쿼리-모바일-이벤트">제이쿼리 모바일 이벤트</h2>
<p>제이쿼리 모바일은 스마트폰, 태블릿 등 <strong>모바일 환경에 특화된 이벤트를 제공</strong>한다.</p>
<blockquote>
</blockquote>
<p><strong>tap</strong> --- 스크린에서 선택 요소를 터치할 때 발생
<strong>taphold</strong> --- 스크린에서 선택 요소를 오래 터치할 때 발생
<strong>swipe</strong> --- 스크린에서 선택 요소를 좌/우로 문지를 때 발생
<strong>swipeleft</strong> --- 스크린에서 선택 요소를 좌측으로 문지를 때 발생
<strong>swiperight</strong> --- 스크린에서 선택 요소를 우측으로 문지를 때 발생
<strong>orientation</strong> --- 모바일, 태블릿 기기의 방향을 전환할 때 발생
가로가 긴 방향인 경우 &#39;Landscape&#39; 반환 / 세로가 긴 방향인 경우 &#39;Potrait&#39; 반환
<strong>vmouseover</strong> --- 선택 요소를 터치하거나 마우스가 오버될 때 발생
<strong>vmouseout</strong> --- 선택 요소를 터치하거나 마우스가 아웃될 때 발생</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[문서 객체(Document Object Model)]]></title>
            <link>https://velog.io/@jay_kimjh/%EB%AC%B8%EC%84%9C-%EA%B0%9D%EC%B2%B4Document-Object-Model</link>
            <guid>https://velog.io/@jay_kimjh/%EB%AC%B8%EC%84%9C-%EA%B0%9D%EC%B2%B4Document-Object-Model</guid>
            <pubDate>Tue, 08 Feb 2022 08:43:17 GMT</pubDate>
            <description><![CDATA[<p>※ 본 포스팅은 책 『실전 프로젝트 반응형 웹 퍼블리싱』의 내용을 바탕으로 작성되었음</p>
<h1 id="문서-객체document-object-model">문서 객체(Document Object Model)</h1>
<p>DOM(Document Object Model)이란 &#39;문서 객체&#39;들을 일컫는다. 웹페이지의 구조는 <code>&lt;html&gt;</code>이 모든 태그들을 감싸고 있으며, 그 내부는 다시 각종 설정과 선언으로 이워진 <code>&lt;head&gt;</code>요소와 본문 내용이 모두 담긴 <code>&lt;body&gt;</code>요소로 나누어진다. 그리고 <code>&lt;body&gt;</code>요소로 나누어진다. 그리고 <code>&lt;body&gt;</code>요소 안에는 <code>&lt;div&gt;</code>,<code>&lt;p&gt;</code>,<code>&lt;ul&gt;</code>,<code>&lt;form&gt;</code>,<code>&lt;table&gt;</code> 등의 요소들이 배치된다.</p>
<h2 id="선택자">선택자</h2>
<p>특정 문서 요소(객체)에 스타일을 적용하거나 삭제하려면 그 문서 요소에 접근하는 방법을 알아야 한다. 요소 선택자에는 <strong>&#39;원거리 선택자&#39;</strong>와 <strong>&#39;근거리 선택자&#39;</strong>가 있다.</p>
<p>_요소에 포함되는 id 속성 또는 요소(태그)명 등을 이용하여 직접 접근_하는 방식을 <strong>원거리 선택자</strong>라고 하며, _선택된 요소를 기준으로 그 가까운 요소를 선택_하고 싶을 때에는 <strong>근거리 선택자</strong>를 이용한다.</p>
<p>일반적으로, 요소에 접근할 때에는 우선 원거리 선택자를 이용하여 접근한 후 근거리 선택자를 이용하여 그 관련 요소들을 선택한다.</p>
<p>다음 실습예제를 통하여 원거리 선택자와 근거리 선택자에 대해서 상세히 알아보자.</p>
<p><strong>예제1</strong></p>
<pre><code class="language-html">&lt;body&gt;
  &lt;div&gt;
    &lt;h1&gt;선택자&lt;/h1&gt;
    &lt;h2 id=&quot;title&quot;&gt;원거리 선택자&lt;/h2&gt;
    &lt;ul&gt;
      &lt;li&gt;getElementById&lt;/li&gt;
      &lt;li&gt;getElementsByTagName&lt;/li&gt;
    &lt;/ul&gt;
    &lt;h2 id=&quot;title2&quot;&gt;근거리 선택자&lt;/h2&gt;
    &lt;ul id=&quot;list&quot;&gt;
      &lt;li&gt;parentNode&lt;/li&gt;
      &lt;li&gt;childNodes&lt;/li&gt;
      &lt;li&gt;children&lt;/li&gt;
      &lt;li&gt;firstChild&lt;/li&gt;
      &lt;li&gt;previousSibling&lt;/li&gt;
      &lt;li&gt;nextSibling&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/div&gt;
 &lt;/body&gt;
&lt;/html&gt;</code></pre>
<h3 id="원거리-선택자">원거리 선택자</h3>
<p>크게 <strong>&#39;id 선택자(getElementById)&#39;</strong>와 <strong>&#39;요소명 선택자(getElementsByTagName)&#39;</strong>가 있다.</p>
<h4 id="id-선택">id 선택</h4>
<p>태그에 지정한 id 속성값을 이용하여 특정 요소에 접근할 수 있는 선택자이다.</p>
<blockquote>
</blockquote>
<p>**선택대상.getElementById(&quot;아이디명&quot;);</p>
<p>그럼, <strong>예제1</strong>에서 연습한 HTML 중 &#39;title&#39;이라는 id의 <code>&lt;h2&gt;</code>요소에 접근한 후 다음과 같이 스타일을 적용하여 그 내부 텍스트의 폰트 색상을 바꿔 보도록 하자.</p>
<pre><code class="language-javascript">var myObj = **document.getElementById(&quot;title&quot;);        //아이디를 이용하여 요소 선택
myObj.style.color = &quot;#f00&quot;;                            //폰트 색상 스타일 적용</code></pre>
<p>단, 7과 &#39;이벤트&#39;에서 언급했듯 자바스크립트는 늘 <code>&lt;body&gt;</code>보다 앞서는 <code>&lt;head&gt;</code> 영역에 정의되어 문서 요소들을 불러오기 전에 실행되므로, <code>&lt;body&gt;</code> 내 요소들에 대한 선택자를 사용할 때에는 반드시 &#39;전체 문서를 로딩 후 실행&#39;하라는 이벤트 조건을 등록해야 한다.</p>
<pre><code class="language-javascript">function loadFnc() {
  var myObj = **document.getElementById(&quot;title&quot;);        //id를 이용하여 요소 선택
  myObj.style.color = &quot;#f00&quot;;
}
if(window.addEventListener){
  window.addEventListener(&quot;load&quot;, loadFnc, false);        //표준 방식 브라우저
}else id(window.attachEvent){
  window.addEventListener(&quot;onload&quot;,loadFnc);            //IE8 이하 버전
}</code></pre>
<h4 id="요소태그명-선택자">요소(태그)명 선택자</h4>
<p>요소(태그)명을 이용해서 접근할 수 있는 선택자인데, 이때 같은 이름의 태그들이 여럿 존재하면 이들이 모두 &#39;배열&#39;로 저장된다. 따라서 getElements와 같이 &#39;s&#39;가 붙는다.</p>
<blockquote>
</blockquote>
<p><strong>선택대상.getElementsByTagName(&quot;태그명&quot;);</strong></p>
<p>우선 <strong>예제1</strong>의 HTML 중 첫 번째 <code>&lt;ul&gt;</code>요소에 접근한 후, 그 하위 요소 중 두 번째 <code>&lt;li&gt;</code> 요소에 border(경계선)를 생성해 보자.</p>
<pre><code class="language-javascript">var myList = **document.getElementsByTagName(&quot;ul&quot;);** --- 1. ul 요소들 선택
var myObj = **myLest[0].getElementsByTagName(&quot;li&quot;)[1];** --- 2. ul &gt; li 요소들 선택</code></pre>
<p>myObj.style.border = &quot;solid 1px #f00&quot;; --- 3. 선 스타일 적용</p>
<ul>
<li><p><strong>myList = document.getElementsByTagName(&quot;ul&quot;);</strong></p>
</li>
<li><p><em>예제1*</em>의 HTML을 보면 <code>&lt;ul&gt;</code>요소가 모두 2개가 존재한다. 따라서 myList라는 변수는 자동으로 배열 객체가 되며 다음과 같이 <code>&lt;ul&gt;</code>요소 2개가 차례로 저장된다.</p>
<blockquote>
</blockquote>
</li>
<li><p><em>myList*</em> = 0 : <code>&lt;ul&gt;</code> / 1 : <code>&lt;ul&gt;</code></p>
</li>
<li><p><strong>var myObj = myList[0].getElementsByTagName(&quot;li&quot;)[1];</strong>
MyList에는 <code>&lt;ul&gt;</code>요소 객체 2개가 저장되어 있다. 여기서 0번 인덱스(첫번째)의 <code>&lt;ul&gt;</code>요소를 &#39;선택대상&#39;으로 삼은 후, 그 하위에 있는 <code>&lt;li&gt;</code>요소들 중 1번 인덱스(두번째)를 선택했다. 그렇게 선택된 <code>&lt;li&gt;</code>요소를 myObj라는 이름으로 저장한 것이다.</p>
</li>
<li><p><strong>myObj.style.border = &quot;solid 1px #f00&quot;;</strong>
지정된 <code>&lt;li&gt;</code>요소에 1px 두께와 빨간색(#f00) 선(border)을 실선(solid)으로 생성한다.</p>
</li>
</ul>
<p>그럼, 한 번만 더 해보자</p>
<p>이번에는 두 번째 <code>&lt;ul&gt;</code>요소의 하위 요소 중 네 번째 <code>&lt;li&gt;</code>요소 안에 포함된 &#39;firstChild&#39;라는 텍스트의 색을 파란색으로 바꿔보자.</p>
<p>바로 앞에서와 같이 &#39;요소명 선택자&#39;를 활용해 배열로 저장하고 인덱스 번호를 통해 다시 한 번 골라내는 식으로도 가능하지만, 잘 살펴보면 우리가 접근해야 할 두 번째 <code>&lt;ul&gt;</code>요소에는 미리 &#39;list&#39;라는 id를 부여해뒀다.</p>
<p>즉, 먼저 &#39;id명 선택자(getElementById)&#39;로 &#39;list&#39;라는 id의 <code>&lt;ul&gt;</code>요소를 변수로 저장(예:listZone)한 후, 비로소 그 아래의 <code>&lt;li&gt;</code>요소들을 &#39;요소명 선택자(getElementsByTagName)&#39;를 활용하여 배역 객체(예:listObj)로 저장한다.</p>
<p>그럼 다음과 같은 배열 객체가 되는데, 이 중 &#39;firstChild&#39;라는 텍스트를 지닌 <code>&lt;li&gt;</code> 요소는 네 번째 <code>&lt;li&gt;</code>이므로 아래에서와 같이 인덱스 3번([3])을 선택하면 되겠다.</p>
<blockquote>
</blockquote>
<p><strong>listObj</strong> = 0 : <code>&lt;li&gt;</code> / 1 : <code>&lt;li&gt;</code> / 2 : <code>&lt;li&gt;</code> / 3 : <code>&lt;li&gt;</code> / 4 : <code>&lt;li&gt;</code> / 5 : <code>&lt;li&gt;</code></p>
<p>그리고 마지막으로 스타일을 적용하면 된다. 이 모든 과정을 적용한 스크립트는 다음과 같이 작성하면 되겠다.</p>
<pre><code class="language-javascript">var listZone = **document.getElementById(&quot;list&quot;);** --- 1. id가 &#39;list&#39;인 요소 선택
var listObj = **listZone.getElementsByTagName(&quot;li&quot;)[3];** --- 2. `&lt;li&gt;`중 인덱스 3번 선택
listObj.style.color = &quot;blue&quot;; --- 3. 선택 요소에 글자색 적용</code></pre>
<h3 id="근거리-선택자">근거리 선택자</h3>
<p><strong>특정 요소를 기준으로 상대적인 다른 요소를 선택</strong>할 때 사용하며, 다음과 같다.</p>
<blockquote>
</blockquote>
<p><strong>parentNode</strong> --- 선택된 요소 기준으로 부모 요소를 선택할 때 사용
<strong>childNodes</strong> --- 선택된 요소 기준으로 자식 요소를 선택할 때 사용
<strong>children</strong> --- 선택된 요소 기준으로 자식 요소를 선택할 때 사용
<strong>firstChild</strong> --- 선택된 요소 기준으로 첫 번째 자식 요소를 선택할 때 사용
<strong>lastChild</strong> --- 선택된 요소 기준으로 마지막 자식 요소를 선택할 때 사용
<strong>previousSibling</strong> --- 선택된 요소 기준으로 형제 요소 중 이전 요소를 선택할 때 사용
<strong>nextSibling</strong> --- 선택된 요소 기준으로 형제 요소 중 ㄷ다음 요소를 선택할 때 사용
<strong>tagName (속성)</strong> --- 선택된 요소의 태그명을 반환(요소 노드의 속성)
<strong>nodeValue (속성)</strong> --- 선택된 요소의 텍스트를 반환(텍스트 노드의 속성)</p>
<h4 id="parentnode부모-요소-선택자">parentNode(부모 요소 선택자)</h4>
<p>id가 &#39;list&#39;인 <code>&lt;ul&gt;</code>요소를 시준으로  그 상위의 <code>&lt;div&gt;</code> 요소에 &#39;근거리 선택자&#39;를 통해 접근하려면 parentNode(부모 요소)를 사용할 수 있다.</p>
<pre><code class="language-javascript">document.getElementById(&quot;list&quot;).parentNode; → `&lt;div&gt;`요소</code></pre>
<p><strong>그럼, <code>&lt;ul&gt;</code>의 입장에서는 전체를 감싸는 <code>&lt;body&gt;</code>도 부모가 아닐까?</strong>
그렇지 않다. 부모 요소는 오로지 &#39;바로 상위&#39;의 한 개만 존재한다. 따라서 <code>&lt;ul&gt;</code>에게는 오로지 <code>&lt;div&gt;</code>만 부모가 될 수 있다.</p>
<h4 id="childnodes자식-요소-선택자">childNodes(자식 요소 선택자)</h4>
<p>역시 id가 &#39;list&#39;인 <code>&lt;ul&gt;</code>요소를 기준으로 그 하위의 <code>&lt;li&gt;</code>들을 &#39;근거리 선택자&#39;로 접근하려면 &#39;childNodes 또는 children&#39;을 사용한다. 먼저 childNodes의 사용법은 다음과 같다.</p>
<pre><code class="language-javascript">childObj = document.getElementById(&quot;list&quot;).chiildNodes; → `&lt;li&gt;`요소 6개(배열)</code></pre>
<p>이때, 표준 방식 브라우저에서는 인덱스 0,2,4,6,8,10,12번 저장소에 공백 문자가 저장되지만,</p>
<blockquote>
</blockquote>
<p><strong>childObj</strong> = 0:&quot; &quot; / 1:<code>&lt;li&gt;</code> / 2:&quot; &quot; / 3:<code>&lt;li&gt;</code> / 4:&quot; &quot; / 5:<code>&lt;li&gt;</code> / 6:&quot; &quot; / 7:<code>&lt;li&gt;</code> / 8:&quot; &quot; / 9:<code>&lt;li&gt;</code> / 10:&quot; &quot; / 11:<code>&lt;li&gt;</code> / 12: &quot; &quot;</p>
<p>비표준 방식 브라우저(IE8 이하 버전)에서는 다음과 같이 공백을 무시한다.</p>
<blockquote>
</blockquote>
<p><strong>childObj</strong> = 0:<code>&lt;li&gt;</code> / 1:<code>&lt;li&gt;</code> / 2:<code>&lt;li&gt;</code> / 3:<code>&lt;li&gt;</code> / 4:<code>&lt;li&gt;</code> / 5:<code>&lt;li&gt;</code></p>
<p><strong>위와 같이 서로 다르게 저장되는 이유는 무엇일까?</strong>
선택자가 호환되지 않아서인데, 먼저 다음의 HTML 코드를 보도록 하자.</p>
<pre><code class="language-html">&lt;ul id=&quot;list&quot;&gt; (Enter)
  &lt;li&gt;parentNode&lt;/li&gt; (Enter)
  &lt;li&gt;childNodes&lt;/li&gt; (Enter)
  &lt;li&gt;children&lt;/li&gt; (Enter)
  &lt;li&gt;firstChild&lt;/li&gt; (Enter)
  &lt;li&gt;previousSibling&lt;/li&gt; (Enter)
  &lt;li&gt;nextSibling&lt;/li&gt; (Enter)
&lt;/ul&gt;</code></pre>
<p>태그를 작성할 때에는 기본적으로 줄바꿈을 하게 되는데, 이런 상태에서 childNodes를 사용하면 표준 방식의 브라우저는 저 줄바꿈 하나를 모두 &#39;공백 문자&#39;로 인식하여 자식 요소로 가져오는데, IE8 이하 버전에서는 줄바꿈을 무시하게 되어 있는 것이다.</p>
<p>그럼 표준 브라우저에서의 호환을 위해 태그를 모두 붙여서 써야 할까? 그럼 코드의 가독성이 떨어질 것이다. 이런 문제로 childNodes 대신 children이 존재하는 것이다.</p>
<h4 id="children자식-요소-선택자">children(자식 요소 선택자)</h4>
<p>그럼 이번에는 childNodes와 같은 자식 요소 선택자, children의 사용법을 보도록 하자.</p>
<pre><code class="language-javascript">childObj = document.getElementById(&quot;list&quot;).children;</code></pre>
<p>children은 childNodes와 달리 줄바꿈을 무시하고 다음과 같이 요소 노드만 선택한다.</p>
<blockquote>
</blockquote>
<p><strong>childObj</strong> = 0:<code>&lt;li&gt;</code> / 1:<code>&lt;li&gt;</code> / 2:<code>&lt;li&gt;</code> / 3:<code>&lt;li&gt;</code> / 4:<code>&lt;li&gt;</code> / 5:<code>&lt;li&gt;</code></p>
<p>이때 childObj 배열 변수에 저장된 요소명을 출력해보자</p>
<pre><code class="language-javascript">for(var i = 0; i &lt; childObj.length; i++){
  document.write(childObj[i].tagName + &quot;&lt;br /&gt;&quot;);
}</code></pre>
<blockquote>
</blockquote>
<p><strong>출력값</strong>
Li
Li
Li
Li
Li</p>
<p>이렇게, 호환성을 위해 자식 요소들을 선택해야 할 때에는 chidren을 권장한다.</p>
<h4 id="firstchild첫-번째-자식-요소-선택자">firstChild(첫 번째 자식 요소 선택자)</h4>
<p>childNodes나 children과 같이 자식 요소 모두를 배열로 선택하는 것이 아니라, 여러 자식 요소 중 첫 번째만 &#39;근거리 선택자&#39;로 접근할 때에는 firstChild 선택자를 이용한다.</p>
<pre><code>document.getElementById(&quot;list&quot;).firstChild;</code></pre><p>이때에도 역시 표준 방식 브라우저에서는 HTML 태그 내의 줄바꿈을 공백 문자(텍스트)로 인식하여 첫 번째 자식 요소로서 가져온다. 그러나 IE8 이하 버전에서는 줄바꿈을 무시한 채 정상적인 첫 번째 <code>&lt;li&gt;</code> 요소를 가져오게 된다.</p>
<p><strong>그럼 호환이 되지 않는 firstChild에 대한 해결 방법은 없을까?</strong>
결국, children을 이용해 0번 인덱스 요소를 가져와야 한다.</p>
<pre><code class="language-javascript">document.getElementById(&quot;list&quot;).children[0];</code></pre>
<h4 id="lastchild마지막-자식-요소-선택자">lastChild(마지막 자식 요소 선택자)</h4>
<p>앞서 firstChild와 반대로 마지막 자식 요소만 선택할 때에는 lastChild 선택자를 사용한다.</p>
<pre><code class="language-javascript">document.getElementById(&quot;list&quot;).lastChild;</code></pre>
<p>하지만, lastChild 역시 표준 방식 브라우저에서의 호환성 문제가 생긴다. 따라서 이때에도 역시 children을 사용해 자식 요소들을 배열로 가져온 후, 그 마지막 인덱스 번호를 통해 마지막 자식 요소를 가져와야 하겠다. 자식 요소가 모두 몇개인지 잘 모를 경우, 먼저 해당 배열 변수의 마지막 인덱스 번호를 구한(length-1 메서드) 후 활용하면 된다.</p>
<pre><code class="language-javascript">var lastNum = document.getElementById(&quot;list&quot;).children.length-1; // 요소갯수-1
document.getElementById(&quot;list&quot;).children[lastNum];</code></pre>
<h4 id="prevsibling이전-형제-요소-선택자">prevSibling(이전 형제 요소 선택자)</h4>
<p>대상 요소와 같은 등금에 해당하는 요소들(형제 요소들) 중, 대상 요소의 바로 앞 요소를 선택할 때 prevSibling 선택자를 사용한다. 여기서는 <strong>예제1</strong>의 HTML 요소 중 id값이 &#39;title&#39;인 <code>&lt;h2&gt;</code>요소를 기준으로, 바로 앞의 형제 요소를 선택해 보겠다.</p>
<pre><code class="language-javascript">var prev = document.getElementById(&quot;title&quot;).previousSibling;</code></pre>
<p>그런데 이 prevSibling 선택자 역시 브라우저의 종류에 따라 결과가 다르다. 이유는 앞에서와 마찬가지로, 태그 사용 시의 줄바꿈을 &#39;공백&#39;이라는 하나의 &#39;문자(텍스트)&#39;로서 인식하는 표준 방식 브라우저들의 처리 방식 때문이다.</p>
<p>이런 이유로 자식 요소를 구해오는 childNodes를 비롯해 firstChild와 lastChild까지, 모두 호환성 문제의 해결을 위해 children을 활용하여 문제를 해결해봤지만, &#39;형제&#39; 요소에 대해서는 children 조차 해답이 될 수 없다.</p>
<p>따라서, 이제는 보다 _원론적인 해결책_인 <strong>&#39;노드 타입&#39;의 활용법</strong>에 대해 알아보자.</p>
<p><strong>노드 타입(node Type)</strong></p>
<p>어떤 노드가 &#39;요소(객체)&#39;와 &#39;속성&#39;, 혹은 &#39;텍스트&#39; 중 어떤 종류인지 나누는 기준을 &#39;노드 타입&#39;ㅇ라고 한다. 각 노드 타입은 그 종류에 따라 다음과 같이 다른 값을 지닌다.</p>
<blockquote>
</blockquote>
<p><strong>요소 노드</strong> --- 1
<strong>속성 노드</strong> --- 2
<strong>텍스트 노드</strong> --- 3</p>
<p>바로 앞 &#39;prevSibling&#39; 선택자에서 예로 든 변수 &#39;prev&#39;를 다음과 같이 출력해 보면, 표준 브라우저에서는 &#39;공백 문자&#39;로 저장되어 노드 타입 값이 &#39;3&#39;으로 출력된다. 반면, 비표준브라우저(IE)에서는 <code>&lt;h1&gt;</code>요소(객체)가 저장되어 그에 맞게 &#39;1&#39;이 출력되겠다.</p>
<pre><code class="language-javascript">var prev = document.getElementById(&quot;title&quot;).previousSibling;
document.write(prev.nodeType);                // 출력값 : 표준 = 3, 비표준 = 1</code></pre>
<p>이 &#39;노드 타입&#39;을 활용하여, 그 값이 &#39;요소(객체)&#39;에 해당하는 &#39;1&#39;이 될 때까지 prevSibling(이전 형제 요소 선택자)이나 다음에 학습할 nextSibling(다음 형제 요소 선택자)을 반복 실행하도록 하면 원하는 요소를 선택할 수 있을 것이다.</p>
<pre><code class="language-javascript">var prev = document.getElementById(&quot;titlt&quot;).prevSibling;        // 1. prevSibling 선택자
while(prev.nodeType != 1){                                        // 2. &#39;요소&#39;가 아니면 반복
  prev = prev.previousSibling;</code></pre>
<p>표준 브라우저에서는 prev 변수에 공백 문자가 저장될 것이므로(노트 타입 3) while문 조건을 만족하여 반복문을 실행하게 된다. 이때 실행문은 다시 prevSibling 선택자를 적용시키고, 그 결과 <code>&lt;h1&gt;</code>요소 노드가 선택되어 prev에 저장된다. 그 후에 다시 while 문으로 조건을 검사하면 노드 타입이 &#39;1&#39;로 인식되어 반복을 마치게 되는 것이다.</p>
<h4 id="nextsiblibng다음-형제-요소-선택자">nextSiblibng(다음 형제 요소 선택자)</h4>
<p>특정 요소를 기준으로 그 형제 요소들 중 바로 다음 요소를 선택하려면 nextSibling 선택자를 사용한다. 기본적인 사용법은 앞에서 학습한 &#39;prevSibling&#39;의 경우와 같다.</p>
<pre><code class="language-javascript">var next = document.getElementById(&quot;title&quot;).nextSibling;</code></pre>
<p>이 또한 호환성 문제를 지니므로, 역시 &#39;노드 타입&#39;을 활용한 반복문으로 해결한다.</p>
<pre><code class="language-java">var next = document.getElementById(&quot;title&quot;).nextSiblibng;        // 1. nextSibling 선택자
while(next.nodeType != 1){
  prev = prev.nexSibling;
}</code></pre>
<h3 id="문서-객체-조작">문서 객체 조작</h3>
<p>지금까지 문서 내의 요소를 선택하는 방법을 연습했다면, <strong>이제는 문서에 새로운 요소를 직접 생성</strong>하여 <strong>추가, 삭제, 복제</strong>하는 방법에 대해 알아보자.</p>
<h4 id="문서-객체-조작에-관련된-메서드">문서 객체 조작에 관련된 메서드</h4>
<blockquote>
</blockquote>
<h4 id="생성">생성</h4>
<ul>
<li><strong>creatElement(&quot;요소명&quot;)</strong> - 새 요소의 생성</li>
<li><strong>appendTextNode / createTextNode(&quot;텍스트&quot;)</strong> - 새 텍스트의 생성</li>
</ul>
<hr>
<h4 id="추가">추가</h4>
<ul>
<li><strong>선택 요소1.appendChild(새 요소, 선택 요소2)</strong> - &#39;선택 요소1&#39;에 새로운 자식 요소를 추가</li>
<li><strong>선택 요소1.insertBefore(새 요소, 선택 요소2)</strong> - &#39;선택 요소1&#39;의 자식인 &#39;선택 요소2&#39; 앞에 새로운 자식 요소를 추가</li>
</ul>
<hr>
<h4 id="교체">교체</h4>
<ul>
<li><strong>선택 요소1.replaceChild(새 요소, 선택 요소2)</strong> - &#39;선택 요소1&#39;의 자식인 &#39;선택 요소2&#39;를 새 요소로 덮어씌움</li>
</ul>
<hr>
<h4 id="삭제">삭제</h4>
<ul>
<li><strong>선택 요소1.removeChild(선택 요소2)</strong> - &#39;선택 요소1&#39;의 자식인 &#39;선택 요소2&#39;를 삭제</li>
</ul>
<hr>
<h4 id="복제">복제</h4>
<ul>
<li><strong>선택 요소.cloneNode(true or false)</strong> - &#39;선택 요소&#39;를 복제하여 true인 경우에는 하위 요소까지 모두 복제</li>
</ul>
<hr>
<h4 id="속성부여">속성부여</h4>
<ul>
<li><strong>선택 요소.setAttribute(&quot;속성&quot;, &quot;값&quot;)</strong> - &#39;선택 요소&#39;에 해당 속성값 부여</li>
</ul>
<h4 id="문서-요소의-생성-순서">문서 요소의 생성 순서</h4>
<blockquote>
</blockquote>
<ul>
<li><strong>문서에 필요한 요소들에 대해 알아본다.</strong>
<code>&lt;ul&gt;</code>요소 1개와 그 하위의 <code>&lt;li&gt;</code>요소 2개, 텍스트 2개가 필요하다고 가정하자.<pre><code class="language-html">&lt;ul&gt;
&lt;li&gt;리스트1&lt;/li&gt;
&lt;li&gt;리스트2&lt;/li&gt;
&lt;/ul&gt;</code></pre>
</li>
<li><strong>필요한 객체들을 생성한다.</strong>
creatElement 메서드를 사용하여 새 요소를 생성한다. 그리고 creatTextNode 혹은 appendTextNode 메서드를 사용하여 텍스트 객체를 생성한다.</li>
<li><strong>생성된 객체를 구조화한다.</strong>
<code>&lt;li&gt;</code>요소에 텍스트를 자식 요소로 추가하고, <code>&lt;li&gt;</code>요소들을 <code>&lt;ul&gt;</code>요소에 자식 요소로 편입시킨다.</li>
<li><strong>문서의 <code>&lt;body&gt;</code>요소 내에 완성된 <code>&lt;ul&gt;</code>요소를 추가한다.</strong></li>
</ul>
<p>그럼, 다음의 두 코드를 보며 생략되었던 버튼을 생성해보자.</p>
<pre><code class="language-html">&lt;body&gt;
  &lt;div id=&quot;theBox&quot;&gt;
    &lt;h1&gt;요소 생성 연습&lt;/h1&gt;.
  &lt;/div&gt;
&lt;/body&gt;</code></pre>
<pre><code class="language-html">&lt;p&gt;
  &lt;button id=&quot;btn1&quot;&gt;버튼1&lt;/button&gt;
  &lt;button id=&quot;btn2&quot;&gt;버튼2&lt;/button&gt;
&lt;/p&gt;</code></pre>
<p>다음 실습을 통해 문서 객체를 생성하고 구조화하여 HTML에 추가하여 보겠다.</p>
<pre><code class="language-javascript">&lt;script type=&quot;text/javascript&quot;&gt;
  //&lt;![CDATA[
    window.onload = function() {

        // 요소 객체 생성
      var newPtag = document.createElement(&quot;p&quot;);
      var newButton1 = document.createElement(&quot;button&quot;);
      var newButton2= document.createElement(&quot;button&quot;);
      var text1 = document.createTextNode(&quot;버튼1&quot;);
      var text2 = document.createTextNode(&quot;버튼2&quot;);

      // 속성 생성
      newButton1.setAttribute(&quot;id&quot;, &quot;btn1&quot;);
      newButton2.setAttribute(&quot;id&quot;, &quot;btn2&quot;);

      // 문서 객체 구조화
      newButton1.appendChild(text1);
      newButton2.appendChild(text2);
      newPtag.appendChild(newButton1);
      newPtag.appendChild(newButton2);

      // 선택 요소에 새 요소 추가
      var theObj = document.getElementById(&quot;theBox&quot;);
      theObj.appendChild(newPtag);
    }
  //]]&gt;
&lt;/script&gt;</code></pre>
<p>그럼 이번에는, 실습을 통해 insertBefore, removeChild, cloneNode에 대해 알아보자.</p>
<pre><code class="language-html">&lt;body&gt;
  &lt;h1&gt;문서 객체 조작&lt;/h1&gt;
  &lt;ul id=&quot;thelist&quot;&gt;
    &lt;li&gt;리스트2&lt;/li&gt;
    &lt;li&gt;리스트3&lt;/li&gt;
    &lt;li&gt;리스트4&lt;/li&gt;
    &lt;li&gt;리스트1&lt;/li&gt;
  &lt;/ul&gt;
&lt;/body&gt;</code></pre>
<p>우선 위 HTML 중 <code>&lt;li&gt;리스트&lt;/li&gt;</code>을 복제 후 삭제한다. 그리고 복제한 요소를 <code>&lt;li&gt;리스트2&lt;/li&gt;</code> 이전으로 추가해야 보기 좋겠다.</p>
<pre><code class="language-javascript">&lt;script type=&quot;text/javascript&quot;&gt;
  //&lt;![CDATA[
    window.onload = function(){
        var theList = document.getElementById(&quot;theList&quot;);
        var listAll = theList.getElementByTagName(&quot;li&quot;);

        // 1. &lt;li&gt;리스트1&lt;/li&gt;을 복제한다.
        var copyList = listAll[3].cloneNode(true);

        // 3. 복제된 &lt;li&gt;리스트1&lt;/li&gt;를 &#39;리스트2&#39; 앞으로 삽입한다.
        theList.insertBefore(copyList, listAll[0]);
    }
  //]]&gt;
&lt;/script&gt;
    // 2. 기존의 &lt;li&gt;리스트1&lt;/li&gt;을 삭제한다.
    theList.removeChild(listAll[3]);</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[Javascript_브라우저 객체(Browser Object Model)]]></title>
            <link>https://velog.io/@jay_kimjh/Javascript%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80-%EA%B0%9D%EC%B2%B4Browser-Obhect-Model</link>
            <guid>https://velog.io/@jay_kimjh/Javascript%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80-%EA%B0%9D%EC%B2%B4Browser-Obhect-Model</guid>
            <pubDate>Mon, 07 Feb 2022 08:28:01 GMT</pubDate>
            <description><![CDATA[<p>※ 본 포스팅은 책 『실전 프로젝트 반응형 웹 퍼블리싱』의 내용을 바탕으로 작성되었음</p>
<h1 id="브라우저-객체browser-object-model">브라우저 객체(Browser Object Model)</h1>
<p><strong>BOM(브라우저 객체 모델)이란 **브라우저 창에 포함된 모든 객체 요소들</strong>을 의미한다. 브라우저에는 URL 주소에 대한 정보를 제공하는 &#39;location&#39; 객체, 현재 실행 둥인 브라우저에 대한 정보(브라우저명, 코드명 등)를 제공하는 &#39;navigator&#39; 객체, 브라우저의 방문 기록에 대한 정보를 제공하는 &#39;history&#39; 객체 등이 있따.</p>
<p>단, 브라우저라는 것도 결국 창(윈도우) 안에서 실행되는 프로그램이므로, 위의 모든 개별 객체들은 <strong>최상위 객체인 window(창) 아래에 존재</strong>한다. 그럼 이번 과에서는 각 브라우저 객체 별 역할과 기능(메서드), 속성에 대해 살펴보자.</p>
<p><strong>브라우저 객체의 종류</strong></p>
<blockquote>
</blockquote>
<p><strong>window</strong></p>
<ul>
<li><strong>document</strong> --- 문서 객체이며, 하위에 form, cookie, images 등이 존재</li>
<li><strong>navigator</strong> --- 브라우저에 대한 정보를 제공하는 객체</li>
<li><strong>location</strong> --- 위치(url)관련 정보를 제공하는 객체</li>
<li><strong>scrreen</strong> --- 스크린(모니터)에 대한 정보를 제공하는 객체</li>
<li><strong>history</strong> --- 인터넷 방문 기록에 대한 정보를 제공하는 객체</li>
</ul>
<h2 id="window">window</h2>
<p><strong>모든 객체의 최상위 객체</strong>이며, 새 창을 생성하는 역할 등을 한다. 다음은 window 객체의 메서드들이다.</p>
<blockquote>
</blockquote>
<p><strong>open(&quot;경로&quot;, &quot;창이름&quot;, _<span style="color : red;">&quot;※옵션&quot;</span>_)</strong> --- 새 창으로 문서를 열 때 사용
<strong>alert(&quot;문자&quot;)</strong> --- 경고창을 열 때 사용
<strong>prompt(&quot;질문&quot;, &quot;기본응답&quot;)</strong> --- 질문/응답창을 열 때 사용
<strong>confirm(&quot;질문&quot;)</strong> --- 확인/취소창을 열 때 사용
<strong>setTimeout(실행문, 간격시간)</strong> --- 해당 간격시간 뒤에 실행문을 한 번만 수행
<strong>setinterval(실행문, 간격시간)</strong> --- 해당 간격으로 실행문을 반복적으로 수행
=&gt; window 객체 생략 가능</p>
<blockquote>
</blockquote>
<p><span style="color : red;"><strong>※ open 메서드의 옵션종류</strong></span>
<strong>width</strong> --- 새 창의 너비 (px, 픽셀 단위)
<strong>height</strong> --- 새 창의 높이 (px, 픽셀 단위)
<strong>left</strong> --- 새 창을 열 때 스크린 기준 좌측 위치 (px, 픽셀 단위)
<strong>top</strong> --- 새 창을 열 때 스크린 기준 상단 위치 (px, 픽셀 단위)
<strong>scrollbars</strong> --- 스크롤바의 생성 여부 (값은 yes or no)
<strong>menubar</strong> --- 메뉴 바의 노출 여부 (값은 yes or no)
<strong>toolbar</strong> --- 도구상자의 노출 여부 (값은 yes or no)
<strong>location</strong> --- 주소표시줄의 노출 여부 (값은 yes or no)
<strong>status</strong> --- 상태표시줄의 노출 여부 (값은 yes or no)
<strong>resizeable</strong> --- 창의 사이즈 조정 가능 여부 (값은 yes or no)</p>
<p>다음은 window객체의 open 메서드를 활용한 팝업창 띄우기이다.</p>
<pre><code class="language-html">&lt;body&gt;
  &lt;p&gt;&lt;img src=&quot;images/popup.jpg&quot; alt=&quot;이달에 새로 나온 책&quot; usemap=&quot;#pop&quot; /&gt;&lt;/p&gt;
  &lt;map name=&quot;pop&quot; id=&quot;pop&quot;&gt;
    &lt;srea shape=&quot;rect&quot; coords=&quot;228, 371, 294, 399&quot; href=&quot;#&quot; onclick=&quot;window.close();&quot; alt=&quot;창 닫기&quot; /&gt;
  &lt;/map&gt;
&lt;/body&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
  //&lt;!CDATA[
    window.open(&quot;popup1.html&#39;, &quot;naver&quot;, &quot;width=300px, height=400px, left=200px, top=20px, scrollbars=no, toolbar=no, location=&quot;no&quot;);
  //]]&gt;
&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
  &lt;h1&gt;opener페잊지&lt;/h1&gt;
&lt;/body&gt;</code></pre>
<p>위 실습 예제는 본 페이지(오프너)와 팝업으로 열릴 &#39;popup1.html&#39; 페이지의 내용이다.</p>
<h2 id="navigator">navigator</h2>
<p>navigator는 <strong>브라우저에 대한 정보를 제공</strong>하는 객체이며, 다음과 같은 속성들이 존재한다.</p>
<blockquote>
</blockquote>
<p><strong>appCodeName</strong> --- 브라우저의 코드명을 제공
<strong>appName</strong> --- 브라우저의 이름을 제공
<strong>appVersion</strong> --- 브라우저의 기본 버전과 실행 중인 플랫폼 정보를 제공
<strong>userAgent</strong> --- 브라우저의 전체적인 정보를 제공</p>
<p>다음은 navigator 객체의 각 속성들을 출력해 본 것이다.</p>
<pre><code class="language-javascript">&lt;script type=&quot;text/javascript&quot;&gt;
//&lt;![CDATA[
  document.write(&quot;코드명: &quot; + navigator.appCodeName + &quot;&lt;br /&gt;&quot;)
  document.write(&quot;브라우저명: &quot; + navigator.appName + &quot;&lt;br /&gt;&quot;)
  document.write(&quot;플랫폼 버전: &quot; + navigator.appVersion + &quot;&lt;br /&gt;&quot;)
  document.write(&quot;전체정보: &quot; + navigator.userAgent + &quot;&lt;br /&gt;&quot;)
//]]&gt;
&lt;/script&gt;</code></pre>
<p>이처럼 navigator 객체의 &#39;userAgent&#39; 속성을 이용하면 현 운영체제에 대한 정보를 얻을 수 있으므로, 현재 사용자의 기기가 데스크탑 PC인지 모바일 기기인지를 파악할 수 있다.</p>
<pre><code class="language-html">&lt;script type=&quot;text/javascript&quot;&gt;
  //&lt;![CDATA[
    var myAgent = navigator.userAent.toLowerCase();
    var mobile = [&quot;iphone&quot;, &quot;ipod&quot;, &quot;android&quot;, &quot;blackberry&quot;, &quot;window ce&quot;, &quot;nokia&quot;, &quot;webos&quot;, &quot;opera mini&quot;, &quot;sonyericsson&quot;, &quot;opera mobi&quot;, &quot;iemobile&quot;];
    for(var i = 0; i &lt; mobile.legth; i ++) {
      if(myAgent.indexOf(mobile[i]) &gt;= 0) {
        location.href=&quot;http://m.naver.com&quot;;
        break;
      }
    }
  //]]&gt;
&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
  &lt;h1&gt;PC버전 페이지&lt;/h1&gt;
&lt;/body&gt;</code></pre>
<h2 id="location">location</h2>
<p>location 객체는 <strong>브라우저의 현재 URL 주소값에 대한 정보를 제공</strong>한다. location 객체의 속성들은 다음과 같다.</p>
<blockquote>
</blockquote>
<p><strong>location.hash</strong> --- 주소창에 URL에서 #뒤에 오는 문자열을 반환
<strong>location.host</strong> --- 주소창에 URL에서 도메인명을 반환
<strong>location.hostname</strong> --- 주소창에 URL에서 도메인명을 반환
<strong>location.href</strong> --- 주소창에 URL에서 전체 정보를 반환
<strong>location.pathname</strong> --- 주소창에 URL에서 메인명 다음에 오는 겨오를 반환
<strong>location.port</strong> --- 주소창에 URL에서 포트번호를 반환
<strong>location.portcol</strong> --- 주소탕에 URL에서 프로토콜을 반환</p>
<h2 id="screen">screen</h2>
<p>screen 객체는 <strong>스크린(모니터)에 대한 속성을 제공</strong>하는 객체이다.</p>
<blockquote>
</blockquote>
<p><strong>availWidth</strong> --- 사용 가능한 스크린 가로 너비값을 반환
<strong>availHeight</strong> --- 사용 가능한 스크린 세로 높이값을 반환
<strong>availTop</strong> --- 창이 위치할 수 있는 최상위의 위치값을 반환
<strong>availLeft</strong> --- 창이 위치할 수 있는 가장 좌측의 위치값을 반환</p>
<p>각각의 속성에 해당하는 값을 다음의 실습을 통해 알아보도록 하자.</p>
<pre><code class="language-javascript">&lt;script type=&quot;text/javascript&quot;&gt;
  //&lt;![CDATA[
    document.write(&quot;스크린 너비값 &quot; + screen.availWidth + &quot;&lt;br /&gt;&quot;);
    document.write(&quot;스크린 높이값 &quot; + screen.availHeight + &quot;&lt;br /&gt;&quot;);
    document.write(&quot;스크린 가장 좌측 위치값 &quot; + screen.availLeft + &quot;&lt;br /&gt;&quot;);
    document.write(&quot;스크린 가장 상단 위치값 &quot; + screen.availTop + &quot;&lt;br /&gt;&quot;);
  //]]&gt;
&lt;/script&gt;</code></pre>
<blockquote>
</blockquote>
<p><strong>출력값 예시</strong>
스크린 너비값 1920
스크린 높이값 1048
스크린 가장 좌측 위치값 0
스크린 가장 상단 위치값 0</p>
<p>availHeight(사용 가능한 스크린 높이값)는 작업표시줄 제외한 높이를 반환한 것이다.</p>
<blockquote>
</blockquote>
<p><strong>비 IE 계열 브라우저들만의 전용 속성 availLeft, availTop</strong>
screen 객체의 속성 중 &#39;availLeft&#39;와 &#39;availTop&#39;은 비 IE 계열 브라우저(파이어폭스, 크롬 등)들만의 전용 속성으로, 만약 위의 코드를 IE에서 실행하면 availLeft와 availTop의 값은 &#39;undefined(확인되지 않음)&#39;로만 출력된다.</p>
<h2 id="history">history</h2>
<p><strong>브라우저로 방문한 페이지들의 정보를 제공</strong>하며, 메서드를 사용하여 &#39;이전&#39; 및 &#39;다음&#39;과 같은 페이지 이동을 위한 버튼을 만들 수도 있다.</p>
<blockquote>
</blockquote>
<p><strong>go(값)</strong> --- 값만큼 다음 또는 이전 페이지로 이동한다.
<strong>back()</strong> --- 이전 페이지로 이동한다.
<strong>forward()</strong> --- 다음 페이지로 이동한다.</p>
<blockquote>
</blockquote>
<pre><code class="language-html">&lt;body&gt;
  &lt;h1&gt;첫 페이지&lt;/h1&gt;
  &lt;a href=&quot;index2.html&quot;&gt;두번째 페이지로 이동&lt;/a&gt;
&lt;/body&gt;</code></pre>
<hr>
<pre><code class="language-html">&lt;body&gt;
  &lt;h1&gt;두번째 페이지&lt;/h1&gt;
  &lt;p&gt;&lt;a href=&quot;index3.html&quot;&gt;마지막 페이지로 이동&lt;/a&gt;&lt;/p&gt;
  &lt;input type=&quot;button&quot; value=&quot;이전 페이지로 이동&quot; onclick=&quot;history.back();&quot; /&gt;
  &lt;input type=&quot;button&quot; value=&quot;다음 페이지로 이동&quot; onclick=&quot;history.go(1);&quot; /&gt;
  &lt;input type=&quot;button&quot; valur=&quot;forward 버튼&quot; onclick=&quot;history.forward();&quot; /&gt;
&lt;/body&gt;</code></pre>
<hr>
<p>```html</p>
<body>
  <h1>마지막페이지</h1>
  <p><input type="button" value="이전 페이지로 이동" onclick="history.go(-1)" /></p>
  <p><input type="button" value="첫 페이지로 이동" onclick="history.go(-2)" /></p>
</body>]]></description>
        </item>
        <item>
            <title><![CDATA[Javascript_이벤트(Event)]]></title>
            <link>https://velog.io/@jay_kimjh/Javascript%EC%9D%B4%EB%B2%A4%ED%8A%B8Event</link>
            <guid>https://velog.io/@jay_kimjh/Javascript%EC%9D%B4%EB%B2%A4%ED%8A%B8Event</guid>
            <pubDate>Fri, 04 Feb 2022 09:26:42 GMT</pubDate>
            <description><![CDATA[<p>※ 본 포스팅은 책『실전 프로젝트 반응형 웹 퍼블리싱』의 내용을 토대로 작성됨</p>
<h1 id="이벤트event">이벤트(Event)</h1>
<p>우리가 사용하는 <strong>브라우저</strong>들은 사용자가 띄운 <strong>웹 문서를 그 구성과 내용에 맞게 객체화</strong>하여 각 요소별(버튼, 이미지 등)로 구조화한다. 각 요소들은 상, 하위 구조나 병렬구조 등으로 체계화되는데 이렇게 정리된 체계를 소위 <strong>DOM(Document Object Model, 문서 객체 구조)</strong> 이라고 부른다. 자바스크립트는 브라우저가 생성한 이 DOM 구조를 통해 각 요소와의 상호작용을 가능하게 함으로써 웹 페이지가 보다 인터렉티브하게 작동하도록 돕는 것이다.</p>
<p>이런 DOM 구조와의 상호작용에서 가장 빈번하게 사용되는 방법이 바로 &#39;이벤트&#39;이다. 웹 브라우저에서 일어나는 모든 행동들을 &#39;이벤트(Event)&#39;라고 하는데, 우리는 실제 앞에서 &#39;클릭(Onclick)&#39;이라는 이벤트를 사용해 보기도 했다. 이렇게, 특정 이벤트가 발생하는 시점에서 함수를 호출하거나 스크립트를 실행하게 하는 요소를 &#39;이벤트 핸들러&#39;라고 부른다.</p>
<p>그럼 다양한 이벤트 종류에 대해 표로 정리해 보자.</p>
<blockquote>
</blockquote>
<p><strong>onload</strong> --- 문서를 모두 불러오고 나서 발생
<strong>onunload</strong> --- 문서를 종료할 때 발생
<strong>onclick</strong> --- 대상을 클릭했을때 발생
<strong>ondblclick</strong> --- 대상을 더블 클릭했을 때 발생
<strong>onkeypress</strong> --- 키보드를 눌렀을 때 발생
<strong>onkeydown</strong> --- 키보드를 눌렀을 때 발생
<strong>onkeyup</strong> --- 키보드를 누르고 떼었을 때 발생
<strong>onmouseover</strong> --- 대상에 마우스를 올렸을 때 발생
<strong>onmouseout</strong> --- 대상에서 마우스가 벗어났을 때 발생
<strong>onfocus</strong> --- 대상에 포커스가 생겼을 때 발생
<strong>onblur</strong> --- 대상에서 포커스를 잃었을 때 발생
<strong>onsubmit</strong> --- 전송(sibmit)버튼을 눌렀을 때 발생
<strong>onreset</strong> --- 취소(reset)버튼을 눌렀을 때 발생
<strong>onchange</strong> --- 입력요소의 값이 바뀌고, 포커스가 옮겨졌을 때 발생
<strong>onmousemove</strong> --- 마우스를 움직일 때마다 발생
<strong>onresize</strong> --- 브라우저의 창을 조절할 때마다 발생
<strong>onerror</strong> --- 문서나 이미지를 불러올 때 에러가 나면 발생
<strong>onabort</strong> --- 문서를 불러오다가 중단되면 발생</p>
<h2 id="이벤트-핸들러-사용법">이벤트 핸들러 사용법</h2>
<p>이벤트 행들러를 사용하는 방법에는 태그에 직접 입력해서 사용하는 &#39;행 입력형&#39; 방식과 태그와 완전히 분리를 해서 사용하는 &#39;외부 분리형&#39; 방식이 있다. 2가지 중 어떤 것을 사용해도 크게 상관은 없지만 혹시 스크립트를 모르는 개발자가 잘못 건드리면 작동하지 않을 수도 있으므로 관리 차원에서 아예 분리하여 <code>&lt;body&gt;</code> 영역 밖으로 빼는 것이 좋다.</p>
<h3 id="이벤트-행-입력형-방식">이벤트 행 입력형 방식</h3>
<pre><code class="language-html">&lt;body&gt;
  &lt;button onclick=&quot;alert(&#39;javascript&#39;)&quot;&gt;버튼&lt;/button&gt;
&lt;/body&gt;</code></pre>
<h3 id="이벤트-분리형-방식">이벤트 분리형 방식</h3>
<h4 id="수정-전잘못된-사용">수정 전(잘못된 사용)</h4>
<pre><code class="language-html">&lt;script type=&quot;text/javascript&quot;&gt;
  //&lt;![CDATA[
    function theFnc(){
      alert(&quot;javascript&quot;);
    }
    var myBtn = document.getElementById(&quot;btn1&quot;);            // 1. 요소선택
    myBtn.onclick = theFnc;                                    // 2. 버튼 클릭 시 theFnc 함수 호출
  //]]&gt;
&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
  &lt;button id = &quot;btn1&quot;&gt;버튼&lt;/button&gt;
&lt;/body&gt;</code></pre>
<ul>
<li><p><strong>var myBtn = document.getElementById(&quot;btn1&quot;);</strong>
현재 html문서에 자바스크립트 선언문이 <code>&lt;body&gt;</code>보다 위에 있으므로 getElementById 선택자를 이용해서 요소를 가지고 올 수 없다. 그럼 어떻게 해야 할까? 현재 문서의 요소들을 모두 로딩된 후에 선택자를 실행하면 해결되겠다.</p>
</li>
<li><p><strong>myBtn.onclick = theFnc;</strong>
선택한 버튼 요소를 클릭했을 때 theFnc함수를 호출한다.</p>
</li>
</ul>
<h4 id="수정-후올바른-사용">수정 후(올바른 사용)</h4>
<pre><code class="language-javascript">&lt;script type=&quot;text/javascript&quot;&gt;
  //&lt;![CDATA[
    function theFnc(){
      alert(&quot;javascript&quot;);
    }
    window.onload = function(){                            // 브라우저 요소를 모두 불러온 뒤에 함수 실행!
      var myBtn = document.getElementById(&quot;btn1&quot;);
      myBtn.onclick = theFnc;
    }
  //]]&gt;
&lt;/script&gt;</code></pre>
<ul>
<li><strong>window.onload = function(){ 실행문; }</strong>
현재 브라우저의 모든 요소들을 로딩한 후에 함수문을 실행하라는 의미이다. 말 그대로, 함수의 실행을 <code>&lt;body&gt;</code>에 담긴 문서 내용 모두가 로드된 후로 미워두라는 것인데, 이렇게 수정하면 앞서 진행한 &#39;행 입력형 방식&#39;과 동일한 결과화면을 얻을 수 있다.</li>
</ul>
<h2 id="기존-방식dom-level-0-이벤트의-문제점">기존 방식(DOM Level 0) 이벤트의 문제점</h2>
<p>위의 예와 같이, 객체에 이벤트를 직접 연결하여 작동하게 하는 고전적인 방식을 &#39;DOM Level 0&#39;이라고 한다. <strong>객체 하나와 이벤트 하나를 연결하여 작동</strong>하는 이 방식은 <strong>한 객체에 동시에 같은 이벤트를 두 번 이상 적용할 수 없다는 문제</strong>를 안고 있다. 한 객체에 같은 이벤트를 두 번 이상 적용하게 되면 제일 마지막에 적용된 이벤트만 실행되는 것이다.</p>
<pre><code class="language-html">&lt;script type=&quot;text/javascript&quot;&gt;
  //&lt;![CDATA[
  function theFnc(){
    alert(&quot;javascript&quot;);
  }
  window.onload = function(){                        // 1. window 객체에 onload 이벤트 적용(작동 X)
    var myBtn = document.getElementById(&quot;btn1&quot;);
    myBtn.onclick = theFnc;
  }
  window.onload = function(){                        // 2. 같은 객체에 동일 이벤트 적용(작동 O)
    var myBtn = document.getElementById(&quot;btn2&quot;);
    myBtn.onclick = theFnc;
  }  
  //]]&gt;
&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
  &lt;button id=&quot;btn1&quot;&gt;버튼1&lt;/button&gt;
  &lt;button id=&quot;btn2&quot;&gt;버튼2&lt;/button&gt;
&lt;/body&gt;</code></pre>
<p>위 예제에서는 &#39;window&#39; 객체에 &#39;onload&#39; 이벤트 핸들러가 2번 적용되었다. 그러므로 마지막에 적용된 이벤트만 실행된다. </p>
<h2 id="dom-level-2-방식-이벤트">DOM Level 2 방식 이벤트</h2>
<p>한 객체에 같은 이벤트를 두 번 적용할 수 없는 &#39;DOM Level 0&#39;방식의 불편함을 해결하기 위해 개발된 방식이 바로 &#39;Level 2&#39;이다. 하지만 W3C(국제 웹 컨소시업)의 &#39;웹 표준안&#39;과 다른 독자정 구현 방식을 가진 마이크로소프트(Microsoft)社의 &#39;익스플로러(MS Explorer, 이하 IE)&#39;가 가장 많은 사용자를 지닌 사실상의 &#39;표준 브라우저&#39;로 지위를 갖게 되면서, 정확한 이벤트 구현을 위한 이벤트 등록 메서드가 서로 달라진다는 불편함이 생겼다.</p>
<p>결국, DOM Level 2 방식으로 구현한 이벤트를 모든 웹 사용자에게 정확하게 보이려면 표준(W3C)을 따르는 크롬, 파이어폭스, 사파리 등이나 비표준 방식으로 작동하는 IE8 이하 버전의 브라우저 등에서 모두 정상 작동하도록 <strong>구분자(if/else if)를 나눠 작성해야</strong> 한다.</p>
<p>표준(크롬, 파이어폭스 등)과 비표준(IE8 이하)을 구분하는 이벤트 등록은 다음과 같다.</p>
<blockquote>
</blockquote>
<p><span style="background-color : #fff59d;">if(window.addEventListener){ --- 표준 방식 브라우저(크롬, 파이어폭스 등)일 경우
  표준 이벤트 등록 메서드;
}else if(window.attachEvent){ --- 비표준 방식 브라우저(IE8 이하)일 경우
  비표준 이벤트 등록 메서드;
}
</span></p>
<p><strong>표준 방식의 브라우저</strong>인 경우 <strong>window.addEventListener</strong>에 이벤트 등록 메서드가 존재하며, <strong>IE8 이하 버전</strong>의 경우에는 <strong>window.attachEvent</strong>에 이벤트 등록 메서드가 존재한다. 다시 말해, <strong><em>사용자의 브라우저가 표준 방식이라면 if문, 비표준 방식 브라우저라면 else if문을 만족하도록 작성</em></strong>하는 것이다.</p>
<h3 id="표준-방식-브라우저파이어폭스크롬사파리에-대한-이벤트-등록방법">표준 방식 브라우저(파이어폭스/크롬/사파리)에 대한 이벤트 등록방법</h3>
<blockquote>
</blockquote>
<span style="background-color : #fff59d;">
  이벤트대상.addEventListener("이벤트명", 함수명, false)
</span>

<p>가령, 특정 &#39;버튼&#39;을 &#39;클릭&#39;했을 때 &#39;theFnc라는 함수를 호출&#39;하고 싶다면, 이벤트대상은 그 &#39;버튼&#39;이고, 이벤트명은 &#39;click&#39;이며, 호출할 함수명은 &#39;theFnc&#39;가 되는 것이다.</p>
<p>마지막 인자값 false는 이벤트 요소가 위, 아래로 나열될 때 해당 이벤트를 끝내고 다음 이벤트로 넘기는 역할을 한다. <strong>인자값 false가 포함되면 해당 이벤트가 발생한 위치에서 멈추고 아래로 진행</strong>되는데, 이를 <strong>&#39;버블업&#39; 방식</strong>이라고 부른다.</p>
<h3 id="비표준-방식-브라우저ie8-이하에-대한-이벤트-등록방법">비표준 방식 브라우저(IE8 이하)에 대한 이벤트 등록방법</h3>
<blockquote>
</blockquote>
<span style="background-color : #fff59d;">
  이벤트대상.attachEvent("on" + "이벤트명", 함수명)
</span>

<p>여기서 주의할 점은 인자값에 이벤트명을 입력할 떄 &#39;on&#39;을 붙여야 한다는 것이다. 그리고 <strong>버블방식의 설정(false)은 필요 없다.</strong></p>
<p>다음은 앞에서의 DOM Level0 코드를 DOM Level2 이벤트 방식으로 바꿔 본 것이다.</p>
<pre><code class="language-javascript">&lt;script type=&quot;text/javascript&quot;&gt;
  //&lt;![CDATA[
  function theFnc(){
    alert(&quot;javascript&quot;);
  }
  function clickBtn1() {
    var myBtn1 = document.getElementById(&quot;btn1&quot;);
    myBtn1.onclick = theFnc;
  }
  function clickBtn2() {
    var myBtn2 = document.getElementById(&quot;btn2&quot;);
    myBtn2.onclick = theFnc;
  }
  if(window.addEventListener) {                            // 1. 표준 방식 브라우저일 경우 실행
    window.addEventListener(&quot;load&quot;, clickBtn1, false);
    window.addEventListener(&quot;load&quot;, clickBtn2, false);
  }else if(window.AttachEvent) {                        // 2. 비표준 방식 브라우저의 경우 실행
    window.attachEvent(&quot;onload&quot;, clickBtn1);
    window.attachEvent(&quot;onload&quot;, clickBtn2);
  }
  //]]&gt;
&lt;/script&gt;</code></pre>
<p>㉠ <strong>window.addEventListener(&quot;load&quot;, clickBtn1, false);</strong>
㉡ <strong>window.attachEvent(&quot;onload&quot;, clickBtn1);</strong></p>
<p>㉠, ㉡의 이벤트 등록 메서드들은 모두 &quot;브라우저에 모든 요소들을 로딩한 후에 clickBtn1 함수를 실행하라&quot;는 뜻이다. ㉠방식은 IE8이하에서는 지원되지 않으므로, 표준/비표준 등에 상관없이 모든 브라우저를 지원하기 위해서는 2가지 방식을 모두 등록해야 한다.</p>
<h2 id="이벤트-객체-생성-및-속성">이벤트 객체 생성 및 속성</h2>
<p><strong>&#39;이벤트 객체&#39;</strong> 란 이벤트 핸들러가 구동될 때 생성되는 객체로서 <strong>&#39;클릭&#39;이나 &#39;키보드 입력&#39; 등의 동작 자체</strong>를 의미한다. 따라서 이벤트 객체에는 좌표나 특정 버튼입력 등에 관한 다양한 속성들이 존재하는데, 이러한 속성들을 활용하면 마우스를 클릭했을 때의 위치 정보는 물론 키보드의 특정 키 입력에 대한 키 코드값 또한 알 수 있다.</p>
<h3 id="이벤트-객체-생성">이벤트 객체 생성</h3>
<blockquote>
</blockquote>
<p><span style="background-color : #fff59d;">선택대상.onclick = function(매개변수) {
매개변수(이벤트 객체).속성
}
</span></p>
<p>특정 이벤트 핸들러를 구동하면, 함수의 매개변수에 이벤트 객체가 자동으로 생성된다. 단, 이는 사용자의 브라우저가 W3C의 표준안을 따르는 브라우저일 경우에 한한다. 즉, 비표준 방식의 브라우저(IE8 이하)를 사용 중이라면, 위와 같은 작성 방법만으로는 이벤트 핸들러를 구동하는 것만으로 매개변수에 객체를 자동 생성할 수 없다.</p>
<p>그러므로 보통의 경우, 앞에서 학습한 &#39;조건 연산자&#39;를 사용하여 이벤트 객체의 자동 생성 유·무를 먼저 매개변수에 확인한 후 생성되지 않은(IE8 이하) 경우라면 IE8 전용 이벤트 객체인 &#39;window.event&#39;를 강제 생성하도록 작성한다.</p>
<p>그럼, &#39;조건 연산자&#39;의 사용법을 다시 한 번 간단히 살펴본 후 모든 브라우저에서 이벤트 객체가 자동적으로 생성되도록 작성해 보겠다.(&#39;이벤트 객체 생성&#39;의 호환성 유지)</p>
<blockquote>
</blockquote>
<p><strong>조건 연산자(삼항 조건문)</strong>
조건식을 만족(true)하면 실행문1, 그렇지 않으면(false) 실행문2를 수행시키는 조건문
 ━
<strong>| 기본형식 |</strong>
<span style="background-color : #fff59d;">
  조건식 ? 실행문1 : 실행문2
</span></p>
<hr>
<p><strong>&lt;예&gt;</strong></p>
<pre><code class="language-javascript">var obj = &quot;자바스크립트&quot;;
var theText = obj ? obj : &quot;제이쿼리&quot;;
document.write(theText);</code></pre>
<p>위와 같은 조건문을 작성한다고 가정하면, 현재 obj 변수에 &#39;자바스크립트&#39;라는 특정 값을 넣었으므로 &#39;var theText = obj?&#39;라는 조건식의 결과값은 true이다. 따라서, theText 변수에는 obj 변수의 값 &#39;자바스크립트&#39;가 저장되는 것이다.</p>
<p>이제, <strong>&lt;예&gt;</strong> 의 방식을 &#39;이벤트 객체 생성(선택대상, 핸들러 = function(매개변수))&#39;에 적용하는 원리는 다음과 같다.</p>
<p>조건 연산자를 활용하여 매개변수의 값 유·무를 확인한다. 즉, 표준 브라우저라면 생성식의 이벤트 핸들러만으로 이벤트 객체가 생성되었을 것이므로 그 변수값 그대로를 유지시키고, 비표준 방식의 브라우저(IE8 이하), 즉 이벤트 객체가 생성되지 않아 매개변수의 값이 없는 경우라면 그 변수값으로 &#39;window.event&#39;라는 이벤트 객체를 강제로 생성시킨다.</p>
<blockquote>
</blockquote>
<p><strong>| 기본형식 |</strong>
<span style="background-color : #fff59d;">선택대상.onclick = function(e) {
  theEvent = e ? e : window.event;
  console.log(theEvent.속성);
}
</span></p>
<hr>
<p><strong>&lt;예&gt;</strong></p>
<pre><code class="language-javascript">document.onclick = function(e) {
  theEvent = e ? e : window.event;
  console.log(theEvent.clientX);
}</code></pre>
<p>앞의 <strong>&lt;예&gt;</strong> 는 다음과 같은 과정을 의미한다. 만약 표준 방식의 브라우저라면 웹 문서 내에서 &#39;클릭&#39;이벤트가 발생할 때에 이벤트 객체가 생성되어 매개변수에 담기고, 생성된 이벤트 객체는 조건 연산자의 조건식을 만족시켜 theEvent 변수로 저장된다. 물론, IE8 이하의 브라우저라면 강제 생성된 window.event 객체가 theEvent 변수에 저장되겠다. 이렇게 저장된 변수에 &#39;clientX&#39;라는 속성을 적용하여 현재 클릭한 마우스의 X값을 출력한 예이다.</p>
<h3 id="이벤트-객체-속성">이벤트 객체 속성</h3>
<blockquote>
</blockquote>
<p><strong>keydown, keypress</strong></p>
<ul>
<li>alrKey --- 키보드의 [alt]키가 눌렸을 때 true값 반환</li>
<li>shiftKey --- 키보드의 [shift]키가 눌렸을 때 true값 반환</li>
<li>ctrlKey --- 키보드의 [ctrl]키가 눌렸을 때 true값 반환</li>
<li>keyCode --- 입력된 문자키의 고유한 유니코드값을 반환한다.</li>
</ul>
<hr>
<p><strong>click, mousemove, mouseover, mouseup, mousedown</strong></p>
<ul>
<li>clientX --- 현재 문서 기준, 이벤트가 발생한 X좌표(스크롤바 너비 계산 X)</li>
<li>clientY --- 현재 문서 기준, 이벤트가 발생한 Y좌표(스크롤바 높이 계산 X)</li>
<li>screenX --- 모니터 기준, 이벤트가 발생한 X좌표</li>
<li>screenY --- 모니터 기준, 이벤트가 발생한 Y좌표</li>
<li>pageX --- 현재 문서 기준, 이벤트가 발생한 X좌표(스크롤바 너비 계산 O)</li>
<li>pageY --- 현재 문서 기준, 이벤트가 발생한 Y좌표(스크롤바 높이 계산 O)</li>
<li>layerX --- position 속성값이 &#39;absolute&#39;인 레이어 안에서의 상대 X좌표</li>
<li>layerY --- position 속성값이 &#39;absolute&#39;인 레이어 안에서의 상대 Y좌표</li>
<li>target --- 이벤트가 발생한 대상 요소</li>
<li>button --- 마우스 버튼(왼쪽/오른쪽/휠)의 클릭된 상태 체크</li>
</ul>
<hr>
<p><strong>all</strong></p>
<ul>
<li>type --- 이베트의 종류</li>
</ul>
<pre><code class="language-html">&lt;head&gt;
  &lt;script type=&quot;text/javascript&quot;&gt;
  //&lt;![CDATA[
    document.onmouse = function(e) {
      var theEvent = e ? e : window.event;                // 1. 이벤트 객체 생성
      var myForm = document.form1;

      // 2. 이벤트 속성 - 문서 기준으로 좌표를 구함.
      myForm.clt_x.value = &quot;clientX: &quot; + theEvent.clientX;
      myForm.clt_y.value = &quot;clientY: &quot; + theEvent.clientY;

      // 3. 이벤트 속성 - 스크린(모니터)기분으로 좌표를 구함.
      myForm.scr_x.value = &quot;screenX: &quot; + theEvent.screenX;
      myForm.scr_y.value = &quot;screenY: &quot; + theEvent.screenY;

      // 4. 이벤트 속성 - 문서 기준으로 스크롤바 높이까지 계산해 좌표를 구함.
      myForm.pg_x.value = &quot;pageX: &quot; + theEvent.pageX;
      myForm.pg_y.value = &quot;pageY: &quot; + theEvent.pageY;
    }
  //]]&gt;
  &lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
  &lt;form name = &quot;form1&quot; action = &quot;#&quot;&gt;
    &lt;p&gt;&lt;input type=&quot;text&quot; name=&quot;clt_x&quot; id=&quot;clt_x&quot; /&gt;&lt;/p&gt;
    &lt;p&gt;&lt;input type=&quot;text&quot; name=&quot;clt_y&quot; id=&quot;clt_y&quot; /&gt;&lt;/p&gt;
    &lt;p&gt;&lt;input type=&quot;text&quot; name=&quot;src_x&quot; id=&quot;src_x&quot; /&gt;&lt;/p&gt;
    &lt;p&gt;&lt;input type=&quot;text&quot; name=&quot;src_y&quot; id=&quot;src_y&quot; /&gt;&lt;/p&gt;
    &lt;p&gt;&lt;input type=&quot;text&quot; name=&quot;pg_x&quot; id=&quot;pg_x&quot; /&gt;&lt;/p&gt;
    &lt;p&gt;&lt;input type=&quot;text&quot; name=&quot;pg_y&quot; id=&quot;pg_y&quot; /&gt;&lt;/p&gt;
  &lt;/form&gt;
&lt;/body&gt;</code></pre>
<ul>
<li><p><strong>theEvent.clientY 와 theEvent.pageY  차이점</strong>
페이지에서 가로/세로 스크롤바가 발생했을 경우, client는 그 스크롤바 높이를 계산하지 않고, page는 스크롤바 높이까지 계산하여 각각 위치값을 구한다.</p>
</li>
<li><p><strong>theEvent.screenX</strong>
모니터 좌측 상단을 기준으로 좌표값을 구한다.</p>
</li>
</ul>
<p>앞의 예제는 자바스크립트를 통해 사용자의 마우스 움직임에 따라 상호작용하는 예를 보인 간단한 예이다. 이렇게, 자바스크립트를 활용하면 사용자의 입력(키보드/마우스)에 따라 반응하는 재미있는 페이지를 구성해낼 수 있다.</p>
<blockquote>
</blockquote>
<p><strong>비 IE 계열 브라우저들만의 전용 속성 pageX, pageY</strong>
이벤트 객체의 속성 중 &#39;pageX&#39;와 &#39;pageY&#39;는 비 IE 계열 브라우저(파이어폭스, 크롬 등)들만의 전용 속성으로, 만약 위의 코드를 IE에서 실행하면 pageX와 pageY의 값은 모두 &#39;underfined(확인되지 않음)&#39;로만 출력된다.</p>
<p>그럼, 이번에는 사용자의 키보드 입력에 반응하는 예를 작성해 보겠다. 다음은 특정 키코드값을 추적하여 이를 활용한 단축키(조합)의 작동을 구현한 예제이다.</p>
<pre><code class="language-javascript">&lt;script type=&quot;text/javascript&quot;&gt;
  //&lt;![CDATA[
    document.onkeydown = function(e) {
        var theEvent = e ? e : window.event;            // 1. 이벤트 객체 생성
        var theKey1 = theEvent.keyCode;                // 2. 키코드 생성
        var theKey2 = theEvent.shiftKey;                // 3. 키보드 상의 [shift] 키의 눌림 여부

        if(theKey1 == 72 &amp;&amp; theKey2){                    // 4. [shift] + [H] 누르면 조건문 실행
        alert(&quot;단축키 완성&quot;)
      }
    }
  //]]&gt;
&lt;/script&gt;</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[Javascript_함수]]></title>
            <link>https://velog.io/@jay_kimjh/Javascript%ED%95%A8%EC%88%98</link>
            <guid>https://velog.io/@jay_kimjh/Javascript%ED%95%A8%EC%88%98</guid>
            <pubDate>Thu, 03 Feb 2022 00:32:55 GMT</pubDate>
            <description><![CDATA[<p>※ 본 포스팅은  책『실전 프로젝트 반응형 웹 퍼블리싱』의 내용을 기반으로 작성하였음</p>
<h1 id="함수function">함수(Function)</h1>
<p><strong>함수</strong>를 사용하게 되면 <strong>일련의 실행문들을 메모리에 저장했다가 필요할 때</strong> 해당 함수의 이름으로 <strong>다시 호출하여 사용</strong>할 수 있다.</p>
<p>가령 화장품 매장에 점원이 혼자 있는데, 손님이 올 때마다 &quot;어서오십시오, 고객님!&quot;, 나갈 때는 &quot;안녕히가십시오, 고객님!&quot;이라고 매번 외치기 귀찮아졌다고 가정하자. 이때, 만약 특정 인사말이 출력되도록 버튼을 만들어 두어 손님이 들어올 때와 나갈 때마다 멘트를 녹음해서 틀어줄 수 있다면 이 점원의 입장에서는 편한 일일 것이다.</p>
<p>위 경우에서, 버튼을 누른 것은 자바스크립트로 치자면 함수의 호출에 해당하고, 그 버튼에 응하여 출력되는 음성은 호출에 응하여 불려오는 함수문이 될 것이다. 즉, 함수를 호출하면  함수에 저장되어 있던 특정 함수문이 불려와 실행되는데, 이렇게 함수를 이용하면 필요할 때마다 반복적으로 실행해야 할 작업들을 한 번에 처리할 수 있게 되는 것이다.</p>
<p>함수도 앞에서 본 &#39;메서드&#39;와 같이 &#39;내장형&#39;과 &#39;사용자 정의&#39; 함수가 있따. 내장형 함수는 이미 자바스크립트에 내장되어 있는 함수문이고, 사용자 정의 함수는 말 그대로 사용자가 직접 실행문들을 함수문에 작성해서 필요할 때마다 호출하여 사용한느 것을 의미한다.</p>
<p><strong>함수에서 변수</strong>는 <strong>&#39;지역변수&#39;와 &#39;전역변수&#39;로 구분</strong>되는데, 먼저 기본적인 함수의 정의와 호출방법에 대해서 알아본 후 두 가지 변수의 차이에 대해서도 알아보자.</p>
<h2 id="기본적인-함수의-정의와-호출">기본적인 함수의 정의와 호출</h2>
<blockquote>
</blockquote>
<p><strong>기본형식</strong>
<span style="background-color : #7befff;">
function 함수명(){
  실행문;
}
함수명();
</span></p>
<p>function은 함수의 정의문으로서, &quot;다음 중괄호({})에 입력하는 실행문들은 지금 당장 실행하지 말고, 함수명으로 저장하라&quot;는 의미이다. 따라서 저장된 실행문들은 &#39;함수명&#39;으로 메모리에 저장되어 언제든 그 &#39;함수명&#39;으로 호출할 수 있겠다.</p>
<p>웹 페이지 상에 앞에서 예로 들었던 버튼을 만들고 그것을 누를 때마다 &quot;안녕히 가세요&quot;라고 경고창이 뜨게 하는 방법을 다음 실습으로 직접 알아보자.</p>
<pre><code class="language-html">&lt;script type=&quot;text/javascript&quot;&gt;
//&lt;![CDATA[
  function greet(){            // &#39;greet&#39;라는 함수명을 정의
    alert(&quot;안녕히 가세요&quot;)        // 호출할 때 수행될 실행문 작성
  }
//]]&gt;
&lt;/script&gt;
&lt;title&gt; new document &lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
  &lt;button onclick=&quot;greet();&quot;&gt;버튼&lt;/button&gt;        &lt;!-- 버튼 클릭 시 함수 호출 --&gt;
&lt;/body&gt;</code></pre>
<p>위 예제는 페이지 상의 버튼에 마우스로 클릭했을(&#39;onclick&#39; 이벤트 발생) 때 미리 지정한 &#39;greet&#39; 함수를 호출하게 되어 있습니다. 버튼을 클릭하면 &quot;안녕히 가세요&quot;라는 경고창이 뜨는 것이다.</p>
<blockquote>
</blockquote>
<p><strong>응용문제</strong>
파일명이 각각 &#39;img1.jpg&#39;, &#39;img2.jpg&#39;, &#39;img3.jpg&#39; ... &#39;img7.jpg&#39;인 7가지 이미지 파일을 버튼을 통해 이전과 이후로 넘길 수 있는 롤링 갤러리를 만드세요.</p>
<p>위 예제에서는 img1부터 7까지 이미지 파일명 뒤에 붙은 숫자를 유념하여 이 7개의 이미지들이 순환되려면, &#39;다음&#39; 버튼을 클릭할 때 이전 파일명에서 숫자만 1만큼 증가하고, &#39;이전&#39; 버튼을 클릭할 때 그 반대로 작동하면 될 것이다. 단, 순환(Rolling)을 위해서는 가장 높은 수 7보다 커져야 할 때는 1로, 반대의 경우 1보다 작아져야 할 때면 7로 치환해야 할 것이다.</p>
<p>그렇게 바뀐 파일명을 갤러리용인 이미지의 src(소스) 속성값에 적용하면 이미지가 바뀔 것이다.</p>
<pre><code class="language-html">&lt;script type=&quot;text/javascript&quot;&gt;
//&lt;![CDATA[
  var num = 1;                // num 초기값

  function nextGallery()        // 다음 버튼 함수명 &#39;nextGallery&#39;
    num++;                // num은 1만큼 증가
    if(num&gt;7) num=1;            // num 변수가 7을 초과하는 순간 1로 치환
    document.getElementById(&quot;gallery&quot;).src=&quot;images/img&quot; + num + &quot;.jpg&quot;;
    return false;            // 호출문에 false값을 반환한다.
  }

  function prevGallery(){        // 이전 버튼 함수명 &#39;prevGallery&#39;
    num--;                // num은 1만큼 감소
    if(num&lt;1) num=7;            // num 변수가 1보다 작아질 때 7로 치환
    document.getElementById(&quot;gallery&quot;).src=&quot;images/img&quot; + num + &quot;.jpg&quot;;
    return false;            // 호출문에 false값을 반환한다. 
  }
//]]&gt;
&lt;/script&gt;
&lt;title&gt; new document &lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
  &lt;div id=&quot;galleryWrap&quot;&gt;
    &lt;h1&gt;이미지 넘기기&lt;/h1&gt;
    &lt;p&gt;
      &lt;a href=&quot;#prev&quot; onclick=&quot;return prevGallery();&quot;&gt;&lt;img src=&quot;images/left_btn.png&quot; alt=&quot;이전 그림&quot; /&gt;&lt;/a&gt;
      &lt;img src=&quot;images/img1.jpg&quot; alt=&quot;갤러리 그림&quot; id=&quot;gallery&quot;/&gt;
      &lt;a href=&quot;#next&quot; onclick=&quot;return nextGallery();&quot;&gt;&lt;img src=&quot;images/right_btn.png&quot; alt=&quot;다음 그림&quot; /&gt;&lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/body&gt;</code></pre>
<ul>
<li><strong>onclick=&quot;return prevGallery();&quot; / onclick=&quot;return nextGallery();&quot;</strong>
  &#39;이전&#39;과  &#39;다음&#39;버튼을 클릭하면 각각 &#39;prevGallery()&#39;나 &#39;nextGallery()&#39; 함수를 호출한다.</li>
<li><strong>if(num&gt;7) num=1;</strong>
  이미지 파일명 끝의 숫자가 1~7까지이므로 num이 7보다 커져야 하면 1로 치환(순환)</li>
<li><strong>document.getElementById(&quot;gallery&quot;).src=&quot;images/img&quot; + num + &quot;.jpg&quot;;</strong>
  getElementById(&quot;id명&quot;) 메서드는 문서 내에서 특정 id값으로 지정된 요소를 불러와 그 속성에 대한 설정을 가하려 할 때 사용한다. 여기서는 &#39;gallery&#39;라는 id로 지정된 이미지의 src(소스)값을 &#39;num 변수가 포함된 값&#39;으로 변경하여, 미리 이미지 순환용 함수로서 지정된 &#39;prevGalley&#39;와 &#39;nextGallery&#39; 등이 작동할 수 있도록 돕고 있다.</li>
<li><strong>retuen false</strong>
이 구문은 쉽게 말해 &#39;여기까지!&#39;라는 의미이다. 하이퍼링크에 쓰이는 <code>&lt;a&gt;</code> 태그의 기본 속성 href는 지정된 주소로의 &#39;이동&#39;을 원칙으로 하는데, onclick 이벤트 함수를 걸어주면 우선 이벤트부터 처리한 뒤에 href 속성으로 가게 된다. 즉, &#39;return false&#39;란 그 href(이동) 속성의 실행을 막아 최초 함수를 불러낸 &#39;클릭&#39; 시점에서 동작을 멈추도록 하기 위함이다.</li>
</ul>
<h2 id="전달인자값이-있는-함수">전달(인자)값이 있는 함수</h2>
<p>앞에서는 함수의 호출문에 따로 전달(인자)값이 없었다. 이번에는 해당 함수의 <strong>매개변수 자리에 특정 인자값을 전달</strong>하고, <strong>그 값이 적용된 상태의 함수가 수행되도록</strong> 하겠다.</p>
<blockquote>
</blockquote>
<p><strong>기본형식</strong>
<span style="background-color : #7befff;">
function 함수명(매개변수1, 매개변수2){
  실행문;
}
함수명(인자값1, 인자값2);
</span></p>
<p><strong>기본형식</strong>을 보면 호출문에는 함수를 호출 시 전달해야 할 인자값이 2개이다. 그 위 함수문에도 특정값을 전달 받기 위한 매개변수 역시 2개가 존재하고 있다. <strong>매개변수와 인자값이 동일하게 나열되어야 정확한 전달이 가능하다는 의미</strong>이다.</p>
<p>아래 실습을 통해 인자값이 있는 함수의 사용법을 알아보도록 하겠다.</p>
<pre><code class="language-html">&lt;script type=&quot;text/javascript&quot;&gt;
//&lt;![CDATA[
  function greet(theText) {
    alert(theText)
  }
//]]&gt;
&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
  &lt;button onclick=&quot;greet(&#39;반갑습니다!&#39;)&quot;&gt;버튼1&lt;/button&gt;
  &lt;button onclick=&quot;greet(&#39;안녕히 가세요!&#39;)&quot;&gt;버튼2&lt;/button&gt;
&lt;/body&gt;</code></pre>
<ul>
<li><strong>onclick=&quot;greet(&#39;반갑습니다!&#39;)&quot;</strong>
버튼을 클릭했을 때 greet()함수를 호출한다. 그리고 &#39;반갑습니다!&#39;라는 문자 데이터를 함수에 전달한다. 이때, 혹시 궁금할 수 있는 부분이 바로 호출문 안에서의 따옴표들인데, 호출문에서는 보통 해당 함수명을 큰따옴표(&quot; &quot;)를 사용해 불러오는데, 맨 뒤 인자값을 큰따옴표로 묶어주면 정상적인 코드로 인식이 되지 않는다.
  예를 들어, 호출문을 onclick=&quot;greet(&quot;반갑습니다&quot;)&quot; 형식으로 코딩했다면 onclick 이벤트로 불려올 부분은 큰따옴표로 묶인 &quot;greet(&quot; 까지이고, 이는 정상적인 함수 형식이 아니므로 오류가 발생하게 된다. 따라서 함수 뒤에 인자값을 넣을 때에는 작은 따옴표를 사용한다.</li>
<li><strong>function greet(the Text){</strong>
  호출 시 전달받은 값을 theText라는 매개변수에 저장하게 된다. 여기서는 &#39;버튼1&#39;을 눌렀을 때 theText에 &#39;반값습니다&#39;라는 문자 데이터가 저장되어 경고창(alert)을 띄울 것이다.</li>
</ul>
<h2 id="return">return</h2>
<p>함수의 실행문에서 <strong>return 문을 실행하면 다음 실행문들은 수행하지 않고, 함수문을 마친다.</strong> 즉, 반복문에서 &#39;break&#39;와 같다. 또 하나의 기능은 <strong>함수 호출문에게 값을 반환</strong>한다. 다음 실습을 통해 자세히 알아보자.</p>
<pre><code class="language-javascript">&lt;script type=&quot;text/javascript&quot;&gt;
//&lt;![CDATA{
  var num1 = 10;
  function theFnc(num2){
    var sum = num1+num2;            // sum = 10 + num2
    var mul = num1*num2;            // mul = 10 * num2

    return sum;                    // 실행문 중단 및 연산결과를 반환
  }

  var result = theFnc(40);            // num2에 40을 적용한 theFnc 함수 호출
  document.write(resilt);            // result=sum=10+40, 출력값 : 50
//]]&gt;
&lt;/script&gt;</code></pre>
<h2 id="재귀함수-호출">재귀함수 호출</h2>
<p>어떤 함수의 <strong>실행문에서 자기 자신을 스스로 호출하는 것</strong>을 <strong>&#39;재귀함수 호출&#39;</strong>이라고 한다. 이 경우, 함수문을 마치 반복문 처럼 특정 조건을 걸어 여러 차례 실행시킬 수 있다.</p>
<pre><code class="language-javascript">&lt;script type=&quot;text/javascript&quot;&gt;
  //&lt;![CDATA[
    var i = 0;
    function theTest(){
      i++;                        // 함수를 실행할 때마다 1씩 증가
      document.write(&quot;안녕하세요&quot; + i + &quot;&lt;br /&gt;&quot;);
      if(i&lt;10) theTest();        // 2. 조건을 만족할 때까지 함수 호출
    }

    theTest();                    // 1. 최초 함수 호출
  //]]&gt;
&lt;/script&gt;</code></pre>
<blockquote>
</blockquote>
<p><strong>출력값</strong>
안녕하세요1
안녕하세요2
안녕하세요3
안녕하세요4
안녕하세요5
안녕하세요6
안녕하세요7
안녕하세요8
안녕하세요9
안녕하세요10</p>
<p>함수문의 실행문 상에 자기 함수를 호출하는 실행문이 포함되었다. 이것을 &#39;재귀함수 호출&#39;이라고 한다.</p>
<h2 id="지역변수local-variable와-전역변수global-variable">지역변수(Local Variable)와 전역변수(Global Variable)</h2>
<p>함수 내에서의 변수는 &#39;지역변수(Local Variable)&#39;와 전역변수(Global Variable)&#39;로 구분된다. <strong>&#39;지역변수&#39;</strong>란 <strong>변수가 정의된 함수 내에서만 사용이 가능한 변수</strong>이며, <strong>&#39;전역변수&#39;</strong>는 <strong>현재 페이지 내 자바스크립트 어디서든 사용이 가능한 변수</strong>이다.</p>
<blockquote>
</blockquote>
<p><strong>&#39;지역변수&#39;와 &#39;전역변수&#39;를 구분하는 이유는 무엇일까?</strong>
변수의 중복 사용을 막기 위해서이다. 전역변수와 지역변수의 이름이 같다는 것만으로 오류가 발생하지는 않으며, 해당 함수 내에서는 지역변수가 우선 호출된다. 하지만, 프로그램이 복잡해질수록 깔끔한 실행을 위해서는 될수록 구분해주는 것이 좋다.</p>
<h3 id="지역변수의-정의">지역변수의 정의</h3>
<p>함수(function)내에서 선언하며, 반드시 앞에 var 키워드를 붙여 선언한다.</p>
<pre><code class="language-javascript">function theFnc(){                // 지역변수 선언(함수 내 변수의 선언)
  var num;
  num = 30;
}
theFnc();
console.log(num);                // 지역변수의 값을 함수 밖에서 불러올 수 있을까?</code></pre>
<p>지역변수로 선언된 변수는 함수 밖에서 사용할 수 없다. 위 코드를 실행했을 때 콘솔창에 오류가 생기는데 &quot;정의되지 않은(not defined) 변수&quot;라는 의미의 오류가 생긴다. 지역변수는 어디까지나 자신이 선언된 함수 내에서만 사용이 가능한 것이다.</p>
<h3 id="전역변수의-정의">전역변수의 정의</h3>
<p>변수를 <strong>함수(function) 바깥에 선언하거나 함수 내에서 var 연산자를 붙이지 않고 선언</strong>한다. 외부에서 선언할 경우 var를 붙이지 않아도 실행에는 문제가 없으나, 좋지 않은 습관이므로 항상 var 연산자를 붙여 선언하는 것이 좋다.</p>
<pre><code class="language-javascript">var num;                // 전역변수 num 선언
function theFnc(){
  num = 30;
}
theFnc();
console.log(num);        // 이번엔 num에 값을 불러 올 수 있을까?</code></pre>
<p>전역변수로 선언된 변수는 함수 바깥에서도 사용할 수 있다. 콘솔창에는 30이라는 숫자가 출력된다.</p>
<pre><code class="language-javascript">&lt;script type=&quot;text/javascript&quot;&gt;
//&lt;![CDATA[
  var i = 10;
  var num = 20;                    // 전역변수 var = 20;

  function theTest(){
    var num = i + 200;            // 지역변수 num = 210;
    alert(num);
  }
  the Test();

  function theFnc(){
    document.write(num);        // 출력결과 : 20
  }
  theFnc();                        // theFnc 함수의 호출(전역변수 num의 영역)
//]]&gt;
&lt;/script&gt;</code></pre>
<p>위에서 보듯 theTest 함수는 그 내부에 지역변수 num을 포함하므로, theTest 함수를 호출하면 전역변수가 아닌 지역변수 num(i+200)이 우선 적용되어 &#39;210&#39;이 적힌 경고창이 뜬다. 또한 내부의 지역변수 없이 num이라는 변수를 쓴 theFnc 함수가 호출되면, theTest 함수의 지역변수가 아닌 전역변수 num(20)이 적용되어 &#39;20&#39;이 출력된다.</p>
<h2 id="내장-함수">내장 함수</h2>
<p>자바스크립트는 사용자의 편의를 우해 다양한 내장 함수를 제공한다. 자바스크립트에 내장되어 있느 함수에는 어떤 것들이 있는지 알아보자.</p>
<blockquote>
</blockquote>
<p><strong>eval()</strong> --- 문자열을 자바스크립트 문장으로 변환(수식은 계산, 문자는 변수로)
<strong>parseInt()</strong> --- 숫자를 정수로 반환
<strong>parseFloat()</strong> --- 숫자를 실수로 반환
<strong>isNaN()</strong> --- &quot;Not a Number&quot;의 약자로, 숫자가 아닌 문자가 포함되면 true를 반환
<strong>isFinite()</strong> --- 주어진 값이 유리수인지 아닌지 판단
<strong>Number()</strong> --- 문자를 숫자형으로 변환
<strong>String()</strong> --- 숫자를 문자형으로 변환
<strong>escape()</strong> --- 문자를 16진수 아스키코드 값으로 반환
<strong>unescape()</strong> --- escape()로 변환된 값을 다시 되돌려 반환</p>
<pre><code class="language-javascript">&lt;script type=&quot;text/javascript&quot;&gt;
//&lt;![CDATA[
  var result1 = eval(&quot;10 + 20&quot;);                // 문자열을 연산하여 &#39;30&#39; 저장
  document.write(result1 + &quot;&lt;br /&gt;&quot;);            // 출력값 : 30
  var num = 100;
  document.write(&quot;num&quot; + 10 + &quot;&lt;br /&gt;&quot;);        // 출력값 : num10 --- 단순 문자결합
  document.write(eval(&quot;num&quot;) + 10 + &quot;&lt;br /&gt;&quot;);    // 출력값 : 110 --- num을 변수로 변환
  var result2 = isNaA(&quot;02-235-1620&quot;);            // &quot;-&quot; 문자열이 포함되므로 true
  document.write(result2 + &quot;&lt;br /&gt;&quot;);            // 출력값 : true
//]]&gt;
&lt;/script&gt;</code></pre>
<h2 id="생성자-함수">생성자 함수</h2>
<p><strong>생성자 함수</strong>를 이용하면 특정 속성과 메서드를 가진 객체를 쉽게 생성할 수 있다. 즉, 맨 처음 객체에 대하여 다룰 때 언급했던 <strong>&#39;사용자 정의 객체&#39;</strong>를 의미하는데, 그 속성과 관련 메서드를 직접 사용자가 정의하여 함수화하고 이휴 new 연산자를 사용하여 해당 함수명을 호출하면 미리 정의된 속성과 메서드를 지닌 새로운 객체가 만들어지도록 하는 것이다.</p>
<p>가령 컴퓨터를 생산한다고 가정하면, 컴퓨터를 생산하는 공장이 있어야겠다. 바로 그 공장과 같은 역할을 하는 것이 &#39;생성자 함수&#39;라고 보면 되겠다. 또한 생산된 컴퓨터에는 각각의 모델명이 있을 테고, 색상과 크기 등(속성)이 있겠다. 그리고 경우에 따라 사양에 대한 정보를 제공해 줄 수도 있을 것이다.(메서드)</p>
<p>이렇게 정의된 생성자 함수가 완성되면, 어디서든 new 연산자를 활용하여 그 속성과 메서드를 지닌 객체를 생성할 수 있다.</p>
<blockquote>
</blockquote>
<p><strong>기본형식</strong>
<span style="background-color : #7befff;">
function 함수명(매개변수1, 매개변수2, ... 매개변수n){
  this.속성1 = 매개변수1;
  this.속성2 = 매개변수2;
  ...
  this.속성n= 매개변수n;
  this.메서드1 = function(){
    실행문;
  }
}
var 인스턴스 네임(객체명) = new 함수명(값1, 값2, ... 값n)
</span></p>
<pre><code class="language-javascript">&lt;script type=&quot;text/javascript&quot;&gt;
  //&lt;![CDATA[
    function comFactory(cpuInfo, ramInfo, hddInfo){                        // 1. 생성자 함수
      this.cpu = cpuInfo;                                                // &#39;cpu&#39; 속성
      this.ram = ramInfo;                                                // &#39;ram&#39; 속성
      this.hdd = hddInfo;                                                // &#39;hdd&#39; 속성

      this.tottInfo = function(){                                        // 객체 메서드
        document.write(&quot;제조업체 : 한국전자 &lt;br /&gt;&quot;);
        document.write(&quot;시스템종류 : 64비트 운영체제 &lt;br /&gt;&quot;;
      }
    }
    var speedCom = new comFactory(&quot;2.GHZ&quot;, &quot;2.0GB&quot;, &quot;1TB&quot;);                // 2. 객체 생성
    document.write(speedCom.cpu + &quot;&lt;br /&gt;&quot;);
    document.write(speedCom.ram + &quot;&lt;br /&gt;&quot;);

    speedCom.totInfo();
  //]]&gt;
&lt;/script&gt;</code></pre>
<ul>
<li><p><strong>function comFactory(cpuInfo, raminfo, hddInfo)</strong>
매개변수가 3개인 생성자 함수이다. 여기서 &#39;this&#39;란 생성될 객체를 의미한다.</p>
</li>
<li><p><strong>var speedCom = new comFactory(&quot;2.8GHZ&quot;, &quot;2.0GB&quot;, &quot;1TB&quot;);</strong>
new 연산자를 사용하여 새 객체를 생성하고, 객체명으로 &#39;speedCom&#39;을 부여했다. 만일 새로운 객체를 하나 더 생성하려면 new 연산자를 통해 한 번 더 함수를 호출하고, 생성 객체명을 부여하면 된다.</p>
</li>
<li><p><strong>speedCom.totInfo();</strong>
생성자 함수에서 지정한 totInfo 메서드를 실행한다. 이때 각 매개변수는 새로운 객체인 &#39;speedCom&#39;을 생성할 때 넣은 인자값(&quot;2.8GHZ&quot;, &quot;2.0GB&quot;, &quot;1TB&quot;)에 맞게 출력된다.</p>
</li>
</ul>
<p>자바스크립트는 객체 기반의 언어이므로 될수록 객체에 대한 개념을 반복하여 정확히 이해하고 넘어가는 것이 좋다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Javascript_객체]]></title>
            <link>https://velog.io/@jay_kimjh/Javascript%EA%B0%9D%EC%B2%B4</link>
            <guid>https://velog.io/@jay_kimjh/Javascript%EA%B0%9D%EC%B2%B4</guid>
            <pubDate>Wed, 26 Jan 2022 09:11:53 GMT</pubDate>
            <description><![CDATA[<p>※ 본 포스팅은 책『실전 프로젝트 반응형 웹 퍼블리싱』을 바탕으로 작성하였음</p>
<h1 id="객체object">객체(Object)</h1>
<p>자바스크립트는 객체기반(Object Based)의 스크립트 언어이다. <strong>&#39;객체&#39;</strong>란 <strong>&#39;특정 기능&#39;을 수행하는 단위체</strong>를 말하는데 우리의 평소 생활에서 예를 찾는다면, 평소 전화를 걸거나 받을 때 사용하는 &#39;휴대폰&#39;이나 혹은 어떤 물건을 멀리 보내야 할 때 이를 대행하는 &#39;택배기사&#39;와 &#39;집배원&#39;등을 모두  &#39;객체&#39;라고 할 수 있다. 이때, 해당 <strong>객체가 지닌 각각의 기능</strong>을 자바스크립트에서는 <strong>&#39;메서드&#39;</strong>라는 용어로 정의한다.</p>
<p>휴대폰.통화하기(); // 메소드
휴대폰.색상;    // 속성</p>
<p>이와 같이, 자바스크립트는 항상 객체를 중심으로 기술한다. 또한 객체명 뒤의 점(.)을 경계로 하여 그 객체에 해당하는 메서드(기능) 또는 속성을 기술하게 된다.</p>
<p>자바스크립트에는 저마다 고유한 기능을 가진 다양한 종류의 객체들이 존재하는데, 크게 &#39;내장 객체&#39;와 &#39;브라우저 객체&#39; 그리고 &#39;사용자 정의 객체&#39; 등이 있다. &#39;내장 객체&#39;는 자바스크립트 내에 내장된 객체로서 Date, Array, Math 등이 있으며, &#39;브라우저 객체(BOM)&#39;는 각 웹 브라우저에서 지원되는 객체로서 window, document(DOM), location 등이 있다.</p>
<p><strong>※ 객체의 생성 - new 연산자</strong></p>
<p><strong>new 연산자</strong>는 <strong>새로운 객체를 생성</strong>할 때 사용하며, 앞에 new를 붙이고 내장 객체의 함수명을 써서 작성한다. 다음은 날짜와 관련된 Date 객체의 생성 예이다.</p>
<blockquote>
</blockquote>
<p><strong>기본형식</strong></p>
<pre><code class="language-javascript">var todayObj = new Date();</code></pre>
<p>우리에게 필요한 제품을 새로 생산하듯 날짜 정보를 제공해주는 Date 객체를 new 연산자를 이용하여 생성하였다. 그리고 제품들 간의 구분을 짓기 위해 모델명을 붙이듯 날짜 객체에도 앞으로 사용할 todayObj라는 인스턴스 네임(객체의 이름표)을 부여하였다. 앞으로 날짜와 관련된 정보가 궁금할 때에는 todayObj에게 물어보면 될 것이다.
그렇다면 어떻게 물어보면 될까? 먼저 todayObj한테 현대 연도를 한번 물어보자.</p>
<p>todayObj야, 현재 연도에 대한 정보를 보여줘!</p>
<p>물론 이렇게 물어보지는 않는다.
자바스크립트에서는 &#39;객체&#39;를 먼저 기술하고, 점(.)을 경계로 사용하고자 하는 메서드를 기술한다.</p>
<p>todayObj.getFullYear();</p>
<p>위와 같이 작성하면 Date 객체는 현재 연도에 대한 정보를 제공하게 되는 것이다.</p>
<blockquote>
</blockquote>
<p><strong>그런데 getFullYear() 메서드를 쓸 경우, 대문자와 소문자를 어떻게 구분하는 것일까?</strong>
<br />
자바스크립트는 낙타(camel)표기법을 따른다. getFullYear 메서드는 get + Full + Year 3개 단어의 조합이다. 첫 단어는 항상 소문자로 시작하고, 다음에 오는 단어 중 첫 글자는 항상 대문자로 표기하는 방법이다. 마치 낙타의 등이 연상되지 않는가?</p>
<p>위에서도 보다시피 객체를 생성할 때에는 보통 new를 사용한다. 하지만 new를 사용하지 않아도 되는 객체가 있는데, 바로 그 대표적인 예가 Math 객체이다. Math 객체의 경우에는 이미 정해져 있는 수학 공식을 가져다 써야하므로 &#39;정적 객체&#39;라고도 부른다.</p>
<p>그 외에도 꼭 new를 사용하지 않아도 간편하게 생성할 수 있는 String, Array 등의 객체들이 있다.</p>
<p>그럼 각 내장 객체의 종류와 메소드 및 속성의 사용법에 대해서도 알아보자</p>
<h2 id="date-객체">Date 객체</h2>
<p>현재 또는 특정 <strong>날짜와 시간에 대한 정보를 제공</strong>한다. 만일 객체 생성 시 특정 날짜를 지정하지 않았다면 <strong>현재 컴퓨터 시스템에 입력된 날짜에 대한 정보를 제공</strong>한다.</p>
<p>다음은 날짜 객체를 생성하는 기본적인 방법이며, 인자값으로 연/월/일/시/분/초를 입력하면 날짜 객체는 지정된 특정 날짜와 시간에 대한 정보를 제공한다.</p>
<blockquote>
</blockquote>
<p><strong>기본형식</strong></p>
<pre><code class="language-javascript">var 변수 = new Date();</code></pre>
<p>또는</p>
<pre><code class="language-javascript">var 변수 = new Date(연, 월, 일, 시, 분, 초);</code></pre>
<h3 id="날짜-정보-제공-메서드">날짜 정보 제공 메서드</h3>
<blockquote>
</blockquote>
<p><strong>getFullYear()</strong> --- 날짜에서 연도에 대한 정보를 제공
<strong>getMonth()</strong> --- 날짜에서 월에 대한 정보를 제공, 0<del>11 반환(0 → 1월, 11 → 12월)
<strong>getDate()</strong> --- 날짜에서 일에 대한 정보를 제공
<strong>getDay()</strong> --- 날짜에서 요일에 대한 정보를 제공(0 → 일요일, 6 → 토요일)
<strong>getHours()</strong> --- 시간에서 시(0</del>23)에 대한 정보를 제공
<strong>getMinutes()</strong> --- 시간에서 분(0<del>59)에 대한 정보를 제공
<strong>getSeconds()</strong> --- 시간에서 초(0</del>59)에 대한 정보를 제공
<strong>getMilliseconds()</strong> --- 시간에서 밀리(1/1000)초에 대한 정보를 제공
<strong>getTime()</strong> --- 1970년 1월 1일 이후 경과 시간을 밀리초로 제공</p>
<h3 id="날짜-지정-메서드">날짜 지정 메서드</h3>
<blockquote>
</blockquote>
<p><strong>setFullYear()</strong> --- 날짜에서 &#39;연도&#39;만 새로 지정할 때
<strong>setMonth()</strong> --- 날짜에서 &#39;월&#39;만 새로 지정할 때(1월 → 0, 12월 → 11)
<strong>setDate()</strong> --- 날짜에서 &#39;일&#39;만 새로 지정할 때
<strong>setHours()</strong> --- &#39;시간&#39;만 새로 지정할 때
<strong>setMinutes()</strong> --- &#39;분&#39;만 새로 지정할 때
<strong>setSeconds()</strong> --- &#39;초&#39;만 새로 지정할 때
<strong>setMilliseconds()</strong> --- &#39;밀리초&#39;만 새로 지정할 때
<strong>setTime()</strong> --- 현재까지 경과된 밀리초를 새로 지정할 때
<strong>toGMTString()</strong> --- 날짜를 그리니치 천문대 표준시로 표시
<strong>toString()</strong> --- 날짜를 문자 형식으로 표시</p>
<pre><code class="language-javascript">&lt;script type=&quot;text/javascript&quot;&gt;
//&lt;![CDATA[
  document.write(&quot;&lt;h1&gt;현재날짜/시간 정보&lt;/h1&gt;&quot;)
  var today=new Date();
  var nowMonth = today.getMonth() + 1;        // 현재 월(0~11)
  var nowDate = today.getDate();        // 현재 일
  var nowDay = today.getDay();            // 현재  요일(0:일요일 ~ 6:토요일)
  var nowHours = today.getHours();        // 현재 시간
  var nowMinutes = today.getMinutes();        // 현재 분
  var nowSeconds = today.getSeconds();        // 현재 초
  var nowTime = today.getTime();        // 1970년 1월 1일부터 밀리초 경과된 시간
  document.write(&quot;월: &quot; + nowMonth + &quot;&lt;br /&gt;&quot;);
  document.write(&quot;일: &quot; + nowDate + &quot;&lt;br /&gt;&quot;);
  document.write(&quot;요일: &quot; + nowDay + &quot;&lt;br /&gt;&quot;);
  document.write(&quot;시: &quot; + nowHours + &quot;&lt;br /&gt;&quot;);
  document.write(&quot;분: &quot; + nowMinutes + &quot;&lt;br /&gt;&quot;);
  document.write(&quot;초: &quot; + nowSeconds + &quot;&lt;br /&gt;&quot;);
  document.write(&quot;경과시간: &quot; + nowTime + &quot;&lt;br /&gt;&quot;);
  document.write(&quot;&lt;h1&gt;날짜 바꾸기&lt;/h1&gt;&quot;)
  today.setMonth(11);                // 월을 12월로 지정
  today.setDate(25);                // 일을 25일로 지정
  document.write(&quot;월: &quot; + today.getMonth() + &quot;&lt;br /&gt;&quot;);
  document.write(&quot;일: &quot; + today.getDate() + &quot;&lt;br /&gt;&quot;);
//]]&gt;
&lt;/script&gt;</code></pre>
<h2 id="math-객체">Math 객체</h2>
<p>단순하게 수를 더하거나 뺄 경우에는 앞에서 공부한 &#39;산술 연산자&#39;들을 사용한다. 하지만 소수점을 반올림하거나 최대/최소값 등 <strong>특정 공식을 사용해야 할 경우</strong>라면, <strong>수학 객체의 메서드를 사용하는 것이 훨씬 편리</strong>하다. <strong>수학 객체</strong>는 다른 내장 객체와 다르게 <strong>new(생성자 키워드)를 사용하지 않는 정적인 객체</strong>이다.</p>
<blockquote>
</blockquote>
<p><strong>max(숫자1, 숫자2, 숫자3)</strong> --- 숫자 중 최대값을 반환
<strong>min(숫자1, 숫자2, 숫자3)</strong> --- 숫자 중 최소값을 반환
<strong>round(숫자)</strong> --- 소수점 첫째 자리를 반올림
<strong>ceil(숫자)</strong> --- 소수점 자리를 무조건 올림
<strong>floor(숫자)</strong> --- 소수점 자리를 무조건 절삭
<strong>abs(숫자)</strong> --- 수의 절대값을 반환
<strong>random()</strong> --- 0과 1 사이의 난수를 발생</p>
<p>기본 메서드 사용법을 익히기 위해 다음 예제를 실습해 보자</p>
<pre><code class="language-javascript">&lt;script type=&quot;text/javascript&quot;&gt;
  //&lt;![CDATA[
  var maxNum = Math.max(30, 70, 5);
  document.write(&quot;최대값: &quot; + maxNum + &quot;&lt;br /&gt;&quot;);        // 출력값 --- &quot;최대값: 70&quot;

  var minNum = Math.min(8, 10, 15);
  document.write(&quot;최소값: &quot; + minNum + &quot;&lt;br /&gt;&quot;);        // 출력값 --- &quot;최소값: 8&quot;

  var roundNum = Math.round(3.5);
  document.write(&quot;반올림: &quot; + roundNum + &quot;&lt;br /&gt;&quot;);        // 출력값 --- &quot;반올림: 4&quot;

  var ceilNum = Math.ceil(5.1);
  document.write(&quot;소숫점올림: &quot; + ceilNum + &quot;&lt;br /&gt;&quot;);        // 출력값 --- &quot;소숫점 올림: 6&quot;

  var floorNum = Math.floor(10.5);
  document.write(&quot;소숫점내림: &quot; + floornum + &quot;&lt;br /&gt;&quot;);        // 출력값 --- &quot;소숫점 내림: 10&quot;

  var absNum = Math.abs(-10);
  document.write(&quot;절대값: &quot; + absNum + &quot;&lt;br /&gt;&quot;);        // 출력값 --- &quot;절대값: 10&quot;

  var ranNum = Math.random();
  document.write(&quot;0~1 난수: &quot; + ranNum + &quot;&lt;br /&gt;&quot;);
  //]]&gt;
&lt;/script&gt;</code></pre>
<blockquote>
</blockquote>
<p><strong>응용문제</strong>
파일명이 각각 &quot;img1.jpg&quot; / &quot;img2.jpg&quot; / &quot;img3.jpg&quot; 인 이미지들이 접속할 때마다 랜덤으로 출력되도록 만드세요.</p>
<p>응용 문제의 그림 파일명들은, &#39;img&#39;는 공통적이고 뒤에 붙은 숫자만 1~3으로 구분되어 있다. 그러므로 1에서 3까지의 난수를 활용하면 무작위(random) 이미지를 출력할 수 있겠다. 다음의 공식을 이용하면 원하는 숫자 사이에서 난수를 발생시킬 수 있다.</p>
<blockquote>
</blockquote>
<p><strong>random 메서드를 이용해서 원하는 숫자(작은수 ~ 큰수) 사이의 난수값을 도출하는 공식</strong></p>
<pre><code class="language-javascript">Math.floor( Msth.random() * (큰수 - 작은수 + 1) ) + 작은수</code></pre>
<pre><code class="language-javascript">&lt;script type=&quot;text/javascript&quot;&gt;
//&lt;![CDATA[
  var imgNum = Math.floor(Math.random()*3)+1;
  document.write(&quot;&lt;img src = &#39;images/img&quot; + imgNum + &quot;.jpg&#39; alt=&#39;랜덤이미지&#39; /&gt;&quot;);
//]]&gt;
&lt;/script&gt;</code></pre>
<p>위 예제는 난수값 공식을 이용하여 1부터 3까지의 정수가 무작위로 추출되도록 하였다. 랜덤으로 구한 숫자를 이용해 src 경로의 파일명에 숫자 대신 난수가 오도록 변수로 처리한 것이다.</p>
<h2 id="string-객체">String 객체</h2>
<p>아마도 이번 String(문자열) 객체가 내장 객체 중에서는 활용 빈도가 가장 높을 것이다. 앞에서 우리는 이미 문자형 데이터를 변수에 저장하여 사용했다. 그 <strong>문자형 변수도 또한 String 객체</strong>인 것이다. 그러므로 이런 문자형 변수에는 String 객체가 사용할 수 있는 메서드나 속성들을 동일하게 사용할 수 있다. 만약 변수에 숫자를 저장한 후 String 객체에 해당하는 메서드를 사용하면 에러가 발생한다.</p>
<p>그럼 String 객체를 생성하는 방법에 대해 먼저 배운 후, 메서드와 속성의 사용법에 대해 공부해 보자. String 객체도 역시 보편적인 new 연산자를 사용해 생성할 수 있지만, 보다 간편하게 생성할 수도 있다.</p>
<h3 id="보편적인-생성법">보편적인 생성법</h3>
<blockquote>
</blockquote>
<p><strong>기본형식</strong></p>
<pre><code class="language-javascript">var 변수(인스턴스 네임) = new String(&quot;자바스크립트&quot;);</code></pre>
<h3 id="간편한-생성법">간편한 생성법</h3>
<blockquote>
</blockquote>
<p><strong>기본형식</strong></p>
<pre><code class="language-javascript">var 변수(인스턴스 네임) = &quot;자바스크립트&quot;;</code></pre>
<p>당연히 간편하게 생성하는 두 번째 방식을 더 많이 쓸 것이다. 그럼 다음 문자 객체를 사용하여 메서드에 대해 공부해보자.</p>
<pre><code class="language-javascript">var theText = &quot;web js hi ciy&quot;;</code></pre>
<p>위 데이터는 theText라는 변수에 13개의 인덱스로 구분되어 저장된다고 보면 된다. 문자의 공백도 각각 하나의 문자로 인식되므로 데이터의 총 문자수는 13개이며, 각 낱글자별 인덱스 번호는 0부터 부여되므로 &#39;총 문자개수&#39;에서 1을빼면 마지막 인덱스 번호를 구할 수 있다.</p>
<table>
  <caption>theText(변수) // 인덱스번호 : 12</caption>
  <tr>
    <td>0</td>
    <td>1</td>
    <td>2</td>
    <td>3</td>
    <td>4</td>
    <td>5</td>
    <td>6</td>
    <td>7</td>
    <td>8</td>
    <td>9</td>
    <td>10</td>
    <td>11</td>
    <td>12</td>
  </tr>
  <tr>
    <td>w</td>
    <td>e</td>
    <td>b</td>
    <td> </td>
    <td>j</td>
    <td>s</td>
    <td> </td>
    <td>h</td>
    <td>i</td>
    <td> </td>
    <td>c</td>
    <td>i</td>
    <td>y</td>
  </tr>
</table>

<blockquote>
</blockquote>
<p><strong>theText.bold()</strong> --- 텍스트를 진하게 표현하여 반환 // <strong>web js hi ciy</strong>
<strong>theText.link(&quot;URL&quot;)</strong> --- 텍스트에 링크를 걸어 반환 // <a href="#">web js hi ciy</a>
<strong>theText.length</strong> --- 텍스트의 개수를 반환 // 13
<strong>theText.toLowerCase()</strong> --- 영문자를 소문자로 바꿔 반환 // web js hi ciy
<strong>theText.toUpperCase()</strong> --- 영문자를 대문자로 바꿔 반환 // WEB JS HI CIY
<strong>theText.indexOf(&quot;i&quot;)</strong> --- 처음에서부터 &quot;i&quot;를 찾아 최초로 일치하는 인덱스 번호를 반환, 없을 경우 -1을 반환 // 8
<strong>theText.lastIndexOf(&quot;i&quot;)</strong> --- 끝에서부터 &quot;i&quot;를 찾아 최초로 일치하는 인덱스 번호를 반환, 없을 경우 -1을 반환 // 11
<strong>theText.charAt(5)</strong> --- 5번 인덱스에 저장된 문자 데이터를 반환 // s
<strong>theText.substring(4,6)</strong> --- 4번부터 6번 인덱스까지의 문자 데이터를 반환 // js
<strong>theText.substr(10, 3)</strong> --- 10번 인덱스부터 3글자를 반환 // ciy
<strong>theText.replace(&quot;web&quot;, &quot;bye&quot;)</strong> --- 텍스트 중 &quot;web&quot;을 &quot;bye&quot;로 치환(교체)해서 반환 // bye js hi ciy
<strong>theText.slice(7, 9)</strong> --- 7번부터 9번 인덱스까지의 일부만 잘라서 반환 // hi
<strong>theText.concat(&quot;good&quot;)</strong> --- 끝에 &quot;good&quot;이라는 문자를 결합하여 반환 // web js hi ciy good
<strong>theText.split(&quot; &quot;)</strong> --- &quot; &quot;(공백)을 기준으로 데이터를 분리(콤마) // web, js, hi, ciy</p>
<pre><code class="language-javascript">&lt;script type=&quot;text/javascript&quot;&gt;
//&lt;![CDATA[
  document.write(&quot;&lt;h3&gt;문자치환&lt;/h3&gt;&quot;);
  var theText1 = &quot;img2_out.jpg&quot;;            // 문자객체1
  theText1 = theText1.replace(&quot;out&quot;, &quot;over&quot;);
  document.write(theText1 + &quot;&lt;br /&gt;&quot;);

  document.write(&quot;&lt;h3&gt;문자추출&lt;/h3&gt;&quot;);
  var theText2 = &quot;images/img10.jpg&quot;;            // 문자객체2
  theText2 = theText2.split(&quot;/&quot;)[1];            // &quot;img10.jpg&quot;가 theText2에 저장됨
  theText2 = theText2.substring(3);            // &quot;10.jpg&quot;가 theText2에 저장됨
  theText2 = parseInt(theText2);            // &quot;10.jpg&quot;에서 10만 남음
  document.write(theText2 + &quot;&lt;br /&gt;&quot;);            // &#39;10&#39; 출력

  document.write(&quot;&lt;h3&gt;마지막 문자 추출&lt;/h3&gt;&quot;);
  var theText3 = &quot;hello javascript&quot;;            // 문자객체3
  var lastIndex = theText3.length-1;            // 문자개수-1 (마지막 인덱스번호)
  var theText3 = tehText3.charAt(lastIndex);        // 인덱스 번호에 해당하는 문자 반환
  document.write(theText3 + &quot;&lt;br /&gt;&quot;);            // &quot;t&quot;

  document.write(&quot;&lt;h3&gt;특정 문자 포함여부&lt;/h3&gt;&quot;);
  var theText4 = &quot;tel phone noe home&quot;;            // 문자객체4
  var findIndex = theText4.indexOf(&quot;mobile&quot;);        // 문자를 찾아 인덱스 번호 반환
  if(findIndex&lt;0){
    document.write(&quot;텍스트에 찾는 문자가 없습니다.&quot;)
  }else{
    document.write(&quot;텍스트에 찾는 문자가 포함 되어있습니다.&quot;);
  }
//]]&gt;
&lt;/script&gt;</code></pre>
<blockquote>
</blockquote>
<p><strong>출력화면</strong></p>
<h3 id="문자치환">문자치환</h3>
<p>img2_over.jpg</p>
<h3 id="문자추출">문자추출</h3>
<p>10</p>
<h3 id="마지막-문자-추출">마지막 문자 추출</h3>
<p>t</p>
<h3 id="특정-문자-포함여부">특정 문자 포함여부</h3>
<p>텍스트에 찾는 문자가 없습니다.</p>
<ul>
<li>replace 메서드를 이용하여 문자열 중 &#39;out&#39;을 &#39;over&#39;로 치환하였다.</li>
<li>split 메서드를 사용하여 문자열을 나누면, 데이터들이 [0,1,2...]의 순서로 인덱스된 공간에 각각 저장된다. 바로 뒤에서 공부할 &#39;배열&#39;이라는 개념으로, 변수 하나에 여러 데이터를 순서대로 나눠 저장하는 것이다. 즉 여기서는 &#39;images/img01.jpg&#39;이라는 문자열이 슬래쉬(/)를 기준으로 나뉘면서 배열[0]에는 &#39;images&#39;가, 배열[1]에는 &#39;img10.jpg&#39;가 각각 저장된 것이다. 결국, 예제의 split 실행문(theText2 = theText.split(&quot;/&quot;)[1];)의 마지막 [1]이란 이렇게 둘로 나뉜 배열공간 0번과 1번 중에서 두 번째 [1] 공간을 의미한다.
  정리하면, 원래 &#39;images/img10.jpg&#39;이던 theText2 변수내용 중 &#39;img10.jpg&#39; 부분만 남긴 것이다. 그 후 substring 메서드를 이용하여 &#39;img10.jpg&#39;이라는 문자열의 3번 인덱스부터 끝까지의 문자만(10.jpg) 남기고, 마지막으로 뒤에서 다룰 parseInt 메서드를 사용하며 정수만(10) 남았다.</li>
<li>문자열에서 마지막 문자를 추출하기 위해 마지막 인덱스 번호를 &#39;문자개수-1&#39;을 이용하여 구하고, charAt 메서드를 이용해 해당 인덱스 번호의 문자를 구했다.</li>
<li>indexOf 메서드를 이용하면 찾는 문자가 있을 경우에는 해당 인덱스 번호를, 찾는 문자가 없을 때에는 &#39;-1&#39;을 반환하므로 if 조건문을 활용해 문자로 출력되도록 했다.</li>
</ul>
<p>위 예제 중 &#39;문자치환&#39; 예제는 보통 웹 페이지 내의 &#39;버튼 이미지&#39;를 바꿀 때에 많이 사용되며, &#39;문자추출&#39; 예제는 요소의 속성값을 가져와 그 숫자를 활용할 경우에 많이 사용된다.</p>
<p>그리고 마지막에 쓰인 <strong>indexOf 메서드</strong>의 경우에는 <strong>찾는 문자의 인덱스 번호를 반환하기도 하지만 찾는 문자가 포함되어 있는지 여부를 알아볼 때에도 많이 사용</strong>된다. 찾는 문자가 있을 때는 좌측에서부터 검색된 문자의 인덱스 번호를 반환하지만 찾는 문자가 없을 때는 &#39;-1&#39;이란 값을 반환한다. 그러므로 indexOf로 찾은 문자의 인덱스 번호가 0보다 작다는 것은 찾는 문자가 없다는 것이다.</p>
<h2 id="array-객체">Array 객체</h2>
<p>우리는 지금까지 여러 차례 변수 선언을 통해 데이터를 저장해 보았다. 지금까지의 방법을는 반드시 한 번에 한 개의 데이터만 저장되었다. 가령 &#39;10&#39;은 지워지고 새로운 &#39;100&#39;이 저장되듯이 말이다.</p>
<p>하지만 <strong>&#39;배열(Array)&#39;</strong> 을 이용하면 <strong>하나의 변수에 여러 개의 데이터를 저장</strong>할 수 있다. 하나의 변수에 여러 개의 공간으로 이뤄진 &#39;배열 객체&#39;를 대입하여 저장하므로, <strong>각 공간마다</strong>의 <strong>인덱스(Index) 번호</strong>가 존재하며 우리는 그 인덱스 번호를 사용해 각각의 공간에 저장된 여러 데이터들을 불러올 수 있는 것이다. &#39;배열 객체&#39;를 쉽게 &#39;서랍장&#39;이라고 생각해보자.</p>
<p>그럼 변수에 여러 개의 데이터를 저장하는 &#39;배열 객체&#39;를 어떻게 생성하는지 보자.</p>
<h3 id="new-연산자를-사용한-배열-객체-생성법">new 연산자를 사용한 배열 객체 생성법</h3>
<blockquote>
</blockquote>
<p><strong>기본형식</strong></p>
<pre><code class="language-javascript">var 변수(인스턴스 네임) = new Array();</code></pre>
<p>위 기본형식은 &quot;변수야, 이제 여러 개의 값을 저장해도 돼!&quot;라는 뜻으로 이해하면 된다.
이제, 변수에 인덱스 번호를 지정하여 직접 나눠서 저장할 수 있다.</p>
<blockquote>
</blockquote>
<p><strong>기본형식</strong>
변수[0] = &quot;값1&quot;
변수[1] = &quot;값2&quot;
변수[2] = &quot;값3&quot;
변수[3] = &quot;값4&quot;
변수[4] = &quot;값5&quot;</p>
<h3 id="저장-공간을-지정한-배열-객체-생성법">저장 공간을 지정한 배열 객체 생성법</h3>
<blockquote>
</blockquote>
<p><strong>기본형식</strong></p>
<pre><code class="language-javascript">var 변수(인스턴스 네임) = new Array(5);</code></pre>
<p>새 배열 객체를 생성하며 &#39;5&#39;라는 숫자를 넣었다. 이는 데이터를 5개만 저장할 수 있도록 총 5개의 저장 공간을 두겠다는 뜻이다. 즉, &quot;전체 공간을 5개로 나눠서 총 5개의 데이터만 저장하라&quot;는 말로 이해하면 된다.</p>
<h3 id="편리한-배열-객체-생성법">편리한 배열 객체 생성법</h3>
<blockquote>
</blockquote>
<p><strong>기본형식</strong></p>
<pre><code class="language-javascript">var 변수(인스턴스 네임) = [값1, 값2, 값3, 값4, 값5]</code></pre>
<p>이와 같이 new 연산자를 사용하징 않고 변수에 여러 개의 값을 저장하는 방법들이 있다. 많은 사람들이 이 방식을 선호한다.</p>
<p>그럼 다음 예제를 통하여 배열 객체에 데이터를 저장하는 방법과 출력하느 방법을 실습해보자.</p>
<pre><code class="language-javascript">&lt;script type=&quot;text/javascript&quot;&gt;
//&lt;![CDATA[
  // 1. 특정 인덱스에 저장된 데이터 출력
  var name = new Array();
name[0] = &quot;홍길동&quot;;
name[1] = &quot;임꺽정&quot;;
name[2] = &quot;아무개&quot;;
name[3] = &quot;전우치&quot;;
name[4] = &quot;이도령&quot;;
document.write(name[3] + &quot;&lt;br /&gt;&quot;); // 3번 인덱스에 저장된 데이터를 출력

// 2. 오늘읜 요일 알아보기
var days = new Array(&quot;일&quot;, &quot;월&quot;, &quot;화&quot;, &quot;수&quot;, &quot;목&quot;, &quot;금&quot;, &quot;토&quot;);
var today = new Date();
var yoil = days[today.getDay()]; // 오늘의 요일에 해당하는 값을 반환 일:0 ~ 토:6
document.write(yoil + &quot;요일 &lt;br /&gt;&quot;); // 오늘의 요일 반환

// 3. 전체 재산의 합 구하기
var money = [100, 100, 200, 50];
var theLen = money.length;
var total = 0;
for(var i=0; i&lt;thLen; i++){
  total = total + money[i];
}
document.write(total);
//]]&gt;
&lt;/script&gt;</code></pre>
<p>예제와 같이 오늘의 요일을 출력하고 싶을 때에는 먼저 요일에 대한 문자 데이터를 &#39;일요일 ~ 토요일&#39;의 순서로 배열하고, 날짜 객체로 오늘의 요일에 해당하는 인덱스 값을 구한다. 이후 그에 맞는 문자 데이터를 배열 인덱스에서 받으면 요일을 문자로 출력할 수 있다.</p>
<p>전체 재산의 합 구하기의 경우는, 저장된 배열개수가 4개이므로 최초 &#39;0&#39;으로 설정도니 total 변수를 지정하여 하나씩 차례대로 더하되 for 문을 사용하여 0부터 총 배열개수(theLen)보다 작은 인덱스 번호의 데이터들만 더하도록 한 것이다. 결국 실행문은 인덱스 0번부터 3번까지의 데이터를 total 변수에 누적하여 합산하게 된다. 그 최종 저장값을 출력했다.</p>
<h3 id="배열-메서드">배열 메서드</h3>
<blockquote>
</blockquote>
<p><strong>reverse()</strong> --- 배열 데이터를 역순으로 반환
<strong>slice(번호1, 번호2)</strong> --- 인덱스 번호 1부터 시작하여 직전의 데이터까지 잘라서 저장
<strong>sort()</strong> --- 배열 데이터를 알파벳 혹은 0/1/2..의 오름차순을 정렬
<strong>join(&quot;구분자&quot;)</strong> --- 배열 데이터를 구분자로 연결하여 결합
<strong>concat()</strong> --- 여러 개의 배열 데이터들을 하나로 결합</p>
<h3 id="배열-데이터-추가삭제-메서드">배열 데이터 추가/삭제 메서드</h3>
<blockquote>
</blockquote>
<p><strong>shift();</strong> --- 배열에서 첫 인덱스(0)에 저장된 데이터를 삭제
<strong>pop();</strong> --- 배열에서 마지막 인덱스에 저장된 데이터를 삭제
<strong>unshift(값);</strong> --- 배열에서 첫 인덱스(0)에 새 데이터를 중첩하여 추가
<strong>push(값);</strong> --- 배열에서 마지막 인덱스에 새 데이터를 중첩하여 추가
<strong>concat()</strong> --- 여러 개의 배열 데이터들을 하나로 결합</p>
<pre><code class="language-javascript">&lt;script type=&quot;text/javascript&quot;&gt;
//&lt;![CDATA[
  // 1. reverse() - 배열 데이터 역순 정렬
  var theFood = [&quot;짜장면&quot;, &quot;냉면&quot;, &quot;갈비탕&quot;, &quot;돈까스&quot;, &quot;삼겹살&quot;];
  theFood.reverse();
  console.log(theFood)
  // 출력값 : [ &quot;삼겹살&quot;, &quot;돈까스&quot;, &quot;갈비탕&quot;, &quot;냉면&quot;, &quot;짜장면&quot; ]

  // 2. sort() - 배열 데이터 오름차순 정렬
  var theSubway = [&quot;2호선&quot;, &quot;9호선&quot;, &quot;7호선&quot;, &quot;4호선&quot;, &quot;3호선&quot;];
  theSubway.sort();
  console.log(theSubway);
  // 출력값 : [ &quot;2호선&quot;, &quot;3호선&quot;, &quot;4호선&quot;, &quot;7호선&quot;, &quot;9호선&quot; ]

  // 3. concat() - 배열된 데이터를 결합
  var Mountain1 = [&quot;남산&quot;, &quot;도봉산&quot;, &quot;관악산&quot;, &quot;청계산&quot;, &quot;북한산&quot;];
  var Mountain2 = [&quot;설악산&quot;, &quot;지리산&quot;, &quot;한라산&quot;, &quot;속리산&quot;];
  var joinResult = Mountain1.concat(Mountain2);
  console.log(joinResult);
  // 출력값 : [ &quot;남산&quot;, &quot;도봉산&quot;, &quot; 관악산&quot;, &quot;청계산&quot;, &quot;북한산&quot;, &quot;설악산&quot;, &quot;지리산&quot;, &quot;한라산&quot;, &quot;속리산&quot; ]

  // 4. slice(시작 인덱스, 마지막 인덱스) - 원하는 데이터만 선택
  var theName = [&quot;최준호&quot;, &quot;이성은&quot;, &quot;기오정&quot;, &quot;김민경&quot;, &quot;정예선&quot;];
  var result = theName.slice(2, 4);
  console.log(result);
  // 출력값 : [ &quot;기오정&quot;, &quot;김민경&quot; ]

  // 5. join(&quot;구분자&quot;) - 구분자 기분으로 데이터를 합친다.
  var theProduct = [&quot;냉장고&quot;, &quot;컴퓨터&quot;, &quot;선풍기&quot;, &quot;밥솥&quot;, &quot;핸드폰&quot;];
  var joinResult = theProduct.join(&quot;-&quot;);
  console.log(joinResult);
  // 냉장고 - 컴퓨터 - 선풍기 - 밥솥 - 핸드폰

//]]&gt;
&lt;/script&gt;</code></pre>
<ul>
<li>reverse()를 이용하여 배열에 저장된 데이터를 역순으로 바꾼다.</li>
<li>sort()를 이용하여 배열에 저장된 데이터를 오름차순으로 정렬한다.</li>
<li>concat()를 이용하여 Mountain1과 Mountain2 배열을 하나로 합쳐 새로운 배열로 생성한 후 joinResult에 저장한다.</li>
<li>slice()를 이용하여 배열에 저장된 데이터 중 2번 인덱스(기오정)부터 4번 인덱스 직전, 즉 3번 인덱스(김민경)까지 잘라서 새로운 배열로 생성한 후 result에 저장한다.</li>
<li>join()을 이용하여 배열에 저장된 데이터를 구분자(-)로 연결하여 하나의 데이터로 새로 생성 후 joinResult에 저장한다.</li>
</ul>
<pre><code class="language-javascript">&lt;script type=&quot;text/javascript&quot;&gt;
//&lt;![CDATA[
  var theSubway = [&quot;2호선&quot;, &quot;9호선&quot;, &quot;7호선&quot;, &quot;4호선&quot;, &quot;3호선&quot;];
  var newLine1 = &quot;1호선&quot;;
  var newLine2 = &quot;분당선&quot;;

  theSubway.shift();            // 맨 앞(0번 인덱스)의 데이터 삭제
  console.log(theSubway)
  // 출력값 : [ &quot;9호선&quot;, &quot;7호선&quot;, &quot;4호선&quot;, &quot;3호선&quot; ]

  theSubway.unshift(newLine1);        // 맨 앞(0번 인덱스)의 데이터 추가(변경)
  console.log(theSubway)
  // 출력값 : [ &quot;1호선&quot;, &quot;9호선&quot;, &quot;7호선&quot;, &quot;4호선&quot;, &quot;3호선&quot; ]

  theSubway.pop();            // 마지막 (4번 인덱스)의 데이터 삭제
  console.log(theSubway)
  // 출력값 : [ &quot;1호선&quot;, &quot;9호선&quot;, &quot;7호선&quot;, &quot;4호선&quot; ]

  theSubway.push(newLine2);        // 마지막(4번 인덱스)의 데이터 추가(변경)
  console,log(theSubway)
  // 출력값 : [ &quot;1호선&quot;, &quot;9호선&quot;, &quot;7호선&quot;, &quot;4호선&quot;, &quot;분당선&quot; ]
//]]&gt;
&lt;/script&gt;</code></pre>
<p>&#39;데이터 추가&#39;의 역할을 하는 unshift와 push을 혼동하기 쉬운데, <strong>이들의 &#39;추가&#39;란 결국 &#39;중첩/변경&#39;</strong> 과도 같아서 다음과 같이 작동한다.
현재 theSubway라는 변수에는 [&quot;2호선&quot;, &quot;9호선&quot;, &quot;7호선&quot;, &quot;4호선&#39;, &quot;3호선&quot;]의 순서대로 인덱스 번호 0에서 4까지 구성된 배열 객체가 생성되었는데, 이때 unshift 메서드를 이용해 새로 지정된 newLine1 변수의 값 &quot;1호선&quot;&#39;을 &#39;추가&#39;해주면, 원래 theSubway 변수의 배열 데이터 0번인 &quot;2호선&quot;을 뒤로 밀고 앞으로 추가되어 [&quot;1호선&quot;, &quot;2호선&quot;, ...] 순으로 재정렬 되는 것이 아니라 &quot;2호선&quot;이란 데이터를 &quot;1호선&quot;으로 씌우게 되는 것이다. 결국, [&quot;1호선&quot;, &quot;9호선&quot;, &quot;7호선&quot;, &quot;4호선&quot;, &quot;3호선&quot;]의 순서로 다시 정렬되는 것이다. push의 역할도 마찬가지로서, &#39;추가&#39;라는 개념의 의미를 정확히 알아야 한다.</p>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />


]]></description>
        </item>
        <item>
            <title><![CDATA[Javascript_제어문(조건문, switch~case문, 반복문)]]></title>
            <link>https://velog.io/@jay_kimjh/Javascript%EC%A0%9C%EC%96%B4%EB%AC%B8%EC%A1%B0%EA%B1%B4%EB%AC%B8-switchcase%EB%AC%B8-%EB%B0%98%EB%B3%B5%EB%AC%B8</link>
            <guid>https://velog.io/@jay_kimjh/Javascript%EC%A0%9C%EC%96%B4%EB%AC%B8%EC%A1%B0%EA%B1%B4%EB%AC%B8-switchcase%EB%AC%B8-%EB%B0%98%EB%B3%B5%EB%AC%B8</guid>
            <pubDate>Tue, 25 Jan 2022 09:30:44 GMT</pubDate>
            <description><![CDATA[<p>※ 본 포스팅은 책『실전 프로젝트 반응형 웹 퍼블리싱』을 바탕으로 작성하였음</p>
<h1 id="제어문">제어문</h1>
<h2 id="조건문">조건문</h2>
<p><strong>조건문</strong>은 <strong>조건식을 만족(true)했을 때에만 실행문을 수행</strong>하는 제어문이다.</p>
<h3 id="if-문">if 문</h3>
<p><strong>조건식을 만족</strong>할 경우 중괄호({}) 내의 <strong>실행문을 수행</strong>한다.</p>
<blockquote>
</blockquote>
<p><strong>기본형식</strong>
<span style="background-color : #ffffb5;">if(조건식) {
  실행문;
}</span></p>
<p>다음 예제는 나이가 20세 이상일 경우에만 &quot;당신은 성인입니다&quot;라고 출력한다.</p>
<pre><code class="language-javascript">&lt;script type=&quot;text/javascript&quot;&gt;
//&lt;![CDATA[
  var myAge = 25;
  if(myAge &gt;= 20){                    // myAge 변수값이 25이므로 현재 조건식을 만족(true)함.
    document.write(&quot;당신은 성인입니다.&quot;);            // 출력값 : &quot;당신은 성인입니다.&quot;
  }
//]]&gt;
&lt;/script&gt;</code></pre>
<blockquote>
</blockquote>
<p><strong>응용문제</strong>
prompt를 이용해서 임의로 정한 변수에 시험 점수를 입력 받아 저장한 후, 만일 70점보다 크거나 같으면 &#39;합격&#39;이라는 메시지를 출력한다.</p>
<pre><code class="language-javascript">&lt;script type=&quot;text/javascript&quot;&gt;
//&lt;![CDATA[
  var testNum = prompt(&quot;시험 점수를 입력하세요.&quot;);
  if(testNum &gt;= 70){            // 시험 점수가 70점 이상일 경우에만 조건을 만족(true)함
    document.write(&quot;합격입니다~!!&quot;);
  }
//]]&gt;
&lt;/script&gt;</code></pre>
<h3 id="ifelse-문">if~else 문</h3>
<p><strong>조건식을 만족(true)</strong>했을 때에는 <strong>if 문의 중괄호에 든 실행문1을 수행</strong>하며, <strong>그렇지 않은(false) 경우</strong>라면 <strong>else 문의 중괄호 안에 든 실행문2를 수행</strong>합니다. 그러므로 <strong>출력 결과가 2가지일 경우</strong>에 사용한다. 가령 &quot;합격&quot; 또는 &quot;불합격&quot;을 출력하거나 &quot;성인&quot; 또는 &quot;미성년자&quot;와 같이 2가지 경우에 따른 결과를 각각 출력하고자 할 때에 사용한다.</p>
<blockquote>
</blockquote>
<p><strong>기본형식</strong>
<span style="background-color : #ffffb5;">if(조건식) {
  실행문1;
}else{
  실행문2;
}</span></p>
<p>다음 예제는 나이가 20세 이상이고, 30세 미만일 경우에는 &quot;통과&quot;라고 출력한다. 그밖에 만족하지 않는 경우라면 &quot;비통과&quot;라고 출력하는 if~else 문의 예제이다.</p>
<p>이 경우에 생각해 볼 수 있는 조건문 구조는 다음과 같다.</p>
<blockquote>
<blockquote>
</blockquote>
<p>myAge &gt;= 20 --- 20세 이상</p>
<blockquote>
<blockquote>
<p>&amp;&amp;</p>
</blockquote>
</blockquote>
<p>myAge &lt; 30 --- 30세 미만</p>
<blockquote>
</blockquote>
<p>→ true → &quot;통과&quot; // → false → &quot;비통과&quot; </p>
</blockquote>
<pre><code class="language-javascript">&lt;script type=&quot;text/javascript&quot;&gt;
//&lt;![CDATA[
  var myAge = 33;
  if(myAge &gt;= 20 &amp;&amp; myAge &lt; 30){        //20세 이상이고 30세 미만일 때 실행
    document.write(&quot;통과&quot;);
  }else{                    // 조건을 만족하지 않을 때 실행
    document.write(&quot;비통과&quot;);
  }
//]]&gt;
&lt;/script&gt;</code></pre>
<p>앞에서의 예제는 나이(myAge)의 값에 따라 &quot;통과&quot; 또는 &quot;비통과&quot;라는 2가지 결과가 출력되는데, 나이(myAge)변수에 33이 저장되어 있으므로 조건을 만족하지 못하여 else문이 실행되어 &quot;비통과&quot;가 출력된다.</p>
<h3 id="if--else-if-문">if ~ else if 문</h3>
<p>맨 위에서 지정한 <strong>조건식 1부터 아래로 내려가면서 순서대로 조건식 검사를 수행</strong>한다. 만일 조건식 검사를 하다가 조건식 2에서 <strong>만족하게 되면</strong> 그 중괄호({})에 든 실행문2를 수행하며 <strong>조건문 검사를 마친다.</strong></p>
<p>하지만 만약 <strong>조건식을 모두 만족하지 못하면 마지막 else 문 중괄호 내에 기술된 실행문4를 수행</strong>한다. 그러므로 이 형식의 조건문은 <strong>출력 결과가 3가지 이상일 경우</strong>에 사용한다</p>
<blockquote>
</blockquote>
<p><strong>기본형식</strong>
<span style="background-color : #ffffb5;">if(조건식1) {
  실행문1;
}else if(조건식2){
  실행문2;
}else if(조건식3){
  실행문3;
}else{
  실행문4;
}</span></p>
<p>이제, 학점(num)이 90점 이상이면 &quot;A학점&quot;, 80점 이상이면 &quot;B학점&quot;, 70점 이상이면 &quot;C학점&quot;, 60점 이상이면 &quot;D학점&quot;, 그밖에 60점 미만이면 &quot;F학점&quot;이 출력되는 성적 프로그램을 만들어 보자.(단, 학점(num)이 75점이라 가정하여 작성하자.)</p>
<pre><code>&lt;script type=&quot;text/javascript&quot;&gt;
//&lt;![CDATA[
  var num=75;
  if(num &gt;= 90){            // 90점 이상일 경우
    document.write(&quot;A학점&quot;);
  }else if(num &gt;= 80){            // 80점 이상일 경우
    document.write(&quot;B학점&quot;);
  }else if(num &gt;= 70){            // 70점 이상일 경우
    document.write(&quot;C학점&quot;);
  }else if(num &gt;= 60){            //60점 이상일 경우
    document.write(&quot;D학점&quot;);
  }else{                // 60점 미만일 경우
    document.write(&quot;F학점&quot;);
  }
//]]&gt;
&lt;/script&gt;</code></pre><h2 id="switch--case-문">switch ~ case 문</h2>
<p><strong>switch ~ case 문</strong>은 <strong>지정한 변수에 저장된 데이터(data)와 정확히 일치되는 경우(case)가 있는지 검사</strong>하여 <strong>일치하는 데이터가 있을 때</strong>에는 <strong>해당 실행문을 수행한 뒤 마지막의 break 문으로 반복을 끝</strong>낸다. 하지만 <strong>일치되는 값이 없을 때</strong>에는 <strong>default에 해당하는 실행문을 수행한 뒤 문장을 마치게</strong> 된다.</p>
<blockquote>
</blockquote>
<p><strong>기본형식</strong>
<span style="background-color : #ffffb5;">num = 3;
switch(num){
  case 1 :
    실행문1;
    break;
  case 2 :
    실행문2;
    break;
  case 3 :
    실행문3;
    break;
  default :
    실행문4;
}</span></p>
<p>위의 기본형식에서 변수 num의 값은 3이므로, switch 문에서 num에 저장된 데이터(3)와 일치하는 case문이 있는지 검사한다. case 3의 경우 num에 저장된 데이터와 일치하므로 실행문3을 수행할 것이다. 이후 break 문을 만나서 switch 문을 마치게 되는 것이다.</p>
<p><strong>그렇다면 조건문과 switch ~ case 문은 무엇이 다른 것일까?</strong></p>
<p>조건문은 말 그대로 &#39;데이터 중복&#39;의 경우라 하더라도 특정 &#39;조건&#39;을 허용할 때 사용하는 반면, switch ~ case 문은 &#39;정확히 일치하는&#39; 경우(case)만 허용할 때 사용한다.</p>
<p>예를 들면 &#39;A&gt;=90&#39;인 경우, 즉 &#39;A가 90 이상&#39;이라는 조건 하에서는 A가 91이나 95일 경우 언제든 만족하겠다. 하지만 switch ~ case 문은 데이터의 중복이 허용되지 않는다. 즉, 정확히 일치하는 데이터가 있을 경우(case)에만 만족하게 되는 것이다.</p>
<p>다음은 응답창(prompt) 기능을 이용하여 지역(서울, 경기, 부산)을 입력한 후에 해당 지역번호를 출력하는 예제이다.</p>
<pre><code class="language-javascript">&lt;script type=&quot;text/javascript&quot;&gt;
//&lt;![CDATA[
  var myArea = prompt(&quot;지역을 입력하세요&quot;, &quot;서울&quot;);
  switch(myArea){
    case &quot;서울&quot; :            // myArea = &quot;서울&quot;인 경우
      areaNum = &quot;02&quot;;
      break;
    case &quot;경기&quot; :            // myArea = &quot;경기&quot;인 경우
      areaNum = &quot;031&quot;;
      break;
    case &quot;부산&quot; :            // myArea = &quot;부산&quot;인 경우
      areaNum = &quot;051&quot;;
      break;
    default :                // 위에 해당되는 지역이 없을 경우
      alert(&quot;등록되지 않은 지역입니다&quot;);
  }
  document.write(myArea + &quot;의 지역번호는 &quot; + areaNum);
//]]&gt;
&lt;/script&gt;</code></pre>
<h2 id="반복문">반복문</h2>
<p><strong>반복문</strong>은 해당 <strong>조건식을 만족하는 동안 중괄호({}) 안의 실행문을 반복적으로 수행</strong>한다. 만약 1붜 10까지 그냥 출력한다면 출력문(document.write())을 이용해서 1에서 10까지 총 10번이나 작성을 해야겠지만, 반복문을 이용하면 이런 번거로움을 줄일 수 있다.</p>
<p>반복문에는 <strong>&#39;while 문&#39;</strong>과 <strong>&#39;for 문&#39;</strong>으로 2가지 종류가 있다. 이 2가지의 문법은 비슷하지만 실무에서는 보통 &#39;while&#39;문 보다 &#39;for&#39;문을 더 많이 사용하는 편이다.</p>
<h3 id="while문">while문</h3>
<p>while은 &#39;~하는 동안&#39;이라는 뜻의 접속사다. 즉, <strong>특정 조건식을 만족하는 동안</strong>에 지정된 실행문을 반복적으로 수행하게 된다. 그 기본형식은 다음과 같다.</p>
<blockquote>
</blockquote>
<p><strong>기본형식</strong>
<span style="background-color : #ffffb5;">num = 3;
var i = 초기값;
while(조건식){
 실행문;
 증감식;
}</span>
<strong>[예]</strong>
var i = 1;
while(i&lt;=10){
  document.write(i+&quot;<code>&lt;br /&gt;</code>&quot;);
  i++;
}</p>
<ul>
<li><strong>[예]</strong>에서 변수 i에 지정된 초기값은 1이며 while에서 조건식을 검사한다.</li>
<li>&#39;i=1&#39;이라는 초기 변수값 지정은 조건식을 만족하므로 중괄호({})의 실행문을 수행하여 1을 출력하고, <code>&lt;br /&gt;</code>로 개행(줄바꿈)이 작동하겠다.</li>
<li>그 다음에 기술된 증감식(i++)에 의하여 i값은 1만큼 증가하여 2가 된다.</li>
<li>중괄호 ({})의 마지막 실행문을 마친 후에는 다시 while문 조건식 검사를 반복한다. 역시 &#39;i=2&#39;가 된 상태로 조건을 만족하므로 실행문을 수행하면 2가 출력되고, 개행이 된다.</li>
<li>그리고 역시 마지막 증감식을 만나면서 i값은 1만큼 증가하여 3이 된다.</li>
</ul>
<p>이렇게 반복하다 보면 i값이 11이 되어 while 문의 조건식(i &lt;= 10, i가 10 이하)을 만족하지 못하게 되고, while 문은 반복을 멈추게 된다. 다음은 위 &lt;예&gt;의 출력 결과이다.</p>
<blockquote>
</blockquote>
<p>1
2
3
4
5
6
7
8
9
10</p>
<blockquote>
</blockquote>
<p><strong>응용문제</strong>
10부터 1까지 내림차순으로 2의 배수(짝수)만 출력해 보세요.
10, 8, 6, 4, 2</p>
<p>여기서 반복문의 조건은 &#39;10과 1 사이에 있는 2의 배수들&#39;이므로 초기값은 10이 되겠다. 또한 1까지의 &#39;내림차순&#39;이 필요하므로 조건식은 &#39;1보다 크거나 같다(i&gt;=1)&#39;가 되고 마지막 증감식으로는 1씩 줄어드는 감소 연산자(i--)가 적당하겠다.</p>
<p>한 가지 주의할 점은, &#39;2의 배수만 출력하라&#39;는 조건의 구현인데, 여기서는 출력 시 &#39;2로 나누었을 때 나머지가 0일 경우(i%2==0)&#39;를 if조건문으로 덧붙여주면 되겠다.</p>
<pre><code class="language-javascript">//&lt;![CDATA[
  var i = 10;                    // 초기값

  while(i&gt;=1){                    // 조건식
    if(i%2 == 0) document.write(i+&quot;&lt;br /&gt;&quot;);    //2의 배수일 경우에만 출력
    i--;
  }
//]]&gt;
&lt;/script&gt;</code></pre>
<h3 id="for-문">for 문</h3>
<p>for 문 역시 while 문과 비슷하지만 간단한 기술 방식으로 사용 빈도가 더 높은 편이다.</p>
<blockquote>
</blockquote>
<p><strong>기본형식</strong>
<span style="background-color : #ffffb5;">
for(var k=초기값; 조건식; 증감식){
  실행문;
}</span>
<strong>[예]</strong>
for(var k=1; k&lt;=10; k++){
  document.write(k+&quot;<br />&quot;);
}</p>
<p>위 <strong>[예]</strong>의 결과는 다음 순서대로 진행되어 1에서 10까지 순서대로 출력하게 된다.</p>
<ul>
<li>k의 초기값 1은 10보다 작으므로 조건식 만족</li>
<li>실행문을 수행하여 초기값인 1을 출력</li>
<li>증감식으로 1이 증가한 2를 변수 k에 새로 저장</li>
<li>k값이 여전히 10보다 작으므로 역시 조건식 만족</li>
<li>실행문을 수행하여 현재 저장값인 2를 출력</li>
<li>증감ㅁ식으로 다시 1이 증가된 3이 k값으로 저장
  이렇게 k값이 증가하다가 11이 되면 조건을 만족하지 않으므로 반복문을 종료하게 됨</li>
</ul>
<blockquote>
</blockquote>
<p><strong>응용문제</strong>
<strong>&lt;HTML 태그 중 일부를 변수로 작동하기&gt;</strong>
<code>&lt;h&gt;</code>태그를 사용하여 다음과 같이 출력하시오.</p>
<h6>h6 재미있는 자바스크립트</h6>
<h5>h5 재미있는 자바스크립트</h5>
<h4>h4 재미있는 자바스크립트</h4>
<h3>h3 재미있는 자바스크립트</h3>
<h2>h2 재미있는 자바스크립트</h2>
<h1>h1 재미있는 자바스크립트</h1>

<p>우선 생각해 볼 수 있는 것은 <code>&lt;h*&gt;</code>라는 태그가 작동하게 한 뒤, *에 해당하는 값을 변수로 하여 6에서 1까지 줄어가는 방법일 것이다. 다음 코드를 살펴보자.</p>
<pre><code class="language-javascript">&lt;script type=&quot;text/javascript&quot;&gt;
//&lt;![CDATA[
  for(ver k = 6; k &gt;= 1; k--){
    document.write(&quot;&lt;h&quot;+ k + &quot;&gt;h&quot; + k + &quot; 재미있는 자바 스크립트&lt;/h&quot; + k + &quot;&gt;&quot;);
  }
//]]&gt;
&lt;/script&gt;</code></pre>
<p>h6에서 h1까지이므로 변수 k의 초기값은 6이며, k값이 1까지 구현된어야 하므로 조건식은 &#39;k가 1보다 크거나 같다(k &gt;= 1)&#39;가 된다. 또한 감소 연산자를 사용한 증감식이 필요하다.</p>
<blockquote>
</blockquote>
<p><strong>태그가 들어간 실행문 작성법</strong></p>
<ul>
<li>위 반복문의 실행문이 복잡할 경우, 먼저 다음과 같이 출력해야 할 문장의 원형을 먼저 작성해보자
document.write(&quot;<code>&lt;h6&gt;h6 재미있는 자바스크립트&lt;/h6&gt;</code>&quot;);</li>
<li>그런데 출력 대상인 따옴표(&quot;&quot;) 안의 내용 중 숫자 6은 반복적으로 감소하는 임의의 변수가 될 부분이므로 &#39;변수와 나머지&#39;로 분리하면 다음과 같다.
&lt;h || k || &gt;h || k || 재미있는 자바스크립트&lt;/h || k || &gt;</li>
<li>이제, 따옴표 없이 &#39;변수&#39;로 인식될 k를 제외한 나머지 영역을 각각 문자열(&quot;&quot;)로 묶어 +(문자 결합) 시켜주면 괄호() 안의 내용은 다음과 같이 정리된다.
document.write(&quot;&lt;h&quot; + k + &quot;&gt;h&quot; + k + &quot; 재미있는 자바스크립트&lt;/h&quot; + k + &quot;&gt;&quot;);</li>
</ul>
<blockquote>
</blockquote>
<p><strong>응용문제</strong>
다음과 같이 구구단 중 2단을 출력하시오
2단
2X1=2
2X2=4
...
2X9=18</p>
<pre><code class="language-javascript">&lt;script type=&quot;&quot;text/javascript&quot;&gt;
//&lt;![CDATA[
  var result;
  var dan=2;
  document.write(&quot;&lt;h1&gt;&quot;+dan+&quot;단&lt;/h1&gt;&quot;);
  for(var k=1; k&lt;=9; k++){
    result = k * dan;
    document.write(&quot;2X&quot; + k + &quot;=&quot; + result + &quot;&lt;br /&gt;&quot;);
  }
//]]&gt;</code></pre>
<blockquote>
</blockquote>
<h2 id="2단">2단</h2>
<p>2X1=2
2X2=4
2X3=6
2X4=8
2X5=10
2X6=12
2X7=14
2X8=16
2X9=18</p>
<ul>
<li>구구단 결과값을 저장할 result 변수를 선언했다. 구구단 중 단수를 dan이라는 변수에 저장하였다.</li>
<li>단수를 h1태그를 사용하여 출력하였다.</li>
<li>for 문을 이용하여 k값이 1부터 9까지 증가하도록 하였다.</li>
<li>단수(dan)에 k(증가변수)값을 곱한 결과값을 result에 다시 저장한다.</li>
<li>출력문을 이용하여 출력하고 <code>&lt;br/&gt;</code>태그를 사용해 개행한다.</li>
</ul>
<h3 id="2중-for문">2중 for문</h3>
<blockquote>
</blockquote>
<p><strong>응용문제</strong>
<strong>&lt;구구단을 출력하시오&gt;</strong>
prompt 메서드를 활용하여 2단부터 9단까지의 구구단을 순차적으로 출력해 보시오</p>
<pre><code class="language-javascript">
&lt;script type=&quot;text/javascript&quot;&gt;
//&lt;![CDATA[
  for(var k = 2; k &lt;= 9; k++){
    document.write(&quot;&lt;h1&gt;&quot;+k+&quot;단&lt;/h1&gt;&quot;);
    for(var m=1; m&lt;=9; m++){
      document.write(k+&quot;X&quot;+m+&quot;=&quot;+(k*m)+&quot;&lt;br /&gt;&quot;);
    }
  }
//]]&gt;
&lt;/script&gt;</code></pre>
<ul>
<li>바깥 for 문이 한번 실행할 때 안쪽 for 문은 1부터 9까지 9번 실행한다. 즉, k가 한단을 출력할 때마다 안쪽 for문은 1부터 9까지 곱해주는 역할을 하는 것이다.</li>
<li>바깥 for 문에서는 제목(*단)이 출력되고, 안쪽 for문에서는 구구단이 출력된다. 한 단 출력이 모두 끝나면(m이 1에서 9까지 순환하고 나면) 다시 바깥 for 문 증감식으로 가서 k값이 1만큼 증가되고, 그 증가된 k값에 맞는 구구단이 다시 이어질 것이다. 이렇게  반복문이 조건을 만족할 때 까지 계속 실행되면 9단까지 모두 출력된다.</li>
</ul>
<h3 id="break문">break문</h3>
<p><strong>반복문의 실행문</strong>들은 수행과정에서 <strong>break문을 만나면 해당 반복문을 종료</strong>한다. 즉, break문은 반복문을 정지시킬 때에 사용한다.</p>
<p>그럼 다음의 기본예문을 보면서 자세히 알아가보자.</p>
<blockquote>
</blockquote>
<p><strong>기본예문</strong></p>
<pre><code class="language-javascript">&lt;script type=&quot;text/javascript&quot;&gt;
//&lt;![CDATA[
  for(var i=1; i&lt;=10; i++){
    document.write(i + &quot;&lt;br /&gt;&quot;);
    if(i==5) break;    // i=5일 때 break문 실행
    }
  }
//]]&gt;
&lt;/script&gt;</code></pre>
<p>위 기본 예문은 1부터 10까지 출력하는 반복문이다. 하지만 실행문 마지막을 보면 i값이 5일 때에 break문을 수행하도록 되어 있으므로, 5를 출력한 후 반복문을 마치게 된다.</p>
<blockquote>
</blockquote>
<p><strong>출력값</strong>
1
2
3
4
5</p>
<h3 id="continue문">continue문</h3>
<p><strong>반복문이 continue문을 만나면,</strong> 더 이상의 실행문을 수행하지 않고 <strong>바로 증감식으로 돌아가 실행을 반복</strong>하게 된다.</p>
<blockquote>
</blockquote>
<p><strong>기본예문</strong></p>
<pre><code class="language-javascript">&lt;script type=&quot;text/javascript&quot;&gt;
//&lt;![CDATA[
  for(var i=1; i&lt;=10; i++){
    if(i%2==1) continue;    // i값이 홀수(2로 나눈 나머지가 1)일 경우 실행
    document.write(i + &quot;&lt;br /&gt;&quot;);
    }
  }
//]]&gt;
&lt;/script&gt;</code></pre>
<p>if 조건문은 i값을 2로 나눈 나머지가 1인 경우, 즉, i값이 &#39;홀수&#39;일 때에만 continue문을 실행하게 한다.
결국, i값이 홀수라면 continue문에 의해 바로 증감식으로 돌아가게 된다.</p>
<p>실행결과 다음과 같이 짝수만 나오는 결과화면을 볼 수 있다.</p>
<blockquote>
</blockquote>
<p><strong>출력값</strong>
2
4
6
8
10</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Javascript_선언문, 변수 및 데이터 형, 연산자]]></title>
            <link>https://velog.io/@jay_kimjh/Javascript</link>
            <guid>https://velog.io/@jay_kimjh/Javascript</guid>
            <pubDate>Fri, 21 Jan 2022 05:05:37 GMT</pubDate>
            <description><![CDATA[<p>※ 본 포스팅은 책 『실전 프로젝트 반응형 웹 퍼블리싱』을 바탕으로 하여 작성됨</p>
<h1 id="선언문declaration">선언문(Declaration)</h1>
<p>선언문이란 Html 페이지 내에 자바스크립트를 작성하기 위해 <strong>&quot;여기서부터는 자바스크립트를 작성할 것이다&quot;</strong>라고 <strong>&#39;스크립트 개시&#39;</strong>를 선언하는 것이다.</p>
<p>만일 선언문을 작성하지 않고 스크립트를 작성하면 브라우저는 자바스크립트 실행문들을 단순히 HTML 태그로 인식하게 되어 문법 오류가 발생할 것이다.</p>
<p>선언문의 문법은 아래와 같이 실행문을 기준으로 <code>&lt;script&gt;&lt;/script&gt;</code> 태그로 작성한다.</p>
<pre><code class="language-html">&lt;script type=&quot;text/javascript&quot;&gt;
  스크립트 실행문;
&lt;/script&gt;</code></pre>
<p>선언문은 HTML 페이지의 head 및 body 요소 내에 작성할 수 있다.</p>
<pre><code class="language-html">&lt;head&gt;
  &lt;script type=&quot;text/javascript&quot;&gt;
    document.write(&quot;hello javascript&quot;);
  &lt;/script&gt;
&lt;/head&gt;</code></pre>
<p>위 예제의 코드 내용 중, 실행문 <strong>&quot;document.write();&quot;</strong> 부분의 <strong>&#39;document&#39;</strong>를 <strong>객체(Object)</strong>라 부르고, <strong>&#39;write()&#39;</strong>는 <strong>메서드(Method)</strong>라고 부른다.</p>
<p><strong>객체(Objrct)</strong>와 <strong>메서드(Method)</strong>의 의미와 역할은 무엇일까?
만일 일하는 곳에 복합기가 없다면 복사를 할 수 없듯이 여기서 &#39;복합기&#39;는 객체가 되고, 복사를 하는 &#39;기능&#39;은 메서드가 된다. 그럼 이 내용을 자바스크립트로 표현하자면 아래와 같이 표현할 수 있다.</p>
<p><strong>복합기.복사해라();</strong></p>
<p>또한 복합기는 복사하는 기능 외에 스캔하는 기능도 있는 것 처럼 한 개의 객체에는 여러 가지 메서드가 모두 포함될 수 있다.</p>
<p>이렇듯 자바스크립트는 다양한 객체들로 구성되며, 각 객체마다 다양한 메서드들을 가지고 있다. 그래서 <strong>자바스크립트를 가리켜 &#39;객체 기반 언어&#39;</strong>라고 부른다.</p>
<p>한 줄의 실행문을 작성했다면, 문장의 마침표에 해당하는 세미콜론(;)으로 마무리를 해 준다. 물론 실제로는 이  세미콜론을 생략하더라도 한 줄에 하나의 실행만 내려진다면 오류는 발생하지 않을 수 있다.</p>
<p>하지만, 차후 다양한 기능의 스크립트를 기술하게 되는 경우에는 한 줄에 2개 이상의 실행문을 수행시키는 등 매우 복잡한 구조를 가진 스크립트 문장을 만들어야 하는 경우가 생기는데 이 때 만약 실행문 뒤에 세미콜론으로 마감하는 습관이 제대로 베어있지 않다면 그렇게 열심히 작성한 스크립트가 세미콜론 때문에 오류를 발생시킬 수도 있다. 그러므로 제대로 된 프로그래밍 연습을 하려면 초기부터 세미콜론으로 마무리 하는 습관을 길러두자.</p>
<p>자바스크립트는 위와 같이 html 문서 내에 모두 기술할 수도 있지만(내부형), 그 실행문의 내용만 별도의 파일(OOO.js)로 작성한 뒤 이를 불러오는 방식의 선언도 가능하다.</p>
<p>이를 가리켜 &#39;외부형 선언&#39;이라고 하는데, 그럼 이렇게 자바스크립트 선언문을 외부형으로 기술하는 방법과 그 장점에 대하여 알아보자.</p>
<blockquote>
</blockquote>
<p><strong>외부형 선언문의 장점</strong></p>
<ul>
<li>관리가 편하다.
  간혹 퍼블리셔가 내부 스크립트 실행문을 잘못 건드려서 프로그램이 제대로 구현되지 않는 경우가 발생한다. 하지만 js 파일을 외부로 분리해 두면 그럴 걸정이 없다.</li>
<li>소스를 숨길 수 있다.
  100% 소스를 감춘다는 것은 불가능하지만 브라우저에서의 &#39;소스 보기&#39;에서는 보이지 않는다.</li>
<li>라이브러리(library) 언어를 사용할 수 있다.
  대표적 라이브러리 언어인 jQuery(제이쿼리)를 연동하여 사용할 수 있다. 그밖에 제이쿼리 모바일이나 센차터치 등 다양한 라이브러리 언어를 연동할 수 있다.</li>
</ul>
<h1 id="변수-및-데이터-형variables--data-type">변수 및 데이터 형(Variables &amp; Data Type)</h1>
<p><strong>변수</strong>란 <strong>&#39;변화하는 값(Data)&#39;을 저장하는 공간</strong>이라고 보면 된다. 단, 변수에는 <strong>한 번에 1개의 데이터(Data)만 저장</strong>할 수 있다. 즉, 새로운 데이터가 입력되면 <strong>기존의 값은 삭제</strong>된다.</p>
<p><strong>변수 선언</strong>은 다음과 같이 작성한다.</p>
<blockquote>
</blockquote>
<p><span style="background-color : #ffffb5;"><strong>var 변수명;</strong></span> 또는 <span style="background-color : #ffffb5;"><strong>var 변수명1, 변수명2, 변수명3;</strong></span> 또는 <span style="background-color : #ffffb5;"><strong>var 변수명 = 데이터값;</strong></span></p>
<blockquote>
<blockquote>
<p><strong>예시</strong>
    <strong>var num = 10;</strong> --- &#39;num&#39;이라는 변수에 숫자형 데이터 값이 10이 저장되었다.
    <strong>var numm = num/2;</strong> --- dlwp, &#39;num&#39; 변수에는 &quot;num/2&quot;의 결과인 5가 새롭게 저장된다.
    <strong>document.write(num);</strong> --- 그대로 출력하면 &#39;5&#39;라고 출력된다.</p>
</blockquote>
</blockquote>
<h2 id="변수명-작성-시-주의사항">변수명 작성 시 주의사항</h2>
<blockquote>
</blockquote>
<p>** + 대-소문자의 구분 + **
변수명을 소문자로 만들고 출력할 때 대문자로 입력하면 &#39;정의되지 않은 변수&#39;로서 오류가 발생한다.</p>
<pre><code class="language-javascript">var num = 50;
document.write(Num); --- X</code></pre>
<blockquote>
</blockquote>
<p>** + 변수명 맨 앞에는 영문, &#39;_&#39;, &#39;$&#39; 등만 가능 + **</p>
<pre><code class="language-javascript">var $num = 10 --- O
var 3num = 0; --- X // 숫자가 맨 앞에 올 수 없다.</code></pre>
<blockquote>
</blockquote>
<p>** + 변수명에는 영문, &#39;$&#39;, &#39;_&#39;, 숫자만 포함 가능 + **</p>
<pre><code class="language-javascript">var the% = 100 --- X // %(특수문자)는 포함할 수 없다.</code></pre>
<h2 id="변수에-저장-가능한-데이터의-종류">변수에 저장 가능한 데이터의 종류</h2>
<blockquote>
</blockquote>
<p>** + 문자(String)형 데이터 + **
다음과 같이 큰따옴표 또는 작은따옴표로 둘러싸인 데이터로서, &#39;문자&#39;로 인식된다.</p>
<pre><code class="language-javascript">var txt1 = &quot;자바스크립트&quot;;
var txt2 = &#39;10&#39;;</code></pre>
<blockquote>
</blockquote>
<p>** + 숫자(Number)형 데이터 + **
다음과 같이 데이터에 숫자로 정의되는 데이터이다.</p>
<pre><code class="language-javascript">var num = 10;</code></pre>
<blockquote>
</blockquote>
<p>** + 논리(Boolean)형 데이터 + **
다음과 같이 데이터에 true(참) 또는 false(거짓)로 정의되는 데이터이다.</p>
<pre><code class="language-javascript">var rewult = true;</code></pre>
<blockquote>
</blockquote>
<p>** + 널(Null)형 데이터 + **
다음과 같이 데이터 null(비어 있음)로 정의되는 데이터이다.</p>
<pre><code class="language-javascript">var result = null;</code></pre>
<h1 id="연산자operator">연산자(Operator)</h1>
<h2 id="산술-연산자">산술 연산자</h2>
<p>피연산자(연산의 대상인 데이터)가 2개 필요하며 <strong>&#39;이항 연산자&#39;</strong> 라고도 부른다. 초등학교 때 배운 사칙 연산에 해당한다.</p>
<blockquote>
</blockquote>
<p>** [ + ] ** --- 더하기
** [ - ] ** --- 빼기
** [ * ] ** --- 곱하기
** [ / ] ** --- 나누기
** [ % ] ** --- 나머지</p>
<pre><code class="language-html">&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot; lang=&quot;ko&quot; xml:lang=&quot;ko&quot;&gt;
 &lt;head&gt;
  &lt;meta http-equiv=&quot;content-type&quot; content=&quot;text/html; charset=utf-8&quot; /&gt;
  &lt;title&gt; new document &lt;/title&gt;
   &lt;script type=&quot;text/javascript&quot;&gt;

      var A=10;  
      var B=3;
      var result;
      result=A+B;
      document.write(result+&quot;&lt;br /&gt;&quot;)
      result=A-B;
      document.write(result+&quot;&lt;br /&gt;&quot;)
      result=A*B;
      document.write(result+&quot;&lt;br /&gt;&quot;)
      result=A/B;
      document.write(result+&quot;&lt;br /&gt;&quot;)
      result=A%B;
      document.write(result+&quot;&lt;br /&gt;&quot;)

   &lt;/script&gt;
 &lt;/head&gt;

 &lt;body&gt;

 &lt;/body&gt;
&lt;/html&gt;</code></pre>
<p>이 코드를 실행시키면</p>
<blockquote>
</blockquote>
<p>13
7
30
3.33333333333333
1</p>
<p>과 같은 결과가 나오는데 하단 바에 ❌ 표시와 함께 &#39;5 오류&#39;라는 문구가 뜬다. 왜 Validator(유효성 검사기)가 5개의 오류를 지적했을까?</p>
<h3 id="유효성-검사-오류를-막는-cdata-선언">유효성 검사 오류를 막는 CDATA 선언</h3>
<p>오류의 원인은, 바로 자바스크립트 내에 들어간<code>&lt;br /&gt;</code>태그이다.  예제와 같이 <strong>내부형으로 작성된 스크립트에서 html 태그를 포함</strong>하게 되면 비록 기능은 정상적으로 작동할지라도 브라우저의 유효성 검사기들은 <strong>오류를 지적</strong>한다.</p>
<p>결국, 내부형 스크립트에서 html 코드를 포함해야 할 때에는 유효성 검사 오류를 막기 위해 다음과 같이 <strong>&#39;CDATA 선언&#39;</strong> 을 함께 작성해야 한다.</p>
<p>CDATA 선언문은 내부형 자바스크립트 내에 HTML 태그가 포함되었을 경우, 이들을 모두 문자형 데이터로 인식시켜 이후 문서의 body 부분에 잘 출력되도록 돕는 역할을 한다. 즉, 스크립트가 실행되는 사이에 HTMl 태그가 갑자기 끼어드는 현상을 막아주는 것이다. 그러니 앞으로 HTML 내에서 자바스크립트를 작성할 때 태그를 포함해야 한다면 그 실행문 전체를 CDATA 선언문으로 감싸주는 습관을 들여야 할 것이다.</p>
<pre><code class="language-html">&lt;script type=&quot;text/jaavascript&quot;&gt;
//![Cdata[
    실행문 내용들
//]]&gt;    
&lt;/script&gt;</code></pre>
<p>물론, 이 경우에도 스크립트 코드를 외부형 파일로 따로 만들어 불러들이는 경우라면 문제가 없다.</p>
<h2 id="비교-연산자">비교 연산자</h2>
<p>역시 피연산자가 2개 필요하며, 그 2개의 데이터를 비교할 때 사용한다. 비교하여 잘못됐으면 flase(거짓)를, 올바르면 true(참)라는 값을 반환한다.</p>
<blockquote>
</blockquote>
<p>** [ A &gt; B ] ** --- A가 B보다 크다
** [ A &gt;= B ] ** --- A가 B보다 크거나 같다
** [ A &lt; B ] ** --- A가 B보다 작다
** [ A &lt;= B ] ** --- A가 B보다 작거나 같다
** [ A == B ] ** --- A와 B가 같다 // 데이터의 형(ype) 상관 없음
** [ A != B ] ** --- A와 B가 다르다 // 데이터의 형(ype) 상관 없음
** [ A === B ] ** --- A와 B가 같다 // 데이터 및 형(ype)이 일치할 때 true
** [ A !== B ] ** --- A와 B가 다르다 // 데이터 및 형(ype)이 불일치할 때 true</p>
<h2 id="대입할당-연산자">대입(할당) 연산자</h2>
<p>대입 연산자는 연산된 데이터를 지정된 변수에 대입할 때 사용한다.</p>
<blockquote>
</blockquote>
<p>** [ = ] ** --- A = 10 → A = 10
** [ += ] ** --- A += B → A = A+B
** [ -= ] ** --- A -= B → A = A-B
** [ <em>= ] *</em> --- A <em>= B → A = A</em>B
** [ /= ] ** --- A /= B → A = A/B
** [ %= ] ** --- A %= B → A = A%B</p>
<pre><code class="language-html">&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot; lang=&quot;ko&quot; xml:lang=&quot;ko&quot;&gt;
 &lt;head&gt;
  &lt;meta http-equiv=&quot;content-type&quot; content=&quot;text/html; charset=utf-8&quot; /&gt;
  &lt;title&gt; new document &lt;/title&gt;
   &lt;script type=&quot;text/javascript&quot;&gt;
   //&lt;![CDATA[
      var num1=10;  
      var num2=20;
      num1+=5;                 //기존에 num1에 저장된 10 에 5를 더해서 num1에 저장합니다.
      document.write(num1+&quot;&lt;br /&gt;&quot;);    //출력 15

      num1-=5;                //기존에 num1에 저장된 15 에 5를 빼서 num1에 저장합니다.
      document.write(num1+&quot;&lt;br /&gt;&quot;);    //출력 10

      num1*=5;                //기존에 num1에 저장된 10 에 5를 곱해서 num1에 저장합니다.
      document.write(num1+&quot;&lt;br /&gt;&quot;);       //출력 50

      num1/=5;                //기존에 num1에 저장된 50 에 5를 나누어 num1에 저장합니다.
      document.write(num1+&quot;&lt;br /&gt;&quot;);       //출력 10

      num2%=3;                 //기존에 num2에 저장된 20에 3으로 나눈 나머지값을 num1에 저장합니다.
      document.write(num2+&quot;&lt;br /&gt;&quot;);       //출력 2
   //]]&gt;
   &lt;/script&gt;
 &lt;/head&gt;

 &lt;body&gt;

 &lt;/body&gt;
&lt;/html&gt;</code></pre>
<h2 id="증감-연산자">증감 연산자</h2>
<p>증가 연산자는 변수에 저장된 값을 1씩 증가시킨다. 반대로 감소 연산자는 변수에 저장된 값을 1씩 감소시킨다.</p>
<blockquote>
</blockquote>
<p>** [ ++ ] ** --- 1씩 증가
** [ -- ] ** --- 1씩 감소</p>
<pre><code class="language-html">&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot; lang=&quot;ko&quot; xml:lang=&quot;ko&quot;&gt;
 &lt;head&gt;
  &lt;meta http-equiv=&quot;content-type&quot; content=&quot;text/html; charset=utf-8&quot; /&gt;
    &lt;script type=&quot;text/javascript&quot;&gt;
    //&lt;![CDATA[
        var num1=10;  
        var num2=20;
        num1++;                           //num1의 10에서 1 더하여 저장
        document.write(num1+&quot;&lt;br /&gt;&quot;);    //출력값: 11
        num2--;                           //num2의 20에서 1을 감하여 저장
        document.write(num2+&quot;&lt;br /&gt;&quot;);    //출력값: 19
    //]]&gt;
&lt;/script&gt;

 &lt;/head&gt;

 &lt;body&gt;

 &lt;/body&gt;
&lt;/html&gt;</code></pre>
<h2 id="논리-연산자">논리 연산자</h2>
<p>피연산자로는 논리데이터인 true 또는 false가 올 수 있다. 연산자로는 이항 연산자인 논리합(||), 논리곱(&amp;&amp;)이 있으며, 단항 연산자인 논리부정(!)이 있다.</p>
<blockquote>
</blockquote>
<p>** [ || (논리합) ] ** --- OR (또는)
** [ &amp;&amp; (논리곱) ] ** --- AND (그리고)
** [ ! (논리부정) ] ** --- NOT (부정)</p>
<p>논리합 연산자는 피연산자에 true가 한 개라도 있으면 true값을 반환하면 반면, 논리곱 연산자는 피연산자 중 false가 한 개라도 있으면 false값을 반환한다. 한편, 논리 부정은 변수에 true가 저장되어 있으면 false를, false가 저장되어 있으면 true를 결과로 내어놓는다.</p>
<p>실생활을 예로 들어, 엄마가 철수에게 김밥 또는(||) 순대를 사오라고 시켰는데 철수가 순대와 떡볶이를 사왔다면 심부름을 맞게 한 것일까?
떡볶이는 틀렸지만(false) 김밥은 참(true)이므로 철수는 제대로 심부름을 해온 것이다.</p>
<p>이제 논리연산자 표를 보면서 결과를 확인해 보도록 하자.</p>
<pre><code class="language-javascript">var A = 10, B = 20;
var C = 30, D = 40;</code></pre>
<table>
  <tr>
    <th>num1</th>
    <th>num2</th>
    <th>num1 || num2</th>
    <th>num1 && num2</th>
    <th>!num1</th>
  </tr>
  <tr>
    <td>A > B</td>
    <td>C >= D</td>
    <td>㉠</td>
    <td>㉡</td>
    <td>㉢</td>
  </tr>
  <tr>
    <td>A >= B</td>
    <td>C <= D</td>
    <td>㉣</td>
    <td>㉤</td>
    <td>㉥</td>
  </tr>
  <tr>
    <td>A <= B</td>
    <td>C < D</td>
    <td>㉦</td>
    <td>㉧</td>
    <td>㉨</td>
  </tr>
</table>

<ul>
<li><p>㉠ --- num1은 false이고, num2도 false이므로 논리합( || ) 결과는 false이다.</p>
</li>
<li><p>㉡ --- num1은 false이고, num2도 false이므로 논리곱( &amp;&amp; ) 결과는 false이다.</p>
</li>
<li><p>㉢ --- num1은 false이므로, num1의 논리부정(!) 결과는 true이다..</p>
</li>
<li><p>㉣ --- num1은 false이고, num2는 true이므로 논리합( || ) 결과는 true이다.</p>
</li>
<li><p>㉤ --- num1은 false이고, num2는 true이므로 논리곱( &amp;&amp; ) 결과는 false이다.</p>
</li>
<li><p>㉥ --- num1은 false이므로, num1의 논리부정(!) 결과는 true이다.</p>
</li>
<li><p>㉦ --- num1은 true이고, num2도 true이므로 논리합( || ) 결과는 true이다.</p>
</li>
<li><p>㉧ --- num1은 true이고, num2도 true이므로 논리곱( &amp;&amp; ) 결과는 true이다.</p>
</li>
<li><p>㉨ --- num1은 true이므로, num1의 논리부정(!) 결과는 false입니다.</p>
</li>
</ul>
<h3 id="응용문제1">응용문제1</h3>
<blockquote>
</blockquote>
<p>20대 대상의 소개팅을 준비 중입니다. 그런데 남성은 다 모집이 되었지만 여성은 아직 모집이 다 되지 않았네요. prompt 메서드를 활용하여 성별과 나이를 물어봅니다. 20대 여성이라면 결과값이 true로, 아니라면 결과값으로 falsee가 나오게 만드세요</p>
<p>우선, 문제에서 언급된 <strong>&#39;prompt 메서드&#39;</strong> 를 알아보자. 자바스크립트를 활용한 재미있는 이벤트 메서드 중 하나인데, 단어 뜻(prompt : 띄우다) 그대로 사용자에게 <strong>간단한 창을 띄워 질문에 대한 답</strong> 을 받아 저장하는 기능이다.사용법은 다음과 같다.</p>
<blockquote>
</blockquote>
<p><strong>기본형식</strong>
<span style="background-color : #ffffb5;">prompt(&quot;질문내용&quot;)</span> 처럼 기술하거나 만약 기본적인 답변이 있을 경우라면, <span style="background-color : #ffffb5;">prompt(&quot;질문내용&quot;, &quot;기본답변&quot;)</span>
<strong>&lt;예&gt;</strong> prompt(&quot;이름은?&quot;, &quot;홍길동&quot;)과 같이 기술합니다.</p>
<p>일단, 문제에서 설명한 대로 &#39;성별&#39;을 먼저 물어본 후 입력된 값을 gender라는 변수에 저장해 보겠다.(여성을 찾고 있으므로, 기본답변은 &#39;여성&#39;으로 해두겠다.)</p>
<pre><code class="language-javascript">var gender = prompt(&quot;당신의 성별은?&quot;, &quot;여성&quot;);</code></pre>
<p>다음 조건으로, &#39;나이&#39;에 관한 질문을 입력된 값을 age라는 변수에 저장한다.</p>
<pre><code class="language-javascript">var age = prompt(&quot;당신의 나이는?&quot;, &quot;20&quot;);</code></pre>
<p>질문이 다 끝났으면 입력된 뎅이터로 조건을 체크할 차례이다. 응답자가 20대라면, 그 나이(age)값은 20보다 크거나 같고 30보다는 작은 숫자겠다. 만약 응답자가 &#39;여성&#39;과 &#39;25&#39;라는 수를 응답한 경우라면 연산자를 통한 체크 과정은 다음과 같다.</p>
<blockquote>
</blockquote>
<p><strong>gendeer == &quot;여성&quot;</strong> --- 성별이 여성과 같다</p>
<p><strong>&amp;&amp;(논리곱, 그리고)</strong></p>
<blockquote>
</blockquote>
<p><strong>age &gt;= 20</strong> --- 20보다 크거나 같다</p>
<blockquote>
<blockquote>
<p><strong>&amp;&amp;(그리고)</strong></p>
</blockquote>
</blockquote>
<p><strong>age  &lt; 30</strong> --- 30보다 작다</p>
<p><strong>= true</strong></p>
<p>그럼 지금까지의 과정을 코드로 작성해보자</p>
<pre><code class="language-javascript">&lt;script type=&quot;text/javascript&quot;&gt;
  //&lt;![CDATA[
    var gender = prompt(&quot;당신의 성별은?&quot;, &quot;여성&quot;); // --- 성별 질문 응답창
    var age = prompt(&quot;당신의 나이는?&quot;, &quot;20&quot;); // --- 나이 질문 응답창
    var reesult = age &gt;= 20 &amp;&amp; age &lt; 30 &amp;&amp; gender == &quot;여성&quot;;
    document.write9result);
//]]&gt;
&lt;/script&gt;</code></pre>
<p>위와 같이 코딩된 페이지를 연 사람이 응답창에
당신의 성별은? --- 여성
당신의 나이는? --- 25
와 같이 입력했다면 웹 브라우저에sms true값이 출력될 것이다.</p>
<h3 id="응용문제2">응용문제2</h3>
<blockquote>
</blockquote>
<p><strong>국어, 영어, 수학 3과목 평균 및 통과여부 문제</strong>
prompt 메서드를 활용하여 국어, 영어, 수학 점수를 입력받으세요. 평균이 70점 이상이고 각 과목별 점수가 60점 이상이라면 true를, 아니라면 false를 출력한다.</p>
<p>먼저 질문 코드를 입력하도록 하자. 한 가지 알아둘 것은, <strong>prompt 메서드</strong>는 입력 받은 <strong>데이터를 문자형 데이터로 반환</strong>한다는 것이다. 만일 문자형 데이터에 더하기 연산자를 사용하게 된다면 우리가 아는 &#39;사칙연산&#39;이 아닌, 문자들의 연결로 인식하게 되는 것이다. 즉, &#39;1+1&#39;이라는 수식을 연산의 결과 2가 아니라 그냥 11로 출력할 수 있다는 이야기다.</p>
<pre><code class="language-javascript">var korNum = prompt(&quot;국어 점수는?&quot;, &quot;0&quot;);
var engNum = prompt(&quot;영어 점수는?&quot;, &quot;0&quot;);
var mathNum = prompt(&quot;수학 점수는?&quot;, &quot;0&quot;);</code></pre>
<p>결국, 이와 같이 코딩한 수 사용자가 국어 점수를 70, 영어 점수를 80, 그리고 수학 점수를 70으로 입력해도 평균을 위해 &#39;+&#39; 연산자를 쓰면 &#39;문자 결합&#39;이 되어 결과는 &quot;708070&quot;이 되어 버린다. 이런 오류를 막으려면, 다음과 같이 prompt로 입력 받을 내용을 Number() 메서드로 감싸주어 그 데이터를 숫자형식(Number)으로 저장해야 한다.</p>
<pre><code class="language-javascript">var korNum = Number(prompt(&quot;국어 점수는?&quot;, &quot;0&quot;));
var engNum = Number(prompt(&quot;영어 점수는?&quot;, &quot;0&quot;));
var mathNum = Number(prompt(&quot;수학 점수는?&quot;, &quot;0&quot;));</code></pre>
<p>이제, 평균 점수는 그렇게 입력 받은 세 과목의 점수를 합산하여 과목수로 나눠주면 된다. &#39;(국어점수 + 영어점수 + 수학점수) / 과목수 = var avg = (korNum + engNum + mathNum) / 3</p>
<p>검토 과정은 다음과 같다.</p>
<blockquote>
<blockquote>
</blockquote>
<p><strong>avg &gt;= 70</strong> --- 평균이 70점 이상</p>
</blockquote>
<p>&amp;&amp;</p>
<blockquote>
<blockquote>
</blockquote>
<p><strong>korNum &gt;= 60</strong> --- 국어점수 60 이상</p>
<blockquote>
<blockquote>
</blockquote>
<p>&amp;&amp; --- 그리고</p>
</blockquote>
<p><strong>engNum &gt;= 60</strong> --- 영어점수 60 이상</p>
<blockquote>
<blockquote>
</blockquote>
<p>&amp;&amp; --- 그리고</p>
</blockquote>
<p><strong>mathNum &gt;= 60</strong> --- 수학점수 60 이상</p>
</blockquote>
<p><strong>→ true</strong></p>
<p>이번에도, 이런 모든 과정을 실제로 코딩해보자.</p>
<pre><code class="language-javascript">&lt;script type=&quot;text/javascript&quot;&gt;
//&lt;![CDATA[
  var korNum = Number(prompt(&quot;국어 점수는?&quot;, &quot;0&quot;)); // Number() : 숫자형식으로 전환
  var engNum = Number(prompt(&quot;영어 점수는?&quot;, &quot;0&quot;));
  var mathNum = Number(prompt(&quot;수학 점수는?&quot;, &quot;0&quot;));
  var avg = (korNum + engNum + mathNum)/3;
  var result = avg &gt;= 70 &amp;&amp; korNum &gt;= 60 &amp;&amp; engNum &gt;= 60 &amp;&amp; mathNum &gt;= 60 ;
  document.write(result);
//]]&gt;
&lt;/script&gt;</code></pre>
<h2 id="문자-결합-연산자">문자 결합 연산자</h2>
<p>피연산자로는 2개의 데이터가 필요하며, 피연산자(연산대상)에 <strong>데이터가 1개 이상 문자형 데이터일 경우</strong>에 문자 결합 연산자로 실행한다. 만일 피연산자 데이터가 모두 숫자형 데이터라면 산술 연산자로 실행을 하게 된다.</p>
<pre><code class="language-javascript">&lt;script type=&quot;text/avascript&quot;&gt;
//&lt;![CDATA[
  var txt1 = &quot;아름다운&quot;;
  var txt2 = &quot;우리강산&quot;;
  document.write(txt1 + txt2 + &quot;&lt;br /&gt;&quot;);    
  // 문자결합 = 문자+문자 ---&gt; 출력값 : 아름다운우리강산

  var txt3 = &quot;은하철도&quot;;
  var txt4 = 999;
  docuument.write(txt3 + txt4 + &quot;&lt;br /&gt;&quot;);    
  // 문자결합 = 문자+숫자 ---&gt; 출력값 : 은하철도999

  var num1 = 200;
  var num2 = 300;
  var txt5 = String(100);    // String() 메서드로 숫자를 문자형 데이터로 변환
  // 문자결합 = 숫자 + 숫자 + 문자 ---&gt; 출력값 : 500100

  var addText = &quot;2002월드컵&quot;;
  addText += &quot;대한민국&quot;;    // 기존 문자데이터에 추가 결합 &quot;2002월드컵 대한민국&quot;
  addText += &quot;짝짝~짝짝짝~!!&quot;;    // 또 더하면 맨 끝에 &#39;짝짝~짝짝짝~!!&#39; 추가
  document.write(addText);
  // 출력값 : &quot;2002월드컵 대한민국 짝짝~짝짝짝~!!&quot;
//]]&gt;
&lt;/script&gt;</code></pre>
<h2 id="조건-연산자">조건 연산자</h2>
<p>조건 연산자는 조건식의 결과가 true(참) 혹은 false(거짓)일 때 각각 다른 실행문을 수행시킨다. 우선 기본형식을 익힌 후 예제를 통해 정확한 사용법을 익혀보도록 하자.</p>
<blockquote>
</blockquote>
<p><strong>기본 형식</strong>
<span style="background-color : #ffffb5;">조건식 ? 실행문1 :  실행문2</span></p>
<ul>
<li>조건식의 결과값이 참(true)이면 실행문1을, 거짓(false)이면 실행문2를 수행한다.</li>
</ul>
<pre><code class="language-javascriptt">&lt;script type=&quot;text/javascript&quot;&gt;
//&lt;![CDATA[
  var num1 = 30;
  var num2 = 20;
  num1 &gt;= num2 ? alert(&quot;참(true)일 경우&quot;) : alert(&quot;거짓(true)일 경우&quot;);
  // 조건식이 참(true)이므로 &quot;참(true)일 경우&quot; 경고창을 띄운다.
//]]&gt;
&lt;/script&gt;</code></pre>
<p>또한 우리는 <strong>confirm() 메서드</strong>를 활용해 <strong>확인, 취소창</strong>을 띄울 수 있다.. 여기서 &#39;확인&#39;버튼을 누를 경우, true값을 반환하며 &#39;취소&#39; 버튼을 누를 경우 false값을 반환한다. </p>
<pre><code class="language-javascript">&lt;script type=&quot;text/javascript&quot;&gt;
//&lt;![CDATA[
  var result=confirm(&quot;do you like javascript?&quot;);    // 확인 : true / 취소 : false

  //result에 true값이 저장되면 (&#39;확인&#39;버튼) 아래 theText 변수에 &quot;good&quot; 저장
  var theText = result ? &quot;good&quot; : &quot;No-good&quot;;
  document.write(theText);
//]]&gt;
&lt;/script&gt;</code></pre>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />

]]></description>
        </item>
        <item>
            <title><![CDATA[CSS3 - 경계선, 배경, 문자 효과, 2차원 변형, 속성 전환, 애니메이션, 다단 편집, 사용자 환경]]></title>
            <link>https://velog.io/@jay_kimjh/CSS3-%EA%B2%BD%EA%B3%84%EC%84%A0-%EB%B0%B0%EA%B2%BD-%EB%AC%B8%EC%9E%90-%ED%9A%A8%EA%B3%BC-2%EC%B0%A8%EC%9B%90-%EB%B3%80%ED%98%95-%EC%86%8D%EC%84%B1-%EC%A0%84%ED%99%98-%EC%95%A0%EB%8B%88%EB%A9%94%EC%9D%B4%EC%85%98</link>
            <guid>https://velog.io/@jay_kimjh/CSS3-%EA%B2%BD%EA%B3%84%EC%84%A0-%EB%B0%B0%EA%B2%BD-%EB%AC%B8%EC%9E%90-%ED%9A%A8%EA%B3%BC-2%EC%B0%A8%EC%9B%90-%EB%B3%80%ED%98%95-%EC%86%8D%EC%84%B1-%EC%A0%84%ED%99%98-%EC%95%A0%EB%8B%88%EB%A9%94%EC%9D%B4%EC%85%98</guid>
            <pubDate>Wed, 19 Jan 2022 05:14:59 GMT</pubDate>
            <description><![CDATA[<p>※ 본 포스팅은 책 『실전 프로젝트 반응형 웹 퍼블리싱』을 바탕으로 작성하였음.</p>
<p>이번에는 CSS3에서 추가된 내용을 정리해 보자. CSS3 속성들은 대체로 브라우저마다 부분적으로만 구현할 수 있기 때문에 대부분의 CSS3 속성은 속성 앞에 브라우저를 식별할 수 있는 접두사인 <strong>벤더 프리픽스(CSS3 Vendor Prefix)</strong> 를 붙여서 사용한다. 다음과 같이 4가지 종류가 있으며 CSS3의 속성들은 대부분 IE8 이하에서는 표현되지 않는다. <a href="http://www.w3schools.com">http://www.w3schools.com</a> 에 가면 어느 브라우저가 그 속성을 지원하는지 나타나 있다.</p>
<blockquote>
</blockquote>
<ul>
<li>webkit --- 웹킷 방식 브라우저용. 사파리, 크롬</li>
<li>moz --- 게코 방식 브라우저용. 모질라사 파이어폭스</li>
<li>o --- 오페라</li>
<li>ms --- 마이크로소프트사 익스플로러(버젼 9, 10 이상)</li>
</ul>
<p>예를 들어 파이어폭스에서 배경에 그라디언트를 주고자 할 때 <code>background:-moz-linear-gradient(top,#06f,#fff);</code>와 같이 사용해야 한다는 것이다.</p>
<h1 id="경계선borders">경계선(Borders)</h1>
<p>Borders 속성을 할 수 있는 일은 모서리를 둥글게 하는 것 외에 네 모서리 중 원하는 부분만 둥글게 표현하여 원, 반원, 4분의 1조각짜리 원 등을 표현해 낼 수도 있다. 그리고 거기에 곁들여 박스에 그림자를 드리우는 box-shadow 속성과 테주리에 무늬를 부여하는 border-immages 속성까지 함께 알아보도록 하자.</p>
<h2 id="border-radius--20px">border-radius : 20px;</h2>
<p>네 모서리가 20px 만큼 둥근 박스를 만들어준다. 아래 그림과 같이 둥근 모서리를 동그란 원의 테두리로 생각했을 때 그 원의 반지름을 radius값으로 표현한다.</p>
<div style="border:2px solid red; width:300px; height:200px; border-radius:20px;"></div>

<pre><code class="language-html">&lt;div style=&quot;border:2px solid red; width:300px; height:200px; border-radius:20px;&quot;&gt;&lt;/div&gt;</code></pre>
<h2 id="border-radius--20px-40px-60px-80px">border-radius : 20px 40px 60px 80px;</h2>
<p>좌측 상단 모서리 반지름이 10px, 우측 상단 모서리 반지름이 20px, 우측 하단 모서리 반지름이 30px, 좌측 하단 모서리 반지름이 40px인 박스를 만들어준다. 즉, 네 개의 수치가 좌측 상단부터 시계방향이다. 값은 박스의 크기보다 적게 설정해야 테스트가 가능하다.</p>
<div style="border:2px solid red; width:300px; height:200px; border-radius:20px 40px 60px 80px;"></div>

<pre><code class="language-html">&lt;div style=&quot;border:2px solid red; width:300px; height:200px; border-radius:20px 40px 60px 80px;&quot;&gt;&lt;/div&gt;</code></pre>
<h2 id="width--200px-height--200px-border-radius--100px">width : 200px; height : 200px; border-radius : 100px;</h2>
<p>이렇게 border-radius값을 width, height값의 1/2로 지정하면 동그란 원을 표현할 수 있다.</p>
<div style="border:2px solid red; width:200px; height:200px; border-radius:100px;"></div>

<pre><code class="language-html">&lt;div style=&quot;border:2px solid red; width:200px; height:200px; border-radius:100px;&quot;&gt;&lt;/div&gt;</code></pre>
<h2 id="width--200px-height--100px-border-radius--100px-100px-0-0">width : 200px; height : 100px; border-radius : 100px 100px 0 0;</h2>
<p>가로가 긴 박스이므로 네 모서리 중 마주하는 두 곳의 반지름만 width, height값의 1/2로 지정하여 반원 모양의 박스를 표현할 수 있다.</p>
<div style="border:2px solid red; width:200px; height:100px; border-radius:100px 100px 0 0;"></div>

<pre><code class="language-html">&lt;div style=&quot;border:2px solid red; width:200px; height:100px; border-radius:100px 100px 0 0;&quot;&gt;&lt;/div&gt;</code></pre>
<h2 id="width--100px-height--200px-border-radius--200px-0-0-0">width : 100px; height : 200px; border-radius : 200px 0 0 0;</h2>
<p>네 모서리 중 한쪽의 반지름만 width, height값의 2배로 지정하여 1/4 원 모양의 박스를 표현할 수 있다.</p>
<div style="border:2px solid red; width:100px; height:100px; border-radius:200px 0 0 0;"></div>

<pre><code class="language-html">&lt;div style=&quot;border:2px solid red; width:100px; height:100px; border-radius:200px 0 0 0;&quot;&gt;&lt;/div&gt;</code></pre>
<h2 id="box-shadow--inset-0px-0px-20px-15px-rgba18-52-86-08">box-shadow : inset 0px 0px 20px 15px rgba(18, 52, 86, 0.8);</h2>
<ul>
<li>inset --- inset을 써주면 박스의 그림자가 안쪽으로 퍼지게 된다.</li>
<li>0px --- 그 다음 수치는 가로로 밀리는 폭인데 inset일 때 값을 주면 예쁘지 않으니 주지 않겠다.</li>
<li>0px --- 그 다음 수치는 세로로 밀리는 폭이다.</li>
<li>20px --- 그 다음 수치는 그림자가 퍼지는 정도이다.</li>
<li>15px --- 그 다음 수치는 그림자와 박스의 거리이다.</li>
<li>rgba(18, 52, 86, 0.8); --- 마지막은 그림자의 색상이다. 괄호 안은 red, green, blue 투명도 순으로 입력한다.</li>
</ul>
<div style="border:2px solid rgb(18, 52, 86); width:300px; height:200px; border-radius:30px; box-shadow:inset 0 0 20px 15px rgba(18, 52, 86, 0.8);"></div>

<pre><code class="language-html">&lt;div style=&quot;border:2px solid rgb(18, 52, 86); width:300px; height:200px; border-radius:30px; box-shadow:inset 0 0 20px 15px rgba(18, 52, 86, 0.8);&quot;&gt;&lt;/div&gt;</code></pre>
<h2 id="border-image--urlimagesborderpng-27-27-round">border-image : url(images/border.png) 27 27 round;</h2>
<p>지정한 이미지를 테두리에 무늬로 칠해준다. 단, 이 속성은 아쉽게도 크롬 브라우저에서만 정상 실행된다. 원래 이미지의 입자가 27px이면 수치를 27로 기입하듯이 이미지 길이와 같은 수치를 쓸 때 가장 정확하게 나타나고 줄일 수도 있다.</p>
<h1 id="배경backgrounds">배경(Backgrounds)</h1>
<p>Backgrounds 속성에는 한 가지 색이 아닌 여러 색 단계를 원형과 선형으로 점진적으로 칠해주는 <strong>그라디언트</strong> 칠 기능이 있으며 배경 이미지의 위치나 크기를 조절할 수도 있다. CSS3 속성 중 가장 많이 변경, 발전된 부분이라고 볼 수 있는 배경 관련 속성을 시작해 보자.</p>
<h2 id="gradient-속성">gradient 속성</h2>
<p>이 속성은 반드시 밴딩 프리픽스를 붙여서 실행한다.</p>
<blockquote>
</blockquote>
<pre><code class="language-html">background:-webkit-gradient(linear, left bottom, left top, color-stop(0,#60),color-stop(2,#00));</code></pre>
<ul>
<li>유형 : 선형 그라디언트(linear)</li>
<li>위치 : 좌측 아래부터 좌측 위 방향</li>
<li>색상 : 시작(0)색상 - #f60, 끝(1)색상 - #f00</li>
</ul>
<blockquote>
</blockquote>
<pre><code class="language-html">background:-moz-linear-gradient(top,#60,#f00);</code></pre>
<ul>
<li>시작 위치 : 위</li>
<li>시작 색 : #60, 끝 색 : #f00</li>
</ul>
<blockquote>
</blockquote>
<pre><code class="language-html">background-image:-webkit-gradient(radial,center center,10,center center,90,from(#60),to(#f00) );</code></pre>
<ul>
<li>유형 : 원형 그라디언트(radial)</li>
<li>시작 위치 : center, 반지름 : 10</li>
<li>끝 위치 : center, 반지름 : 90</li>
<li>시작 색 : #f60, 끝 색 : #f00</li>
</ul>
<blockquote>
</blockquote>
<pre><code class="language-html">background-image:-moz-radial-gradient(center 45deg, circle closet-corner, #f60 10%, #f00 70% );</code></pre>
<ul>
<li>시작 위치 : 기본값 center</li>
<li>각도 : 45도</li>
<li>모양 : circle-원형( ecllipse는 타원 ) webkit은 타원 안 됨</li>
<li>크기 : 네 가지. (webkit은 크기 조절 안 됨)
  closet-side, contain --- 그라데이션이 가장 가까운 면과 만난다.
  closet-corner --- 가장 가까운 상자에 꽉 찬다.
  farthest-side --- 상자의 가장 멀리 있는 면과 만난다.
  farthest-corner,cover --- 가장 멀리 있는 상자에 꽉 찬다.</li>
</ul>
<h2 id="background-size">background-size</h2>
<p>이제는 배경 이미지의 크기까지 조절할 수 있게 되었다. 형식은 다음과 같다.</p>
<blockquote>
</blockquote>
<pre><code class="language-css">background-sizee : 80px 60px;</code></pre>
<p>배경 이미지의 가로 크기 80px, 세로 크기 60px</p>
<blockquote>
</blockquote>
<pre><code class="language-css">background-size : 150px;</code></pre>
<p>배경 이미지의 가로 크기 150px, 세로 크기 150px</p>
<blockquote>
</blockquote>
<pre><code class="language-css">background-size : container;</code></pre>
<p>배경 이미지의 크기를 박스의 세로 크기에 맞춤</p>
<blockquote>
</blockquote>
<pre><code class="language-css">background-size : cover;</code></pre>
<p>배경 이미지의 크기를 박스의 가로 크기에 맞춤</p>
<h2 id="background-origin">background-origin</h2>
<p>이 속성으로 배경 이미지의 한계를 어디로 할지 정할 수 있게 되었다.</p>
<blockquote>
</blockquote>
<pre><code class="language-css">background-origin : border-box;</code></pre>
<blockquote>
</blockquote>
<pre><code class="language-css">background-orrigin : padding-box;</code></pre>
<p>박스의 안 여백을 포함한 부분까지를 경계로 잡는다.</p>
<blockquote>
</blockquote>
<pre><code class="language-css">background-origin : content-box;</code></pre>
<p>박스의 안 여백을 제외한 부분까지만 경계로 잡는다.</p>
<h2 id="multi-background">multi-background</h2>
<p>CSS3에서는 배경 이미지로 여럿을 지정할 수 있고 위치와 기타 속성도 각각 설정할 수 있다.</p>
<blockquote>
</blockquote>
<pre><code class="language-css">background-image : url(&quot;images/bg.png&quot;), url(&quot;images/bg_line.gif&quot;), url(&quot;images/blueheart.png&quot;);</code></pre>
<p>배경으로 세개의 이미지를 지정함.</p>
<blockquote>
</blockquote>
<pre><code class="language-css">background-repeat : repeat-x, repeat-x, no-repeaat;</code></pre>
<p>세 개의 배경 이미지 중 1, 2번은 가로 반복, 3번은 반복 없음으로 설정함.</p>
<blockquote>
</blockquote>
<pre><code class="language-css">background-position : top, bottom, center;</code></pre>
<p>세개의 배경 이미지 중  1번은 위, 2번은 아래, 3번은 정중앙으로 위치를 정함.</p>
<blockquote>
</blockquote>
<pre><code class="language-css">background-attachment : fixed, fixed, fixed;</code></pre>
<p>세 개의 배경 이미지 모두 화면에 고정 시킴.</p>
<h2 id="background-clip">background-clip</h2>
<p>배경색을 어디까지 칠해 줄 것인지 결정하는 속성이다. background-origin과 의미가 비슷하다.</p>
<blockquote>
</blockquote>
<pre><code class="language-css">background-clip : content-box;</code></pre>
<p>배경색이 콘텐츠 부분까지만 칠 됨</p>
<blockquote>
</blockquote>
<pre><code class="language-css">background-clip : padding-box;</code></pre>
<p>배경색이 안 여백 영역까지 칠 됨</p>
<blockquote>
</blockquote>
<pre><code class="language-css">background-clip : border-box;</code></pre>
<p>배경색이 테두리 영역까지 칠 됨</p>
<h1 id="문자-효과text-effects">문자 효과(Text Effects)</h1>
<p>글자에 주는 효과들은 그림자, 줄  바꿈, 글꼴 설정 등이 있다.</p>
<h2 id="text-shadow">text-shadow</h2>
<p>그래픽 프로그램의 도움 없이도 글자에 그림자를 줄 수 있게 되었다.</p>
<blockquote>
</blockquote>
<pre><code class="language-css">text-shadow : 1px -2px #ccc;</code></pre>
<p>글자에  우측으로 1px, 위쪽으로 2px 위치에 연회색으로 그림자를 드리워준다.</p>
<h2 id="word-wrap">word-wrap</h2>
<p>영문을 띄어쓰기 없이 길게 입력하면 width값을 주어도 박스 밖으로 튀어 나오게 되는데 이것을 가로 폭에 맞추어 적당히 잘라 다음 줄로 내려오도록 해준다.</p>
<h2 id="font-face">font-face</h2>
<p>기본 글꼴이 아닌 경우, 글꼴 파일 없이는 인터넷 화면에 뜨게 할 수 없으므로 사용자들도 같은 글꼴로 볼 수 있도록 웹 폰트를 설정하는 법을 알아보자.
웹 폰트는 유료가 많으니, 무료 폰트인 나눔고딕을 예로 들고, IE8 이하를 제외한 모든 브라우저에서 지원 가능한 woff(Web Open Format Font)포맷으로 실행해 보도록 하자. 절차는 다음과 같다.</p>
<p>글꼴을 다운 받거나 구매한 뒤 내 업로드할 폴더를 정해 올린다. </p>
<blockquote>
</blockquote>
<p>NanumGothic.woff
NanumGothicBold.woff
NanumGothicExtraBold.woff</p>
<p>CSS에서 다음과 같이 글꼴 이름, 글꼴 파일 경로, 파일 유형을 설정한다.</p>
<blockquote>
</blockquote>
<pre><code class="language-css">@font-face {font-family:&quot;NGothic&quot;;src:url(&quot;../font/NanumGhothic.wooff&quot;) format(&quot;woff&quot;);}</code></pre>
<pre><code class="language-css">@font-face  {font-family:&quot;NGothicB&quot;, src:url(&quot;../font/NanumGothicBold.woff&quot;) format(&quot;woff&quot;);}</code></pre>
<pre><code class="language-css">2font-face {font-family:&quot;NGothicEB&quot;, src:url(&quot;../font/nanumGothicExtraBold.woff&quot;) format(&quot;woff&quot;);]</code></pre>
<p>선택자에 지정한다.</p>
<blockquote>
</blockquote>
<pre><code class="language-css">h1 { font:bold 2em &quot;NGothicEB&quot;;}</code></pre>
<h1 id="2차원-변형2d-transform">2차원 변형(2D Transform)</h1>
<p>박스를 회전(rotate), 확대 축소(scale), 이동(translate), 찌그러뜨리기(skew)할 수 있게 되었다.</p>
<blockquote>
</blockquote>
<pre><code class="language-css">transform : translate(20px, -30px);</code></pre>
<p>박스를 우측으로 20px, 위로 30px 이동시킴</p>
<blockquote>
</blockquote>
<pre><code class="language-css">transform : rotate(30deg);</code></pre>
<p>박스를 시계 방향으로 30도 회전시킴</p>
<blockquote>
</blockquote>
<pre><code class="language-css">transform : scale(1.3, 0.7);</code></pre>
<p>박스를 가로 130%로 확대, 세로 70%로 축소시킴</p>
<blockquote>
</blockquote>
<pre><code class="language-css">transform : skew(30deg, 20deg);</code></pre>
<p>박스를 가로 30도, 세로 20도로 찌그러뜨림.</p>
<h1 id="속성-전환transitions">속성 전환(Transitions)</h1>
<p>Transition은 background, color, height, width, transformation 등의 속성들에 애니메이션을 적용하는 것이다. 형식은 다음과 같다.</p>
<blockquote>
</blockquote>
<pre><code class="language-css">transition : property duration timingfunction;</code></pre>
<ul>
<li><strong>property</strong> --- 애니메이션 시킬 속성을 사용함</li>
<li><strong>duration</strong> --- 시작해서 끝날 때까지 시간을 초 단위로 지정함</li>
<li><strong>timigfunction</strong> --- 속도 변화를 기술하는데 큰 차이를 느끼기 어렵지만 다음 항목들이 있다.<blockquote>
<blockquote>
</blockquote>
</blockquote>
</li>
<li><em>linear*</em> --- 등속 cubic-bezier(0, 0, 1, 1)와 같음.</li>
<li><em>ease*</em> --- 느리게 시작했다가 빨라졌다 다시 느려짐. cubic-bezier(0.25, 0.1, 0.25, 1)와 같음.</li>
<li><em>ease-in*</em> : 점점 빨라짐. cubic-bezier(0.42, 0, 1, 1)와 같음.</li>
<li><em>ease-out*</em> : 점점 느려짐. cubic-bezier(0, 0, 0.58, 1)와 같음.</li>
<li><em>ease-in-out*</em> : 처음과 끝이 느림. cubic-bezier(0.42, 0, 0.58, 1)와 같음.</li>
<li><em>cubic-bezier(N,N,N,N)*</em> : 값을 입력하여 가속/감속을 조작.</li>
</ul>
<blockquote>
</blockquote>
<pre><code class="language-css">transition-delay : 0.5s;</code></pre>
<p>0.5초 지난 후 작동함.</p>
<blockquote>
</blockquote>
<pre><code class="language-css">transition : background 0..5s ease, color 0.3s linear;</code></pre>
<p>다중으로 여러 속성을 적용 시킬 수 있음.</p>
<h1 id="애니메이션animation">애니메이션(Animation)</h1>
<p>박스의 크긴나 위치 또는 색상 등의 속성을 시간에 따라 변화를 줄 수 있도록 <strong>키프레임을 설정</strong>하여 여러 단계를 연속적으로 실행할 수 있다.
애니메이션 명령을 내리는 것과 별도로 변경 시점을 지정하기 위해 키프레임을 설정해야 하는데 이때에도 <strong>벤더 프리픽스</strong>를 붙여준다.</p>
<blockquote>
</blockquote>
<pre><code class="language-css">animation:myfirst 5s infinite;</code></pre>
<ul>
<li>myfirst로 지정된 키프레임에 설정된 대로 5초 동안 애니메이션 할 것을 명령함.</li>
<li>infinite : 계속 반복함.
(animation-direction을 alternate로 설정하면 처음에서 끝을 지그재그로 반복함)</li>
</ul>
<blockquote>
</blockquote>
<pre><code class="language-css">@keyframes myfirst
{
0% {background:#c00; width:140px; height:120px;}
25% {background:#00c; width:450px; height:120px;}
50% {background:#808; width:450px; height:180px;}
75% {background:#080; width:140px; height:180px;}
100% {background:#c00; width:140px; height:120px;}</code></pre>
<ul>
<li>시작할 때 박스 크기는 140px * 120px 이고 색상은 자주색</li>
<li>설정 시간의 1/4이 지날 때에 박스 크기는 450px * 120px 이고 색상은 파란색</li>
<li>설정 시간의 2/4이 지날 때에 박스 크기는 450px * 180px 이고 색상은 초록색</li>
<li>설정 시간의 3/4이 지날 때에 박스 크기는 140px * 180px 이고 색상은 보라색</li>
<li>설정 시간의 마지막에 다다랐을 때에 박스 크기와 색상은 다시 원래대로 되돌아옴</li>
</ul>
<h1 id="다단-편집multiple-colume">다단 편집(Multiple Colume)</h1>
<p>CSS3에서는 float이나 position을 이용하지 않고도 다단을 편집할 수 있도록 <strong>멀티 칼럼</strong>을 지원하고 있다.</p>
<blockquote>
</blockquote>
<pre><code class="language-css">column-count : 3;</code></pre>
<p>박스의 내용을 3단으로 하기로 한다.</p>
<blockquote>
</blockquote>
<pre><code class="language-css">column-gap : 20px;</code></pre>
<p>각 단 사이의 간격을 20px로 하기로 한다.</p>
<blockquote>
</blockquote>
<pre><code class="language-css">column-rule : 2px dotted brown;</code></pre>
<p>단과 단 사이에 구분선을 줄 수 있고 그 선의 모양을 2px 두꼐의 점선으로 한다.</p>
<h1 id="사용자-환경user-interface">사용자 환경(User Interface)</h1>
<p>User Interface에서는 박스의 크기를 조절하거나 박스의 크기 설정 방법을 설정하거나 border 밖에 테두리를 줄 수 있다.</p>
<h2 id="box-sizing">box-sizing</h2>
<blockquote>
</blockquote>
<pre><code class="language-css">box-sizing : content-box;</code></pre>
<p>border가 박스 크기에 포함되지 않는다.</p>
<blockquote>
</blockquote>
<pre><code class="language-css">box-sizing : border-box;</code></pre>
<p>border가 박스 크기에 포함된다.</p>
<p>박스의 크기에 border의 두께가 포함되지 않는다. 그런데 width값을 픽셀로 줄 수 없는 경우가 간혹 발생하는데 그 때에는 border의 두께를 width에 포함시켜 줄 수 있으면 좋다.</p>
<h2 id="resize">resize</h2>
<p>박스의 모서리를 잡아당겨 크기를 조절할 수 있다. (가로 : horizontal, 세로 : vertical, 양쪽 : both)</p>
<h2 id="outline">outline</h2>
<p>border를 깜싸는 테두리를 또 줄 수 있다.</p>
<blockquote>
</blockquote>
<p><strong>outline-offset</strong> --- border와 outline 사이의 거리
<strong>outline-width</strong> --- outline의 두께
<strong>outline-color</strong> --- outline의 색상</p>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />



























































]]></description>
        </item>
        <item>
            <title><![CDATA[CSS - IE 조건 주석문]]></title>
            <link>https://velog.io/@jay_kimjh/CSS-IE-%EC%A1%B0%EA%B1%B4-%EC%A3%BC%EC%84%9D%EB%AC%B8</link>
            <guid>https://velog.io/@jay_kimjh/CSS-IE-%EC%A1%B0%EA%B1%B4-%EC%A3%BC%EC%84%9D%EB%AC%B8</guid>
            <pubDate>Tue, 18 Jan 2022 09:04:21 GMT</pubDate>
            <description><![CDATA[<p>※ 본 포스팅은 책『실전 프로젝트 반응형 웹 퍼블리싱』을 바탕으로 작성됨.</p>
<h2 id="ie-조건-주석문">IE 조건 주석문</h2>
<p>조건 주석문이란 일반적인 주석문을 말하는 게 아니라 IE 브라우저에서만 다른 CSS 파일을 적용하고자 할 때 쓰는 일종의 문법적인 구문이다.
IE6, 7, 8 브라우저는 다른 표준 브라우저들에 비해 CSS 실행 결과가 다르게 나타나는  경우가 빈번히 있어, 그런 경우 CSS를 다르게 적용해 주어 비슷하게라도 보여지도록 해주어야 하기 때문이다. 사용법은 다음과 같다.</p>
<pre><code class="language-html">&lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;css/main.css&quot; /&gt;
&lt;!--[if lt IE9]&gt;
  &lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;css/main_ie.css&quot; /&gt;
&lt;![endif]--&gt;</code></pre>
<p>위의 구문에서 main.css 파일을 주 CSS 파일로 사용하지만 브라우저가 인터넷 익스플로어 9버전보다 낮을 경우 즉, IE6, IE7, IE8에서는 main_ie.css 파일을 사용하게 된다.</p>
<pre><code class="language-html">&lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;css/main.css&quot; /&gt;
&lt;!--[if IE6]&gt;
  &lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;css/main_ie6.css&quot; /&gt;
&lt;![endif]--&gt;</code></pre>
<p>위의 구문은 main.css 파일을 CSS 파일로 사용하지만 브라우저가 인터넷 익스플로어 6일 경우에서만 main_ie6.css 파일을 사용하게 된다는 뜻이다.</p>
<p>그렇다면 이래야 할 일이 뭐가 있을까? 한 예로 입력 양식 중 체크 박스의 여백이 IE6,7에서 다르게 나타나며, 다른 예로는 이미지 중 svg포맷이 IE에서 나타나지 않는다. 크롭 브라우저에서는 화면이 확대되어도 svg 포맷의 이미지는 꺠끗하게 나타나지만, IE에서는 svg는 보이지도 않는다. 따라서 IE에서는 이미지를 gif나 jpg로 바꿔 주어야 한다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[CSS - 상자, 레이아웃]]></title>
            <link>https://velog.io/@jay_kimjh/CSS-%EC%83%81%EC%9E%90-%EB%A0%88%EC%9D%B4%EC%95%84%EC%9B%83</link>
            <guid>https://velog.io/@jay_kimjh/CSS-%EC%83%81%EC%9E%90-%EB%A0%88%EC%9D%B4%EC%95%84%EC%9B%83</guid>
            <pubDate>Mon, 10 Jan 2022 05:44:12 GMT</pubDate>
            <description><![CDATA[<p>*본 포스팅은 책『실전 프로젝트 반응형 웹 퍼블리싱』을 바탕으로 작성됨.
※코드 출력화면이 보이지 않을 시 글 수정 페이지로 들어와 확인 할 것</p>
<h1 id="상자box">상자(Box)</h1>
<h2 id="width">width</h2>
<p>박스의 가로 사이즈를 말하는데 여백을 포함하지 않는 크기로 px, %, em 등의 단위로 된 수치를 쓸 수 있고, 많은 브라우저 오류가 가로 사이즈를 기재함으로써 치유되므로 가장 중요한 속성 중 하나라고 볼 수 있다.</p>
<h2 id="height">height</h2>
<p>박스의 세로 사이즈를 말하는데 역시 여백을 포함하지 않는 크리고 px, %, em등의 단위로 된 수치를 쓸 수 있다. 높이값 속성은 레이아웃 작업에서 float을 해제할 때 쓰는 겨우가 있지만 장문의 텍스트 상자에서는 레이아웃을 설계하는데 오히려 방해가 되므로 높이값은 가능한 한 사용하지 않는 것이 좋다.</p>
<h2 id="padding">padding</h2>
<p>박스의 안쪽 여백을 발한다. 즉, 내용과 테두리 사이의 간격을 말하는 것이며, 간격과 방향에 관련해서는 다음의 형식으로 사용하게 된다.</p>
<blockquote>
</blockquote>
<p>padding : 10px; --- 값을 한 번만 지정하면 위, 아래, 왼쪽, 오른쪽 <span style="color : red;"><strong>안</strong></span> 여백 모두 각 10px
padding : 10px 20px; --- 값을 두 번 지정하면 위, 아래 10px / 왼쪽, 오른쪽 20px
padding : 10px 20px 30px; --- 값을 세 번만 지정하면 위 10px / 왼쪽, 오른쪽 20px / 아래 30px
padding : 10px 20px 30px 40px; --- 값을 네 번 지정하면 위 10px / 오른쪽 20px / 아래 30px / 왼쪽 40px
padding-top : 10px; --- 위쪽 <span style="color : red;"><strong>안</strong></span> 여백만 10px로 지정함
padding-right : 10px; --- 오른쪽 <span style="color : red;"><strong>안</strong></span> 여백만 10px로 지정함
padding-bottom : 10px; --- 아래쪽 <span style="color : red;"><strong>안</strong></span> 여백만 10px로 지정함
padding-left : 10px; --- 왼쪽 <span style="color : red;"><strong>안</strong></span> 여백만 10px로 지정함</p>
<h2 id="margin">margin</h2>
<p>박스의 바깥쪽 여백을 말한다. 즉, 테두리와 다음 박스 영역 사이의 간격을 말하는 것이며, 특정 브라우저에서 오류를 많이 일으키므로 가능한 한 사용하지 않는 것이 좋겠다.</p>
<blockquote>
</blockquote>
<p>margin : 10px; --- 값을 한 번만 지정하면 위, 아래, 왼쪽, 오른쪽 <span style="color : red;"><strong>바깥</strong></span> 여백 모두 각 10px
margin : 10px 20px; --- 값을 두 번 지정하면 위, 아래 10px / 왼쪽, 오른쪽 20px
margin : 10px 20px 30px; --- 값을 세 번만 지정하면 위 10px / 왼쪽, 오른쪽 20px / 아래 30px
margin : 10px 20px 30px 40px; --- 값을 네 번 지정하면 위 10px / 오른쪽 20px / 아래 30px / 왼쪽 40px
margin-top : 10px; --- 위쪽 <span style="color : red;"><strong>밖</strong></span> 여백만 10px로 지정함
margin-right : 10px; --- 오른쪽 <span style="color : red;"><strong>밖</strong></span> 여백만 10px로 지정함
margin-bottom : 10px; --- 아래쪽 <span style="color : red;"><strong>밖</strong></span> 여백만 10px로 지정함
margin-left : 10px; --- 왼쪽 <span style="color : red;"><strong>밖</strong></span> 여백만 10px로 지정함</p>
<p>두 개의 값을 써서 세로 가로 여백을 설정하는 형식으로 박스를 가운데에 정렬할 수 있다.
박스에 가로 사이즈를 주고 [margin : 세로값 auto;] 하게 되면 전체 폭의 중앙에 설정한 크기의 박스가 배치된다.</p>
<pre><code>&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;ko&quot;&gt;
&lt;head&gt;&lt;title&gt; CSS &lt;/title&gt;
&lt;meta charset=&quot;utf-8&quot;&gt;

&lt;style type=&quot;text/css&quot;&gt;
   body { font:12px &quot;굴림&quot;, Gulim; background:url(&quot;images/bg_grid.gif&quot;) ; }
   .exp { width:500px ; background:#abc ; padding:10px ; margin:20px 0 ; }
   .cloud { width:200px; margin:0 auto; }
&lt;/style&gt;&lt;/head&gt;
&lt;body&gt;
   &lt;p class=&quot;exp&quot;&gt;오늘은 비가 옵니다.&lt;/p&gt;
   &lt;p class=&quot;exp&quot;&gt;오늘은 눈이 옵니다.&lt;/p&gt;
   &lt;p class=&quot;exp&quot;&gt;오늘은 해가 납니다.&lt;/p&gt;
   &lt;p class=&quot;exp cloud&quot;&gt;오늘은 흐립니다.&lt;/p&gt;
&lt;/body&gt;

&lt;/html&gt;</code></pre><p>이를 출력하면 다음과 같다.</p>
<style type="text/css">
   body { font:12px "굴림", Gulim; background:url("images/bg_grid.gif") ; }
   .exp { width:500px ; background:#abc ; padding:10px ; margin:20px 0 ; }
   .cloud { width:200px; margin:0 auto; }
</style>
</head>
<body>
   <p class="exp">오늘은 비가 옵니다.</p>
   <p class="exp">오늘은 눈이 옵니다.</p>
   <p class="exp">오늘은 해가 납니다.</p>
   <p class="exp cloud">오늘은 흐립니다.</p>
</body>

<p>각 요소 간의 마진은 합해서 40px이어야 할 텐데 20px이다. - 세로 마진 겹침 오류!
마지막 박스는 중앙에 배치되었다. - margin : 0 auto;</p>
<h2 id="border">border</h2>
<p>박스의 테두리를 말한다. 테두리의 색상, 모양, 굵기를 정할 줄 알아야 하며 한꺼번에 지정할 줄도 알아야 한다.</p>
<blockquote>
</blockquote>
<p>border-color : #00f; --- 테두리의 색상을 파란색으로 지정한다
border-width : 2px; --- 테두리의 굵기를 2px로 지정한다
border-style : solid; --- 테두리의 모양을 실선으로 지정한다
border-top : 1px solid red; --- 위쪽 테두리만 1px짜리 빨간 실선으로 지정한다
border-bottom : 1px solid red; --- 아래쪽 테두리만 1px짜리 빨간 실선으로 지정한다
border-left : 1px solid red; --- 왼쪽 테두리만 1px짜리 빨간 실선으로 지정한다
border-right : 1px solid red; --- 오른쪽 테두리만 1px짜리 빨간 실선으로 지정한다</p>
<p>테두리 선의 모양은 다음과 같다.</p>
<blockquote>
</blockquote>
<p>solid --- 실선 모양의 테두리를 칠함
dashed --- 긴 점선 모양의 테두리를 칠함
dotted --- 점선 모양의 테두리를 칠함 (IE6에서는 1px dotted line은 dashed line으로 표현된다)
double --- 테두리 모양이 이중선으로 나타남
none --- 테두리를 치지 않음
groove, ridge, inset, outset --- 액자 형태의 테두리를 칠함</p>
<html>
<body>
<span style="border:5px solid #123456; width:550px; padding:5px; margin-bottom:20px; display : block;">border:5px solid #123456;</span>
<span style="border:5px dotted #123456; width:550px; padding:5px; margin-bottom:20px; display : block;">border:5px dotted #123456;</span>
<span style="border:5px dashed #123456; width:550px; padding:5px; margin-bottom:20px; display : block;">border:5px dashed #123456;</span>
<span style="border:10px groove #06c; width:550px; padding:5px; margin-bottom:20px; display : block;">border:10px groove #06c;</span>
<span style="border:10px ridge #f06; width:550px; padding:5px; margin-bottom:20px; display : block;">border:10px ridge #f06;</span>
<span style="border:10px inset #0c3; width:550px; padding:5px; margin-bottom:20px; display : block;">border:10px inset #0c3;</span>
<span style="border:10px outset #c63; width:550px; padding:5px; margin-bottom:20px; display : block;">border:10px outset #c63;</span>
<span style="border:none; width:550px; padding:5px;">border:none;</span>
</body>
</html>

<h1 id="레이아웃">레이아웃</h1>
<p>이번에 나오는 속성들은 블록들의 위치를 가로로 나열하는 데 필요한 요소와 요소들을 겹치게 배열하는 데 필요한 요소들이며 웹 표준 전반에서 가장 중요한 부분이다.</p>
<h2 id="float">float</h2>
<p>박스를 좌측이나 우측에 붙이고 아래 내용이 그 주변을 흐르게 하는 속성인데, 세로로만 나열되던 블록들을 가로로 서로 어울리게 배치하려 할 때 반드시 필요한 것이다. <span style="border-bottom : 1px solid red;" >float한 박스에 가로 사이즈를 함께 주어야 모든 구형 브라우저에서까지도 <strong>크로스 브라우징</strong> 된다.</span>
<strong>*크로스 브라우징</strong>이란? --- 각 브라우저들에서 한 웹페이지가 동일한 결과로 표현되는 것</p>
<blockquote>
</blockquote>
<p>left --- 박스를 왼쪽에 배치하고 나머지 컨텐츠는 그 주변을 흐르도록 함
right --- 박스를 오른쪽에 배치하고 나머지 컨텐츠는 그 주변을 흐르도록 함</p>
<p>[float : left;] 를 계속 쓴다는 것은 float된 박스의 옆 공간 중에서 왼쪽에 붙인다는 뜻이다.
따라서 계속 가로로 나열해야 하는 박스들은 맨 마지막 것을 제외하고는 모두 [float : left;]여야 하고 모두 다 [float : left;]여도 된다는 것이다.</p>
<h2 id="clear">clear</h2>
<p>float된 박스들의 바로 아래 박스에게 주변을 흐르지 않고 원래대로 배치되도록 하는 속성이다.
즉, float을 해제시켜주는 중요한 역할을 하는데, 이 요소는 블록이어야 한다.</p>
<blockquote>
</blockquote>
<p>left --- float된 박스 중 좌측이 짧을 때 좌측의 빈 공간부터 채워 내려옴
right --- float된 박스 중 우측이 짧을 때 우측의 빈 공간부터 채워 내려옴
both --- float된 박스 중 어느 쪽도 채우지 않고 다시 한단으로 배치해줌(가장 중요)</p>
<p>float을 해제하지 않으면 얼핏 보기에 정상적인 것 같아도 float된 박스를 감싸는 박스에 부여된 배경이나 테두리 속성이 실행되지 않는다. 특히 float된 박스 다음에 [clear : both;]를 부여할 박스가 없어서 방치한 경우가 그런 경우이다.</p>
<p>이런 경우에는 [clear : both;]를 부여할 가짜 요소를 만들어 주어야 한다. :after 선택자를 이용하여 container 안에 실제로는 없는 마지막 박스를 만들고 내용은 비웓둔다. 거기에 [clear : both;]을 해준다.</p>
<pre><code class="language-css">#container:after {
  content : &quot;&quot;;
  display : block;
  clear : both;
}</code></pre>
<p>이렇게 세 문장이다.</p>
<p>이러한 float 해제 처리를 해주지 않으면 container에 디자인이 들어가지 않는다는 것을 다음 예제를 통해 확인해보자.</p>
<pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;ko&quot;&gt;
&lt;head&gt;
&lt;title&gt;CSS&lt;/title&gt;
&lt;meta charset=&quot;utf-8&quot;&gt;
&lt;style type=&quot;text/css&quot;&gt;
*{margin:0;padding:0;}li{list-style-type:none;}
body{font:12px &quot;굴림&quot;,Gulim;margin:10px;}
#container{width:500px;padding:10px;background:#fdd;border:5px solid #caa;}
h1{text-align:center;padding:10px;}
p{text-align:justify;}
.green{float:left;width:200px;padding:15px;background:#dda;}
.coffee{float:right;width:200px;padding:15px;;background:#ba7;}
#container:after{content:&quot;&quot;;display:block;clear:both;}
&lt;/style&gt;
&lt;/head&gt;

&lt;body&gt;
&lt;div id=&quot;container&quot;&gt;
&lt;h1&gt;녹차와 커피&lt;/h1&gt;
&lt;div class=&quot;green&quot;&gt;
&lt;p&gt;녹차는 은은한 향을 좋아하는 사람들이 애용하는 차이다. 녹차를 마실 줄 모르는 사람들은 티백들을 모두 뜯어 주전자에 넣고 끊이기도 하는데 강한 차의 향기도 견디기 힘들겠지만 보관도 힘들고 그때그때 방금 끓인 듯한 맛을 느끼지 못하게 되며 진한 카페인 덕에 밤에 잠들기도 힘들 것이다.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;coffee&quot;&gt;
&lt;p&gt;커피는 독한 향을 좋아하는 사람도 매우 좋아하며 심한 경우  태어나기 전부터 커피를 마신 듯 강한 중독 증세를 보이는 경우가 많다. 심지어 원두를 씹어서 향에 자신을 담그는 사람도 있고 설탕, 시럽 등 다른 조미를 절대로 허락하지 않는 오직 커피맛만을 고집하는 마니아들이 늘고 있다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<br />

<p>이를 출력하면 다음과 같다.</p>
<br />

<!DOCTYPE html>
<html lang="ko">
<head>
<title>CSS</title>
<meta charset="utf-8">
<style type="text/css">
*{margin:0;padding:0;}li{list-style-type:none;}
#container{width:500px;padding:10px;background:#fdd;border:5px solid #caa;}
h1{text-align:center;padding:10px;}
p{text-align:justify;}
.green{float:left;width:200px;padding:15px;background:#dda;}
.coffee{float:right;width:200px;padding:15px;;background:#ba7;}
#container:after{content:"";display:block;clear:both;}
</style>
</head>

<body>
<div id="container">
<h1>녹차와 커피</h1>
<div class="green">
<p>녹차는 은은한 향을 좋아하는 사람들이 애용하는 차이다. 녹차를 마실 줄 모르는 사람들은 티백들을 모두 뜯어 주전자에 넣고 끊이기도 하는데 강한 차의 향기도 견디기 힘들겠지만 보관도 힘들고 그때그때 방금 끓인 듯한 맛을 느끼지 못하게 되며 진한 카페인 덕에 밤에 잠들기도 힘들 것이다.</p>
</div>
<div class="coffee">
<p>커피는 독한 향을 좋아하는 사람도 매우 좋아하며 심한 경우  태어나기 전부터 커피를 마신 듯 강한 중독 증세를 보이는 경우가 많다. 심지어 원두를 씹어서 향에 자신을 담그는 사람도 있고 설탕, 시럽 등 다른 조미를 절대로 허락하지 않는 오직 커피맛만을 고집하는 마니아들이 늘고 있다.</p>
</div>
</div>
</body>
</html>

<br />

<p>위의 코드에서</p>
<pre><code class="language-css">#container:after{content:&quot;&quot;;display:block;clear:both;}</code></pre>
<p>이 구문이 사라지면 <code>#container</code> 의 디자인이 제대로 실행되지 않아 결과가 다음처럼 나오게 된다.</p>
<br />

<!DOCTYPE html>
<html lang="ko">
<head>
<title>CSS</title>
<meta charset="utf-8">
<style type="text/css">
*{margin:0;padding:0;}li{list-style-type:none;}
#container2{width:500px;padding:10px;background:#fdd;border:5px solid #caa;}
h1{text-align:center;padding:10px;}
p{text-align:justify;}
.green{float:left;width:200px;padding:15px;background:#dda;}
.coffee{float:right;width:200px;padding:15px;;background:#ba7;}
</style>
</head>

<body>
<div id="container2">
<h1>녹차와 커피</h1>
<div class="green">
<p>녹차는 은은한 향을 좋아하는 사람들이 애용하는 차이다. 녹차를 마실 줄 모르는 사람들은 티백들을 모두 뜯어 주전자에 넣고 끊이기도 하는데 강한 차의 향기도 견디기 힘들겠지만 보관도 힘들고 그때그때 방금 끓인 듯한 맛을 느끼지 못하게 되며 진한 카페인 덕에 밤에 잠들기도 힘들 것이다.</p>
</div>
<div class="coffee">
<p>커피는 독한 향을 좋아하는 사람도 매우 좋아하며 심한 경우  태어나기 전부터 커피를 마신 듯 강한 중독 증세를 보이는 경우가 많다. 심지어 원두를 씹어서 향에 자신을 담그는 사람도 있고 설탕, 시럽 등 다른 조미를 절대로 허락하지 않는 오직 커피맛만을 고집하는 마니아들이 늘고 있다.</p>
</div>
</div>
</body>
</html>

<br />

<p>※ 만약 제대로 출력이 되지 않을 시 수정 페이지에서 모습을 확인할 수 있다.</p>
<h2 id="display">display</h2>
<p>요소의 성격을 바꾸어주는 속성이다. display가 어떻게 설정되어 있는지에 따라 그 후 사용할 수 있는 속성이 달라지므로 주의하자.</p>
<blockquote>
</blockquote>
<p>block --- 박스를 블록  요소로 만들어 줌 (줄 바꿈이 일어남)
inline --- 박스를 인라인 요소로 만들어 줌 (줄 바꿈이 일어나지 않음)
inline-block --- 박스를 인라인 요소로 두어 줄 바꿈은 일어나지 않게 하면서 <strong>블록에 쓸 수 있는 속성</strong>을 쓸 수 있음
none --- 박스를 보이지 않ㅎ게 숨겨 줌</p>
<p>*블록에 쓸 수 있는 속성이란? - width, height, padding, text-align... 등이다.</p>
<p>[display : inline-block;]을 사용하면 요소들 사이에 5px의 margin이 발생한다.
따라서 만약 각 메뉴들 사이가 붙어 있어야 한다면 [display : inline-block;]  대신 [float : left;] 를 넣어야 한다.
이때 float 해제는 gnb 요소에 높이값을 주는 것으로 처리한다. (뒤에 가서 정리할 float 해제 방법에 다시 나온다.)</p>
<h2 id="overflow">overflow</h2>
<p>박스 안의 내용이 박스보다 클 경우 넘치는 부분을 처리하는 속성이다.</p>
<blockquote>
</blockquote>
<p>hidden --- 넘치는 컨텐츠를 숨김
auto --- 넘치는 컨텐츠가 존재할 경우에만 스크롤바를 생성해 줌
scroll --- 넘치는 컨텐츠가 없어도 스크롤바를 생성해 줌
scroll-y, scroll-x --- 각 방향으로 스크롤바를 따로 처리하게 해줌</p>
<pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;ko&quot;&gt;
&lt;head&gt;&lt;title&gt;CSS&lt;/title&gt;
&lt;meta charset=&quot;utf-8&quot;&gt;
&lt;style type=&quot;text/css&quot;&gt;
*{margin:0;padding:0;}li{list-style-type:none;}
body{font:12px &quot;굴림&quot;,Gulim;margin:10px;}

#container{width:200px;height:100px;
    border:1px solid #ccc;overflow:hidden;}
&lt;/style&gt;&lt;/head&gt;
&lt;body&gt;
    &lt;div id=&quot;container&quot;&gt;
        &lt;blockquote&gt;우리가 확실하다고 여기는 것이 아니라 불명확하다며 지나치는 사소한 것에 내가 누구인지 말해주는 본질적인 요소가 담겨 있다&lt;/blockquote&gt;
        &lt;p&gt; - 김연수(소설가) &lt;/p&gt;
        &lt;p&gt;이 글을 처음 읽게 되었을 때 공감하여 입을 다물지 못했다. 무릎 대신 머리를 치는 것 같은 느낌을 받았다. 그 뒤로 나는 사람들이 발표하는 말이 아닌 일상에서의 사소한 말들에 집중하기 시작했던 것 같다. &lt;/p&gt;
    &lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<br />

<p>이를 출력하면 다음과 같다.</p>
<br />

<!DOCTYPE html>
<html lang="ko">
<head><title>CSS</title>
<meta charset="utf-8">
<style type="text/css">
*{margin:0;padding:0;}li{list-style-type:none;}
#container3{width:300px;height:150px;
border:1px solid #ccc; overflow:hidden;}
</style>
</head>
<body>
<div id="container3">
<p>우리가 확실하다고 여기는 것이 아니라 불명확하다며 지나치는 사소한 것에 내가 누구인지 말해주는 본질적인 요소가 담겨 있다</p>
<p> - 김연수(소설가) </p>
<p>이 글을 처음 읽게 되었을 때 공감하여 입을 다물지 못했다. 무릎 대신 머리를 치는 것 같은 느낌을 받았다. 그 뒤로 나는 사람들이 발표하는 말이 아닌 일상에서의 사소한 말들에 집중하기 시작했던 것 같다. </p>
</div>
</body>
</html>

<br />

<p>overflow에 무엇을 주느냐에 따라 다음과 같은 결과가 나타난다.</p>
<br />

<h3 id="overflow--hidden">overflow : hidden;</h3>
<!DOCTYPE html>
<html lang="ko">
<head><title>CSS</title>
<meta charset="utf-8">
<style type="text/css">
*{margin:0;padding:0;}li{list-style-type:none;}
#container3{width:300px;height:150px;
border:1px solid #ccc; overflow:hidden;}
</style>
</head>
<body>
<div id="container3">
<p>우리가 확실하다고 여기는 것이 아니라 불명확하다며 지나치는 사소한 것에 내가 누구인지 말해주는 본질적인 요소가 담겨 있다</p>
<p> - 김연수(소설가) </p>
<p>이 글을 처음 읽게 되었을 때 공감하여 입을 다물지 못했다. 무릎 대신 머리를 치는 것 같은 느낌을 받았다. 그 뒤로 나는 사람들이 발표하는 말이 아닌 일상에서의 사소한 말들에 집중하기 시작했던 것 같다. </p>
</div>
</body>
</html>

<br />

<h3 id="overflow--scroll">overflow : scroll;</h3>
<!DOCTYPE html>
<html lang="ko">
<head><title>CSS</title>
<meta charset="utf-8">
<style type="text/css">
*{margin:0;padding:0;}li{list-style-type:none;}
#container4{width:300px;height:150px;
border:1px solid #ccc; overflow:scroll;}
</style>
</head>
<body>
<div id="container4">
<p>우리가 확실하다고 여기는 것이 아니라 불명확하다며 지나치는 사소한 것에 내가 누구인지 말해주는 본질적인 요소가 담겨 있다</p>
<p> - 김연수(소설가) </p>
<p>이 글을 처음 읽게 되었을 때 공감하여 입을 다물지 못했다. 무릎 대신 머리를 치는 것 같은 느낌을 받았다. 그 뒤로 나는 사람들이 발표하는 말이 아닌 일상에서의 사소한 말들에 집중하기 시작했던 것 같다. </p>
</div>
</body>
</html>

<br />

<h3 id="overflow-y--scroll">overflow-y : scroll;</h3>
<!DOCTYPE html>
<html lang="ko">
<head><title>CSS</title>
<meta charset="utf-8">
<style type="text/css">
*{margin:0;padding:0;}li{list-style-type:none;}
#container5{width:300px;height:150px;
border:1px solid #ccc; overflow-y:scroll;}
</style>
</head>
<body>
<div id="container5">
<p>우리가 확실하다고 여기는 것이 아니라 불명확하다며 지나치는 사소한 것에 내가 누구인지 말해주는 본질적인 요소가 담겨 있다</p>
<p> - 김연수(소설가) </p>
<p>이 글을 처음 읽게 되었을 때 공감하여 입을 다물지 못했다. 무릎 대신 머리를 치는 것 같은 느낌을 받았다. 그 뒤로 나는 사람들이 발표하는 말이 아닌 일상에서의 사소한 말들에 집중하기 시작했던 것 같다. </p>
</div>
</body>
</html>

<br />

<h3 id="overflow-x--scroll">overflow-x : scroll;</h3>
<!DOCTYPE html>
<html lang="ko">
<head><title>CSS</title>
<meta charset="utf-8">
<style type="text/css">
*{margin:0;padding:0;}li{list-style-type:none;}
#container6{width:300px;height:150px;
border:1px solid #ccc; overflow-x:scroll;}
</style>
</head>
<body>
<div id="container6">
<p>우리가 확실하다고 여기는 것이 아니라 불명확하다며 지나치는 사소한 것에 내가 누구인지 말해주는 본질적인 요소가 담겨 있다</p>
<p> - 김연수(소설가) </p>
<p>이 글을 처음 읽게 되었을 때 공감하여 입을 다물지 못했다. 무릎 대신 머리를 치는 것 같은 느낌을 받았다. 그 뒤로 나는 사람들이 발표하는 말이 아닌 일상에서의 사소한 말들에 집중하기 시작했던 것 같다. </p>
</div>
</body>
</html>

<br />

<h3 id="overflow--auto">overflow : auto;</h3>
<!DOCTYPE html>
<html lang="ko">
<head><title>CSS</title>
<meta charset="utf-8">
<style type="text/css">
*{margin:0;padding:0;}li{list-style-type:none;}
#container7{width:300px;height:150px;
border:1px solid #ccc; overflow:auto;}
</style>
</head>
<body>
<div id="container7">
<p>우리가 확실하다고 여기는 것이 아니라 불명확하다며 지나치는 사소한 것에 내가 누구인지 말해주는 본질적인 요소가 담겨 있다</p>
<p> - 김연수(소설가) </p>
<p>이 글을 처음 읽게 되었을 때 공감하여 입을 다물지 못했다. 무릎 대신 머리를 치는 것 같은 느낌을 받았다. 그 뒤로 나는 사람들이 발표하는 말이 아닌 일상에서의 사소한 말들에 집중하기 시작했던 것 같다. </p>
</div>
</body>
</html>

<br />

<h2 id="float을-해제하는-몇-가지-방법">float을 해제하는 몇 가지 방법</h2>
<p>앞서 언급했듯 float을 해제하지 않으면 다음 박스들에 속성이 제대로 지정되지 않으며 무엇보다 float된 박스를 감싸는 박스에 부여된 배경, 테두리 여백 등이 하나도 나오지 않는다. 따라서 레이아웃을 제대로 표현하는데 float 해제는 반드시 필요하다.</p>
<blockquote>
</blockquote>
<p><strong>1</strong>. float된 박스들의 바로 다음 박스에게 [clear : both;] 한다.
바로 다음에 박스가 없으면 사용할 수 없다.
<strong>2</strong>. float된 박스들을 감싸는 박스를 다시 [float : left;] 한다.
그 float까지 연쇄적으로 해제해야 하며 width값 주어야 크로스 브라우징 됨.
<strong>3</strong>. float된 박스들을 감싸는 박스에 [overflow : auto;] 한다.
세로 스크롤바가 생길 경우 사용할 수 없으며 width값 주어야 크로스 브라우징 됨.
<strong>4</strong>. float된 박스들을 감싸는 박스에 height값을 준다.
본문 내용엔 높이를 주지 않으므로 세로 사이즈가 불변일 경우 아니면 사용불능.
<strong>5</strong>. float된 박스들을 감싸는 박스에 가상요소 : after를 주어 해제한다.
아무 부작용 없으며 width값 주어야 크로스 브라우징 됨.
1번이 안되면 이 방법이 가장 좋음.</p>
<p>※ 부모 요소에 heignt를 주면 float 해제 효과가 있으나 본문 내용에 height를 주면 유지보수가 힘들어지니 container 본문 부분에서는 꼭 필요한 경우가 아니면 height를 주지 않는다.</p>
<h2 id="position">position</h2>
<p>블록을 박스의 위치기준으로 배치하는 기술로서, 주로 컨텐츠를 서로 겹치게 배열하거나 마크업 순서와 디자인상의 순서가 다른 경우의 표현에 매우 유용하다.</p>
<blockquote>
</blockquote>
<p><strong>static</strong> --- 요소를 이동하거나 겹칠 수 없는 원래 그대로의 상태를 말하며 postion을 생략하면 그게 바로 static.
<strong>relative</strong> --- relative로 지정된 요소는 left와 top 속성으로 이동을 할 수 있으며, absolute로 지정된 요소의 부모 요소 역할을 할 수도 있다.
<strong>absolute</strong> --- absolute로 지정된 요소는 다른 요소와 겹칠 수 있고 left와 top 속성을 이용하여 부모 박스를 기준으로 위치를 정해주어야 한다.
<strong>fixed</strong> --- 요소의 위치를 화면 기준으로 지정해주며, 구형 브라우저에서는 표현되지 않는다.</p>
<p>position은 absolute와 relative가 중요하다. 다른 요소와 겹쳐져야 하거나 또는 제이쿼리로 애니메이션 해야 한다면 absolute여야 한다. 또한, absolute 요소의 부모 박스 역할을 하거나 그냥 살짝 이동만 할 거라면 relative를 사용한다.</p>
<p><code>position : relative;</code>와 <code>float : left;</code>는 함께 쓸 수 있으며 둘 다 주변과 어울리게 해준다. 그러나 <code>position : absolute;</code>와 <code>float : left;</code>는 함께 쓸 수 없다. absolute는 어울림의 반대 즉, 따로 떨어져 나온 독립된 요소이기 때문에 부모 박스가 자동으로 감싸주지 않는다. 또한, <code>float : left;</code>와 <code>clear : both;</code>도 함께 쓰면 안된다. float하는 명령과 해제하는 명령을 둘 다 쓰면 float 명령이 오류를 일으키게 돌 테니 쓰지 않는 것이 맞다.</p>
<h2 id="left">left</h2>
<p>relative나 absolute, 또는 fixed된 박스의 가로 위치를 정할 때 쓰는 속성이다.
※ 마크업한 요소가 접근성 측면에서 반드시 읽어주어야 하지만 보이지 않는 것이 레이아웃 상으로 좋을 경우 요소를 화면 바깥으로 숨기기 위해 <code>position : absolute; left : -9999px; }</code>처럼 사용하기도 한다.
<code>displat : none;</code>을 하면 아예 읽을 수 없어지기 때문에 위와 같은 방법으로 숨기는 것이 좋다.
한 가지 더, table의 caption은 위처럼 숨기면 브라우저에 따라 오류가 생길 수 있으니 <code>visibility : hidden;</code>도 넣어 준다.</p>
<h2 id="top">top</h2>
<p>relative나 absolute, 또는 fixed된 박스의 세로 위치를 정할 때 쓰는 속성이다.</p>
<h2 id="2단-레이아웃을-완성하는-몇-가지-방법">2단 레이아웃을 완성하는 몇 가지 방법</h2>
<p>2단은 container 안의 가로로 나열된 두 박스, sidemenu와 content를 말한다.</p>
<h3 id="1-float-방식">1. float 방식</h3>
<p>sidemenu는 <code>float ; left;</code>하고 content는 <code>float : right;</code>
※loat의 해제가 필요함.</p>
<div style="float:left; width:100%; border:1px solid red;">
  <div style="float:left; width:200px; height: 300px; margin:10px; border:1px solid green;">sidemenu</div>
  <div style="float:right; width:800px; height: 600px; margin:10px; border:1px solid blue;">content</div>
</div>
<div style="clear:both; margin-top:10px; border:1px solid #333;">clear:both;</div>

<pre><code class="language-html">&lt;div style=&quot;float:left; width:100%; border:1px solid red;&quot;&gt;
  &lt;div style=&quot;float:left; width:200px; height: 300px; margin:10px; border:1px solid green;&quot;&gt;sidemenu&lt;/div&gt;
  &lt;div style=&quot;float:right; width:800px; height: 600px; margin:10px; border:1px solid blue;&quot;&gt;content&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;clear:both; margin-top:10px; border:1px solid #333;&quot;&gt;clear:both;&lt;/div&gt;</code></pre>
<br />

<h3 id="2-position---절대-상대위치">2. position - 절대, 상대위치</h3>
<p>sidemenu는 <code>position : absolute</code>하고 content는 <code>position : relative;</code> 함.
긴 쪽을 relative해야 container가 포함할 수 있다.
※부모 박스를 지정해 주어야 함.</p>
<div style="position:relative; width:100%; border:1px solid red;">
  <div style="position:absolute; width:200px; height: 300px; margin:10px; border:1px solid green;">sidemenu</div>
  <div style="position:relative; left:220px; width:800px; height: 600px; margin:10px; border:1px solid blue;">content</div>
</div>

<pre><code class="language-html">&lt;div style=&quot;position:relative; width:100%; border:1px solid red;&quot;&gt;
  &lt;div style=&quot;position:absolute; width:200px; height: 300px; margin:10px; border:1px solid green;&quot;&gt;sidemenu&lt;/div&gt;
  &lt;div style=&quot;position:relative; left:220px; width:800px; height: 600px; margin:10px; border:1px solid blue;&quot;&gt;content&lt;/div&gt;
&lt;/div&gt;</code></pre>
<br />

<h3 id="3-postition---절대-마진">3. postition - 절대, 마진</h3>
<p>sidemenu는 <code>position : absolute</code>하고 content는 <code>margin-left</code>를 줌.
※부모 박스를 지정해 주어야 함.</p>
<div style="position:relative; width:100%; border:1px solid red;">
  <div style="position:absolute; width:200px; height: 300px; margin:10px; border:1px solid green;">sidemenu</div>
  <div style="margin-left:220px; width:800px; height: 600px; margin:10px; border:1px solid blue;">content</div>
</div>

<pre><code class="language-html">&lt;div style=&quot;position:relative; width:100%; border:1px solid red;&quot;&gt;
  &lt;div style=&quot;position:absolute; width:200px; height: 300px; margin:10px; border:1px solid green;&quot;&gt;sidemenu&lt;/div&gt;
  &lt;div style=&quot;margin-left:220px; width:800px; height: 600px; margin:10px; border:1px solid blue;&quot;&gt;content&lt;/div&gt;
&lt;/div&gt;</code></pre>
<br />

<h3 id="4-float--position">4. float + position</h3>
<p>sidemenu는 <code>position : absolute</code>하고 content는 <code>float : right;</code>
※float의 해제가 필요하고 부모 박스를 지정해 주어야 함.</p>
<div style="position:relative; flaot:left; width:100%; border:1px solid red;">
  <div style="position:absolute; width:200px; height: 300px; margin:10px; border:1px solid green;">sidemenu</div>
  <div style="float: right; width:800px; height: 600px; margin:10px; border:1px solid blue;">content</div>
</div>
<div style="clear:both; margin-top:10px; border:1px solid #333;">clear:both;</div>

<pre><code class="language-html">&lt;div style=&quot;position:relative; width:100%; border:1px solid red;&quot;&gt;
  &lt;div style=&quot;position:absolute; width:200px; height: 300px; margin:10px; border:1px solid green;&quot;&gt;sidemenu&lt;/div&gt;
  &lt;div style=&quot;margin-left:220px; width:800px; height: 600px; margin:10px; border:1px solid blue;&quot;&gt;content&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;clear:both; margin-top:10px; border:1px solid #333;&quot;&gt;clear:both;&lt;/div&gt;</code></pre>
<br />

<h2 id="3단-레이아웃을-완성하는-몇-가지-방법">3단 레이아웃을 완성하는 몇 가지 방법</h2>
<p>이번엔 3단 레이아웃을 완성하는 방법을 정리해보자. sidemenu보다 content를 먼저 마크업 할 경우는 sidemenu와 content를 감싸는 박스가 필요하므로 다섯 가지 방법으로 정리해보자. </p>
<h3 id="1-float-방식-1">1. float 방식</h3>
<p>sidemenu와 content는 float:left; banner만 float:right;
float의 해제가 필요함</p>
<div style="float:left; width:100%; border:1px solid red;">
  <div style="float:left; width:200px; height:300px; margin:10px; border:1px solid green;">sidemenu</div>
  <div style="float:left; width:600px; height:600px; margin:10px; border:1px solid blue;">content</div>
  <div style="float:right; width:200px; height:400px; margin:10px; border:1px solid black;">banner</div>
</div>
<div style="clear:both; margin-top:10px; border:1px solid #333;">clear:both;</div>

<pre><code class="language-html">&lt;div style=&quot;float:left; width:100%; border:1px solid red;&quot;&gt;
  &lt;div style=&quot;float:left; width:200px; height:300px; margin:10px; border:1px solid green;&quot;&gt;sidemenu&lt;/div&gt;
  &lt;div style=&quot;float:left; width:600px; height:600px; margin:10px; border:1px solid blue;&quot;&gt;content&lt;/div&gt;
  &lt;div style=&quot;float:right; width:200px; height:400px; margin:10px; border:1px solid black;&quot;&gt;banner&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;clear:both; margin-top:10px; border:1px solid #333;&quot;&gt;clear:both;&lt;/div&gt;</code></pre>
<br />

<h3 id="2-content를-sidemenu보다-먼저-마크업">2. content를 sidemenu보다 먼저 마크업</h3>
<p>content는 <code>float:right;</code>하고 sidemenu는 <code>flaot:left;</code>
sidemenu와 content는 <code>float:left;</code> banner는 <code>float:right;</code>
float의 해제가 필요함</p>
<div style="float:left; width:100%; border:1px solid red;">
  <wrap style="float:left;">
    <div style="float:left; width:200px; height:300px; margin:10px; border:1px solid green;">sidemenu</div>
    <div style="float:right; width:600px; height:600px; margin:10px; border:1px solid blue;">content</div>
  </wrap>
  <div style="float:right; width:200px; height:400px; margin:10px; border:1px solid black;">banner</div>
</div>
<div style="clear:both; margin-top:10px; border:1px solid #333;">clear:both;</div>

<pre><code class="language-html">&lt;div style=&quot;float:left; width:100%; border:1px solid red;&quot;&gt;
  &lt;wrap style=&quot;float:left;&quot;&gt;
    &lt;div style=&quot;float:left; width:200px; height:300px; margin:10px; border:1px solid green;&quot;&gt;sidemenu&lt;/div&gt;
    &lt;div style=&quot;float:right; width:600px; height:600px; margin:10px; border:1px solid blue;&quot;&gt;content&lt;/div&gt;
  &lt;/wrap&gt;
  &lt;div style=&quot;float:right; width:200px; height:400px; margin:10px; border:1px solid black;&quot;&gt;banner&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;clear:both; margin-top:10px; border:1px solid #333;&quot;&gt;clear:both;&lt;/div&gt;</code></pre>
<br />

<h3 id="3-position---절대-상대위치">3. position - 절대, 상대위치</h3>
<p>siidemenu와 content는 <code>position:absolute</code>하고 content는 <code>position:relative</code>
부모 박스를 지정해 주어야 함</p>
<div style="position:relative; width:100%; border:1px solid red;">
  <div style="position:absolute; left:0; width:200px; height:300px; margin:10px; border:1px solid green;">sidemenu</div>
  <div style="position:absolute; right:0; width:200px; height:400px; margin:10px; border:1px solid black;">banner</div>
  <div style="position:relative; left:210px; width:600px; height:600px; margin:10px; border:1px solid blue;">content</div>

</div>

<pre><code class="language-html">&lt;div style=&quot;position:relative; width:100%; border:1px solid red;&quot;&gt;
  &lt;div style=&quot;position:absolute; left:0; width:200px; height:300px; margin:10px; border:1px solid green;&quot;&gt;sidemenu&lt;/div&gt;
  &lt;div style=&quot;position:relative; left:220px; width:600px; height:600px; margin:10px; border:1px solid blue;&quot;&gt;content&lt;/div&gt;
  &lt;div style=&quot;position:absolute; right:0; width:200px; height:400px; margin:10px; border:1px solid black;&quot;&gt;banner&lt;/div&gt;
&lt;/div&gt;</code></pre>
<br />

<h3 id="4-position---절대-마진">4. position - 절대, 마진</h3>
<p>sidemenu와 content는 <code>position:absolute</code>하고 content는 <code>margin-left;</code>
부모 박스를 지정해주어야 함</p>
<div style="position:relative; width:100%; border:1px solid red;">
  <div style="position:absolute; left:0; width:200px; height:300px; margin:10px; border:1px solid green;">sidemenu</div>
  <div style="position:absolute; right:0; width:200px; height:400px; margin:10px; border:1px solid black;">banner</div>
  <div style="margin:10px 10px 10px 220px; width:600px; height:600px; border:1px solid blue;">content</div>
</div>

<pre><code class="language-html">&lt;div style=&quot;position:relative; width:100%; border:1px solid red;&quot;&gt;
  &lt;div style=&quot;position:absolute; left:0; width:200px; height:300px; margin:10px; border:1px solid green;&quot;&gt;sidemenu&lt;/div&gt;
  &lt;div style=&quot;position:absolute; right:0; width:200px; height:400px; margin:10px; border:1px solid black;&quot;&gt;banner&lt;/div&gt;
  &lt;div style=&quot;margin:10px 10px 10px 220px; width:600px; height:600px; border:1px solid blue;&quot;&gt;content&lt;/div&gt;
&lt;/div&gt;</code></pre>
<br />

<h3 id="5-float--position">5. float + position</h3>
<p>sidemenu는 <code>float:left;</code>하고 banner는 <code>float;right;</code>하고 content는 <code>position:absolute;</code>
내용이 길면 부모 박스에 height 지정
float의 해제가 필요하고 부모 박스를 지정해 주어야 함</p>
<p>float이 있으니 해제도 해주어야 하고 absolute 박스가 있으니 부모도 설정해주어야 하며 가운데 상자가 absolute 박스이니 양쪽 박스보다 가운데 길이가 긴 레이아웃에 이 방식을 적용하면 안 될 것이다. 제일 번거로운 방식이라서 잘 쓰지 않지만 가능한 조합의 경우를 모두 표현해보기 위해 정리해보자.</p>
<div style="position:relative; float:left; width:100%; border:1px solid red;">
  <div style="float:left; width:200px; height:300px; margin:10px; border:1px solid green;">sidemenu</div>
  <div style="position:absolute; margin:10px; left:220px; width:600px; height:600px; border:1px solid blue;">content</div>
  <div style="float:right; width:200px; height:400px; margin:10px; border:1px solid black;">banner</div>
</div>
<div style="clear:both; margin-top:10px; border:1px solid #333;">clear:both;</div>

<pre><code class="language-html">&lt;div style=&quot;position:relative; float:left; width:100%; border:1px solid red;&quot;&gt;
  &lt;div style=&quot;float:left; width:200px; height:300px; margin:10px; border:1px solid green;&quot;&gt;sidemenu&lt;/div&gt;
  &lt;div style=&quot;position:absolute; margin:10px; left:220px; width:600px; height:600px; border:1px solid blue;&quot;&gt;content&lt;/div&gt;
  &lt;div style=&quot;float:right; width:200px; height:400px; margin:10px; border:1px solid black;&quot;&gt;banner&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;clear:both; margin-top:10px; border:1px solid #333;&quot;&gt;clear:both;&lt;/div&gt;</code></pre>
<br />





]]></description>
        </item>
        <item>
            <title><![CDATA[CSS - 선택자, 서체, 문단, 배경]]></title>
            <link>https://velog.io/@jay_kimjh/CSS</link>
            <guid>https://velog.io/@jay_kimjh/CSS</guid>
            <pubDate>Fri, 07 Jan 2022 05:28:50 GMT</pubDate>
            <description><![CDATA[<ul>
<li>본 포스팅은 책『실전 프로젝트 반응형 웹 퍼블리싱』을 바탕으로 작성됨.</li>
</ul>
<h1 id="css-기본-문법basic-css-grammar">CSS 기본 문법(Basic CSS Grammar)</h1>
<p>CSS는 내부 스타일시트, 외부 스타일시트, 인라인 스타일시트 등의 세 가지 종류가 있다. 실제로 외부 css를 사용하는 편이지만, 간단한 스타일은 내부 스타일시트로도 많이 사용하고 있으며 인라인 스타일시트는 가장 우선순위가 높아 꼭 필요할 때 편리하게 사용할 수 있다.</p>
<ul>
<li>내부 스타일시트는 문서의 표현(디자인 꾸미기)을 위한 명령들을 HTML 문서 안에 스타일 태그로 기재하여 스타일이 HTML 안에 함께 저장되는 형대이다.</li>
</ul>
<pre><code class="language-html">&lt;html&gt;
  &lt;head&gt;
    &lt;style type=&quot;text/css&quot;&gt;    /* 스타일 시작 */
      p { color : red; }
    &lt;/style&gt;            &lt;!-- 스타일 끝 --&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;p&gt;우리를 기쁘게 하는 것들.&lt;/p&gt;
  &lt;/body&gt;
&lt;/html&gt;</code></pre>
<p>-외부 스타일시트는 문서의 표현(디자인 꾸미기)을 위한 명령들을 따로 CSS파일로 저장하여 HTML문서에 파일명으로 연결해주는 형태이다.</p>
<p>html</p>
<pre><code class="language-html">&lt;html&gt;
  &lt;head&gt;
    &lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;style.css&quot; /&gt;    /* 스타일 파일을 연결 */
  &lt;/head&gt;
  &lt;body&gt;
    &lt;p&gt;우리를 기쁘게 하는 것들.&lt;/p&gt;
  &lt;/body&gt;
&lt;/html&gt;</code></pre>
<p>style.css</p>
<pre><code class="language-css">p { color : red; }</code></pre>
<ul>
<li>외부 스타일시트 형식이 또 하나 있는데 @import이다. 이것은 스타일 태그나 스타일 파일 안에 써주어야 한다. 주로 기본 CSS를 따로 작성하여 각각의 프로젝트마다 꽂아주는 데 사용한다. CSS 가장 윗줄에 넣어야 한다.</li>
</ul>
<p>html</p>
<pre><code class="language-html">&lt;html&gt;
  &lt;head&gt;
    &lt;style type=&quot;text/css&quot;&gt;
      @import url(&quot;reset.css&quot;);    /* 스타일 파일을 연결 */
      p {color : red; }
    &lt;/style&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;p&gt;우리를 기쁘게 하는 것들.&lt;/p&gt;
  &lt;/body&gt;
&lt;/html&gt;</code></pre>
<p>reset.css</p>
<pre><code class="language-css">body, p, h1 { margin:0; padding:0; }</code></pre>
<ul>
<li>인라인 스타일시트는 문서의 표현(디자인 꾸미기)을 위한 명령들을 HTML 마크업의 속성으로 직접 입력해주는 형태이다.<pre><code class="language-html">&lt;body&gt;
&lt;p style=&quot;color : red;&quot;&gt;우리를 기쁘게 하는 것들.&lt;/p&gt;
&lt;/body&gt;</code></pre>
이후에 선택자의 속성에 대해 좀 더 배우고 나서 스타일시트를 본격적으로 만드는 예제들을 만나 보자.</li>
</ul>
<p><br /><br /></p>
<h2 id="선택자selector">선택자(Selector)</h2>
<p>CSS에 대한 아무런 지식 없이 선택자를 이야기한다는 것은 어렵다. 그런데 선택자를 모르고는 css속성을 알아볼 수 없기 때문에 선택자의 의미를 먼저 알아야만 좀 더 쉽게 다가갈 수 있따. 선택자란 CSS로 UI 디자인을 할 때 &#39;어디를 꾸며 줄까?&#39;하는 고민의 대상이 되는 부분을 말한다. 선택자에는 여러 종류가 있는데 그중에서 <strong>타입 선택자, id 선택자, class 선택자</strong>가 가장 중요하다. 그럼 하나씩 좀 더 자세히 살펴보자.</p>
<p><img src="https://images.velog.io/images/jay_kimjh/post/297342ce-539c-4c96-857e-e5876df49f90/yrkim-140327-selector-04.png" alt=""></p>
<h3 id="타입-선택자">타입 선택자</h3>
<p>태그 이름을 그대로 가져다 쓰는 선택자이다.</p>
<pre><code class="language-css">p { color : blue; } /* p태그 안의 글자들을 파란색으로 처리함 */</code></pre>
<h3 id="id-선택자">id 선택자</h3>
<p>id를 붙인 이름을 가져다 쓰는 선택자이다. --- &quot;#&quot;을 붙여 표기함</p>
<pre><code class="language-css">#ctxt { color : blue; } /* id명이 ctxt인 요소의 글자들을 파란색으로 처리함 */</code></pre>
<h3 id="class-선택자">class 선택자</h3>
<p>class로 붙인 이름을 가져다 쓰는 선택자이다. --- &quot;.&quot;을 붙여 표기함</p>
<pre><code class="language-css">.ctxt { color : blue; } /* id명이 ctxt인 요소의 글자들을 파란색으로 처리함 */</code></pre>
<h3 id="전체-선택자">전체 선택자</h3>
<p>페이지의 모든 요소를 가리키는 선택자이다. --- &quot;*&quot;을 붙여 표기함</p>
<pre><code class="language-css">* { color : blue; } /* 페이지 내의 모든 요소들의 글자들을 파란색으로 처리함 */</code></pre>
<h3 id="자식-선택자">자식 선택자</h3>
<p>현재 요소 내의 바로 아래 나오는 요소만을 가리키는 선택자이다. IE6에서는 표현되지 않는다.</p>
<pre><code class="language-css">li &gt; p { color : blue; } /* li 속 바로 아래 p 태그의 글자들을 파란색으로 처리함 */</code></pre>
<h3 id="인접-선택자">인접 선택자</h3>
<p>현재 요소 밖의 바로 뒤에 나오는 요소만을 가리키는 선택자이다. IE6에서는 표현되지 않는다.</p>
<pre><code class="language-css">h1 + p { color : blue; } /* h1 속 바로 다음 p 태그의 글자들을 파란색으로 처리함 */</code></pre>
<h3 id="속성-선택자">속성 선택자</h3>
<p>마크업의 속성을 선택자로 사용할 수 있다. IE6에서는 표현되지 않는다.</p>
<blockquote>
</blockquote>
<p><strong>h1[class]</strong> - class 속성이 있는 모든 h1
<strong>img[alt]</strong> - alt 속성이 있는 모든 이미지
** *[title]** - title 속성을 갖는 모든 요소</p>
<h3 id="가상-클래스-선택자">가상 클래스 선택자</h3>
<p>링크 걸린 글자에 스타일을 부여하는 것이다.</p>
<blockquote>
</blockquote>
<p><strong>a:link</strong> - 링크된 글자를 보고만 있을 때의 스타일을 주는 선택자.
<strong>a:visited</strong> - 링크된 글자를 눌러 해당 페이지에 갔다가 돌아온 경우의 스타일을 주는 선택자.
<strong>a:hover</strong> - 링크 걸린 글자에 마우스가 닿았을 경우의 스타일을 주는 선택자.
<strong>a:active</strong> - 링크 걸린 글자가 활성화 되었을 경우의 스타일을 주는 선택자. (클릭했다가 돌아왔거나 클릭하려다 만 경우)
<strong>a:focus</strong> - 링크 걸린 글자에 포커스가 생길 경우의 스타일을 주는 선택자. (탭키 등으로 포커스가 나타날 경우)</p>
<p>모두 사용할 경우 위 표의 순서대로 기재해야 하며 무졸 다음 예처럼 사용한다.</p>
<pre><code class="language-css">&lt;style type=&quot;tsxt/css&quot;&gt;
  a { color : #000; }     /* 링크 걸린 글자는 모두 검은색 */
  a:hover { color : #f00; }    /* 마우스 닿으면 빨간색 */
&lt;/style&gt;</code></pre>
<h3 id="수도-클래스-선택자">수도 클래스 선택자</h3>
<p>요소의 세부 조건까지도 나타낼 수 있는 선택자이다. IE6에서는 표현되지 않는다.</p>
<blockquote>
</blockquote>
<p>:first-letter - 요소의 첫글자
:first-line - 요소의 첫 줄
:first-child - 같은 요소 중 첫 번째 요소
:last-child - 같은 요소 중 첫 번째 요소
:before - 요소의 맨 앞에 배치하는 마크업에는 없는 가상 요소
:after - 요소의 맨 뒤에 배치하는 마크업에는 없는 가상 요소</p>
<pre><code class="language-css">&lt;style type=&quot;text/css&quot;&gt;
  .box:after { content : &quot;항목을 선택해주세요&quot;; color : green; }        /* box의 마지막에 문장을 삽입한다 */
  p:first-letter { font-size : 300%; }        /* p 태그 안의 첫 글자는 글자크기 세배로 */
  p { border-bottom : 1px dashed #000; }        /* p 태그에 모두 밑줄 치고 */
  p:last-child { border : none; }        /* 마지막 p 태그에만 밑줄 빼기 */
  &lt;/style&gt;</code></pre>
<p>※ 결합 형태에 따라서 종속 선택자, 하위 선택자, 그룹 선택자가 있는데 간단히 알아보도록 하자</p>
<h3 id="종속-선택자">종속 선택자</h3>
<p>타입 선택자와 아이디(#)/틀래스(.) 선택자가 결합된 형태이다.</p>
<pre><code class="language-css">p.more a { color : red; }        /* 클래스명이 more인 p태그의 링크 (a)샋상을 변경함 */</code></pre>
<h3 id="하위-선택자">하위 선택자</h3>
<p>한 선택자 내부에 존재하는 또 다른 선택자이다.</p>
<pre><code class="language-css">.box li { padding :  5px 0; }        /* 클래스명이 box인 요소 내부의 li에 세로 여백을 준다 */</code></pre>
<h3 id="그룹-선택자">그룹 선택자</h3>
<p>선택자들을 쉼표로 구분하여 여럿을 함께 기술하는 것이다.</p>
<pre><code class="language-css">
h1, p { border : 1px solid #000; }        /* h1과 p요소에 1px짜리 검은 테두리를 준다 */</code></pre>
<p><br /><br /></p>
<h2 id="서체font">서체(Font)</h2>
<p>글자에 관련된 속성은 <strong>글꼴, 글자 크기, 글자 굵기, 기울임 여부, 줄 간격, 대소문자 여부, 글자 색상</strong> 등 일곱 가지로 정리해 보겠다. 그것들을 CSS로 따로 표현하는 법을 알아보고, <span style="border-bottom : 1px solid #ff0000">특히 그 중 색상을 제외한 여섯 가지 속성은 한꺼번에 표현하는 경우가 더 많으므로</span> 그 방법도 알아보도록 하자. 그럼 좀 더 자세히 들어가보자.</p>
<blockquote>
</blockquote>
<p><strong>font-family</strong> - 글꼴을 인용 부호로 감싸 지정한다.
<strong>font-size</strong> - 수치에 px 등의 단위를 붙여 지정한다.(px, %, em<em>)
<strong>font-weight</strong> - 두께를 bold 또는 수치로 지정한다.(bold, normal0
<strong>font-style</strong> - 기울이거나, 바로 세운다.(italic, normal)
<strong>font-variant</strong> - small-caps로 작은 대문자를 표현할 수 있다.(small-caps, normal)
<strong>line-height</strong> - 줄 간격을 수치로 지정한다.(%, em</em>, px)
<strong>font</strong> - 위의 속성들을 한 줄로 기술하는 선택자.</p>
<p>*1em은 100%와 같은 뜻으로 부모 박스에서 설정한 크기와 같은 크기를 의미한다.</p>
<p>이렇게 여섯가지 속성을 많은 사람들은 모두 한꺼번에 쓰기를 즐겨하는데 그럴 경우 반드시 다음 세가지 순서에 맞추어 써야 하며, <span style="border-bottom : 1px solid #ff0000;">글자 크기와 글꼴은 결코 생략할 수 없다.</span></p>
<pre><code class="language-css">sont:[font-weighyt, font-style, font-variamt] → [font-size/line-height] → [font-famliy]</code></pre>
<blockquote>
</blockquote>
<ul>
<li>font : 12px Times ; --- O</li>
<li>font : bold 12px/1.5 ; --- X (글꼴을 쓰지 않았음)</li>
<li>font : 12px/1.5 bold Times ; --- X (bold를 맨 앞에 써야 함)</li>
</ul>
<p>그리고 전체나 기타의 레이아웃을 정할 때 크기를 편하게 가늠하기 위해 전체 문서에서 가장 많은 양을 차지하는 본문의 서식대로 다음과 같이 기본 폰트를 body 태그에 넣어주는 것도 좋다.</p>
<pre><code class="language-css">body {font:12px &quot;굴림&quot;,Gilim;}</code></pre>
<p>다음은 색상 속성으로 넘어가도록 하자. 색상은 주로 16진수 6자리로 표기하며 맨 앞 두 자리는 빨간색(R), 다음 두 자리는 초록색(G), 맨 뒤 두 자리는 파란색(B)이다. 혹은, 브라우저에 등록되어 있는 색상 고유명사로 지정할 수 도 있다. 값이 높아질수록 밝아지는 결과가 나오며, 참고로 그 두 자릿값이 셋다 같으면 한자리로 줄여  쓸 수 있다.</p>
<blockquote>
</blockquote>
<h4 id="color">color</h4>
<ul>
<li>color : #ff0000;        --- 글자 색을 빨간색으로</li>
<li>color : orange;        --- 글자 색을 주황색으로<h4 id="대표-색상값">대표 색상값</h4>
</li>
<li>color : #000000;        --- 검은색 (= #000)</li>
<li>color : #ffffff;        --- 흰색 (= #fff)</li>
<li>color : #ff0000;        --- 빨간색 (= #f00)</li>
<li>color : #00ff00;        --- 형광 밝은 초록색 (= #0f0)</li>
<li>color : #0000ff;        --- 파란색 (= #00f)</li>
<li>color : #ffff00;        --- 노란색 (= #ff0)</li>
<li>color : #00ffff;        --- 형광 밝은 파란색 (= #0ff)</li>
<li>color : #ff00ff;        --- 형광 밝은 보라색(= #f0f)<h4 id="예시">예시</h4>
</li>
<li>color : pink;            --- O</li>
<li>color : #orange;        --- X (고유명사에 #을 붙이지 않음)</li>
<li>color : #abcdef;        --- O</li>
<li>color : #qwerty;        --- X (16진수는 f까지만 사용)</li>
<li>color : #123456;        --- O</li>
<li>color : #1234567;        --- X (자릿수는 6자리만)</li>
</ul>
<p><br /><br /></p>
<h2 id="문단paragraph">문단(Paragraph)</h2>
<p>문단 관련 속성은 주로 글자나 단어보다는 문장들에 적용하면 좋은 속성들로 분류했는데, 대표적으로 <strong>가로 정렬, 세로 정렬, 들여쓰기, 대소문자, 줄치기, 자간 조절</strong> 등이 있다. 어떻게 사용하는지 알아보자.</p>
<h3 id="text-align">text-align</h3>
<ul>
<li>문단을 블록의 왼쪽, 가운데, 오른쪽, 양쪽 등으로 정렬시켜 준다.</li>
<li>쓸 수 있는 값들 : left(왼쪽 정렬), center(중앙 정렬), right(오른쪽 정렬), justify(양쪽 정렬)</li>
<li>블록 요소에만 사용할 수 있다.</li>
</ul>
<h3 id="vertical-align">vertical-align</h3>
<ul>
<li>이미지나 폼 요소를 위, 가운데, 아래 등으로 세로 정렬시켜 준다.</li>
<li>쓸 수 있는 값들 : top(위쪽 정렬), middle(중앙 정렬), bottom(아래쪽 정렬)</li>
<li>img, input, select, 테이블의 th, td 등에 사용한다.</li>
</ul>
<h3 id="text-indent">text-indent</h3>
<ul>
<li>문단의 첫머리를 들여쓰기한다.</li>
<li>쓸 수 있는 값들 : px, % 등의 단위로 수치를 적용한다.</li>
<li>블록 요소에만 사용할 수 있다.</li>
</ul>
<h3 id="text-transform">text-transform</h3>
<ul>
<li>대소문자 변경을 실행한다.</li>
<li>쓸 수 있는 값 : uppercase(대문자), lowercase(소문자), capitalize(첫 글자만 대문자)</li>
</ul>
<h3 id="text-decoration">text-decoration</h3>
<ul>
<li>글자에 및줄, 윗줄, 가운데 줄을 치거나, 원래 있던 밑줄을 없애 준다.</li>
<li>쓸 수 있는 값 : underline(밑줄), overline(윗줄), line-through(가운데 줄), none(밑줄 제거)</li>
</ul>
<h3 id="letter-spacing">letter-spacing</h3>
<ul>
<li>글자와 글자간의 간격을 부여한다.</li>
<li>쓸 수 있는 값 : px, % 등의 단위로 수치를 적용한다.</li>
</ul>
<p><br /><br /></p>
<h2 id="배경background">배경(Background)</h2>
<p>배경에 관한 속성은 배경색, 배경 이미지, 배경 반복 여부, 배경 위치, 배경 고정 여부 등이 있으며 이 모든 속성을 한 줄로 표기할 수도 있어야 하겠다. 그럼 들어가 보자.</p>
<blockquote>
</blockquote>
<h4 id="background-color">background-color</h4>
<p>배경의 색상을 지정한다.</p>
<ul>
<li>transparent        --- 투명 (생략하면 기본값으로 취급됨)</li>
<li>#ff0000            --- 배경을 빨간색으로<h4 id="background-image">background-image</h4>
배경으로 쓸 이미지를 지정한다.
ex) url(&quot;image/bg.png&quot;)<h4 id="background-repeat">background-repeat</h4>
배경 이미지를 어떻게 반복시킬지 정한다.</li>
<li>repeat            --- 가로 세로로 반복(생략하면 기본값으로 취급됨)</li>
<li>no-repeat            --- 한번만 나옴</li>
<li>repeat-x            --- 가로로 반복함</li>
<li>repeat-y            --- 세로로 반복함<h4 id="background-position">background-position</h4>
배경 이미지의 위치를 정한다.
가로위치            --- left, right, center, px값, %값, em값
세로위치            --- top, bottom, center, px값, %값, em값
생략하면            --- 각각 left, top이 기본값으로 취급됨<h4 id="background-attachment">background-attachment</h4>
베경 이미지를 고정시킬지 스크롤되게 할지 정한다.
scroll            --- 화면이 스크롤되면 따라감(생략하면 기본값으로 취급됨)
fixed            --- 배경의 위치가 화면 기준으로 고정됨<h4 id="background">background</h4>
위의 다섯 가지 속성을 한 줄로 표기한다.</li>
</ul>
<p>배경 관련 속성을 한 줄로 표기할 때의 주의점은 다음과 같다.</p>
<ul>
<li>각 속성들 간의 순서는 상관없이 기술함.</li>
<li>단, 반드시 속성 간에 띄어쓰기를 해주어야 함.(url과 괄호는 붙임)</li>
<li>no-repeat 앞을 띄어 쓰지 않으면 브라우저 IE에서 배경 이미지가 나오지 않는다.</li>
<li>배경 이미지의 위치를 수치값으로 기술할 때에는 가로 위치 → 세로 위치 순서로 반드시 두 개의 값을 넣어주어야 한다.</li>
</ul>
<pre><code class="language-css">background : #fdd yrl(&quot;images/bg.png&quot;) no-repeat 50px 100px scroll;</code></pre>
<p>또한 background 속성을 쓰면서 속성을 생략할 경우 위의 표에서 기술한 대로 각 속성은 기본값을 가지므로 다음 두 문장은 같은 결과를 갖게 된다.</p>
<pre><code class="language-css">background : url(&quot;images/bg.png&quot;);
background : transparent url(&quot;images/bg.png&quot;) repeat left top scroll;</code></pre>
<blockquote>
</blockquote>
<h4 id="예시-1">예시</h4>
<h4 id="맞는-예와-풀이">맞는 예와 풀이</h4>
<p><strong>background : pink url(&quot;images/bg.png&quot;) no-repeat 10px 30px;</strong></p>
<ul>
<li>배경 이미지는 bg.png 하나만 찍음</li>
<li>그 나머지 영역 핑크색 칠</li>
<li>배경 이미지 위치는 좌측에서 10px, 위에서 30px 떨어진 곳</li>
<li><em>background : url(&quot;imged/bg.png&quot;) repeat-x bottom;*</em></li>
<li>배경 이미지로 bg.png를 영역 아래쪽에 가로로 반복하여 쭉 찍음</li>
<li>그 나머지 영역 투명<h4 id="틀린-예와-풀이">틀린 예와 풀이</h4>
</li>
<li><em>background : #ffdddd url (&quot;images/bg.png&quot;)no-repeat 50px;*</em></li>
<li>url 뒤에 띄어쓰기 하지 말 것</li>
<li>no-repeat 앞에 붙여 쓰지 말 것</li>
<li>위치값을 하나만 써서 가로 위치인지 세로 위치인지 알 수 없음</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[HTML5_새로운 태그(New Tag)]]></title>
            <link>https://velog.io/@jay_kimjh/HTML5%EC%83%88%EB%A1%9C%EC%9A%B4-%ED%83%9C%EA%B7%B8New-Tag</link>
            <guid>https://velog.io/@jay_kimjh/HTML5%EC%83%88%EB%A1%9C%EC%9A%B4-%ED%83%9C%EA%B7%B8New-Tag</guid>
            <pubDate>Fri, 17 Dec 2021 12:59:13 GMT</pubDate>
            <description><![CDATA[<p>※ 본 포스팅은 책 &lt;실전프로젝트 반응형 웹 퍼블리싱&gt;을 참고하여 작성하였음.</p>
<h2 id="figure-요소와-figcaption-요소">figure 요소와 figcaption 요소</h2>
<p>HTML5에서는 삽화, 다이어그램, 사진, 코드 목록 컨텐츠 등에 설명을 달 수 있는데 그 요소가 바로 <code>&lt;figuare&gt;</code>요소이다. <code>&lt;figcaption&gt;</code> 요소는<code>&lt;figure&gt;</code> 요소 안의 컨텐츠에 대한 제목을 나타낸다.</p>
<pre><code class="language-html">&lt;figure&gt;
  &lt;img src=&quot;images/newbool1.gif&quot; alt=&quot;안드로이드로 용돈벌기&quot; /&gt;
  &lt;img src=&quot;images/newbool2.gif&quot; alt=&quot;아이폰으로 용돈벌기&quot; /&gt;
  &lt;figcation&gt;아이콕스에서 새로 나온 책들&lt;/figcaption&gt;
&lt;/figure&gt;</code></pre>
<figure>
    <img src="images/newbool1.gif" alt="안드로이드로 용돈벌기" />
    <img src="images/newbool2.gif" alt="아이폰으로 용돈벌기" />
    <figcation>아이콕스에서 새로 나온 책들</figcaption>
  </figure>

<h2 id="mark-요소">mark 요소</h2>
<p><code>&lt;mark&gt;</code>요소는 글 내용에서 주의 깊게 볼 텍스트 부분을 강조 처리하기 위한 요소이다. 특히, 검색 사이트에서 특정 키워드를 검색하면 찾고 있던 키워드만 강조되어 나타내는 것이 <code>&lt;mark&gt;</code>요소의 좋은 얘이다.</p>
<pre><code>&lt;p&gt;&lt;mark&gt;&amp;lt;mark&amp;gt;&lt;/mark&gt;요소는 글 내용에서 주의 깊게 볼 텍스트 부분을 강조 처리하기 위한 요소이다.&lt;/p&gt;</code></pre><p><mark>&lt;mark&gt;</mark>요소는 글 내용에서 주의 깊게 볼 텍스트 부분을 강조 처리하기 위한 요소이다.</p>
<h2 id="time-요소">time 요소</h2>
<p><code>&lt;time&gt;</code> 요소는 날짜와 시간을 기계가 이해할 수 있는 형태로 만들어 주는 요소이다.</p>
<pre><code class="language-html">&lt;p&gt;&lt;time datetime=&quot;2012-11-15T14:00:00&quot;&gt;목요일 오후 2시&lt;/time&gt;회의 일정&lt;/p&gt;
&lt;p&gt;발행일&lt;time pubdate datetime=&quot;2012-11-15&quot;&gt;2012년 11월 15일&lt;/time&gt;&lt;/p&gt;
&lt;p&gt;작성일자&lt;time pubdate datetime=&quot;2012-11-15T08:10&quot;&gt;12.11.15&lt;/time&gt;&lt;/p&gt;</code></pre>
<p>&#39;목요일 오후 2시&#39;에 대한 날짜와 시간을 기계에게 명확하게 전달한다. 날짜 다음에 나오는 &#39;T&#39;는 시간을 의미하며 시 : 분 : 초 로 나타내고 pubdate 속성은 datetime에 있는 날짜에 작성되었음을 의미한다.</p>
<p>pubdate 속성의 경우 <code>&lt;time&gt;</code>요소가 <code>&lt;article&gt;</code>요소에 포함되어 있거나 인접한 <code>&lt;article&gt;</code>요소가 있다면 이것은 해당 <code>&lt;article&gt;</code>요소(기사내용 등) 내용의 발행일을 의미하며 <code>&lt;article&gt;</code>요소가 없다면 문서 전체의 발행일을 의미한다.</p>
<h2 id="details-요소와-summary-요소">details 요소와 summary 요소</h2>
<p>HTML5에서는 세부 항복이나 추가 정보를 숨겨 놓았다가 펼쳐 보여줄 수 있는 기능이 있다. 이 요소가 바로 <code>&lt;details&gt;</code> 요소이며 <code>&lt;summary&gt;</code> 요소는 세부 항목의 제목이나 요약 내용이라고 보면 된다.</p>
<pre><code class="language-html">&lt;details&gt;
  &lt;summary&gt;아이폰으로 용돈벌기&lt;/summary&gt;
  &lt;ul&gt;
    &lt;li&gt;출판사 : 아이콕스&lt;/li&gt;
    &lt;li&gt;저자 : 정창훈&lt;/li&gt;
    &lt;li&gt;가격 : 25,000원&lt;/li&gt;
    &lt;li&gt;출간일 : &lt;time datetime=&quot;2012-05-25&quot;&gt;2012년 5월 25일&lt;/time&gt;&lt;/li&gt;
  &lt;/ul&gt;
&lt;/details&gt;</code></pre>
<details>
  <summary>아이폰으로 용돈벌기</summary>
  <ul>
    <li>출판사 : 아이콕스</li>
    <li>저자 : 정창훈</li>
    <li>가격 : 25,000원</li>
    <li>출간일 : <time datetime="2012-05-25">2012년 5월 25일</time></li>
  </ul>
</details>

<h2 id="progress-요소와-meter-요소">progress 요소와 meter 요소</h2>
<p><code>&lt;progress&gt;</code>요소는 다운로드의 진행 상황 같은 내용을 나타낼 때 사용하며 <code>&lt;meter&gt;</code>요소는 정해져 있는 범위의 값에서 현재 상태의 값을 나타낼 때 사용된다.</p>
<pre><code class="language-html">&lt;p&gt;파일 다운로드&lt;/p&gt;
&lt;p&gt;다운로드 진행 : &lt;progress max=&quot;100&quot;&gt;&lt;span&gt;0&lt;/span&gt;%&lt;/progress&gt;&lt;/p&gt;
&lt;p&gt;투표상황&lt;/p&gt;
&lt;p&gt;현재 투표 진행상황 : &lt;meter min=&quot;0&quot; max=&quot;100&quot; value=&quot;20&quot; low=&quot;30&quot; high=&quot;65&quot; title=&quot;percent&quot;&gt;20%&lt;/meter&gt;&lt;p&gt;
&lt;p&gt;현재 투표 진행상황 : &lt;meter min=&quot;0&quot; max=&quot;100&quot; value=&quot;60&quot; low=&quot;30&quot; high=&quot;65&quot; title=&quot;percent&quot;&gt;60%&lt;/meter&gt;&lt;p&gt;
&lt;p&gt;현재 투표 진행상황 : &lt;meter min=&quot;0&quot; max=&quot;100&quot; value=&quot;70&quot; low=&quot;30&quot; high=&quot;65&quot; title=&quot;percent&quot;&gt;70%&lt;/meter&gt;&lt;p&gt;</code></pre>
<p>파일 다운로드
다운로드 진행 : <progress max="100"><span>0</span>%</progress></p>
<p>투표상황
현재 투표 진행상황 : <meter min="0" max="100" value="20" low="30" high="65" title="percent">20%</meter>
현재 투표 진행상황 : <meter min="0" max="100" value="60" low="30" high="65" title="percent">60%</meter>
현재 투표 진행상황 : <meter min="0" max="100" value="70" low="30" high="65" title="percent">70%</meter></p>
<h2 id="의미가-달라진-요소들">의미가 달라진 요소들</h2>
<table style="width:100%;">
  <colgroup>
    <col width="20%">
    <col width="80%">
  </colgroup>
  <tr>
    <th>요소명</th>
    <th>설명</th>
  </tr>
  <tr>
    <td style="text-align:center;">&lt;a&gt;</td>
    <td>&lt;a&gt;요소 내에 인터렉티브 컨텐츠(input, button, 다른 link 등)을 제외하고 어떤 요소든 포함할 수 있다.</td>
  </tr>
  <tr>
    <td style="text-align:center;">&lt;i&gt;</td>
    <td>일반적인 문장에서 전문 용어, 다른 언어 된 숙어 구문, 사상 등 문장 내에 다른 형태의 문장으로 표시할 때 사용된다.</td>
  </tr>
  <tr>
    <td style="text-align:center;">&lt;b&gt;</td>
    <td>의미상 특별히 중요하지 않지만 굵게 표현해야 할 텍스트에 사용된다.</td>
  </tr>
  <tr>
    <td style="text-align:center;">&lt;strong&gt;</td>
    <td>강조의 의미가 아니라 중요의 으미리르 나타낼 때 사용한다.</td>
  </tr>
  <tr>
    <td style="text-align:center;">&lt;address&gt;</td>
    <td>주소를 표시하기 위한 것이 아니라 실제 연락 정보를 나타내기 위해 사용된다.</td>
  </tr>
  <tr>
    <td style="text-align:center;">&lt;hr&gt;</td>
    <td>단순한 구분선이 아니라 문단과 문단을 구분해 주는데 사용된다.</td>
  </tr>
  <tr>
    <td style="text-align:center;">&lt;small&gt;</td>
    <td>주의 사항, 법적 제한, 저작권 등에 사용되며 짧은 문장에만 적용해야 한다.</td>
  </tr>
</table>  
]]></description>
        </item>
        <item>
            <title><![CDATA[HTML5_새로운 구조(New Structure)]]></title>
            <link>https://velog.io/@jay_kimjh/HTML5%EC%83%88%EB%A1%9C%EC%9A%B4-%EA%B5%AC%EC%A1%B0New-Structure</link>
            <guid>https://velog.io/@jay_kimjh/HTML5%EC%83%88%EB%A1%9C%EC%9A%B4-%EA%B5%AC%EC%A1%B0New-Structure</guid>
            <pubDate>Mon, 13 Dec 2021 10:36:17 GMT</pubDate>
            <description><![CDATA[<p>*본 포스팅은 책&lt;실전프로젝트 반응형 웹퍼블리싱&gt;의 내용을 기반으로 작성됨.</p>
<h1 id="새로운-구조new-structure">새로운 구조(New Structure)</h1>
<p>HTML5에서는 기존의 XHTML보다 더 의미론적인 구조를 가진 웹 문서를 만들 수 있도록 새로운 요소들이 추가되었다.</p>
<p>예를 들어 웹 문서의 일반적인 구조가 header(머리말), content(내용), footer(꼬리말)의 형식으로 되어 있지만 XHTML에서는 이러한 의미를 가진 요소들이 없었기 때문에 문서의 header 역역인 경우 그룹화 요소인 <code>&lt;div&gt;</code>에 id 속성을 이용해서 <code>&lt;div id=&quot;header&quot;&gt;</code>와 같이 그 의미를 대신 하였다. 하지만 이러한 방법으로 처리한따고 해서 <code>&lt;div&gt;</code>요소가 문서에서 header의 의미를 가질 수는 없었다.</p>
<p>HTML5에서는 이러한 부분을 해결할 수 있는 <code>&lt;header&gt;</code>요소, <code>&lt;nav&gt;</code>요소, <code>&lt;section&gt;</code>요소, <code>&lt;article&gt;</code>요소, <code>&lt;footer&gt;</code>요소 등의 문서 구조에 대한 요소들이 새롭게 추가되어 더욱 의미 있는 마크업이 가능해졌다. 다만, 문법 규칙에 있어서는 XHTML에 비해 많이 유연해졌다.</p>
<p>예를 들어 XHTML에서는 소문자만 써야 했지만, HTML5에소는 예전의 HTML 4.0 방식처럼 대소문자를 구분하지 않는다든지 <code>&lt;br /&gt;, &lt;img /&gt;, &lt;input /&gt;, &lt;hr /&gt;</code>등 빈 요소를 <code>&lt;br&gt;, &lt;img&gt;, &lt;input&gt;, &lt;hr&gt;</code>로 처리하여도 문법적으로 문제가 발생하지 않는다.</p>
<p>여기에서는 앞에서 배웠던 XHTML 문법 규칙을 따르도록 하겠다.</p>
<h3 id="html-기본-문서-구조">HTML 기본 문서 구조</h3>
<pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;ko&quot;&gt;
  &lt;head&gt;
    &lt;meta vharset&gt;
    &lt;title&gt;HTML5&lt;/title&gt;
  &lt;/head&gt;
  &lt;body&gt;

    내용

  &lt;/body&gt;
&lt;/html&gt;</code></pre>
<p>기존의 XHTML 기본 문서 구조와 비교해 보면 매우 간단해진 것을 알 수 있다. 그런데 현재까지는 모든 부라우저에서 HTML5를 지원하고 있지는 않다. 특히 IE9.0 이하 버전에서는 HTML5가 지원되지 않는다.</p>
<p>본인이 사용하고 있는 브라우저가 HTML5를 얼마나 지원해 주는지 알고 싶다면 <a href="http://html5test.com">http://html5test.com</a>사이트에서 확인할 수 있다. 또, 현재 브라우저가 HTML5를 가장 잘 지원해 주는지도 알 수 있다.</p>
<p>여기에서는 크롬 브라우저로 마크업에 대한 실행 화면을 보도록 하겠다.</p>
<h2 id="header-요소-footer-요소-nav-요소">header 요소, footer 요소, nav 요소</h2>
<p><code>&lt;header&gt;</code>요소는 문서의 머리말을 나타내는 요소로써 기존 <code>&lt;div id=&quot;header&quot;&gt;</code> 영역 안에 있던 문서의 큰 제목이나 내비게이션, 검색폼 등의 내용들을 포함할 수 있다.</p>
<p><code>&lt;footer&gt;</code>요소 또한 문서의 꼬리말을 나타내는 요소로 기존 <code>&lt;div id=&quot;header&quot;&gt;</code> 영역 안에 있던 작성자나 저작권에 대한 정보, 관련된 문서의 링크를 포함할 수 있다.</p>
<p><code>&lt;header&gt;</code>요소나 <code>&lt;footer&gt;</code>요소는 일반적으로 문서 전체의 머리말, 꼬리말로 사용되지만 경우에 따라 앞으로 배울 섹셔닝 컨텐츠 요소의 머리말이나 꼬리말로도 사용이 가능하다. 이 부분에 대한 것은 <code>&lt;article&gt;</code>요소에서 더 자세히 설명하도록 하겠다.</p>
<p><code>&lt;nav&gt;</code>요소는 주로 메인 네비게이션의 의미를 줄 때 사용하며 모든 링크 그룹에 <code>&lt;nav&gt;</code>요소로 마크업할 필요는 없다.</p>
<p>다음 예제를 통하여 좀 더 자세히 알아보도록 하자.</p>
<p>예제1</p>
<pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;ko&quot;&gt;
  &lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot; /&gt;
    &lt;title&gt;header 요소, footer 요소, nav 요소&lt;/title&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;header&gt;
      &lt;h1&gt;&lt;img src=&quot;images/icox_logo.gif&quot; alt=&quot;icox&quot; &gt;&lt;/h1&gt;
      &lt;ul&gt;
        &lt;li&gt;&lt;a href=&quot;#&quot;&gt;Home&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href=&quot;#&quot;&gt;About me&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href=&quot;#&quot;&gt;News&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href=&quot;#&quot;&gt;Contact&lt;/a&gt;&lt;/li&gt;
      &lt;/ul&gt;
      &lt;nav&gt;
        &lt;h2&gt;메인메뉴&lt;/h2&gt;
        &lt;ul&gt;
          &lt;li&gt;&lt;a href=&quot;#&quot;&gt;아이콕스&lt;/a&gt;&lt;li&gt;
          &lt;li&gt;&lt;a href=&quot;#&quot;&gt;신간도서&lt;/a&gt;&lt;li&gt;
          &lt;li&gt;&lt;a href=&quot;#&quot;&gt;iCox커뮤니티&lt;/a&gt;&lt;li&gt;
          &lt;li&gt;&lt;a href=&quot;#&quot;&gt;iCox자료실&lt;/a&gt;&lt;li&gt;
        &lt;/ul&gt;
      &lt;/nav&gt;
      &lt;form name=&quot;sform&quot; action=&quot;#&quot; method=&quot;get&quot; id=&quot;sform&quot;&gt;
        &lt;fieldset&gt;
          &lt;legend&gt;
          &lt;label for=&quot;sbox&quot;&gt;도서 검색어 입력&lt;/label&gt;&lt;input type=&quot;search&quot; id=&quot;sbox&quot; /&gt;
          &lt;input type=&quot;submit&quot; value=&quot;검색&quot; /&gt;
        &lt;/fieldset&gt;
      &lt;/form&gt;
    &lt;/header&gt;
    &lt;div&gt;
      &lt;h2&gt;메인컨텐츠&lt;/h2&gt;
      &lt;p&gt;메인 컨텐츠 내용&lt;/p&gt;
    &lt;/div&gt;
    &lt;footer&gt;
      &lt;small&gt;COPYRIGHT &amp;copy; iCox. All Rights Reserved&lt;/small&gt;
    &lt;/footer&gt;
  &lt;/body&gt;
&lt;/html&gt;</code></pre>
<ul>
<li><code>&lt;header&gt;</code>요소, <code>&lt;footer&gt;</code>요소 안에 일반적으로 들어갈 수 있는 내용들을 마크업해 보았다. <code>&lt;header&gt;</code>나 <code>&lt;footer&gt;</code> 두 요소 모두 대부분의 요소를 포함 할 수 있지만 같은 <code>&lt;header&gt;</code>요소와 <code>&lt;footer&gt;</code>요소는 포함할 수 없다.</li>
<li>예제1에 보면 <code>&lt;ul&gt;</code>요소가 두 개 있다. 하나는 &#39;상단메뉴 링크 그룹&#39;(Home, About us, News, Contact)이고 하나는 &#39;메인메뉴 링크 그룹&#39;(아이콕스, 신간 도서, iCox 커뮤니티, iCox 자료실)이다.</li>
</ul>
<p>&#39;메인메뉴 링크 그룹&#39;에만 <code>&lt;nav&gt;</code>요소로 감싸줬는데 이렇게 하면 &#39;메인메뉴 링크 그룹&#39;을 주 내비게이션으로 하겠다는 의미가 된다. &#39;상단메뉴 링크 그룹&#39;에도 <code>&lt;nav&gt;</code>요소를 줄 수 있지만 사이트의 모든 페이지를 연결할 수 있는 &#39;메인메뉴 링크 그룹&#39;이 좀 더 주된 내비게이션의 의미를 가지고 있기 떄문에 &#39;메인메뉴 링크 그룹&#39;에만 <code>&lt;nav&gt;</code>요소를 감싼 것이다.</p>
<h2 id="section-요소">section 요소</h2>
<p><code>&lt;section&gt;</code>요소는 문서 내에서 의미가 같은 내용들을 묶어주는 의미적 그룹 요소이며 보통 제목 요소로 시작한다. 묶어 주는 요소라고 하여 기존의 <code>&lt;div&gt;</code>요소처럼 생각하면 안 된다. 레이아웃을 잡거나 스타일을 적용 또는 자바스크립트의 편의성이 목적이라면 <code>&lt;div&gt;</code>요소를 사용해야 한다.</p>
<p>예제2</p>
<pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;ko&quot;&gt;
  &lt;head&gt;
    &lt;meta charset=&quot;utf-8&quot; /&gt;
    &lt;title&gt;section 요소&lt;/title&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;h1&gt;아이콕스&lt;/h1&gt;
    &lt;section&gt;
      &lt;h1&gt;아이콕스 소개&lt;/h1&gt;
      &lt;p&gt;아이콕스 스토리&lt;/p&gt;
      &lt;p&gt;아이콕스 인포&lt;/p&gt;
    &lt;/section&gt;
    &lt;section&gt;
      &lt;h1&gt;신간소개&lt;/h1&gt;
      &lt;p&gt;안드로이드로 용돈벌기&lt;/p&gt;
      &lt;p&gt;아이폰으로 용돈벌기&lt;/p&gt;
    &lt;/section&gt;
    &lt;section&gt;
      &lt;h1&gt;아이콕스 이벤트&lt;/h1&gt;
      &lt;p&gt;아이콕스 도서구매 시 커피증정&lt;/p&gt;
      &lt;p&gt;제2회 앱 아이디어 공모&lt;/p&gt;
    &lt;/section&gt;
  &lt;/body&gt;
&lt;/html&gt;</code></pre>
<ul>
<li>의미가 같은 내용들을 <code>&lt;section&gt;</code>요소로 그룹화하였다. 전체적으로 볼 때 &#39;아이콕스&#39;에 대해 주제별 3개의 섹션으로 나누어져 있다. 다시 말해서 의미가 같은 컨텐츠들로 그룹화하여 영역을 나눈 것이지 레이아웃 구조를 위해 그룹화한 것이 아님을 알아야 한다.</li>
<li><code>&lt;section&gt;</code>요소에 제목요소를 포함하지 않거나 의미가 다른 내용들을 그룹화하였다고 문법적으로 틀린 것은 아니다.</li>
</ul>
<p>중요한 것은 하나의 <code>&lt;section&gt;</code>요소를 만들 때 의미상 내용들을 그룹으로 묶는 것이 가능하고 그 그룹에 제목을 명료하게 명시할 수만 있다면 <code>&lt;section&gt;</code>요소를 사용하는데 큰 문제가 없을 것이다.</p>
<h2 id="article-요소">article 요소</h2>
<p>신문 기사나 블로그의 글은 보면 문서 내에서 하나의 자립적인 컨텐츠라는 것을 알 수 있다. 또 이러한 컨텐츠들은 수정이나 가공 없이 다른 사이트로 배포 또는 재사용할 수 있다는 특징을 가지고 있다. 이처럼 독립적으로 배포 또는 재사용이 가능한 모든 내용들을 <code>&lt;article&gt;</code>요소에 포함할 수 있다.</p>
<p>예제3</p>
<pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html&gt;
  &lt;head&gt;
    &lt;meta charset=&quot;utf-8&quot; /&gt;
    &lt;title&gt;article 요소&lt;/title&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;h1&gt;신간소개&lt;/h1&gt;
    &lt;article&gt;
      &lt;header&gt;
        &lt;h1&gt;안드로이드로 용돈벌기&lt;/h1&gt;
      &lt;/header&gt;
      &lt;ul&gt;
        &lt;li&gt;&lt;img src=&quot;images/newbook.gif&quot; alt=&quot;안드로이드로 용돈벌기&quot; /&gt;&lt;/li&gt;
        &lt;li&gt;
          가히 아이폰, 안드로이드 앱이 &quot;문화를 바꾸었다&quot;고 할 수 있을 정도로, 이제 휴대폰과 앱은 따로 분리해서 생각하기 어려워졌으며...
        &lt;/li&gt;
      &lt;/ul&gt;
      &lt;footer&gt;작성자 : 아이콕스&lt;/footer&gt;
    &lt;/article&gt;
  &lt;/body&gt;
&lt;/html&gt;</code></pre>
<ul>
<li><p>예제3은 <code>&lt;article&gt;</code>요소의 일반적인 형식이다. 그렇다고 <code>&lt;header&gt;</code>요소나 <code>&lt;footer&gt;</code>요소를 항상 마크업할 필요는 없다. 보통 제목 요소와 내용만 마크업하는 경우가 많다. <code>&lt;article&gt;</code>요소는 자립적이고 독립적인 배포나 재사용 가능한 컨텐츠라는 의미에서 제목 요소를 포함하는 것이 바람직하다.</p>
</li>
<li><p><code>&lt;section&gt;</code>요소와 <code>&lt;article&gt;</code>요소에 대한 혼동이 종종 있다. 쉽게 생각해서 <code>&lt;section&gt;</code>요소는 의미가 같은 내용을 묶는 의미적 그룹 요소이고 <code>&lt;article&gt;</code>요소는 하나의 자립적인 요소라고 보면 된다.</p>
</li>
<li><p><code>&lt;section&gt;</code>요소는 <code>&lt;section&gt;</code>요소나 <code>&lt;article&gt;</code>요소를 포함할 수 있고 <code>&lt;article&gt;</code>요소 또한 <code>&lt;article&gt;</code>요소나 <code>&lt;section&gt;</code>요소를 포함할 수 있다.</p>
<p>예를 들어 자립적이고 배포나 재사용이 가능한 내용들이 모두 같은 의미를 가졌다면 이것은 <code>&lt;section&gt;</code>요소로 <code>&lt;article&gt;</code>요소들을 그룹화할 수 있는 것이며 <code>&lt;article&gt;</code>요소 안에서 의미가 같은 내용들을 그룹화해야 한다면 이것은 <code>&lt;article&gt;</code>요소 안에 <code>&lt;section&gt;</code>요소가 포함될 수 있는 것이다.</p>
</li>
</ul>
<h2 id="aside-요소">aside 요소</h2>
<p><code>&lt;aside&gt;</code>요소는 주위의 내용들과 관련이 없고 메인 컨텐츠와 분리할 수 있는 독립적인 요소이다. 블로그나 문서에서 메인 컨텐츠의 왼쪽이나 오른쪽에 위치한 &#39;사이드 바&#39;영역이라고 보면 된다.</p>
<p>예제4</p>
<pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html&gt;
  &lt;head&gt;
    &lt;meta charset=&quot;utf-8&quot; /&gt;
    &lt;title&gt;aside 요소&lt;/title&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;h1&gt;아이콕스&lt;/h1&gt;
    &lt;div id=&quot;content&quot;&gt;
      &lt;h2&gt;메인 컨텐츠&lt;/h2&gt;
      &lt;p&gt;신간소개&lt;/p&gt;
      &lt;p&gt;아이콕스 이벤트&lt;/p&gt;
      &lt;p&gt;저자칼럼&lt;/p&gt;
    &lt;/div&gt;
    &lt;aside&gt;
      &lt;h1&gt;IT 동향&lt;/h1&gt;
      &lt;ul&gt;
        &lt;li&gt;&lt;a href=&quot;#&quot;&gt;이제 반응형 웹...&lt;/a&gt;&lt;li&gt;
        &lt;li&gt;&lt;a href=&quot;#&quot;&gt;HTML5의 새로운...&lt;/a&gt;&lt;li&gt;
      &lt;/ul&gt;
    &lt;/aside&gt;
  &lt;/body&gt;
&lt;/html&gt;</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[html5 _ <form> 태그 정리]]></title>
            <link>https://velog.io/@jay_kimjh/form-%EC%9A%94%EC%86%8C-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@jay_kimjh/form-%EC%9A%94%EC%86%8C-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Mon, 15 Nov 2021 07:24:31 GMT</pubDate>
            <description><![CDATA[<p>※ 본 포스팅은 책 &lt;실전 프로젝트 반응형 웹 퍼블리싱&gt;을 참고하여 작성함</p>
<h2 id="폼form--form_b">폼(Form) : <code>&lt;form&gt;</code>_b</h2>
<p>웹 사이트에서 특정 콘텐츠에 대한 정보를 제공받기 위해서는 회원가입을 해야 하는 경우가 많다.
회원가입 양식을 보면 약관 동의에서부터 이름, 아이디, 패스워드, 주소 등을 입력해야 하며 성별 체크 등 다양한 항목을 선택하기도 해야 한다.
회원가입뿐만 아니라 온라인 쇼핑몰에서 상품을 구입하거나 게시판에 글을 쓸 때에도 이러한 정보입력 양식을 많이 접하게 되는데 웹에서의 이러한 <strong>정보입력 양식</strong>을 <strong>&#39;온라인 서식&#39;</strong>이라고 한다.</p>
<h3 id="form_b"><code>&lt;form&gt;</code>_b</h3>
<p><code>&lt;form&gt;</code> 요소는 스크린에 보이지는 않지만 input 태그들을 담는 일종의 컨테이너 역할을 수행하며 온라인 서식에서 작성한 값들을 서버 프로그램(서식값 처리)으로 전송하는 역할을 담당함.</p>
<pre><code class="language-html">&lt;form action=&quot;서버 프로그램 URL&quot; method=&quot;get이나 post방식&quot;&gt;
  서식 내용
&lt;/form&gt;</code></pre>
<ul>
<li>&#39;action&#39;은 서식에서 작성한 값들을 처리하는 서버 프로그램의 주소이다.
여기에서 서버 프로그램이 하는 역할은 전송되어 넘어온 값들(아이디, 패스워드, 주소 등)을 DB(DataBase)에 저장하거나 로그인할 때처럼 입력받은 아이디값이 DB에 등록되어 있는지, 패스워드가 일치하는지에 대한 여부 처리 및 데이터 검색 등의 역할을 수행한다.</li>
<li>&#39;method&#39;는 서식의 값들을 서버 프로그램에 어떤 방법으로 전달할 것이지 처리하는 부분이다.
전달 방식에는 &#39;get&#39;방식과 &#39;post&#39;방식이 있다.
예를 들어 서식에서 id를 &#39;kim&#39;, pw를 &#39;1234&#39;라고 입력하였다면 &#39;get&#39; 방식의 경우 &#39;서버 프로그램 URL?id=kim&amp;pw=1234&#39;식으로 전달한다. 이런 방식은 포털사이트에서 검색한 후 주소창을 보면 확인할 수 있다. 이와 같이 &#39;get&#39;방식은 주소창에 중요한 정보값들이 노출된다는 점과 전송할 수 있는 데이터가 적다는 특징을 가지고 있다. 이와 반대로 &#39;post&#39;방식의 경우 전송되는 데이터값들이 노출되지 않으며 많은 양의 데이터을 전송할 수 있는 특징이 있다.
온라인 서식의 경우 중요한 정보들이 많고 많은 양의 정보들을 전송해야 하기 때문에 일반적으로 &#39;post&#39;방식을 많이 이용한다.</li>
</ul>
<h3 id="fieldset_b"><code>&lt;fieldset&gt;</code>_b</h3>
<p><code>&lt;fieldset&gt;</code>요소는 <code>&lt;form&gt;</code>요소 안에 있는 여러 요소를 그룹화할 때 사용하며, 그룹 제목 <code>&lt;legend&gt;</code>요소를 포함한다.</p>
<pre><code class="language-html">&lt;form action=&quot;join.php&quot; method=&quot;post&quot;&gt;
  &lt;fieldset&gt;
    &lt;legend&gt;그룹 제목&lt;/legend&gt;
    서식내용
  &lt;/fieldset&gt;
&lt;/form&gt;</code></pre>
<h3 id="input_i"><code>&lt;input&gt;</code>_i</h3>
<p><code>&lt;input&gt;</code>은 inline요소이며 type속성 변경으로 다양한 폼 컨트롤을 생성할 수 있다.</p>
<pre><code class="language-html">&lt;form action=&quot;join.php&quot; method&quot;post&quot;&gt;
  &lt;fieldset&gt;
    &lt;legend&gt;회원가입&lt;/legend&gt;
    &lt;p&gt;아이디 : &lt;input type=&quot;text&quot; size=&quot;12&quot; maxlength=&quot;8&quot; /&gt;&lt;/p&gt;
    &lt;p&gt;비밀번호 : &lt;input type=&quot;password&quot; size=&quot;12&quot; maxlength=&quot;8&quot; /&gt;&lt;/p&gt;
    &lt;p&gt;메일 수신여부 : 
      &lt;input type=&quot;radio&quot; value=&quot;y&quot; name=&quot;receive&quot; /&gt;예
      &lt;input type=&quot;radio&quot; value=&quot;n&quot; name=&quot;receive&quot; /&gt;아니오
    &lt;/p&gt;
    &lt;p&gt;관심분야 : 
      &lt;input type=&quot;checkbox&quot; value=&quot;HTML&quot; name=&quot;chk1&quot; /&gt;HTML
      &lt;input type=&quot;checkbox&quot; value=&quot;CSS&quot; name=&quot;chk2&quot; /&gt;CSS
      &lt;input type=&quot;checkbox&quot; value=&quot;Javascript&quot; name=&quot;chk3&quot; /&gt;Javascript
    &lt;/p&gt;
    &lt;p&gt;
      &lt;input type=&quot;submit&quot; value=&quot;전송&quot; /&gt;
      &lt;input type=&quot;reset&quot; value=&quot;취소&quot; /&gt;
      &lt;input type=&quot;button&quot; value=&quot;확인&quot; /&gt;
      &lt;input type=&quot;image&quot; src=&quot;images/search.gif&quot; alt=&quot;검색&quot; /&gt;
    &lt;/p&gt;
    &lt;p&gt;파일 올리기 : &lt;input type=&quot;file&quot; /&gt;&lt;/p&gt;
    &lt;p&gt;&lt;input type=&quot;hidden&quot; /&gt;&lt;/p&gt;
  &lt;/fieldset&gt;
&lt;/form&gt;</code></pre>
<p>이를 출력하면 다음과 같다.</p>
<form action="join.php" method"post">
  <fieldset>
    <legend>회원가입</legend>
    <p>아이디 : <input type="text" size="12" maxlength="8" /></p>
    <p>비밀번호 : <input type="password" size="12" maxlength="8" /></p>
    <p>메일 수신여부 : 
      <input type="radio" value="y" name="receive" />예
      <input type="radio" value="n" name="receive" />아니오
    </p>
    <p>관심분야 : 
      <input type="checkbox" value="HTML" name="chk1" />HTML
      <input type="checkbox" value="CSS" name="chk2" />CSS
      <input type="checkbox" value="Javascript" name="chk3" />Javascript
    </p>
    <p>
      <input type="submit" value="전송" />
      <input type="reset" value="취소" />
      <input type="button" value="확인" />
      <input type="image" src="images/search.gif" alt="검색" />
    </p>
    <p>파일 올리기 : <input type="file" /></p>
    <p><input type="hidden" /></p>
    <br />
  </fieldset>
</form>



<ul>
<li><code>&lt;fieldset&gt;</code>요소는 사각형 border로 나오게 되며 <code>&lt;legend&gt;</code>요소는 사각형 border 상단에 제목으로 출력된다.</li>
<li><code>&lt;input&gt;</code>의 type의 종류를 정리하면 다음과 같다.</li>
</ul>
<table border="1" width="100%">
  <colgroup>
    <col width="20%" />
    <col width="80%" />
  </colgroup>
  <thead>
    <tr>
      <th>type</th>
      <th>설명</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>text</td>
      <td>
        <ul>
          <li>한 줄 글 입력 상자</li>
          <li>size 속성은 글상자의 가로길이</li>
          <li>maxlength 속성은 최대 글자 수</li>
        </ul>
      </td>
    </tr>
    <tr>
      <td>password</td>
      <td>
        <ul>
          <li>비밀번호 입력 상자, 입력된 내용은 '*'로 표시</li>
        </ul>
      </td>
    </tr>
    <tr>
      <td>radio</td>
      <td>
        <ul>
          <li>라디오 버튼</li>
          <li>여러 중 하나만 선택 가능</li>
          <li>name값이 같아야함</li>
          <li>value는 체크 시 실제 전송되는 값</li>
        </ul>
      </td>
    </tr>
    <tr>
      <td>checkbox</td>
      <td>
        <ul>
          <li>체크박스</li>
          <li>다중 선택 가능</li>
          <li>name값이 서로 다름</li>
        </ul>
      </td>
    </tr>
    <tr>
      <td>submit</td>
      <td>
        <ul>
          <li>전송 버튼</li>
          <li>value 속성은 버튼에 표시할 글자</li>
        </ul>
      </td>
    </tr>
    <tr>
      <td>reset</td>
      <td>
        <ul>
          <li>초기화 버튼</li>
        </ul>
      </td>
    </tr>
    <tr>
      <td>button</td>
      <td>
        <ul>
          <li>범용 버튼</li>
        </ul>
      </td>
    </tr>
    <tr>
      <td>image</td>
      <td>
        <ul>
          <li>이미지 버튼</li>
          <li>alt 속성은 반드시 명시</li>
        </ul>
      </td>
    </tr>
    <tr>
      <td>file</td>
      <td>
        <ul>
          <li>첨부 파일</li>
        </ul>
      </td>
    </tr>
    <tr>
      <td>hidden</td>
      <td>
        <ul>
          <li>화면에 표시되지 않음</li>
          <li>사용자에게 노출할 필요가 없는 데이터 지정</li>
        </ul>
      </td>
    </tr>
  </tbody>
</table>

<br /> 

<h3 id="새로-추가된-input-type">새로 추가된 input type</h3>
<form action="join.php" method"post">
  <fieldset>
    <legend>새로 추가된 input type</legend>
    <p>
      아직 모든 브라우저에서 새로 추가된 input type들을 지원하고 있지는 않다.
      <br />
      http://miketaylr.com/code/input-type-attr.html 사이트에서 현재 브라우저들에서 HTML5 input type과 속성을 어느 정도 지원해 주는 지 알 수 있다.
    </p>
    <p>search : <input type="search" /> 
      <br />검색 박스로 텍스트 입력시 지우기(X) 버튼이 나타남.</p>
    <p>email : <input type="email" /> 
      <br />email입력 양식에 맞지 않을 경우 오류 메시지를 제공하며 아이폰에선느 입력하기 편리한 키패드로 변함.</p>
    <p>url : <input type="url" /> 
      <br />url입력 양식에 맞지 않을 경우 오류 메시지를 제공하며 아이폰에서는 입력하기 편리한 키패드로 변함.</p>
    <p>tel : <input type="tel" /> 
      <br />전화번호 입력 박스</p>
    <p>number : <input type="number" /> 
      <br />숫자 입력 박스에 직접 입력하거나 상하 화살표를 눌러 선택할 수 있다.
      <br />min과 max 속성은 선택할 수 있는 숫자의 최소값과 최대값을 나타내며 step속성은 숫자의 단계를 의미한다.
      <br />value 속성은 숫자의 기본 값이다. 예를 들어 value="1"을 놓고 step="2"로 하면 위 화살표를 한 번 누를 때마다 2씩 증가되어 1,3,5,7...과 같이 나오게 된다.
    </p>
    <p>rage : <input type="range" /> 
      <br />숫자 범위가 '슬라이드 바'로 나타난다.</p>
    <p>date : <input type="date" /> 
      <br />연, 월, 일을 선택할 수 있는 박스가 나온다.</p>
    <p>datetime : <input type="datetime" /> 
      <br />연, 월, 일과 시, 분을 선택할 수 있는 박스가 나온다.(UTC, 국제표준시간)</p>
    <p>datetime-local : <input type="datetime-local" /> 
      <br />연, 월, 일, 시, 분을 선택할 수 있는 박스가 나온다.</p>
    <p>month : <input type="month" /> 
      <br />연과 월만 선택할 수 있는 박스가 나온다.</p>
    <p>week : <input type="week" /> 
      <br />연과 주를 선택할 수 있는 박스가 나온다.</p>
    <p>time : <input type="time" /> 
      <br />시, 분을 선택할 수 있는 박스가 나온다.</p>
    <p>color : <input type="color" /> 
      <br />색상 선택 박스로 나타난다.</p>
  </fieldset>
</form>

<br />

<h3 id="추가된-폼-속성">추가된 폼 속성</h3>
<ul>
<li>required 속성
required 속성은 입력 필드에 값이 채워졌는지에 대한 부분과 유효성을 판단해주는 속성이다. required 속성을 적용한 <code>&lt;input&gt;</code>요소에 값을 입력하지 않거나 유효하지 않은 상태로 [전송] 버튼을 누르면 오류 메시지가 나타납니다.</li>
</ul>
<pre><code class="language-html">&lt;p&gt;&lt;strong&gt;*&lt;/strong&gt; 표시는 필수입력 항목입니다.&lt;/p&gt;
&lt;form&gt;
  &lt;fieldset&gt;
    &lt;legend&gt;필드 유효성 검사&lt;/legend&gt;
    &lt;ul&gt;
      &lt;li&gt;
        &lt;label&gt;&lt;strong&gt;*&lt;strong&gt;이름&lt;/label&gt;
        &lt;input type=&quot;text&quot; id=&quot;name&quot; required=&quot;required&quot; /&gt;
      &lt;/li&gt;
      &lt;li&gt;
        &lt;label&gt;&lt;strong&gt;*&lt;strong&gt;아이디&lt;/label&gt;
        &lt;input type=&quot;text&quot; id=&quot;id&quot; required=&quot;required&quot; /&gt;
      &lt;/li&gt;
      &lt;li&gt;
        &lt;label&gt;&lt;strong&gt;*&lt;strong&gt;비밀번호&lt;/label&gt;
        &lt;input type=&quot;password&quot; id=&quot;pw&quot; required=&quot;required&quot; /&gt;
      &lt;/li&gt;
      &lt;li&gt;
        &lt;label&gt;&lt;strong&gt;*&lt;strong&gt;전화번호&lt;/label&gt;
        &lt;input type=&quot;tel&quot; id=&quot;phone&quot; required=&quot;required&quot; /&gt;
      &lt;/li&gt;
      &lt;li&gt;
        &lt;label&gt;&lt;strong&gt;*&lt;strong&gt;이메일&lt;/label&gt;
        &lt;input type=&quot;email&quot; id=&quot;email&quot; /&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
    &lt;p&gt;&lt;input type=&quot;submit&quot; value=&quot;전송&quot;&gt;&lt;/p&gt;
  &lt;/fieldset&gt;
&lt;/form&gt;</code></pre>
<p>*표시는 필수입력 항목입니다.</p>
<form>
  <fieldset>
    <legend>필드 유효성 검사</legend>
    <ul>
      <li>
        <label>*이름</label>
        <input type="text" id="name" required="required" />
      </li>
      <li>
        <label>*아이디</label>
        <input type="text" id="id" required="required" />
      </li>
      <li>
        <label>*비밀번호</label>
        <input type="password" id="pw" required="required" />
      </li>
      <li>
        <label>*전화번호</label>
        <input type="tel" id="phone" required="required" />
      </li>
      <li>
        <label>이메일</label>
        <input type="email" id="email" />
      </li>
    </ul>
        <p><input type="submit" value="전송"></p>
  </fieldset>
</form>

<br />

<ul>
<li>placeholder 속성
placeholder 속성은 각 필드에 대한 입력형식 힌트를 제공해준다.</li>
</ul>
<pre><code class="language-html">&lt;form&gt;
  &lt;fieldset&gt;
    &lt;legend&gt;필드에 입력형식 힌트주기&lt;/legend&gt;
    &lt;ul&gt;
      &lt;li&gt;
        &lt;label for=&quot;phone&quot;&gt;핸드폰 번호&lt;/label&gt;
        &lt;input type=&quot;tel&quot; id=&quot;phone&quot; placeholder=&quot;01011112222&quot; /&gt;
     &lt;/li&gt;
      &lt;li&gt;
        &lt;label for=&quot;phone&quot;&gt;이메일&lt;/label&gt;
        &lt;input type=&quot;email&quot; id=&quot;email&quot; placeholder=&quot;id@domain.com&quot; /&gt;
     &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/fieldset&gt;
&lt;/form&gt;</code></pre>
<p>이를 출력하면 다음과 같다.</p>
<form>
  <fieldset>
    <legend>필드에 입력형식 힌트주기</legend>
    <ul>
      <li>
        <label for="phone">핸드폰 번호</label>
        <input type="tel" id="phone" placeholder="01011112222" />
     </li>
      <li>
        <label for="phone">이메일</label>
        <input type="email" id="email" placeholder="id@domain.com" />
     </li>
    </ul>
  </fieldset>
</form>

<ul>
<li>autocomplete 속성
autocomplete 속성은 자동완성 기능에 대한 사용 여부를 판단해준다. 자동완성 기능을 사용하고 싶으면 속성값을 &#39;on&#39;으로, 아니면 &#39;off&#39;를 주면 된다.</li>
</ul>
<pre><code class="language-html">&lt;form&gt;
  &lt;fieldset&gt;
    &lt;legend&gt;자동완성 기능&lt;/legend&gt;
    &lt;ul&gt;
      &lt;li&gt;
        &lt;label for=&quot;phone&quot;&gt;전화번호&lt;/label&gt;
        &lt;input type=&quot;tel&quot; id=&quot;phone&quot; autocomplete=&quot;off&quot; /&gt;
      &lt;/li&gt;
      &lt;li&gt;
        &lt;label for=&quot;email&quot;&gt;이메일&lt;/label&gt;
        &lt;input type=&quot;email&quot; id=&quot;email&quot; autocomplete=&quot;on&quot; /&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/fieldset&gt;
&lt;/form&gt;</code></pre>
<p>이를 출력하면 다음과 같다.</p>
<form>
  <fieldset>
    <legend>자동완성 기능</legend>
    <ul>
      <li>
        <label for="phone">전화번호</label>
        <input type="tel" id="phone" autocomplete="off" />
      </li>
      <li>
        <label for="email">이메일</label>
        <input type="email" id="email" autocomplete="on" />
      </li>
    </ul>
  </fieldset>
</form>

<ul>
<li>list 속성
list 속성은 텍스트 필드에 내용 입력 시 미리 만들어 놓은 리스트 항목이 마치 자동완성 기능처럼 나타나도록하는 속성이다. 리스트 항목들은 <code>&lt;datalist&gt;</code>요소로 만들어 준다.</li>
</ul>
<pre><code class="language-html">&lt;form&gt;
  &lt;fieldset&gt;
    &lt;legend&gt;datalist&lt;/legend&gt;
    &lt;p&gt;
      &lt;label for=&quot;course&quot;&gt;수강과목 : &lt;/label&gt;&lt;input type=&quot;text&quot; id=&quot;course&quot; list=&quot;subjects&quot; /&gt;
      &lt;datalist id=&quot;subjects&quot;&gt;
        &lt;option value=&quot;html5&quot;&gt;
        &lt;option value=&quot;css3&quot;&gt;
        &lt;option value=&quot;javascript&quot;&gt;
        &lt;option value=&quot;jquery&quot;&gt;
      &lt;/datalist&gt;
    &lt;/p&gt;
  &lt;/fieldset&gt;
&lt;/form&gt;</code></pre>
<p>이를 출력하면 다음과 같다.</p>
<form>
  <fieldset>
    <legend>datalist</legend>
    <p>
      <label for="course">수강과목 : </label><input type="text" id="course" list="subjects" />
      <datalist id="subjects">
        <option value="html5">
        <option value="css3">
        <option value="javascript">
        <option value="jquery">
      </datalist>
    </p>
  </fieldset>
</form>

<ul>
<li>outofocus 속성
페이지가 로드되었을 때 입력 필드에 포커스(커서)가 자동으로 이동하게 해주는 속성이다.
outofocus 속성은 하나의 <code>&lt;input&gt;</code>요소에만 적용할 수 있다.</li>
</ul>
<pre><code class="language-html">&lt;form&gt;
  &lt;fieldset&gt;
    &lt;legend&gt;포커스 자동이동&lt;/legend&gt;
    &lt;ul&gt;
      &lt;li&gt;
        &lt;label for=&quot;name&quot;&gt;이름&lt;/label&gt;
        &lt;input type=&quot;text&quot; id=&quot;name&quot; autofocus=&quot;autofocus&quot; /&gt;
      &lt;/li&gt;
      &lt;li&gt;
        &lt;label for=&quot;id&quot;&gt;아이디&lt;/label&gt;
        &lt;input type=&quot;text&quot; id=&quot;id&quot; /&gt;
      &lt;/li&gt;
      &lt;li&gt;
        &lt;label for=&quot;pw&quot;&gt;비밀번호&lt;/label&gt;
        &lt;input type=&quot;password&quot; id=&quot;pw&quot; /&gt;
      &lt;/li&gt;
      &lt;li&gt;
        &lt;label for=&quot;phone&quot;&gt;전화번호&lt;/label&gt;
        &lt;input type=&quot;tel&quot; id=&quot;phone&quot; /&gt;
      &lt;/li&gt;
      &lt;li&gt;
        &lt;label for=&quot;email&quot;&gt;이메일&lt;/label&gt;
        &lt;input type=&quot;email&quot; id=&quot;email&quot; /&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
    &lt;p&gt;&lt;input type=&quot;submit&quot; value=&quot;전송&quot; /&gt;&lt;/p&gt;
  &lt;/fieldset&gt;
&lt;form&gt;</code></pre>
<p>이를 출력하면 다음과 같다.</p>
<form>
  <fieldset>
    <legend>포커스 자동이동</legend>
    <ul>
      <li>
        <label for="name">이름</label>
        <input type="text" id="name" autofocus="autofocus" />
      </li>
      <li>
        <label for="id">아이디</label>
        <input type="text" id="id" />
      </li>
      <li>
        <label for="pw">비밀번호</label>
        <input type="password" id="pw" />
      </li>
      <li>
        <label for="phone">전화번호</label>
        <input type="tel" id="phone" />
      </li>
      <li>
        <label for="email">이메일</label>
        <input type="email" id="email" />
      </li>
    </ul>
    <p><input type="submit" value="전송" /></p>
  </fieldset>
<form>


<ul>
<li><p>disabled 속성과 readonly 속성</p>
<p>disabled 속성과 readonly 속성은 적용된 input 요소의 내용을 수정하거나 선택할 수 없도록 비활성화 상태로 만든다.
예를 들어 프로그램을 설치 시 시링얼 번호를 입력하지 않으면 &#39;다음&#39;으로 넘어가는 버튼이 비활성화되어 있는 것을 볼 수 있다. 이렇게 disabled 속성은 어떤 조건에 만족하지 않았을 때 input 요소를 비활성화시키는데 주로 사용되며 readonly 속input 요소의 값이 변경되지 않은 채 폼 전송이 되어야 하는 곳에 사용된다.</p>
</li>
</ul>
<pre><code class="language-html">&lt;form&gt;
  &lt;fieldset&gt;
    &lt;legend&gt;disabled속성과 readonly속성&lt;/legend&gt;
    &lt;ul&gt;
      &lt;li&gt;
        &lt;label for=&quot;serialNum&quot;&gt;시리얼 번호 입력 : &lt;/label&gt;
        &lt;input type=&quot;text&quot; id=&quot;serialNum&quot; /&gt;
        &lt;input type=&quot;button&quot; value=&quot;이전&quot; /&gt;
        &lt;input type=&quot;button&quot; value=&quot;다음&quot; disabled=&quot;disabled&quot; /&gt;
      &lt;/li&gt;
      &lt;li&gt;
        &lt;label for=&quot;book&quot;&gt;선택한 책 : &lt;/label&gt;
        &lt;input type=&quot;text&quot; id=&quot;book&quot; value=&quot;안드로이드로 용돈 벌기&quot; readonly=&quot;readonly&quot; /&gt; 
        &lt;label for=&quot;number&quot;&gt;수량 : &lt;/label&gt;&lt;ipnut type=&quot;number&quot; id=&quot;number&quot; value=&quot;1&quot; /&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/fieldset&gt;
&lt;/form&gt;</code></pre>
<p><del>이를 출력하면 다음과 같다.</del>
  코드를 넣으면 게시물 전체가 보이지 않는 알 수 없는 오류로 인해 해당 코드는 예시를 보이지 않겠다.</p>
<ul>
<li><p>pattern 속성</p>
<p>pattern 속성은 required 속성처럼 필드의 값을 체크해 주는 폼 유효성 검사 속성이라고 보면 된다. 다만, required 속성은 일반적인 input type 형식에 대한 유효성을 체크하지만 pattern 속성은 &#39;정규 표현식&#39; 방법으로 입력값과 정규식이 일치해야만 유효성에 통과할 수 있다.</p>
</li>
</ul>
<pre><code class="language-html5">&lt;form&gt;
  &lt;fieldset&gt;
    &lt;legend&gt;pattern 속성&lt;/legend&gt;
    &lt;p&gt;&lt;label for=&quot;tel&quot;&gt;휴대폰 번호 : &lt;/label&gt;&lt;input type=&quot;tel&quot; id=&quot;tel&quot; pattern=&quot;\d{3}-\d{3,4}-\d{4}&quot; title=&quot;휴대폰 번호는 3자리 숫자 - 3자리에서 4자리 숫자 - 4자리 숫자로 입력하셔야 합니다.&quot; /&gt;&lt;/p&gt;
    &lt;p&gt;&lt;input type=&quot;submit&quot; value=&quot;전송&quot; /&gt;&lt;/p&gt;
  &lt;/fieldset&gt;
&lt;/form&gt;</code></pre>
<p>이를 출력하면 다음과 같다.</p>
<form>
  <fieldset>
    <legend>pattern 속성</legend>
    <p><label for="tel">휴대폰 번호 : </label><input type="tel" id="tel" pattern="￦d{3}-￦d{3,4}-￦d{4}" title="휴대폰 번호는 3자리 숫자-3자리에서 4자리 숫자-4자리 숫자로 입력하셔야 합니다." /></p>
    <p><input type="submit" value="전송" /></p>
  </fieldset>
</form>

<p>pattern=&quot;￦d{3}-￦d{3,4}-￦d{4}&quot;의 의미를 살펴보면 &#39;￦d&#39;는 숫자, &#39;{3}&#39;은 3자리를 의미합니다. 조금 더 쉽게 풀이하자면, &quot;입력되는 값은 &#39;숫자 3자리-숫자 3~4자리-숫자 4자리&#39; 와 일치해야 합니다.&quot;라는 뜻이 된다. pattern 속성을 사용할 때는 해당 input 요소에 정해놓은 정규 표현식과 일치하게 입력할 수 있도록 title 속성을 이용하여 입력 형식에 대한 툴티을 제공해 주어야 한다.</p>
<ul>
<li>multiple 속성
multiple 속성은 여러 개의 이메일을 &#39;,&#39;로 입력하거나 다중의 파일을 선택할 수 있도록 해주는 속성이다.</li>
</ul>
<pre><code class="language-html">  &lt;label for=&quot;email&quot;&gt;이메일 : &lt;/label&gt;&lt;input type=&quot;email&quot; id=&quot;email&quot; multiple=&quot;multiple&quot; /&gt;
  &lt;label for=&quot;file&quot;&gt;파일 찾기:&lt;/label&gt;&lt;input type=&quot;file&quot; id=&quot;file&quot; multiiple=&quot;multiple&quot; /&gt;</code></pre>
<p><br /><br /></p>
<h3 id="textarea_i--select_i"><code>&lt;textarea&gt;</code>_i &amp; <code>&lt;select&gt;</code>_i</h3>
<p><code>&lt;textarea&gt;</code> : 게시판의 내용 입력이나 약관 등 여러 줄로 된 텍스트 상자를 생성하는 요소
<code>&lt;select&gt;</code> : 선택 목록 상자를 생성하는 요소</p>
<pre><code class="language-html">&lt;form action=&quot;board.php&quot; method=&quot;post&quot;&gt;
&lt;fieldset&gt;
  &lt;legend&gt;여러 줄 글상자와 목록상자&lt;/legend&gt;
  &lt;p&gt;답글&lt;br /&gt; &lt;textarea cols=&quot;30&quot; rows=&quot;3&quot; name=&quot;reply&quot;&gt;&lt;/textarea&gt;&lt;/p&gt;
  &lt;p&gt;과목 선택
    &lt;select&gt;
      &lt;option value=&quot;html5&quot;&gt;html5&lt;/option&gt;
      &lt;option value=&quot;css3&quot;&gt;css3&lt;/option&gt;
      &lt;option value=&quot;javascript&quot;&gt;javascript&lt;/option&gt;
      &lt;option value=&quot;Query&quot;&gt;jQuery&lt;/option&gt;
    &lt;/select&gt;
  &lt;/p&gt;
  &lt;p&gt;스터디 지역
    &lt;select&gt;
      &lt;optgroup label=&quot;관악구&quot;&gt;
        &lt;option value=&quot;gwanak-bcd&quot;&gt;봉천동&lt;/option&gt;
        &lt;option value=&quot;gwanak-sld&quot;&gt;신림동&lt;/option&gt;
        &lt;option value=&quot;gwanak-nhd&quot;&gt;남현동&lt;/option&gt;
      &lt;/optgroup&gt;
      &lt;optgroup label=&quot;동대문구&quot;&gt;
        &lt;option value=&quot;ddm-jnd&quot;&gt;전논동&lt;/option&gt;
        &lt;option value=&quot;ddm-dsn&quot;&gt;답십리&lt;/option&gt;
        &lt;option value=&quot;ddm-ssd&quot;&gt;신설동&lt;/option&gt;
      &lt;/optgroup&gt;
    &lt;/select&gt;
  &lt;/p&gt;
&lt;/fieldset&gt;
&lt;/form&gt;</code></pre>
<p>이를 출력하면 다음과 같다.</p>
<form action="board.php" method="post">
<fieldset>
  <legend>여러 줄 글상자와 목록상자</legend>
  <p>답글<br /> <textarea cols="30" rows="3" name="reply"></textarea></p>
  <p>과목 선택
    <select>
      <option value="html5">html5</option>
      <option value="css3">css3</option>
      <option value="javascript">javascript</option>
      <option value="Query">jQuery</option>
    </select>
  </p>
  <p>스터디 지역
    <select>
      <optgroup label="관악구">
        <option value="gwanak-bcd">봉천동</option>
        <option value="gwanak-sld">신림동</option>
        <option value="gwanak-nhd">남현동</option>
      </optgroup>
      <optgroup label="동대문구">
        <option value="ddm-jnd">전논동</option>
        <option value="ddm-dsn">답십리</option>
        <option value="ddm-ssd">신설동</option>
      </optgroup>
    </select>
  </p>
</fieldset>
</form>

<ul>
<li><code>&lt;textarea&gt;</code>요소의 cols와 rows 속성은 텍스트 상자의 열과 행의 수를 지정한다.</li>
<li><code>&lt;select&gt;</code>요소는 <code>&lt;option&gt;</code>요소와 함께 쓰며 특히 목록이 많은 경우에는 관련 있는 것끼리 묶어주는 <code>&lt;optgroup&gt;</code>요소를 사용한다. <code>&lt;option&gt;</code>요소의 value는 실제 전송값을 의미하며 <code>&lt;optgroup&gt;</code>요소의 label 속성은 그룹 지어진 <code>&lt;option&gt;</code>요소들의 제목이다.</li>
</ul>
<p><br /><br /></p>
<h3 id="label_i"><code>&lt;label&gt;</code>_i</h3>
<p>테이블과 마찬가지로 폼 요소들도 환경적인 요인에 따라 접근하기 어려운 경우들이 있다.</p>
<p>예를 들어 마우스에 익숙하지 않은 사용자의 경우 라디오 버튼이나, 체크박스에 정확히 클릭하기란 쉽지 않을 것이다. 또한, 웹 문서가 음성만 출력되는 환경에서는 각 폼 요소들 앞에 정확한 레이블을 주지 않으면 어떤 내용을 입력하고 체크해야 하는지 알 수가 없는 상황이 발생할 수 있다.</p>
<p><code>&lt;label&gt;</code>요소를 이용하여 접근성 높은 온라인 서식을 만드는 방법에 대해 알아보자.</p>
<pre><code class="language-html5">&lt;form action=&quot;join.php&quot; method=&quot;post&quot;&gt;
  &lt;fieldset&gt;
    &lt;legend&gt;회원가입&lt;/legend&gt;
    &lt;table&gt;
      &lt;colgroup&gt;
        &lt;col width=&quot;30%&quot; /&gt;
        &lt;col width=&quot;70%&quot; /&gt;
      &lt;/colgroup&gt;
      &lt;tbody&gt;
        &lt;tr&gt;
          &lt;th scope=&quot;row&quot;&gt;&lt;label for=&quot;name&quot;&gt;이름&lt;/label&gt;&lt;/th&gt;
          &lt;td&gt;&lt;input type=&quot;text&quot; id=&quot;name&quot; /&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
          &lt;th scope=&quot;row&quot;&gt;&lt;label for=&quot;id&quot;&gt;아이디&lt;/label&gt;&lt;/th&gt;
          &lt;td&gt;&lt;input type=&quot;text&quot; id=&quot;id&quot; /&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
          &lt;th scope=&quot;row&quot;&gt;&lt;label for=&quot;pw&quot;&gt;비밀번호&lt;/label&gt;&lt;/th&gt;
          &lt;td&gt;&lt;input type=&quot;text&quot; id=&quot;pw&quot; /&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
          &lt;th scope=&quot;row&quot;&gt;&lt;label for=&quot;r_pw&quot;&gt;비밀번호 확인&lt;/label&gt;&lt;/th&gt;
          &lt;td&gt;&lt;input type=&quot;text&quot; id=&quot;r_pw&quot; /&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
          &lt;th scope=&quot;row&quot;&gt;&lt;label for=&quot;jumin_num&quot;&gt;주민번호&lt;/label&gt;&lt;/th&gt;
          &lt;td&gt;
            &lt;input type=&quot;text&quot; id=&quot;jumin_num&quot; title=&quot;주민번호 앞 6자리&quot; /&gt;
            -
            &lt;input type=&quot;text&quot; id=&quot;jumin_num&quot; title=&quot;주민번호 뒤 7자리&quot; /&gt;
          &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
          &lt;th scope=&quot;row&quot;&gt;&lt;label for=&quot;e-mail&quot;&gt;이름&lt;/label&gt;&lt;/th&gt;
          &lt;td&gt;
            &lt;input type=&quot;text&quot; id=&quot;email&quot; tilte=&quot;이메일 아이디&quot; /&gt;
            @
            &lt;input type=&quot;tsxt&quot; title=&quot;이메일 주소&quot; /&gt;
          &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
          &lt;th scope=&quot;row&quot;&gt;&lt;label for=&quot;hp&quot;&gt;핸드폰&lt;/label&gt;&lt;th&gt;
          &lt;td&gt;&lt;input type=&quot;text&quot; id=&quot;hp&quot; /&gt;&lt;/td&gt;
        &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
    &lt;p&gt;&lt;input type=&quot;submit&quot; value=&quot;전송&quot; /&gt;&lt;input type=&quot;reset&quot; value=&quot;취소&quot; /&gt;&lt;/p&gt;
  &lt;/fieldset&gt;
&lt;/form&gt;</code></pre>
<p>이를 출력하면 다음과 같다.</p>
<form action="join.php" method="post">
  <fieldset>
    <legend>회원가입</legend>
    <table border="1" width="100%">
      <colgroup>
        <col width="30%" />
        <col width="70%" />
      </colgroup>
      <tbody>
        <tr>
          <th scope="row"><label for="name">이름</label></th>
          <td><input type="text" id="name" /></td>
        </tr>
        <tr>
          <th scope="row"><label for="id">아이디</label></th>
          <td><input type="text" id="id" /></td>
        </tr>
        <tr>
          <th scope="row"><label for="pw">비밀번호</label></th>
          <td><input type="text" id="pw" /></td>
        </tr>
        <tr>
          <th scope="row"><label for="r_pw">비밀번호 확인</label></th>
          <td><input type="text" id="r_pw" /></td>
        </tr>
        <tr>
          <th scope="row"><label for="jumin_num">주민번호</label></th>
          <td>
            <input type="text" id="jumin_num" title="주민번호 앞 6자리" />
            -
            <input type="text" id="jumin_num" title="주민번호 뒤 7자리" />
          </td>
        </tr>
        <tr>
          <th scope="row"><label for="email">이름</label></th>
          <td>
            <input type="text" id="email" tilte="이메일 아이디" />
            @
            <input type="tsxt" title="이메일 주소" />
          </td>
        </tr>
        <tr>
          <th scope="row"><label for="hp">핸드폰</label></th>
          <td><input type="text" id="hp" /></td>
        </tr>
      </tbody>
    </table>
    <p>
      <input type="submit" value="전송" />
      <input type="reset" value="취소" />
    </p>
  </fieldset>
</form>

<ul>
<li><code>&lt;label&gt;</code>요소의 for 속성값과 <code>&lt;input&gt;</code>요소의 id 속성값을 같은 이름으로 연결시켜 주면 레이블 텍스트(이름, 아이디, 비밀번호 등...)에 마우스를 클릭하거나 포커스가 이동되면 우측에 연결되어 있는 input 텍스트 상자로 커서가 자동 이동된다.</li>
<li>주민번호의 경우 하나의 <code>&lt;label&gt;</code>에 두 개의 <code>&lt;input&gt;</code>요소가 있다. 이러한 경우 <code>&lt;label&gt;</code>를 첫 번째 <code>&lt;input&gt;</code>요소에 title 속성을 이용하여 추가적딩 설명을 넣어주면 음성만 출력되는 환경에서도 폼 요소들에 대한 접근성을 높일 수 있다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[html5 _ <table> 태그 정리]]></title>
            <link>https://velog.io/@jay_kimjh/html5-%ED%85%8C%EC%9D%B4%EB%B8%94-%EC%9A%94%EC%86%8C-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@jay_kimjh/html5-%ED%85%8C%EC%9D%B4%EB%B8%94-%EC%9A%94%EC%86%8C-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Mon, 15 Nov 2021 07:23:26 GMT</pubDate>
            <description><![CDATA[<p>※ 본 포스팅은 책 &lt;실전 프로젝트 반응형 웹 퍼블리싱&gt;을 참고하여 작성함</p>
<h3 id="테이블table--table_b">테이블(Table) : <code>&lt;table&gt;</code>_b</h3>
<p><code>&lt;table&gt;</code>_b : 웹 문서에서 <strong>표</strong>를 만드는 요소
<code>&lt;table&gt;</code>은 block요소이며 기본적으로 행과 열을 가지고 있다.</p>
<ul>
<li><code>&lt;th&gt;</code> : 열이나 행의 제목. 이 요소 안의 내용을 볼드 처리 되며 중앙 정렬된느 특징이 있다.</li>
<li><code>&lt;tr&gt;</code> : <strong>행</strong>을 만드는 요소</li>
<li><code>&lt;td&gt;</code> : <strong>열</strong>을 만드는 요소. <strong>&#39;셀(cell)&#39;</strong> 이라고도 한다.</li>
<li>rowspan : 행 합치기</li>
<li>colspan : 열 합치기</li>
<li><code>&lt;caption&gt;</code> : 테이블의 제목</li>
<li><code>&lt;thead&gt;</code> : 머리말</li>
<li><code>&lt;tbody&gt;</code> : 본문</li>
<li><code>&lt;tfoot&gt;</code> : 꼬리말 - 테이블에 대한 수치 결과값 등 데이터에 대한 결과가 있을 때만 마크업해주고 그 외에는 <code>&lt;thead&gt;</code>요소와 <code>&lt;tbody&gt;</code>요소만 마크업한다.
※ 본문(tbody)보다 꼬리말(tfoot)을 먼저 마크업해도 결과 화면에서는 본문 다음 꼬리말 순으로 내용 흐름에 맞게 출력된다.
<strong>그렇다면 왜 <code>&lt;tbody&gt;</code>보다 <code>&lt;tfoot&gt;</code>을 먼저 마크업해야 할까?</strong>
웹페이지가 화면이 아닌 음성으로만 지원되는 환경(스크린 리더)에서는 테이블에 대한 정보를 마크업한 순서대로 접근하여 읽어 주기 때문에 <code>&lt;thead&gt;</code>다음 <code>&lt;tfoot&gt;</code>에 대한 정보를 먼저 제공하여 전체적인 내용을 파악할 수 있게 하고 그다음 본문으로 내려가도록 하는 것이 효율적인 방법이다. (들어 봤을 때 관심이 없는 내용이라면 굳이 긴 본문의 내용을 모두 다 들을 필요 없으니까)</li>
</ul>
<p>예제를 보며 참고해보자.</p>
<pre><code class="language-html5">&lt;table border=&quot;1&quot; width=&quot;100%&quot;&gt;
  &lt;caption&gt;태블릿 PC와 스마트폰 판매현황&lt;/caption&gt;
  &lt;colgroup&gt;
    &lt;col width=&quot;20%&quot; /&gt;
    &lt;col width=&quot;40%&quot; /&gt;
    &lt;col width=&quot;40%&quot; /&gt;
  &lt;/colgroup&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th scope=&quot;col&quot;&gt;구분&lt;/th&gt;
      &lt;th scope=&quot;col&quot;&gt;태블릿 PC&lt;/th&gt;
      &lt;th scope=&quot;col&quot;&gt;스마트폰&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tfoot&gt;
    &lt;tr&gt;
      &lt;th scope=&quot;row&quot;&gt;총판매수&lt;/th&gt;
      &lt;td&gt;5만대&lt;/td&gt;
      &lt;td&gt;16만대&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tfoot&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;th scope=&quot;row&quot;&gt;상반기 판매수&lt;/th&gt;
      &lt;td&gt;2만대&lt;/td&gt;
      &lt;td&gt;5만대&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th scope=&quot;row&quot;&gt;하반기 판매수&lt;/th&gt;
      &lt;td&gt;3만대&lt;/td&gt;
      &lt;td&gt;11만대&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;</code></pre>
<p>이를 출력하면 다음과 같다.</p>
<table border="1" width="100%">
  <caption>태블릿 PC와 스마트폰 판매현황</caption>
  <colgroup>
    <col width="20%" />
    <col width="40%" />
    <col width="40%" />
  </colgroup>
  <thead>
    <tr>
      <th scope="col">구분</th>
      <th scope="col">태블릿 PC</th>
      <th scope="col">스마트폰</th>
    </tr>
  </thead>
  <tfoot>
    <tr>
      <th scope="row">총판매수</th>
      <td>5만대</td>
      <td>16만대</td>
    </tr>
  </tfoot>
  <tbody>
    <tr>
      <th scope="row">상반기 판매수</th>
      <td>2만대</td>
      <td>5만대</td>
    </tr>
    <tr>
      <th scope="row">하반기 판매수</th>
      <td>3만대</td>
      <td>11만대</td>
    </tr>
  </tbody>
</table>

<p> <code>&lt;th&gt;</code>요소에 있는 &#39;scope&#39;속성은 열의 제목(scope=&quot;col&quot;)과 행의 제목(scope=&quot;row&quot;)이 어떤 것인지 알려준다. 음성만으로 정보를 전달하는 환경에서는 테이블에 대한 정보를 정확히 이해하기란 쉽지 않기 때문에 필요하다.</p>
<p> 만약 현재의 커서 위치를 &#39;2만대&#39;셀로 이동시 음성으로 그냥 &#39;2만 대&#39;라고 읽어주면 이것이 무엇에 대한 &#39;2만 대&#39;인지 알 수 없다. 그런데 이것을 &#39;태블릿 PC. 2만 대&#39;라고 읽어준다면 정보를 이해하는데 훨씬 더 수월할 것이다.
 스크린 리더마다 조금씩 차이는 있겠지만 보통 scope 속성을 주면 위 표를 예시로 했을 때 다음과 같이 읽어준다.</p>
<p> &quot;구분&quot; → &quot;상반기 판매수&quot; → &quot;태블릿 PC 2만 대&quot; → &quot;스마트폰 5만 대&quot;</p>
<p> 스크린 리더 중에서는 <code>&lt;th&gt;</code>요소만 잘 써 줘도 위와 같이 ㅇ릭어주는 경우가 있지만, 접근성 높은 데이터 테이블을 제작하기 위해서 <code>&lt;th&gt;</code>요소에 &#39;scope&#39;속성을 꼭 넣어 주시기 바란다.</p>
<p>다음은 셀 합치기가 된 경우의 테이블 접근성을 높일 수 있는 방법을 알아보자.</p>
<pre><code class="language-html5">&lt;h5&gt;colgroup&lt;/h5&gt;
&lt;table border=&quot;1&quot; width=&quot;100%&quot;&gt;
  &lt;caption&gt;상품에 따른 월별 판매현황&lt;/caption&gt;
  &lt;colgroup&gt;
    &lt;col width=&quot;20%&quot; /&gt;
    &lt;col width=&quot;25%&quot; /&gt;
    &lt;col width=&quot;25%&quot; /&gt;
    &lt;col width=&quot;30%&quot; /&gt;
  &lt;/colgroup&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th rowspan=&quot;2&quot; scope=&quot;col&quot;&gt;구분&lt;/th&gt;
      &lt;th colspan=&quot;3&quot; scope=&quot;colgroup&quot;&gt;상품종류&lt;/th&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th scope=&quot;col&quot;&gt;스마트폰&lt;/th&gt;
      &lt;th scope=&quot;col&quot;&gt;태블릿PC&lt;/th&gt;
      &lt;th scope=&quot;col&quot;&gt;데스크탑PC&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;th scope=&quot;row&quot;&gt;1월&lt;/th&gt;
      &lt;td&gt;5만대&lt;/td&gt;
      &lt;td&gt;3만대&lt;/td&gt;
      &lt;td&gt;1만대&lt;/td&gt;
    &lt;/tr&gt;
  &lt;tbody&gt;
&lt;/table&gt;
&lt;br/&gt;
&lt;h5&gt;id, headers&lt;/h5&gt;
&lt;table border=&quot;1&quot; width=&quot;100%&quot;&gt;
  &lt;caption&gt;상품에 따른 월별 판매 현황&lt;/caption&gt;
  &lt;colgroup&gt;
    &lt;col width=&quot;20%&quot; /&gt;
    &lt;col width=&quot;25%&quot; /&gt;
    &lt;col width=&quot;25%&quot; /&gt;
    &lt;col width=&quot;30%&quot; /&gt;
  &lt;/colgroup&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th rowspan=&quot;2&quot; id=&quot;division&quot;&gt;구분&lt;/th&gt;
      &lt;th colspan=&quot;3&quot; id=&quot;product&quot;&gt;상품종류&lt;/th&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th header=&quot;product&quot; id=&quot;smartphone&quot;&gt;스마트폰&lt;/th&gt;
      &lt;th header=&quot;product&quot; id=&quot;tabletpc&quot;&gt;태블릿PC&lt;/th&gt;
      &lt;th header=&quot;product&quot; id=&quot;pc&quot;&gt;데스크탑PC&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;th headers=&quot;division&quot;&gt;1월&lt;/th&gt;
      &lt;td headers=&quot;product smartphone&quot;&gt;5만대&lt;/td&gt;
      &lt;td headers=&quot;product tabletpc&quot;&gt;3만대&lt;/td&gt;
      &lt;td headers=&quot;product pc&quot;&gt;1만대&lt;/td&gt;
    &lt;/tr&gt;
  &lt;tbody&gt;
&lt;/table&gt;</code></pre>
<p>이를 출력하면 다음과 같다.</p>
<h5>colgroup</h5>
<table border="1" width="100%">
  <caption>상품에 따른 월별 판매현황</caption>
  <colgroup>
    <col width="20%" />
    <col width="25%" />
    <col width="25%" />
    <col width="30%" />
  </colgroup>
  <thead>
    <tr>
      <th rowspan="2" scope="col">구분</th>
      <th colspan="3" scope="colgroup">상품종류</th>
    </tr>
    <tr>
      <th scope="col">스마트폰</th>
      <th scope="col">태블릿PC</th>
      <th scope="col">데스크탑PC</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th scope="row">1월</th>
      <td>5만대</td>
      <td>3만대</td>
      <td>1만대</td>
    </tr>
  <tbody>
</table>
<br/>
<h5>id, headers</h5>
<table border="1" width="100%">
  <caption>상품에 따른 월별 판매 현황</caption>
  <colgroup>
    <col width="20%" />
    <col width="25%" />
    <col width="25%" />
    <col width="30%" />
  </colgroup>
  <thead>
    <tr>
      <th rowspan="2" id="division">구분</th>
      <th colspan="3" id="product">상품종류</th>
    </tr>
    <tr>
      <th header="product" id="smartphone">스마트폰</th>
      <th header="product" id="tabletpc">태블릿PC</th>
      <th header="product" id="pc">데스크탑PC</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th headers="division">1월</th>
      <td headers="product smartphone">5만대</td>
      <td headers="product tabletpc">3만대</td>
      <td headers="product pc">1만대</td>
    </tr>
  <tbody>
</table>

<ul>
<li><p>셀을 합친 경우, 접근성을 높일 수 있는 방법에는 두 가지가 있는데 그 첫 번째 방법이 &#39;colgroup&#39;이다.</p>
<p>첫 번째 테이블 마크업을 보면 &#39;상품종류&#39;셀은 &#39;열 합치기&#39;가 되어 있으며 아래 &#39;스마트폰&#39;, &#39;태블릿 PC&#39;, &#39;데스크탑 PC&#39; 제목 셀들의 큰제목이 된다. 이런 경우 &#39;상품종류&#39; 제못 셀 안에 &#39;scope&#39; 속성값을 col이 아닌 &#39;colgroup&#39;으로 주면 된다.</p>
</li>
<li><p>두 번째 방법은 &#39;id&#39;와 &#39;headers&#39;속성을 이용하는 방법이다.
&#39;id&#39;는 제목 셀에 이름을 부여하는 것이고 &#39;headers&#39;는 제목 셀 &#39;id&#39;의 내용을 참조한다고 보면 된다.</p>
<p>두 번째 테이블 마크업을 보면 &#39;상품종류&#39; 셀에 id &#39;product&#39;를 부여 하였고 아래 각 제목 셀들(&#39;스마트폰&#39;, &#39;태블릿 PC&#39;, &#39;데스크탑 PC&#39;)에 각각 id &#39;smartphone&#39;, &#39;tabletpc&#39;, &#39;pc&#39;를 부여 하였다. 또, headers 속성을 이용하여 상품종류 셀(&#39;product&#39;)을 참조하게 하였다.</p>
<p>3행 2열의 &#39;5만 대&#39; 셀의 경우 headers 속성을 이용하여 그 열의 제목 셀인 상품종류(&#39;product&#39;)와 스마트폰(&#39;smartphone&#39;)을 참조하게 하였다.</p>
</li>
<li><p>첫 번째 테이블과 두 번째 테이블을 각각 scope 속성값 &#39;colgroup&#39;, &#39;id, headers&#39; 속성과 같이 서로 다른 방식을 이용하여 마크업하였지만 스크린 리더에서는 같은 결과를 얻을 수 있다.</p>
<p>&quot;구분&quot; → &quot;1월&quot; → &quot;상품종류 스마트폰 5만 대&quot; → &quot;상품종류 태블릿PC 3만 대&quot;</p>
</li>
</ul>
<p>※ scope 속성의 colgroup 값은 셀 합치기가 단순한 구조로 되어 있을 때 사용하며 id와 headers는 셀 합치기 구조가 복잡할 때 주로 사용한다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[XHTML 정리_태그]]></title>
            <link>https://velog.io/@jay_kimjh/XHTML-%EC%A0%95%EB%A6%AC%ED%83%9C%EA%B7%B8</link>
            <guid>https://velog.io/@jay_kimjh/XHTML-%EC%A0%95%EB%A6%AC%ED%83%9C%EA%B7%B8</guid>
            <pubDate>Wed, 10 Nov 2021 11:12:11 GMT</pubDate>
            <description><![CDATA[<p>※ 본 포스팅은 책 &lt;실전 프로젝트 반응형 웹 퍼블리싱&gt;을 참고하여 작성됨</p>
<h4 id="블록-요소block-elememt">블록 요소(Block Elememt)</h4>
<ul>
<li><strong>블록 요소</strong>는 마크업 시 <em><strong>줄바꿈</strong>이 일어나는 성질을 가지고 <span style="color:red;">있다</span>.</em></li>
<li>한 요소가 한 라인의 전체를 차지함, <strong>가로 세로 크기 지정 가능</strong></li>
<li>일반적으로 화면 레이아웃을 그리는 데 사용함</li>
<li>inline 요소보다 상위 요소임 (block 안에 inline 포함 가능 / inline 안에 block 포함 불가능)</li>
</ul>
<h4 id="인라인-요소inline-element">인라인 요소(Inline Element)</h4>
<ul>
<li><strong>인라인 요소</strong>는 블록 요소와 달리 <em><strong>줄바꿈</strong> 성질이 <span style="color:red;">없다</span>.</em> 즉, 행이 바뀌지 않고 한 줄로 출력됨</li>
<li>한 라인에 여러 요소가 존재할 수 있음, 필요한 폭만 유지해서 다른 요소와 같은 라인에 위치함</li>
<li><strong>상 &middot; 하단 margin 속성이 적용되지 않음</strong></li>
<li>inline 태그끼리 연속해서 사용하는 경우 별도 속성이 없으면 <span style="color:#06c;">좌우 margin 5px</span> 생성됨</li>
</ul>
<h1 id="xhtml-태그-정리">XHTML 태그 정리</h1>
<p>※ 이하, block요소는 &#39;<strong>_b</strong>&#39;로, inline요소는 &#39;<strong>_i</strong>&#39;로 구분한다. </p>
<h2 id="제목title--h_b">제목(Title) : <code>&lt;h#&gt;</code>_b</h2>
<p><code>&lt;h#&gt;&lt;/h#&gt;</code> : 일반적인 문서 작업에서 상단에 가장 먼저 쓰이는 큰제목과 소제목처럼 문서 내에서 큰 줄기가 되는 부분들을 제목으로 처리할 때 쓰는 요소.
큰제목 순으로 <code>&lt;h1&gt; ~ &lt;h6&gt;</code>까지 사용할 수 있다.</p>
<ul>
<li>웹 표준 문서 작업 시 <code>&lt;h1&gt;</code>은 꼭 마크업해주어야 하는데 웹 문서의 <code>&lt;h1&gt;</code>은 보통 회사나 단체의 상호명(로고)으로 처리한다.</li>
<li>마크업 시 <code>&lt;h1&gt; → &lt;h2&gt; → &lt;h3&gt; → &lt;h4&gt; → &lt;h5&gt; → &lt;h6&gt;</code> 순서로 정의해야 하며 <code>&lt;h1&gt;</code> 다음에는 반드시 <code>&lt;h2&gt;</code>가 와야 하며 <code>&lt;h3&gt;</code>가 올 수 없다.</li>
<li>내용의 흐름이나 중요도에 따라 <code>&lt;h1&gt; ~ &lt;h6&gt;</code>는 여러번 정의 될 수 있다.</li>
<li><code>&lt;h#&gt;</code>은 블록 요소이며, 텍스트나 인라인 요소를 포함할 수 있지만 블록요소는 포함할 수 없다.<pre><code class="language-html5">&lt;h1&gt;가나다라&lt;/h1&gt; (O)
&lt;h1&gt;&lt;a href=&quot;#&quot;&gt;가나다라&lt;/a&gt;&lt;/h1&gt; (O)
&lt;h1&gt;&lt;p&gt;가나다라&lt;/p&gt;&lt;/h1&gt; (X)</code></pre>
</li>
<li>사실 <code>&lt;h#&gt;</code>요소는 기본 개념은 어렵지 않지만, 실제 작업에 있어서는 어느 부분에 어느 번호를 정의해야 할지 애매한 경우가 많다. 웹페이지 기획 단계에서 내용의 중요도와 흐름에 따라 어느 부분을 제목을 처리해야 할지 잘 판단해야 한다.</li>
</ul>
<h2 id="단락paragraph--p_b">단락(Paragraph) : <code>&lt;p&gt;</code>_b</h2>
<p><code>&lt;p&gt;</code> : 단락을 정의 하는 태그. 문장과 같은 텍스트들은 인라인 요소의 성질을 가지고 있기 때문에 단독으로 쓰지 않고 보통 블록 요소인<code>&lt;p&gt;</code>요소 안에 포함 시킨다.</p>
<ul>
<li>마크업할 때 아무리 엔터를 쳐서 행을 만들어도 실제 출력화면에는 한 줄로 나타난다.</li>
<li>문맥상 특정 부분에서 강제적으로 줄 바꿈을 하고 싶을 때 <code>&lt;br /&gt;</code> 요소를 마크업하면 된다.
&#39;줄 바꿈&#39;을 해주는 요소인<code>&lt;br /&gt;</code>은 빈 요소이기 때문에 <code>&lt;br&gt;&lt;/br&gt;</code>로 마크업하지 않는다.</li>
<li><code>&lt;p&gt;</code>는 block요소이며 텍스트와 inline요소는 포함할 수 있지만 block요소는 포함할 수 없다.<pre><code class="language-html5">&lt;p&gt;가나다라&lt;/p&gt; (O)
&lt;p&gt;&lt;a href=&quot;#&quot;&gt;가나다라/a&gt;&lt;/p&gt; (O)
&lt;p&gt;&lt;h1&gt;가나다라&lt;/h1&gt;&lt;/p&gt; (X)</code></pre>
</li>
</ul>
<h2 id="주소address--address_b">주소(Address) : <code>&lt;address&gt;</code>_b</h2>
<p><code>&lt;address&gt;</code> : 웹 문서 하단(footer)에 보면 문서와 관련된 연락처나 주소, 전화번호, 저작권 등에 관련된 내용처럼 연락처 정보를 나타내는 요소.</p>
<ul>
<li><code>&lt;address&gt;</code>요소 안의 텍스트들은 이탤릭체로 출력된다.</li>
<li><code>&lt;address&gt;</code>는 block요소이며 텍스트와 inline요소는 포함할 수 있지만 block요소는 포함할 수 없다.<pre><code class="language-html5">&lt;address&gt;연락처 02-1111-2222&lt;/address&gt; (O)
&lt;address&gt;&lt;a href=&quot;#&quot;&gt;e-mail:abc123@abc.com&lt;/a&gt;&lt;address&gt; (O)
&lt;address&gt;&lt;h3&gt;COPYRIGHT&amp;copy; Jay.&lt;/h3&gt;&lt;/address&gt; (X)</code></pre>
</li>
</ul>
<h2 id="구분선horizontal-line--hr-_b">구분선(Horizontal line) : <code>&lt;hr /&gt;</code>_b</h2>
<p><code>&lt;hr /&gt;</code> : 웹 문서 내에서 구분선을 그을 때 사용하는 요소</p>
<ul>
<li><code>&lt;hr /&gt;</code>은 빈 요소이기 때문에 <code>&lt;hr&gt;&lt;/hr&gt;</code>로 마크업하지 않는다.</li>
<li><code>&lt;hr /&gt;</code>요소는 단순해 보이지만 마크업 시 복잡한 내용들을 헷갈리지 않게 구분해주는 역할을 하여 매우 유용하게 쓰인다.</li>
</ul>
<h2 id="인용문quotation--blockquoteq_i">인용문(Quotation) : <code>&lt;blockquote&gt;,&lt;q&gt;</code>_i</h2>
<p>다른 사람의 말이나 글을 인용할 때 쓴다.</p>
<pre><code class="language-html5">&lt;blockquote cite=&quot;href://...&quot; title=&quot;가나다라&quot;&gt;&lt;p&gt;...&lt;p&gt;&lt;/blockquote&gt;</code></pre>
<ul>
<li>다른 요소들과 구분되어 보이기 위해 텍스트가 들여쓰기 되어 출력됨. </li>
<li>cite에는 인용한 곳의 URL주소를 넣을 수 있다.</li>
<li>title이란 속성을 이용하여 인용한 곳의 타이틀을 명시할 수 있다.</li>
<li>block요소이며 다른 block요소와 다르게 텍스트나 inline요소를 포함하지 않고 <code>&lt;p&gt;</code>요소와 같은 block요소를 포함해야 한다.</li>
</ul>
<pre><code class="language-html5">&lt;q cite=&quot;http://...&quot;&gt;...&lt;/q&gt;</code></pre>
<ul>
<li><strong>&quot;...&quot;</strong> 로 출력되는 inline요소이며 텍스트와 inline요소를 포함할 수 있다.</li>
<li>보통 짧은 인용문을 쓸 때 사용한다.</li>
</ul>
<h2 id="텍스트text">텍스트(Text)</h2>
<p>텍스트 관련 요소들은 텍스트의 강조, 생략어와 두문자어, 추가글, 취소글, 첨자 등을 출력할 때 쓰는 요소</p>
<ul>
<li><code>&lt;em&gt;</code>_i : <em>이탤릭체</em>, 일반적인 강조 *css에서 단위로서의 em과 다름</li>
<li><code>&lt;strong&gt;</code>_i : <strong>볼드체</strong>, <code>&lt;em&gt;</code>보다 더 강한 강조
※ <code>&lt;i&gt;</code>_i , <code>&lt;b&gt;</code>_i : <code>&lt;i&gt;</code>(이탤릭체), <code>&lt;b&gt;</code>(볼드체)는 각각 위의 태그들과 모양만 같고 강조의 의미가 없다는 것이 차이점이다. </li>
<li><code>&lt;abbr&gt;</code>_i : 생략어 ex) <code>&lt;abbr title=&quot;World Health Organization&quot;&gt;WHO&lt;/abbr&gt;</code></li>
<li><code>&lt;del&gt;</code>_i/b : 삭제글(취소선) ex) 올 때 <del>메로나</del></li>
<li><code>&lt;ins&gt;</code>_i/b : 추가글(밑줄) ex) 올 때 <del>메로나</del> <ins>바밤바</ins>
※ <code>&lt;ins&gt;</code>, <code>&lt;del&gt;</code>요소는 상황에 따라 block요소도, inline요소도 될 수 있다.</li>
<li><code>&lt;sup&gt;</code>_i : 윗첨자 ex) m<sup>2</sup></li>
<li><code>&lt;sub&gt;</code>_i : 아래첨자 ex) CO<sub>2</sub></li>
</ul>
<h2 id="이미지images">이미지(Images)</h2>
<h3 id="이미지--img-_i">이미지 : <code>&lt;img /&gt;</code>_i</h3>
<p><code>&lt;img /&gt;</code> : 웹 문서에 <strong>이미지</strong>를 불러오는 요소</p>
<pre><code class="language-html5">&lt;img src=&quot;이미지파일명&quot; width=&quot;가로길이&quot; height=&quot;세로길이&quot; alt=&quot;대체텍스트&quot; /&gt;</code></pre>
<p>※ 같은 <code>&lt;img&gt;</code>태그를 각각<code>&lt;h1&gt;</code>과 <code>&lt;p&gt;</code>에 넣었을 때, 정상적으로 작동한다면 두 요소의 차이는 없다. 그러나 만약 통신환경의 문제로 이미지를 불러올 수 없는 상황이 된다면 이미지가 사라지고 alt의 속성값이 각 요소의 사이즈에 따라 다르게 출력된다.</p>
<h3 id="이미지-맵image-map--map_i">이미지 맵(Image map) : <code>&lt;map&gt;</code>_i</h3>
<p><code>&lt;map&gt;</code> : <strong>이미지 맵</strong>은 하나의 이미지에 여러 개의 링크를 적용할 수 있다.</p>
<pre><code class="language-html5">&lt;img src=&quot;이미지파일명&quot; alt=&quot;대체텍스트&quot; usemap=&quot;#맵이름&quot; /&gt;
&lt;map id=&quot;맵이름&quot; name=&quot;맵이름&quot;&gt;
  &lt;area shape=&quot;rect(사각형),circle(원),poly(다각형),&quot; coords=&quot;맵좌표&quot; href=&quot;url&quot; alt=&quot;대체 텍스트&quot; /&gt;
&lt;/map&gt;</code></pre>
<h3 id="링크link--a_i">링크(Link) : <code>&lt;a&gt;</code>_i</h3>
<p><code>&lt;a&gt;</code> : 텍스트나 이미지를 통하여 <strong>다를 곳으로 정보를 연결해 주는 역할</strong></p>
<pre><code class="language-html5">&lt;a href=&quot;url&quot;&gt;텍스트 또는 이미지&lt;/a&gt;</code></pre>
<ul>
<li><code>&lt;a&gt;</code>요소 안의 텍스트나 이미지 또는 연결된 정보에 대한 부연 설명은 title 속성으로 할 수 있다.</li>
<li>target 속성의 &quot;_blank&quot;는 연결된 정보 페이지를 새 창에 띄운다.</li>
</ul>
<h3 id="리스트list--olulli_b">리스트(List) : <code>&lt;ol&gt;</code>,<code>&lt;ul&gt;</code>,<code>&lt;li&gt;</code>_b</h3>
<p>일반적으로 _목록_을 작성할 때 쓰이며 목록의 종류에는 <strong>순차적 목록 ol(Order List), 비순차적 목록 ul(Unorder List), 정의형 목록 dl(Dedinition List)</strong>이 있다.</p>
<h4 id="olorder-list">ol(Order List)</h4>
<p>순차적인 목록을 작성할 때 사용됨</p>
<pre><code class="language-html5">&lt;h5&gt;신입직원 채용절차&lt;/h5&gt;
&lt;ol&gt;
  &lt;li&gt;입사지원&lt;/li&gt;
  &lt;li&gt;서류전형&lt;/li&gt;
  &lt;li&gt;1차면접&lt;/li&gt;
  &lt;li&gt;적성검사&lt;/li&gt;
  &lt;li&gt;최종면접&lt;/li&gt;
&lt;/ol&gt;</code></pre>
<p>이를 출력하면,</p>
<h5>신입직원 채용절차</h5>
<ol>
  <li>입사지원</li>
  <li>서류전형</li>
  <li>1차면접</li>
  <li>적성검사</li>
  <li>최종면접</li>
</ol>

<p>와 같다.</p>
<ul>
<li>순차적 목록 <code>&lt;ol&gt;</code>은 항목 앞에 번호가 부여됨.</li>
<li><code>&lt;ol&gt;</code> 요소는 block요소이며 <code>&lt;li&gt;</code>요소 이외의 다른 요소는 포함할 수 없다. <code>&lt;li&gt;</code>요소는 block요소이며 텍스트, inline요소, block요소를 포함할 수 있다.</li>
</ul>
<h4 id="ulunorder-list">ul(Unorder List)</h4>
<p>비순차적 목록은 웹 문서의 주요 메뉴 등을 마크업할 때 가장 많이 쓰는 요소 중의 하나</p>
<pre><code class="language-html5">&lt;h5&gt;주메뉴&lt;/h5&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;#&quot;&gt;기업소개&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#&quot;&gt;사업영역&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#&quot;&gt;제품소개&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#&quot;&gt;고객센터&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#&quot;&gt;홍보자료실&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#&quot;&gt;인재채용&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</code></pre>
<p>이를 출력하면, </p>
<h5>주메뉴</h5>
<ul>
  <li><a href="#">기업소개</a></li>
  <li><a href="#">사업영역</a></li>
  <li><a href="#">제품소개</a></li>
  <li><a href="#">고객센터</a></li>
  <li><a href="#">홍보자료실</a></li>
  <li><a href="#">인재채용</a></li>
</ul>

<p>와 같다.</p>
<ul>
<li>순차적 목록 <code>&lt;ol&gt;</code>은 항목의 순서가 바뀌기 어려운 반면, 비순차적 목록<code>&lt;ul&gt;</code>의 항목은 순서에 크게 상관 없다.</li>
<li><code>&lt;ul&gt;</code>은 block요소이며 <code>&lt;li&gt;</code>요소 이외의 다른 요소를 포함할 수 없다. <code>&lt;li&gt;</code>요소는 block요소이며 텍스트, inline요소, block요소를 포함할 수 있다.</li>
</ul>
<h4 id="dldefinition-list">dl(Definition List)</h4>
<p>순차적 목록과 비순차적 목록은 항목들을 나열하는 데 비해 정의형 목록 <code>&lt;dl&gt;</code>은 &#39;이것은 무엇이다&#39;처럼 정의내리고자 하는 용어에 대한 정의 리스트</p>
<pre><code class="language-html5">&lt;dl&gt;&lt;dt&gt;용어&lt;/dt&gt;&lt;dd&gt;용어 정의&lt;/dd&gt;&lt;dl&gt;</code></pre>
<pre><code class="language-html5">&lt;dl&gt;
  &lt;dt&gt;웹 표준 수업과목&lt;/dt&gt;
  &lt;dd&gt;XHTML&lt;/dd&gt;
  &lt;dd&gt;HTML5&lt;/dd&gt;
  &lt;dd&gt;CSS&lt;/dd&gt;
  &lt;dd&gt;CSS3&lt;/dd&gt;
  &lt;dd&gt;Javascript&lt;/dd&gt;
  &lt;dd&gt;jQuery&lt;/dd&gt;
&lt;/dl&gt;</code></pre>
<p>이를 출력하면,</p>
<dl>
  <dt>웹 표준 수업과목</dt>
  <dd>XHTML</dd>
  <dd>HTML5</dd>
  <dd>CSS</dd>
  <dd>CSS3</dd>
  <dd>Javascript</dd>
  <dd>jQuery</dd>
</dl>

<p>와 같다.</p>
<ul>
<li><code>&lt;dd&gt;</code>요소 항목들이 들여쓰기 되어 출력되는 것을 확인할 수 있다.</li>
<li><code>&lt;dl&gt;</code>요소는 block요소이며 <code>&lt;dt&gt;</code>요소와 <code>&lt;dd&gt;</code>요소 이외의 다른 요소는 포함할 수 없다.</li>
<li><code>&lt;dt&gt;</code>요소는 inline요소이며 텍스트와 inline요소를 포함할 수 있다.</li>
<li><code>&lt;dd&gt;</code>요소는 block요소이며 텍스트와 inline요소, block요소를 포함할 수 있다.</li>
</ul>
<h2 id="그룹핑grouping">그룹핑(Grouping)</h2>
<p><strong>그룹핑</strong> 요소에는 <code>&lt;div&gt;</code>요소와 <code>&lt;span&gt;</code>요소가 있다.
<code>&lt;div&gt;</code>_b : block요소들을 그룹핑하는 데에 사용
<code>&lt;span&gt;</code>_i : inline요소들을 그룹핑하는 데에 사용</p>
<pre><code class="language-html5">&lt;h5&gt;div 요소&lt;/h5&gt;
&lt;div id=&quot;footer&quot;&gt;
  &lt;ul&gt;
    &lt;li&gt;&lt;a href=&quot;#&quot;&gt;홈&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;#&quot;&gt;회사소개&lt;/a&gt;&lt;/li&gt;
  &lt;/ul&gt;
  &lt;address&gt;COPYRIGHT &amp;copy; Jay. All Rights Reserved&lt;/address&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;h5&gt;span 요소&lt;/h5&gt;
&lt;ul&gt;
  &lt;li&gt;
    &lt;span&gt;
      &lt;strong&gt;
        &lt;a href=&quot;#&quot;&gt;
          오늘의 book
        &lt;/a&gt;
      &lt;/strong&gt;
      &lt;br /&gt;
      &lt;em&gt;
        &lt;a href=&quot;#&quot;&gt;
          HTML5와 CSS3
        &lt;/a&gt;
      &lt;/em&gt;
    &lt;/span&gt;
  &lt;/li&gt;
&lt;/ul&gt;</code></pre>
<p>이를 출력하면 다음과 같다.</p>
<h5>div 요소</h5>
<div id="footer">
  <ul>
    <li><a href="#">홈</a></li>
    <li><a href="#">회사소개</a></li>
  </ul>
  <address>COPYRIGHT &copy; Jay. All Rights Reserved</address>
</div>
<br />
<h5>span 요소</h5>
<ul>
  <li>
    <span>
      <strong>
        <a href="#">
          오늘의 book
        </a>
      </strong>
      <br />
      <em>
        <a href="#">
          HTML5와 CSS3
        </a>
      </em>
    </span>
  </li>
</ul>

<p>위를 보면 <code>&lt;di&gt;</code>요소 안에 블록 요소인 <code>&lt;ul&gt;</code>요소와 <code>&lt;address&gt;</code>요소가 포함되어 있는 것을 알 수 있다.
요소들 중에 문서의 꼬리말의 의미를 가진 요소는 없다. 그래서 <code>&lt;div&gt;</code>요소 안에 id 속성값 &#39;footer&#39;를 주어 의미를 부여한 것이다. 그렇다고 <code>&lt;di&gt;</code>요소가 실제 footer의 의미를 갖는 것은 아니다.</p>
<p><code>&lt;span&gt;</code>요소의 경우 인라인 요소인 <code>&lt;strong&gt;</code>요소와 <code>&lt;em&gt;</code>요소를 포함하고 있다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[XHTML 정리 _기초 이론]]></title>
            <link>https://velog.io/@jay_kimjh/XHTML-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@jay_kimjh/XHTML-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Wed, 10 Nov 2021 10:56:37 GMT</pubDate>
            <description><![CDATA[<p>※ 본 포스팅은 책 &lt;실전프로젝트 반응형 웹퍼블리싱&gt;의 내용을 토대로 작성하였음</p>
<h1 id="xhtml">XHTML</h1>
<p>만약 잘못된 구조로 마크업을 한다면 CSS(디자인)와 Javascript(동작)를 적용 할 때 어려움이 있을 뿐 아니라, 잘 적용한다 하여도 제 기능과 역할을 수행하지 못하는 부실한 웹페이지가 나올 수 밖에 없다.</p>
<p><code>&lt;p&gt;, &lt;span&gt;, &lt;a&gt;</code> 등과 같이 명령어의 형태가 &#39;&lt;&gt;(각 괄호)&#39;로 되어있는 것을 <strong>태그(tag)</strong> 라 하며,
<code>&lt;p&gt; ~ &lt;/p&gt;</code> 와 같이 태그의 (&lt;&gt;)과 끝(&lt;/&gt;)을 하나의 <strong>요소(element)</strong> 라고 한다.</p>
<p>이러한 요소들을 이용하여 웹 문서의 기본 구조를 작성하는 것을 <strong>마크업(markup)</strong> 이라고 한다.</p>
<hr>
<h2 id="xhtml의-문법-규칙">XHTML의 문법 규칙</h2>
<h3 id="1-요소는-제대로-중첩되어야-한다">1. 요소는 제대로 중첩되어야 한다.</h3>
<pre><code>&lt;p&gt;중첩된 요소가 있을 때는 &lt;strong&gt;바르게&lt;/strong&gt; 표현해야 한다.&lt;/p&gt; (O)
&lt;p&gt;중첩된 요소가 있을 때는 &lt;strong&gt;바르게&lt;/p&gt; 표현해야 한다.&lt;/strong&gt; (X)</code></pre><p>마지막에 정의한 태그를 가장 먼저 닫아야 함</p>
<h3 id="2-요소-및-속성-이름은-소문자여야-한다">2. 요소 및 속성 이름은 소문자여야 한다.</h3>
<pre><code>&lt;p&gt;&lt;a href=&quot;index.html&quot;&gt;첫페이지&lt;/a&gt;&lt;/p&gt; (O)
&lt;P&gt;&lt;A href=&quot;index.html&quot;&gt;첫페이지&lt;/A&gt;&lt;/P&gt; (X)</code></pre><p><code>&lt;a&gt;</code> 요소에서 &#39;href&#39;와 같은 것을 <strong>속성(attribute)</strong> 이라고 부르며 &#39;=&#39; 다음에 오는 것을 <strong>값(value)</strong> 이라고 부른다.</p>
<h3 id="3-요소는-항상-닫아야-한다">3. 요소는 항상 닫아야 한다.</h3>
<pre><code>&lt;p&gt;요소는 &lt;strong&gt;항상 닫아야&lt;/strong&gt; 합니다.&lt;/p&gt; (O)
&lt;p&gt;요소는 &lt;strong&gt;항상 닫아야 합니다. (X)</code></pre><p>그런데 한 쌍의 태그(&lt;&gt;~&lt;/&gt;)요소로 이루어져 있지 않고 하나의 태그로 되어있는 요소도 있다.
이러한 요소를 <strong>빈 요소(empty element)</strong> 라고 한다.
빈 요소의 경우도 다음과 같이 &#39;/&#39;로 닫아 주어야 함.</p>
<pre><code>요소는 항상&lt;br /&gt; 닫아야 합니다. (O)
요소는 항상&lt;br&gt; 닫아야 합니다. (x)
&lt;img src=&quot;image/today.gif&quot; alt=&quot;오늘&quot; /&gt; (O)
&lt;img src=&quot;image/today.gif&quot; alt=&quot;오늘&quot;&gt; (X)</code></pre><p>자주 쓰는 빈 요소에는 <code>&lt;br /&gt;, &lt;ht /&gt;, &lt;img /&gt;, &lt;input /&gt;, &lt;area /&gt;, &lt;meta /&gt;, &lt;link /&gt;</code> 등이 있다.</p>
<h3 id="4-속성값에는-인용-부호를-붙여야-한다">4. 속성값에는 인용 부호를 붙여야 한다.</h3>
<pre><code>&lt;img src=&quot;image/today.gif&quot; alt=&quot;오늘&quot; /&gt; (O)
&lt;img src=&quot;image/today.gif&quot; alt=&quot;오늘&quot;&gt; (X)</code></pre><p>보통 &#39;=&#39;다음에 오는 것을 값(value)이라고 하는데 값에는 인용 부호(&quot; &quot;)를 붙인다.</p>
<h3 id="5-속성은-속성값과-함께-써야-한다">5. 속성은 속성값과 함께 써야 한다.</h3>
<pre><code>&lt;input disabled=&quot;disabled&quot; /&gt; (O)
&lt;input disabled /&gt; (X)
&lt;option selected=&quot;selecterd&quot;&gt;&lt;/option&gt; (O)
&lt;option selected&gt;&lt;/option&gt; (X)</code></pre><p>속성은 속성값과 같이 선언해야 하며 생략하면 안 된다.</p>
<h3 id="6-img와-area-요소에는-alt-속성이-있어야-한다">6. img와 area 요소에는 alt 속성이 있어야 한다.</h3>
<pre><code>&lt;img src=&quot;imges/today.gif&quot; alt=&quot;오늘&quot; /&gt; (O)
&lt;img src=&quot;imges/today.gif&quot; /&gt; (X)
&lt;area shape=&quot;rect&quot; coords=&quot;0,0,0,72&quot; alt=&quot;오늘&quot; href=&quot;today.html&quot; /&gt; (O)
&lt;area shape=&quot;rect&quot; coords=&quot;0,0,0,72&quot; href=&quot;today.html&quot; /&gt; (X)</code></pre><p><code>&lt;img&gt;</code> 요소에 alt를 주어야 하는 이유는 문법적으로도 필요하지만 <em>이미지를 볼 수 없는 환경에서도 충분히 그 이미지에 대한 정보를 제공</em> 해 주어야 하기 때문이다.</p>
<h3 id="7-특수문자를-쓸-때는-entity-name-또는-entity-code를-사용해야-한다">7. 특수문자를 쓸 때는 Entity Name 또는 Entity code를 사용해야 한다.</h3>
<pre><code>&lt;p&gt;you &amp;amp; me&lt;/p&gt; (O) -&gt; &amp;amp;는 특수문자&#39;&amp;&#39;의 Entity Name
&lt;p&gt;you &amp;#38; me&lt;/p&gt; (O) -&gt; &amp;#38;는 특수문자&#39;&amp;&#39;의 Entity code
&lt;p&gt;you &amp; me&lt;/p&gt; (X)</code></pre><p>특수문자 &#39;&amp;&#39;를 출력하기 위해 그냥 &#39;&amp;&#39;를 쓰게 되면 Entity Name이나 Entity code 맨 앞에 오는 &amp;로 오인하여 문법적 오류가 발생한다. 따라서 이러한 문제들을 발생시키지 않으려면 특수문자의 경우 Entity로 변환하여 기술해야 함.
※ <a href="http://emtity.com">http://emtity.com</a> 에 가면 Entity code 에 대한 더 많은 정보를 얻을 수 있다.</p>
<h3 id="8-주석처리-방법">8. 주석처리 방법</h3>
<p>주석은 일반적으로 협업(공동작업)시 다음 작업자가 현재 작업한 내용을 쉽게 알아볼 수 있도록 도와주는 설명문이라고 보면 됨.
주석 내용을 브라우저 화면에 출력되지 않으며 처리 방법은 다음과 같다.</p>
<pre><code>&lt;!--주석내용--&gt;
&lt;!--여기서부터 공지사항입니다.--&gt;</code></pre><hr>
<p>※작성한 웹 문서의 &#39;문법 유효성 검사&#39;는 <a href="http://validator.w3.org">http://validator.w3.org</a> 에서 할 수 있다.</p>
<hr>
<h2 id="기본-문서-구조">기본 문서 구조</h2>
<pre><code>&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot; lang=&quot;ko&quot; xml:lang=&quot;ko&quot;&gt;
  &lt;head&gt;
    &lt;meta name=&quot;description&quot; content=&quot;Responsible Web Project&quot; /&gt;
    &lt;meta name=&quot;keywords&quot; content=&quot;xhtml, css, html5, css3, javascript, jquery&quot; /&gt;
    &lt;meta name=&quot;author&quot; content=&quot;icons&quot; /&gt;
    &lt;meta http-equiv=&quot;content-type&quot; content=&quot;text/html;charset=UTF-8&quot; /&gt;
    &lt;title&gt;반응형 웹&lt;/title&gt;
    &lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;main.css&quot; /&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;main.js&quot;&gt;&lt;/script&gt;
    &lt;style type=&quot;text/css&quot;&gt;
      body{font-size:12px;}
    &lt;/style&gt;
  &lt;/head&gt;
  &lt;body&gt;
    반응형 웹이란...
  &lt;/body&gt;
&lt;/html&gt;</code></pre><ol>
<li><code>&lt;!DOCTYPE&gt;</code> 은 현재 문서 타입이 무엇인지를 브라우저에게 알려줌.</li>
<li><code>&lt;html&gt;</code> 요소 안에는 <code>&lt;head&gt;</code> 요소와 <code>&lt;body&gt;</code> 요소로 구성되어 있다.</li>
<li><code>&lt;head&gt;</code> 요소 안에는 <code>&lt;meta&gt;, &lt;title&gt;, &lt;link&gt;, &lt;script&gt;, &lt;style&gt;</code> 등과 같은 요소들이 올 수 있는데, 내용을 정리하면 다음과 같다.<ul>
<li><code>&lt;meta&gt;</code> : 문서의 설명, 키워드, 저자 등을 지정</li>
<li><code>&lt;title&gt;</code> : 문서의 제목 지정</li>
<li><code>&lt;link&gt;</code> : 일반적으로 외부의 CSS 파일을 연결할 때 사용</li>
<li><code>&lt;script&gt;</code> : 주로 자바스크립트를 선언할 때 사용</li>
<li><code>&lt;style&gt;</code> : 문서 내에서 직접 스타일(CSS) 정의</li>
</ul>
</li>
<li>XHTML은 &#39;네임 스페이스&#39;라는 것을 꼭 지정해 주어야 하는데 <code>&lt;html&gt;</code> 태그 안에 있는 xmlns=&quot;<a href="http://www.w3.org/1999/xhtml&quot;">http://www.w3.org/1999/xhtml&quot;</a> 속성이 바로 &#39;네임 스페이스&#39;부분이다. 옆에 있는 lang=&quot;ko&quot; xml:lang=&quot;ko&quot;는 &#39;언어는 한국어(한글)이다&#39;라는 뜻.</li>
<li><code>&lt;meta&gt;</code> 태그를 보면 &#39;charset=UTF-8&#39;로 지정한 부분이 있다. &#39;charset&#39;은 &#39;character set&#39;의 약어로 &#39;문자 조합&#39;을 의미한다. &#39;UTF-8&#39;은 모든 언어 문자 및 특수 문자를 표현할 수 있어 다국어 환경에 적합하다. 또한 여기에서 중요한 점은 charset을 UTF-8로 설정할 경우, 문서를 저장할 때에도 반드시 인코딩 옵션을 &#39;UTF-8&#39;로 지정하고 저장해야 한다는 것이다. 그렇지 않으면 글자가 깨지는 현상이 일어난다.</li>
</ol>
]]></description>
        </item>
    </channel>
</rss>