웹앱 과정 - 제이쿼리 (1)

|

제이쿼리 개요

제이쿼리(jQuery)

  • 가장 인기 있는 자바 스크립트 라이브러리
  • 크로스 브라우징 지원 (cross browsing)
    브라우저마자 자바스크립트의 해석이 상이하고, 어떤 브라우저는 오류를 내뱉기도 하는 문제가 있었다. 제이쿼리는 모든 웹 브라우저에서 항상 동일하게 동작하도록 지원한다.
  • 생산성 향상 지원
    • Write Less, Do More
    • 더 적은 코드 양으로 더 많은 기능을 수행

제이쿼리에 관한 사이트 - w3schools - jQuery API - learning jQuery - jQAPI

자바스크립트

자바스크립트 코드는 <script> 태그 안에 명세하여 <head> 또는 <body> 태그 안에 포함시킨다. <script src="sample.js"> 를 통해 별도의 자바스크립트 파일을 import할 수도 있다. <body>의 최하단에 위치하는 것이 좋다. (참고 : script 태그는 어디에 위치해야 할까요?)

자바스크립트 함수는 다른 함수에 의해 호출되거나 이벤트 발생시 호출되어 실행된다.

  • 예 : 이벤트 핸들러 onload(), onclick() 이벤트 핸들러 (event handler) : 키보드나 마우스 등의 동작에 의해 이벤트가 발생할 경우 이를 감지하여 자바스크립트 코드와 연결
  • 자바스크립트 코드를 직접 명세하기보다는 특정 함수를 호출할 목적으로 사용

제이쿼리 연동

  • HTML5 문서 안에서 제이쿼리 라이브러리 파일을 포함하도록 선언
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
  • 제이쿼리의 동작은 자바스크립트처럼 HTML5 태그와 결합하지 않는다. -> tag 안에 스크립트 코드를 포함시키지 않고 HTML5 태그와 스크립트 코드를 분리할 수 있다.
  • DOM이라는 공통된 표준 모델을 따르면 스크립트 엔진이나 언어가 다르더라도 얼마든지 동일하게 HTML5나 XML 문서에 접근할 수 있다. DOM은 플랫폼과 언어에 중립적이며 동적으로 문서의 내용, 구조, 스타일을 접근하고 변경하는 중요한 수단

DOM 트리 구조

  • 엘리먼트 노드 태그와 내용으로 구성되는 엘리먼트를 표현하는 노드 하위에 또다른 엘리먼트 노드를 포함할 수 있다.
  • 속성 노드 엘리먼트의 시작 태그 안에 포함되는 속성 이름과 속성 값을 쌍으로 갖는 노드
  • 텍스트 노드 엘리먼트가 갖는 실제 내용을 의미하는 노드 DOM 트리에서 최하위 단말 노드가 해당

제이쿼리 함수

jQuery() 함수는 제이쿼리의 핵심

  • 모든 시작은 jQuery() 함수를 통해 이루어진다.
  • 괄호 앞의 jQuery 문자열은 제이쿼리를 사용한다는 일종의 선언. 자바스크립트 문장과 제이쿼리 문장을 구별하는 역할

입력 인자 유형

  • 큰따움표 또는 작은따옴표 모두 가능
// 1) 선택자 입력 인자
jQuery('body p');
// 2) HTML 입력 인자
jQuery('<h1>HTML 동적 추가</h1>')
// 3) 함수 입력 인자
jQuery(function(){alert("DOM 트리가 생성됨")});
  1. 선택자 입력 인자 : DOM 트리에서 원하는 노드를 선별하기 위해 사용
  2. HTML 입력 인자
    • 내부적으로는 자바스크립트의 createElement() 함수를 호출
    • 주로 DOM 트리에 새로운 노드를 추가하기 위해 사용됨
  3. 함수 입력 인자
    • jQuery() 함수는 명세된 순서대로 호출되어 실행됨
    • jQuery() 함수의 실행 대상인 노드가 DOM 트리에 생성되기도 전에 먼저 실행되는 것을 피하기 위해 jQuery() 함수 안에 입력 인자로 함수를 포함시키면 HTML5 문서를 모두 읽어들여 DOM 트리가 생성된 후 함수가 호출되어 실행되도록 할 수 있음
    • 콜백 함수(callback function) : 함수를 실행한 이후 스스로 호출되는 함수

문서 시작 이벤트 핸들러

jQuery(document).ready(function(){ ... });

document 선택자: HTML5 문서 전체를 선택 ready() 메소드: HTML5 문서가 웹 브라우저에 표시될 준비가 완료되면 실행되는 이벤트 핸들러

jQuery 함수의 사용

주석은 /*로 시작하고 */로 끝을 지정 한 줄 단위의 주석은 //로 시작하며 웹 브라우저에 의해 해석되지 않고 무시됨

  • ready() : 준비되었을 때
  • click() : 클릭되었을 때
  • remove() : 특정 엘리먼트를 DOM 트리에서 삭제
  • text() : DOM 트리에 텍스트 노드를 추가

jQuery 코드는 HTML5 문서 내용 자체는 변화시키지 않고 DOM 트리만 변경

문서 시작 이벤트 핸들러

제이쿼리 코드를 <head> 안에 명세할 경우, <body> 태그 안의 HTML5 엘리먼트 태그들이 DOM 트리를 구성하기 전에 제이쿼리 코드가 먼저 실행되는 문제점이 있다. 이를 해결하기 위해 문서 시작 핸들러 jQuery(document).ready() 안에 제이쿼리 시랭문들을 ;로 구분하여 나열하면 DOM 트리 구성이 완료된 후까지 실행이 지연되었다가 자동으로 호출되어 순차적으로 실행된다. 제이쿼리를 포함한 문서를 처음 시작하는 방법은 2가지가 있다.

  1. jQuery(document).ready(function() { ... });
    • 문서가 100% 로드되기 전 페이지 DOM만 로드가 완료된 이후 수행
    • .ready() 메소드가 여러 개 있더라도 순서대로 실행
    • 비교적 첫 페이지 로드 시간이 빠름
  2. jQuery(window).load(function() { ... });
    • 문서가 100% 로드된 후 페이지 DOM + 리소스 전체(문서에 포함된 이미지 등의 모든 객체)가 모두 로드 완료된 이후 한 번만 수행
    • .load() 메소드가 여러 개 있으면 마지막만 실행
    • 기존 자바스크립트 window.onload = function() { ... }를 대체
    • 비교적 첫 페이지 로드 시간이 느림

DOM 트리를 변경함으로써 웹 페이지의 표현 내용도 동적으로 변화시킬 수 있다.

jQuery() 함수의 단축형

jQuery()를 보통 $()로 줄여 표시한다. 의미는 같다. 식별이 어렵고 불편하기 때문 제이쿼리 변수, 함수를 자바스크립트의 변수, 함수 등과 구별하기 위한 목적

var 변수명; // 일반 변수
var $변수명; // 제이쿼리 변수

$를 붙이지 않은 일반 변수는 보통의 자바스크립트 변수로 처리

$()

  • 제이쿼리 함수, 제이쿼리 래퍼(wrapper)
  • 보통 제이쿼리 함수는 $(선택자) 형태로 제이쿼리 선택자를 입력 인자로 받아들여 선택자 조건을 만족하는 엘리먼트 노드들을 DOM 트리에서 찾아 객체 형식으로 반환 -> 제이쿼리 객체
  • 이때 일치하는 DOM 노드들이 여러 개이면 배열 형태의 제이쿼리 객체 집합을 반환
  • 반환하는 DOM 엘리먼트들을 제이쿼리 객체 개념으로 감싸고 미리 준비된 메소드를 사용할 수 있도록 함 -> 제이쿼리 래퍼

제이쿼리 선택자

기본 선택자

  • * : 모든 엘리먼트 선택
  • 태그명 : 특정 엘리먼트를 모두 선택
  • #아이디 : 고유한 아이디 속성값을 가진 엘리먼트를 선택
  • .클래스 : 특정 클래스 속성값을 가진 엘리먼트들을 선택
// 기본 선택자
$('*').css('border-style', 'hidden');
$('p').css('border', 'dashed thick red');
$('.class1').css('border', 'solid thick green');
$('#p3').css({'background-color':'purple', 'color':'white'});

계층 선택자

  • 선택자 > 자식선택자 : 특정 엘리먼트 바로 밑에 위치한 하위 엘리먼트(자식 엘리먼트)를 선택
  • 선택자 자손선택자 : 특정 엘리먼트 안에 포함된 모든 하위 엘리먼트(자손 엘리먼트)를 선택
  • 선택자 + 형제선택자 : 특정 엘리먼트에 바로 다음에 나오는 특정한 형제 엘리먼트 하나를 선택
  • 선택자 ~ 형제선택자 : 특정 엘리먼트 다음에 나오는 특정한 모든 형제 엘리먼트들을 선택
// 계층 선택자
$('#p1 + p').css('border-style', 'hidden');
$('#p2 ~ p').css('border', 'dashed thick red');
$('div > div').css('border', 'solid thick green');
$('div span').css({'background-color':'purple', 'color':'white'});

속성 선택자

  • 선택자[속성명] : 해당 속성을 포함하는 엘리먼트들을 선택
  • 선택자[속성명="조건값"] : 해당 속성값이 조건값과 일치하는 엘리먼트들을 선택
  • 선택자[속성명*="조건값"] : 해당 속성값이 조건값을 포함하는 엘리먼트들을 선택
  • 선택자[속성명^="조건값"] : 해당 속성값이 조건값으로 시작하는 엘리먼트들을 선택
  • 선택자[속성명$="조건값"] : 해당 속성값이 조건값으로 끝나는 엘리먼트들을 선택
// 속성 선택자
$('p[class]').css('border-style', 'hidden');
$('*[id*="2"]').css('border', 'dashed thick red');
$('*[class^="cla"]').css('border', 'solid thick green');
$('p[id$="2"]').css({'background-color':'purple', 'color':'white'});

위치필터 기본 선택자

  • filter : 선택자에 의해 선택된 엘리먼트들 중 필터 조건에 맞는 엘리먼트들로 선택 대상을 한번 더 제한
  • 선택자 뒤에 콜론(:)을 붙여 명세
  • 반환된 엘리먼트들은 자바스크립트의 배열 첨자를 적용하므로 첨자가 ‘0’부터 부여됨 :first == :eq(0) == :lt(1)
  • 선택자:first : 선택된 엘리먼트들 중 첫 번째 엘리먼트를 선택
  • 선택자:last : 선택된 엘리먼트들 중 마지막 엘리먼트를 선택
  • 선택자:odd : 선택된 엘리먼트들 중 홀수 첨자 엘리먼트들을 선택
  • 선택자:even : 선택된 엘리먼트들 중 짝수 첨자 엘리먼트들을 선택
  • 선택자:eq(n) : 선택된 엘리먼트들 중 n번째 엘리먼트를 선택
  • 선택자:lt(n) : 선택된 엘리먼트들 중 n번째의 앞 엘리먼트들을 선택
  • 선택자:gt(n) : 선택된 엘리먼트들 중 n번째의 뒤 엘리먼트들을 선택
  • 선택자:not(condition) : 선택된 엘리먼트들 중 필터링 조건을 만족하지 않는 엘리먼트들을 선택
// 위치필터 기본 선택자
$('div:first').css('border-style', 'hidden');
$('p:even').css('border', 'dashed thick red');
$('span:eq(1)').css('border', 'solid thick green');
$('p:lt(1)').css({'background-color':'purple', 'color':'white'});

위치필터 계층 선택자

  • 선택자:first-child : 선택된 엘리먼트들 중 부모의 첫 번째 자식 엘리먼트들을 선택
  • 선택자:last-child : 선택된 엘리먼트들 중 부모의 마지막 자식 엘리먼트들을 선택
  • 선택자:nth-child(odd) : 선택된 엘리먼트들 중 부모의 홀수 번째 자식 엘리먼트들을 선택
  • 선택자:nth-child(even) : 선택된 엘리먼트들 중 부모의 짝수 번째 자식 엘리먼트들을 선택
  • 선택자:nth-child(n) : 선택된 엘리먼트들 중 부모의 n번째 자식 엘리먼트를 선택
  • 선택자:nth-child(Xn+Y) : 선택된 엘리먼트들 중 부모의 Xn+Y번째에 있는 자식 엘리먼트들만을 선택(n은 0부터 시작)
  • 선택자:only-child : 선택된 엘리먼트들 중 (형제 엘리먼트가 없는) 유일한 자식 엘리먼트들만을 선택
// 위치필터 계층 선택자
$('div:first-child').css('border-style', 'hidden');
$('p:nth-child(odd)').css('border', 'dashed thick red');
$('p:nth-child(3n+1)').css('border', 'solid thick green');
$('*:only-child').css({'background-color':'purple', 'color':'white'});

폼 필터 선택자

  • 선택자:input : 모든 폼 입력 양식의 엘리먼트를 선택 <input>, <select>, <button>, <textarea>
  • 선택자:button : 모든 버튼 유형의 엘리먼트를 선택 <button>, type 속성값이 submit, reset, button<input> 태그들
  • 선택자:text : 텍스트 엘리먼트들만 선택 type 속성값이 text<input> 태그
  • 선택자:checkbox : 체크박스 선택 버튼 엘리먼트만 선택 type 속성값이 checkbox<input> 태그
  • 선택자:radio : 라디오 선택 버튼 엘리먼트만 선택 type 속성값이 radio<input> 태그
  • 선택자:file : 파일 엘리먼트를 선택 type 속성값이 file<input> 태그
  • 선택자:image : 폼 이미지 엘리먼트를 선택 type 속성값이 image<input> 태그
  • 선택자:password : 패스워드 엘리먼트를 선택 type 속성값이 password<input> 태그
  • 선택자:submit : 전송 버튼 엘리먼트를 선택 type 속성값이 submit<input> 태그
  • 선택자:reset : 초기화 버튼 엘리먼트를 선택 type 속성값이 reset<input> 태그

상태 필터 선택자

  • 현재 웹 브라우저 실행 홤녀에서의 특정 상황 조건을 만족하는지 여부에 따라 엘리먼트를 한번 더 거르는 필터 선택자
  • 폼 엘리먼트의 현재 상태를 검사하는데 유용
  • 선택자:selected : 지정된 엘리먼트들 중 현재 선택된 엘리먼트만 선택
  • 선택자:checked : 지정된 엘리먼트들 중 현재 설정된 엘리먼트(체크박스, 라디오버튼)만 선택
  • 선택자:enabled : 지정된 엘리먼트들 중 현재 활성화된 엘리먼트만 선택
  • 선택자:disabled : 지정된 엘리먼트들 중 현재 비활성화된 엘리먼트만 선택
  • 선택자:visible : 지정된 엘리먼트들 중 현재 보여지는 엘리먼트만 선택
  • 선택자:hidden : 지정된 엘리먼트들 중 현재 숨겨진 엘리먼트만 선택
  • 선택자:focus : 지정된 엘리먼트들 중 현재 포커싱된 엘리먼트만 선택
  • 선택자:animated : 지정된 엘리먼트들 중 현재 애니메이션이 동작 중인 엘리먼트만 선택

내용 필터 선택자

  • 엘리먼트의 내용 조건 필터를 통해 한번 더 거르는 선택자
  • 특정 엘리먼트가 내용이 있는지 혹은 내용 중 특정 문자열이 포함되는지를 확인 가능
  • 선택자:has(자손엘리먼트) : 선택된 엘리먼트들 중 하위에 특정 자손 엘리먼트르 하나 이상 포함하고 있는 엘리먼트만 선택
  • 선택자:contains(문자열) : 선택된 엘리먼트들 중 내용으로 특정 문자열을 포함하고 있는 엘리먼트만 선택
  • 선택자:empty : 선택된 엘리먼트들 중 내용이 없는 엘리먼트만 선택
  • 선택자:parent : 선택된 엘리먼트들 중 내용(공백 포함)이 있는 엘리먼트(다른 엘리먼트의 부모에 해당하는 엘리먼트)만 선택
// 내용 필터 선택자
$('*:contains(2)').css('border-style', 'hidden');
$('div:has(span)').css('border', 'dashed thick red');
$('*:empty').css('border', 'solid thick green');
$('#div0 *:parent').css({'background-color':'purple', 'color':'white'});

참고

웹앱 과정 - 제이쿼리 모바일 (4)

|

#제이쿼리 모바일 대화상자와 폼

대화상자(dialog box)

  • 팝업 창 형태의 페이지
  • 둥근 모서리와 바깥 여백, 그림자 등의 스타일이 적용되어 기존 페이지 위에 표시됨
  • 확인 창이나 경고 창, 액션시트 스타일 등의 유형을 만들 때 사용
<!-- 링크 페이지의 유형을 대화상자로 선언 -->
<a href="#" data-rel="dialog"></a>
<!-- 페이지 유형을 대화상자로 선언 -->
<div data-role="dialog" id="dialog-id">
  • 두 번째 바람이 더 바람직하다. 대화상자를 연결하는 버튼마다 data-rel="dialog" 속성을 모두 설정할 필요 없이 단 한 번만 페이지 유형을 대화상자로 설정하면 되기 때문
  • 페이지가 열릴 때 중앙에서 점점 확대되는 팝업(pop up)이 기본 화면 전환 효과
  • 왼쪽 위에 자동 생성된 닫기 버튼을 선택하면 대화상자는 축소되어 닫히고 이전 페이지가 다시 표시됨
  • 이력(history) 정보를 남기지 않음
    • 뒤로 가기 버튼을 클릭하더라도 돌아갈 대화상자에 관한 기록이 없기 때문에 대화상자 페이지를 호출했던 처음 페이지도 돌아감

액션시트(action sheets)

  • 헤더와 푸터가 없는 특별한 대화상자
  • 보통 사용자의 의견을 묻고 응답을 요청하는 경우에 사용됨
  • 취소를 포함한 선택 가능한 작업 항목들을 제시할 목적으로 사용되므로 보통 둘 이상의 버튼을 포함
<a href="#dialog2" data-transition="slidedown">액션시트 페이지</a>

<div data-role="dialog" id="dialog1">
  <div data-role="content">
    <p>액션 시트</p>
    <p>삭제하시겠습니까?</p>
    <a href="#" data-role="button" data-rel="back">예</a>
    <a href="#" data-role="button" data-rel="back">아니오</a>
  </div>
</div>
  • 액션시트는 헤더와 푸터가 없기 때문에 대화상자를 닫을 수 있는 링크 버튼이 꼭 필요
  • data-rel="back" : 이전 페이지로 되돌아감
  • 헤더 없이 화면 윗부분에 붙어있기 때문에 보통 ‘slidedown’ 페이지 전환 효과와 함께 사용됨

페이지 테마

  • a : 색상 계열 은색, 일반적인 기본 테마
  • b : 색상 계열 검정, 선명한 테마
  • 페이지 전체 또는 일부 요소만 다른 테마를 설정할 수 있다.
  • 테마를 별도로 정의하지 않으면 보통 부모 엘리먼트의 테마를 상속받는다.

디자인 테마 : 사용자가 직접 26개의 하위 테마를 정의함으로써 독자적인 테마를 적용할 수 있다. 참고 : jquery mobile gallery 테마롤러(Theme Roller) 사이트에서 좀더 쉽게 제이쿼리 모바일 테마를 만들 수 있다. 테마롤러는 사용자 정의 테마 라이브러리 파일을 쉽게 생성할 수 있는 웹 기반의 GUI 개발 도구

콘텐츠 영역의 레이아웃

  • 스마트폰은 화면 크기가 작고 폭이 좁음 -> 모바일 페이지의 레이아웃 구성이 중요

기본 레이아웃 형식

  • 바 레이아웃 (bar layout)
    • 콘텐츠 영역 안에 제목처럼 한 줄 단위의 정보를 표시
    • class="ui-bar" 속성값에 ui-bar-a부터 ui-bar-b까지의 속성값을 추가로 함께 설정하여 툴바와 비슷한 양식을 만들 수 있다.
  • 블록 레이아웃 (block layout)
    • 콘텐츠 영역 안에 사각형 모양의 박스 영역을 생성하여 내용들을 규칙적으로 배치하거나 특정 내용을 강조
    • class="ui-body" 속성값에 ui-body-a 부터 ui-body-b까지의 속성값을 추가로 함께 설정하여 독립된 내용 공간을 만들 수 있다.
  • 그리드(격자) 레이아웃(grid layout)
    • 문자열이나 이미지를 행이나 열에 맞추어 일정한 간격으로 배치
    • 화면을 균등하게 여러 행 또는 여러 열로 분할하는 다중 분할 레이아웃
    • 버튼이나 네비게이션바, 아이콘 집합 등 작은 요소들을 나란히 나열할 경우 적합
    • 화면 전체 너비의 100%를 사용

그리드 레이아웃 형식

  • 그리드 컨테이너(grid container)
    • 그리드 레이아웃은 둘 이상의 블록들을 갖는 그리드 컨테이너를 생성함으로써 만들어진다.
    • 그리드 컨테이너 내부에 포함하는 열의 개수에 따라 적절한 ui-grid-* 클래스 속성값을 명세해야 하며, 최대 5개의 열까지 가능
    • ui-grid-a : 그리드 열 개수 2 ui-block-a, ui-block-b
    • ui-grid-b : 그리드 열 개수 3 ui-block-a, ui-block-b, ui-block-c
    • ui-grid-c : 그리드 열 개수 4 ui-block-a, ui-block-b, ui-block-c, ui-block-d
    • ui-grid-d : 그리드 열 개수 5 ui-block-a, ui-block-b, ui-block-c, ui-block-d, ui-block-e
  • 그리드 블록(grid block)
    • 그리드 안에 생성되는 열의 개수만큼 그리드 블록이 그리드 컨테이너 내부에 생성됨
    • 해당 엘리먼트가 몇 번째 블록에 해당하는지를 지정하기 위해 a~e 값을 사용
    • 각 블록들을 식별하기 위해 ui-block-* 속성값을 지정
    • ui-block-a : 왼쪽 첫번째 블록
    • ui-block-b : 왼쪽 두번째 블록
    • ui-block-c : 왼쪽 세번째 블록
    • ui-block-d : 왼쪽 네번째 블록
    • ui-block-e : 왼쪽 다섯번째 블록
  • 다중 열 그리드 레이아웃
    • 콘텐츠 영역을 같은 크기의 2열~5열로 분할
    • 최대 5열로 분할된 그리드 레이아웃을 생성할 수는 있지만 스마트폰의 작은 화면 크기를 고려해 2열이나 3열 레이아웃이 적절
    • 앱 아이콘들을 균등하게 배치한 스프링보드 화면도 그리드 레이아웃을 통해 생성 가능
  • 다중 행 그리드 레이아웃
    • 콘텐츠 영역의 여러 행으로 균등 분할
    • 새로운 행이 추가될 때마다 자동으로 줄바꿈

      제이쿼리 모바일은 그리드 안의 모든 블록들을 기본적으로 같은 크기로 분할한다. 스타일을 추가로 정의하여 블록의 크기를 서로 다르게 할 수 있다.

  .ui-grid-a .ui-block-a { width: 75% }
  .ui-grid-a .ui-block-a { width: 25% }

접이식 패널 레이아웃

  • 내용을 선택적으로 보일 수 있음
  • 특정 영역이 접혔다 펼치기를 반복하며 내용을 숨기거나 표시
  • 스마트폰의 좁은 화면 영역에서 전체 내용을 개략적으로 빠르게 파악할 수 있어 내용 검색을 위해 화면 스크롤을 반복하는 번거로움도 피할 수 있다.
  • 접이식 패널 안의 블록에는 텍스트, 버튼, 리스트뷰, 폼 요소 등이 포함될 수 있다.

기본 접이식 패널(basic collapsible panel)

  • 콘텐츠 영역에 접이식 패널을 여러 개 배치
  • <div> 태그에 data-role="collapsible" 속성을 설정함으로써 생성
  • 패널 블록은 패널 제목과 패널 내용으로 구성됨
  • 보통 패널 제목은 <h1>~<h6> (어떤 태그를 사용해도 표시되는 제목의 스타일은 모두 같음), 패널 내용은 <p> 태그를 이용하여 명세
  • 여러 <h> 태그를 사용할 경우, 첫 번째 <h> 태그를 패널 제목으로 표시되고, 나머지 <h> 태그들은 일반 제목처럼 패널 제목 안에 표시됨
  • 접이식 패널 안에 <h> 태그가 하나도 없다면 패널은 닫히지 않고 항상 펼쳐져 있게 되니 주의!
  • 패널 제목은 클릭할 수 있는 버튼으로 표시됨

중첩 접이식 패널(nested collapsible panel)

  • 바깥쪽 패널은 안쪽 패널의 컨테이너가 되어 계층적 패널 블록을 구성
  • 중첩 단계에 제한은 없지만 화면 공간 크기와 내부 DOM 트리의 복잡성 등을 고려해 2~3단계 정도가 적당

그룹 접이식 패널(group collapsible panel)

  • 여러 접이식 패널들을 하나의 그룹으로 묶은 것
  • 하나의 연결된 요소로 동작
  • 한 번에 하나의 접이식 패널만 선택하여 펼칠 수 있음
  • 단일 접이식 패널 컨테이너 상위에 data-role="collapsible-set" 속성을 갖는 <div> 태그를 설정
  • 새로운 접이식 패널을 펼치게 되면 이전에 펼쳐졌던 패널은 자동으로 접힌다
  • ‘아코디언 패널’이라고 불리기도 한다.
  • 기본적으로 모든 패널은 접힌 상태로 표시됨
  • 특정 패널에 data-collapsed="false" 속성을 설정하면 그 패널은 처음부터 펼쳐진 상태로 표시된다.
  • 접이식 패널에 data-themedata-content-theme 속성을 지정하면 패널 제목 영역과 패널 내용 영역의 테마를 한꺼번에 변경 가능
  • 그룹 접이식 패널 안에는 중첩 접이식 패널 포함 불가

폼 요소

  • 사용자와의 상호작용을 위해 필수적 요소
  • 표준 HTML5 태그 형식의 네이티브 폼 컨트롤을 자동으로 모바일 폼 컨트롤로 렌더링
  • data-role 속성을 지정하지 않아도 자동으로 변환 및 표시된다.
  • 브라우저가 HTML5 태그를 지원하지 않거나 data-role="none" 속성값을 지정하면 대체 옶션으로 네이티브 폼 컨트롤이 표시된다.

HTML5 표준 폼 태그

  • 폼 태그 (<form>)
    • 입력 컨트롤과 관련 정보를 묶어 하나의 입력폼으로 그룹화하고 전송 방식을 설정
    • 입력폼 영역의 시작과 끝을 지정하며 웹 브라우저에 표시되지는 않는다.
    • <form> 태그 하위에 <input>, <select>, <textarea> 등의 태그를 이용하여 입력 컨트롤을 생성하여 폼 완성
    • action : URL 주소를 속성값으로 가지고, 사용자 입력 정보를 전송할 위치(처리 프로그램의 주소)를 지정
    • method : GET 또는 POST를 속성값으로 가지고, 사용자 입력 정보의 전송 방식을 지정한다.
    • name : 문자열을 속성값으로 가진다. 폼의 이름

GET 방식: URL 주소에 입력 정보(변수명+변수값)를 추가해서 문자열로 보내는 방식 POST 방식: URL 주소가 아닌 내부적(트랜잭션)으로 보내는 방식, 비교적 보안성이 높고 전송량에 제한이 없다.

  • 입력 태그 (<input>)
    • type 속성값에 따라 다양한 입력 컨트롤 생성
    • 보통 <form> 태그의 하위 태그로 명세하며 정보를 입력받는 가장 기본적인 방식
    • 시작과 종료 태그를 합친 <input /> 형태로 명세
    • text : 문자열 입력양식
    • password : 비밀번호 입력양식
    • hidden : 글자 숨김 입력양식
    • checkbox : 체크박스 버튼 (복수 선택)
    • radio : 라디오 버튼 (단일 선택)
    • button : 일반 버튼
    • submit : 전송 버튼 (데이터를 서버에 전송)
    • reset : 초기화 버튼 (입력 데이터를 모두 지움)
    • image : 이미지 전송 버튼
    • file : 파일 업로드 입력양식
    • name : 입력폼 안에서 명명하기 위한 입력양식 이름, 데이터 전송 시 변수명으로 사용
    • id : 입력폼 안에서 식별하기 위한 고유한 입력양식 식별자
    • value : 컨트롤의 표시 제목이나 내부 기본값(기본 문자열)을 지정, 데이터 전송시 전달될 변수값을 지정
    • max : 입력 최댓값
    • min : 입력 최솟값
    • step : 입력 증분값
    • search : 키워드 검색 입력양식
    • tel : 전화번호 입력양식
    • email : 이메일 입력양식
    • url : URL 웹주소 입력양식
    • number : 숫자 입력양식 (스핀버튼 선택)
    • range : 숫자범위 입력양식 (슬라이드 막대 이동)
    • month : 월 입력양식
    • week : 주 입력양식
    • date : 날짜 입력양식
    • time : 시간 입력양식
    • datetime : 날찌시간 입력양식
    • datetime-local : 지역날짜시간 입력양식
    • color : 색상 입력양식
  • 라벨 태그(<label>)
    • 입력 컨트롤에 대한 의미나 설명을 표시
    • <label> 태그의 라벨 문자열과 특정 입력 컨트롤을 연결하려면 <input> 태그의 id 속성값을 <label> 태그의 for 속성값으로 설정 -> <label> 태그의 영역을 선택하더라도 연결된 입력 컨트롤이 자동으로 선택됨
  • 복수 문자열 입력 태그(<textarea>)
    • 여러 줄에 걸친 긴 문자열 입력
  • 선택 태그 (<select>)
    • 나열된 목록 항목 중 하나를 선택할 수 있는 선택 입력 컨트롤을 생성
    • multipel="multiple"을 설정하면 여러 항목을 동시에 선택할 수 있다.
  • 옵션 그룹화 및 옵션 태그 (<option>)
    • <select> 태그나 <optgroup> 태그의 하위 태그로 사용되어 선택할 수 있는 항목들을 표시
    • <optgroup> 태그는 <select> 태그의 하위 태그로 <option> 태그의 선택 항목들을 하나로 묶어 그룹화
    • <optgroup> 태그 안의 label 속성은 선택 옵션 그룹에 대한 이름, 반드시 설정해야 하는 필수 속성
  • 입력 양식 그룹화 및 그룹 설명 태그 (<fieldset>)
    • 입력폼 안의 서로 연관된 입력 컨트롤들을 하나로 묶어 그룹화
    • 폼 안의 입력 컨트롤들을 화면 공간에서 분류함으로써 이해하기 쉽도록 함
    • <legend> 태그는 <fieldset> 태그로 묶은 입력 양식 그룹에 대한 설명을 표시하며, <fieldset> 태그의 하위에 표시해야 한다.

네이티브 폼 컨트롤

  • 폼 안에 data-role="none" 속성을 추가하면 네이티브 스타일의 폼 컨트롤을 사용할 수 있다.
  • 네이티브 스타일(native style): 제이쿼리 모바일이 적용되지 않은 HTML5 태그의 원래 표준 웹 양식

모바일 폼 컨트롤 : 입력 상자(input box)

  • 문자나 숫자값을 입력받는 가장 기본적인 폼 컨트롤
  • <input> 태그의 type 속성값에 따라 폼 컨트롤 유형이 결정됨
  • 둥근 모서리의 긴 상자 모양 컨트롤로 화면 너비에 비례하여 자동 변경됨
  • 모바일 폼 요소 그룹화
    • 보통 폼 컨트롤들은 사용자에게 입력 정보를 안내하기 위해 <label> 태그를 함께 쌍으로 묶어 사용
    • data-role="fieldcontain" 속성을 갖는 <div> 태그로 감싸서 둘 이상의 모바일 폼 컨트롤을 하나의 그룹처럼 표시 -> 필드 컨테이너 (field container)
    • 레이블과 폼 컨트롤들을 정렬시키고 다른 컨트롤과 경계선으로 구분짓는 일종의 래퍼
    • 화면의 너비에 따라 자동으로 레이아웃이 조절된다.
      <div data-role="fieldcontain">
        <label for="아이디">라벨명</label>
        <input type="입력 유형" name="변수명" id="아이디">
      </div>
    
    • name 속성값으로 변수명을 명세하면 입력받은 값을 저장하고 이후 추가적인 처리가 가능
  • 단일행 입력 상자
    • 가장 간단한 폼 입력 유형
    • <input> 태그의 type="text" 속성값을 준 것
    • <label> 태그의 문자열은 <input> 태그와 연결되더라도 다른 줄에 각각 표시됨
    • 모바일 폼 컨트롤은 모바일 장치의 특성을 고려하여 한 줄에 오직 하나만 표시되기 때문
    • 모바일 화면의 너비가 커지면 한 줄에 나란히 표시되기도.
    • <label> 태그 안의 for 속성은 의미적으로 연관된 입력 상자 엘리먼트의 id 속성 값을 가짐
    • <input> 태그를 <label> 태그로 직접 감싸는 것으로도 가능 -> 이렇게 할 경우 for 속성 불필요
    • 그러나 <label>for 속성과 <input>id를 연결시키는 방법이 가장 바람직하다.
    • class="ui-disabled" : 해당 영역에 있는 폼 요소들을 비활성화할 수 있다. 비활성화하면 선택이나 입력이 불가능해진다.
  • 다양한 입력 상자
    • <input> 태그는 입력 값의 유형을 고려하여 type 속성값을 지정
    • type 속성값은 text 이외에도 password, HTML5에서 새로 추가된 number, email, tel, url, search 등이 가능.
    • 모두 비슷한 모양의 입력 컨트롤이 표시된다.
    • 실제 입력할 때는 각 입력 유형에 맞는 가상 키보드가 화면에 표시된다.
    • placeholder : 폼 컨트롤에 기본 값으로 보여지는 내용을 지정
    • ui-hidden-accessible 클래스 : 레이블을 생략
  • 다중 행 입력 상자
    • <textarea>
      <textarea cols="열개수" rows="행개수" id="아이디"></textarea>
    
    • 자동 확장(auto-growing) 기능이 적용됨 -> 스크롤바를 사용할 필요가 없음
    • 입력 상자의 크기가 입력되는 문자열의 크기에 비례하여 자동으로 늘어남
  • 슬라이더(slider)
    • 이동 바를 좌우로 움직여 최소값과 최대값 사이의 값을 선택하도록 하는 모바일 폼 컨트롤러
    • <input> 태그에 type="range" 속성값을 지정
    • value : 슬라이더의 초기값
    • min : 슬라이더의 최솟값
    • max : 슬라이더의 최댓값
  • 스위치 (switch)
    • 서로 대비되는 두 가지 선택 항목 중 하나만 선택 가능한 모바일 폼 컨트롤
    • 대비되는 두 가지 선택 항목은 <option> 태그로 설정
    • <select> 택그 안에 data-role="slider" 속성을 추가
      <select name="변수명" id="아이디" data-role="slider">
        <option value="변수설정값1">옵션1</option>
        <option value="변수설정값2">옵션2</option>
      </select>
    
  • 라디오 선택 버튼
    • 선택 항목 중 오직 하나만 선택 가능
    • <input> 태그 안에 type="radio" 속성 설정
    • nameid 속성은 반드시 설정
    • type="radio" 속성을 갖는 모든 <input> 태그들은 name 속성값이 같아야 함. 다를 경우, 하나가 아닌 여러 항목이 선택될 수 있다.
    • 둘 이상의 라이도 버튼을 그룹으로 묶으려면 <fieldset> 태그로 감싸고 data-role="controlgroup" 속성을 추가.
    • 그룹으로 묶인 버튼 사이의 경계선과 여백은 사라지며 버튼은 컨테이너의 너비에 비례하여 세로 방향으로 나열됨
    • <legend> : <fieldset> 태그의 첫 번째 하위 엘리먼트, 어떤 선택에 관한 것인지의 그룹 제목 표시
    • <label>은 개별 폼 컨트롤에 관한 설명을 위해, <legend> 태그는 폼 컨트롤 그룹 전체에 관한 설명을 위해 사용
    • data-type="horizontal" : 가로 방향으로 나열
  • 체크 상자 버튼
    • 선택 항목 중 여러 개를 동시에 선택할 때 사용
    • <input> 태그 안에 type="checkbox" 속성을 설정
      <input type="checkbox" name="변수명" id="아이디" value="변수설정값" />
    
    • checked="checked" 속성은 처음부터 선택되어 있는 항목들에 설정됨
    • 상위에 <fieldset> 태그를 생성하고 그 안에 data-role="controlgroup" 속성을 추가하면 버튼들을 그룹으로 묶을 수 있음

모바일 폼 컨트롤 : 선택 메뉴

  • 기본 선택 메뉴(select menu)
    • <select> 태그를 사용하여 여러 항목 중 하나를 선택하도록 하는 폼 컨트롤
    • 비활성화 상태일 때는 하나의 항목만 표시됨
    • 활성화되면 드롭다운 목록이 펼쳐져 목록 중 하나를 선택 가능
    • 표시 공간이 작아 효율적
      <select name="변수명" id="아이디">
        <option> 안내글 </option>
        <option value="변수설정값">옵션</option>
        ...
      </select>
    
    • <option> 태그의 value 속성이 없다면 그 항목은 선택 대상에서 제외됨.
    • data-placeholder="true" 속성값이 지정된 항목도 선택 불가능. disabled="disabled" 속성값을 추가해도 선택할 수 없도록 비활성화됨
    • 선택 항목 수가 적으면 메뉴가 대화 창 모양으로 표시됨
    • 항목 수가 많아 화면 영역을 벗어나게 되면 스크롤 페이지로 변경됨
  • 그룹 선택 메뉴
    • 항목들을 몇 개의 그룹으로 묶을 수 있고 <optgroup> 태그 안에 label 속성값을 설정하여 각 그룹의 이름을 선택 항목들 사이에 표시 가능
    • 다른 부류의 선택 항목들을 메뉴에 표시할 때 서로를 구분하기 위해 사용
    • 선택 메뉴의 항목들을 그룹핑하는 효과
      <optgroup label="그룹명">
        <option value="변수설정값">옵션</option>
        ...
      </optgroup>
    
    • data-inline="true" : 선택 메뉴의 표시되는 폭이 선택 문자열 크기에 맞추어 조절됨
  • 변형 선택 메뉴
    • <select> 태그 안에 data-native-menu="false" 속성을 지정 -> 선택 메뉴가 대화 상자와 비슷한 모양으로 표시됨
    • multiple 속성을 설정하여 동시에 여러 항목 선택 가능
    • 여러 항목을 선택하고 선택 메뉴를 닫으면 선택 항목들이 표시되고 선택된 개수도 추가로 표시됨
    • 플레이스홀더를 지정하면 선택 후에는 선택 메뉴의 제목으로 변경 표시됨
    • 플레이스홀더를 별도로 지정하지 않으면 기본적으로 목록의 첫 번째 항목이 지정됨
    • data-placeholder="true" 설정은 data-native-menu="false" 설정이 있을 때만 유효

플레이스홀더

  • 선택 메뉴의 첫 항목이 기본 제목으로 보여지는 것을 원하지 않을 경우 사용
  • 대신 보여질 다른 제목을 설정하는 3가지 방법이 가능
    • 1) 옵션에 특정 값을 지정하지 않고 문자열 추가
      <option>선택하세요</option>
    
    • 2) 옵션에 특정 값과 문자열이 지정된 경우, data-placeholder="true" 속성을 추가
      <option value="xxx" data-placeholder="true">선택하세요</option>
    
    • 3) 힌트나 제목이 없는 선택 메뉴를 만들고자 할 경우, 빈 옵션을 지정
      <option value=""></option>
    

웹앱 과정 - 제이쿼리 모바일 (3)

|

제이쿼리 모바일 버튼과 리스트뷰

버튼

  • 버튼 : 보통 사용자 의사를 전달하거나 요청을 위해 사용
  • 모바일 페이지에서는 페이지 간 이동 수단 으로 주로 사용
<!-- <a> 태그 버튼 -->
<a href="#" data-role="button">버튼 제목</a>

<!-- <button> 태그 버튼 -->
<button>버튼 제목</button>

<!-- <input> 태그 버튼 -->
<input type="button" value="버튼 제목">

태그와 명세 방법은 다르지만 생성된 버튼의 모양은 모두 같다. default 모양은 둥근 모서리와 테두리 음영 효과, 크기는 화면 전체의 너비나 문자열 길이에 비례하고 버튼 문자열은 가운데 정렬

기본 버튼 종류

링크 버튼 (<a>)

  • 버튼처럼 보여지는 링크
  • 가장 많이 사용됨
  • <a> 태그가 기존 링크 문자열 형태로 표시될 경우 손으로 터치하기 불편하여 작은 화면의 모바일 장치에는 부적합 -> 제이쿼리 모바일이 <a> 태그를 버튼으로 변환함
  • data-inline="true" : 버튼 너비를 문자열(아이콘 포함) 크기에 맞춤
  • data-min="true" : 버튼 높이와 글자 크기를 기본보다 작게 표시
  • data-corners="false" : 버튼 모서리를 직각으로 표시
  • data-shadow="false" : 버튼 밑의 음영 효과를 표시하지 않음
  • 콘텐츠 영역에서는 반드시 data-role="button" 설정을 해 줘야 한다.

폼 버튼

  • 입력, 수정 등 폼과의 상호 작용 혹은 완성된 폼의 제출을 위해 사용
<button type="버튼 유형">버튼 제목</button>
<input type="버튼 유형" value="버튼 제목">
  • type 속성값이 submin, reset, button에 해당할 경우 모바일 버튼으로 자동 변환된다.
  • <button> 태그의 경우도 type 속성을 명세하는 것이 바람직
  • data-role="none" : 변환 전의 기존 버튼 모양으로 표시됨
  • <button> 태그에 의해 생성된 버튼은 주로 자바스크립트의 실행을 호출하는 역할을 위해 사용

아이콘 버튼

  • 버튼을 생성하는 마크업 안에 data-icon 속성을 추가
  • 제이쿼리 모바일에서 40개의 표준 아이콘을 제공
<button type="버튼 유형" data-icon="아이콘이름">버튼 제목</button>
<input type="버튼 유형" value="버튼 제목" data-icon="아이콘이름">
  • data-role="none" 속성값을 설정하면 고전적인 버튼 모양에 아이콘은 표시되지 않는다.
  • data-iconpos="notext" : 문자열 없이 아이콘만으로 버튼 생성
<button type="버튼 유형" data-icon="아이콘이름" data-iconpos="notext">버튼 제목</button>
<input type="버튼 유형" value="버튼 제목" data-icon="아이콘이름" data-iconpos="notext">
  • data-iconpos="top|bottom|left|right" : 버튼 내 아이콘의 위치 변경
  • data-icon : 사용자 정의 아이콘 추가. 추가하는 아이콘의 이름은 CSS로 미리 정의되어야 한다. 이때 추가하는 CSS 클래스의 이름은 반드시 .ui-icon- 접두어 뒤에 data-icon 속성값으로 설정하는 식별자, 즉 사용자 정의 아이콘 이름을 붙여서 명세
<style>
  .ui-icon-my-icon:after{
    background: url(buttonicon1.png); /* url(아이콘파일 경로명) */
    background-size: 18px 18px; /* 아이콘이미지크기 */
  }
</style>

<button data-icon="my-icon">버튼 제목</button>

서용자 정의 아이콘을 적용하려면 png 형식의 아이콘 이미지 파일을 준비. 1818 픽셀의 흰색(또는 투명)에 알파 투명도가 적용된 PNG-8 형식으로 크기를 약간 작게 만든다. 선명한 아이콘을 원하면 3636 크기의 이미지를 사용하여 background-size 속성값을 18px 18px로 준다.

이미지 버튼

  • 이미지만으로 버튼을 만들 수 있다.
    <a href="#" data-role="button"> <img src="이미지파일경로명"> </a>
    

    버튼 그룹

  • 여백 없이 버튼들을 모아서 표시 -> 의미적으로 밀접하게 관련된 버튼들을 그룹화할 때 사용
  • data-role="controlegroup"을 갖는 <div> 태그로 버튼들을 감싸면 된다.
  • data-inline="true" 속성을 갖는 버튼이 여러 개 있을 때 버튼 그룹으로 그룹화하는 것이 좋다.
  • 버튼들은 기본적으로 세로 방향으로 결합해서 표시됨
  • data-type="horizontal" : 버튼들을 가로 방향으로 나열

버튼 테마

  • 제이쿼리 모바일에서 제공하는 스타일 기본 테마는 a, b 2가지
  • data-theme="버튼테마이름" 속성값으로 다른 테마 적용 가능
  • 보통 콘텐츠 컨테이너에 data-theme 속성값을 설정하는 것이 바람직

리스트뷰

  • 제이쿼리 : 모바일 페이지들은 대부분 리스트뷰 기반의 레이아웃
  • 리스트뷰(listview) : 여러 리스트들, 즉 목록들을 모아 간결한 형태로 화면에 표시
  • 기본 리스트뷰(basic listview)
    • 세로로 나열
    • 항목 정보만을 목록으로 제공
    • ‘읽기전용 리스트뷰’
    • 보통 비순서 리스트 태그 <ul> 안에 data-role="listview" 속성값을 준다.
    • 순서 리스트 태그 <ol> 에도 가능
    • 각 목록 항목 버튼들의 너비는 페이지 전체 너비와 동일
    • 디폴트 테마는 a
<ul data-role="listview">
  <li>항목 이름</li>
  ...
</ul>
  • 연결 리스트뷰(linked listview)
    • 항목 선택이 가능
    • 기본 리스트뷰의 각 항목에 <a>를 추가하면 연결 리스트뷰가 된다.
    • 특정 페이지 이동을 안내하거나 다른 하위 리스트뷰를 연결하기 위해 사용
    • 기본 리스트뷰의 각 항목에 오른쪽 화살표가 추가된 모양
    • 링크 버튼의 간격도 조금 넓어지면서 ‘오른쪽 화살표’ 아이콘이 오른쪽에 자동으로 추가됨
    • 연결 리스트뷰 항목의 내용이 길 경우, 자동으로 내용을 자르고 생략 기호(…)를 추가해 준다.
<ul data-role="listview">
  <li><a href="#">항목이름</a></li>
  ...
</ul>
  • 순서 리스트뷰
    • 자동으로 항목마다 번호가 앞에 표시됨
    • <ol> 태그 안에 data-role="listview" 속성을 주면 된다.
    • 순위나 순번들을 갖는 항목에 적용
<ol data-role="listview">
  <li>항목 이름</li>
  ...
</ol>
  • 인셋 리스트뷰(inset listview)
    • 콘텐츠 영역 안에 둥근 사각형 모양의 내부 공간을 형성하고 그 안에 리스트뷰를 표시
    • <ul> 안에 data-inset="true" 속성값을 주어 사용
    • 기본 리스트뷰는 여백이 없어 보기에 좋지 않고 페이지에 다른 내용들을 함께 표시할 경우 조화를 이루기가 쉽지 않다.
    • 인셋 리스트뷰는 화면의 가로, 세로 길이에 비례하여 상하좌우에 적정 여백과 둥근 모서리 모양을 가진다.
  • 분할 리스트뷰(split listview)
    • 각 항목 영역을 분할하여 둘 이상의 링크를 통해 여러 페이지와의 연동이 가능
    • 분할된 항목 영역은 독립된 분할 버튼으로서 동작
    • 각 링크 항목은 수직선으로 구분됨
    • 첫 번째 링크는 주 항목으로 문자열 버튼으로 표시
    • 두 번째 링크는 보조 항목으로 간주하며 아이콘 버튼만 표시
    • 예) 첫 번째 문자열 버튼은 상세 정보를 열람, 두 번째 아이콘 버튼은 수정 편집을 위해 선택하도록 구성 가능
    • 두 번째 버튼의 기본 아이콘은 오른쪽 화살표 모양
    • <ul> 태그 안의 data-split-icon속성에 원하는 아이콘 이름을 명시하여 변경 가능
    • 기본적으로 테마 a가 적용됨
    • data-split-theme : 테마 수정 가능
<li><a href="#">분할 항목 이름1</a><a href="#">분할 항목 이름2</a></li>

리스트뷰 고급

카운트 버블(count bubble)

  • 리스트뷰 항목의 둥근 거품 방울 모양의 화면 요소
  • 전체 하위 항목이나 새로운 항목의 개수, 항목 내용을 강조하고자 할 경우 유용
  • 리스트뷰의 일반 항목이나 리스트 분리자에 모두 표시 가능
  • 기본적으로 테마 c
<li><a href="#">상위 항목 이름<span class="ul-li-count">5</span></a></li>
<li><a href="#">상위 항목 이름<span class="ul-li-count">new</span></a></li>

리스트 구분자(list devider)

  • 항목들을 그룹으로 분류하고 각 그룹별로 분류명을 표시
  • 항목 그룹에 대한 헤더와 같은 역할
<li data-role="listdivider">구분자 제목</li>

썹네일 리스트뷰

  • 리스트뷰에서 썸네일 이미지를 항목 왼쪽에 추가 가능

    썸네일 이미지 : 데이터 전송의 효율성을 위해 변환된 작은 크기의 이미지

  • 리스트뷰의 각 항목 내용으로 <img> 태그를 추가하면 된다.
  • <img> 태그는 각 리스트 항목의 문자열보다 먼저 명세되어야 한다.
<li><a href="#"><img src="썸네일 이미지파일 경로명">항목이름</a></li>
  • 설정하는 썸네일 이미지의 기본 크기는 80*80 픽셀의 정사각형 모양
  • 기본 크기보다 더 커도 리스트뷰에서는 자동으로 80*80 픽셀 크기로 조정되는데 이때, 이미지의 가로 크기를 기준으로 크기가 축소된다.
  • 기본 크기보다 작은 이미지는 원본 크기 그대로 표시된다.
  • 이미지 크기를 강제로 80*80 픽셀로 지정할 수 있다.
<ul data-role="listview">
  <li>
    <a href="#">
      <img src="listimg.png" style="max-width: 80px; max-height:80px;">리스
      트1
    </a>
  </li>
</ul>

아이콘 리스트뷰

  • <img> 태그에 ul-li-icon 클래스 속성을 추가하면 썸네일 이미지 대신 크기가 더 작은 이미지를 아이콘처럼 추가 가능
  • 각 항목 왼쪽에 아이콘을 작게 표시

여러 줄 리스트뷰

  • 표시 내용의 중요도에 따라 강조할 내용은 <h> 제목 태그로, 나머지 내용은 <p> 문단 태그를 사용하여 일정한 형식으로 여러 줄에 표시 가능
<li>
  <h3>제목</h3><p>내용1</p><p>내용2</p>
  <p class="ul-li-aside">추가설명</p>
</li>
  • ul-li-aside 클래스 속서을 설정하여 항목 오른쪽에 날짜와 같은 추가 정보 표시 가능

검색 필터 리스트(search filter list)

  • 제이쿼리 모바일은 검색 필터 리스트를 제공한다.
  • 항목들의 맨 위쪽에 검색 필터 상자를 추가할 수 있다.
  • 검색어를 입력하면 키워드 검색 방식으로 일치하는 항목만 걸러서 보여준다.
  • <ul> 태그 안에 data-filter="true" 속성을 설정
  • data-filter-placeholder="..." : 검색 필터 상자에 기본적으로 표시되는 초기 문자열
<ul data-role="listview" data-filter="true" data-filter-placeholder="검색 키워드를 입력하세요">

<a> 링크 태그는 링크 기능을 제거하고 사용하기도 한다. 이 경우 href="#" 라고 기입하는데, 이를 빈 링크(empty link)라고 하며 클릭 이벤트 발생시 불필요한 페이지 전환을 방지하기 위해 주로 사용한다.

제이쿼리 모바일 위젯

페이지 탭(page tap)

  • 같은 페이지 공간 안에 여러 개의 탭 페이지를 생성하여 각 탭 페이지를 선택적으로 브라우징하는 인터페이스
  • 모바일 화면의 좁은 페이지 공간을 효율적으로 활용하는 방법 중 하나
  • 보통 현재 페이지와 의미적으로 연관된 복잡하고 다양한 정보들을 제공할 때 사용
  • 각각의 탭 컨테이너 상위에 data-role="tabs" 속성을 갖는 <div> 태그를 설정하여 사용 가능
<div data-role="tabs">
  <div data-role="header">
    <ul>
      <li><a href="#tab1">탭1</a></li>
      <li><a href="#tab2">탭2</a></li>
      <li><a href="#tab3">탭3</a></li>
    </ul>
  </div>
  <div id="tab1">...</div>
  <div id="tab2">...</div>
  <div id="tab3">...</div>
</div>
  • 위에서 tab1, tab2, tab3 아이디를 가지는 탭 컨테이너들은 페이지 탭 설정에 의해 같은 공간을 공유한다.

컬럼 토글 테이블 (column toggle table)

  • 좁은 공간을 위해 테이블의 컬럼을 선택적으로 표기하거나 숨길 수 있는 테이블
  • 숨겨진 컬럼들은 표시를 원할 경우, 컬럼 팝업 메뉴를 통해 선택함으로써 표시된다.
  • 화면 폭에 비해 테이블 컬럼들의 수가 너무 많은 경우, 각 컬럼들에 대해 우선 순위를 부여함으로써 표시되는 테이블 컬럼 항목들을 제한한다.
  • <table> 태그에 data-role="table", data-mode="columntoggle" 속성값을 설정한다.
  • id 속성도 추가해주는데, 컬럼 선택 팝업 메뉴와 테이블을 연결시키기 위해 필요
  • class="ui-responsive" : 다양한 화면 폭에 따라 허용되는 범위만큼 자동으로 표시되는 테이블 컬럼들을 조절
  • class="table-strip" : 테이블의 인접한 행들을 쉽게 구별할 수 있도록 줄무늬 형태로 표시
  • <th> 태그 안에 data-priority 속성값을 설정함으로써 가장 낮은 1부터 6까지 표시되는 컬럼들의 우선 순위를 지정할 수 있다. data-priority 속성값이 지정된 테이블 헤더 컬럼들은 컬럼 선택 메뉴에 표시된다. 생략하면 화면 폭에 상관없이 항상 고정적으로 표시되며, 컬럼 선택 메뉴에 표시되지 않는다.
<div data-role="page">
  <div data-role="header">
    <h1>header 영역</h1>
  </div>
  <div data-role="content">
    <table class="ui-responsive table-strip" id="my-table1" data-mode="columntoggle" data-role="table">
      <thead>
        <tr>
          <th data-priority="2">학년</th>
          <th>이름</th>
          <th data-priority="3">성별</th>
          <th data-priority="1">성적</th>
        </tr>
      </thead>
      <tbody>
        <tr>
          <th>1</th>
          <td>홍길동</td>
          <td>남</td>
          <td>94</td>
        </tr>
        <tr>
          <th>4</th>
          <td>신나라</td>
          <td>여</td>
          <td>77</td>
        </tr>
        <tr>
          <th>3</th>
          <td>홍미미</td>
          <td>여</td>
          <td>88</td>
        </tr>
      </tbody>
    </table>
  </div>
  <div data-role="footer" data-position="fixed">
    <h4>footer 영역</h4>
  </div>
</div>

숨김 패널(hidden panel)

  • 숨김 패널 안에 메뉴나 폼 등을 숨겨 놓았다가 필요할 때 페이지를 전환하지 않고도 제공 가능
  • 컨테이너에 data-role="panel" 속성 설정
  • data-display : 패널의 표시 방식을 지정, overlay 속성값은 페이지 내용 위에 패널이 펼쳐지는 형태로 표시
  • 링크 버튼에 data-rel="close" 속성을 추가하면 숨김 패널 안에 종료 버튼이 추가된다.
  • data-position : 화면 안에서의 숨김 패널의 위치를 설정. 기본값은 left 보통 화면의 왼쪽 가장자리로부터 숨겨진 패널 내용이 표시됨
  • 숨김 패널 컨테이너는 페이지 컨테이너 안에는 포함하되 헤더, 컨텐츠, 푸터 컨테이너 안에 포함시키지는 않는다.
<div data-role="page">
  <div data-role="panel" id="panel1" data-display="overlay" data-theme="b">
    <form>
      <h3>로그인 패널</h3>
      <label for="name">사용자명:</label>
      <input name="name" id="name" type="text" data-mini="true" data-clear-btn="true">
      <label for="password">비밀번호:</label>
      <input name="password" id="password" type="password" value="" data-mini="true" data-clear-btn="true">
      <div class="ui-grid-a">
        <div class="ui-block-a"><a href="#" data-role="button" data-rel="close">취소</a></div>
        <div class="ui-block-b"><a href="#" data-role="button" data-rel="close">저장</a></div>
      </div>
    </form>
  </div>
</div>

데이터베이스의 특징과 등장 배경

|

데이터베이스를 사용하는 이유

데이터베이스가 존재하기 이전에는 파일 시스템을 이용하여 데이터를 관리하였다. (현재도 부분적으로 사용되고 있다.) 데이터를 각각의 파일 단위로 저장하며 이러한 일들을 처리하기 위한 독립적인 어플리케이션과 상호 연동이 되어야 한다. 파일 시스템을 이용하여 데이터를 관리할 때 데이터 종속성 문제와 중복성, 데이터 무결성 문제가 생긴다.

파일 시스템

각 응용 프로그램(어플리케이션)이 독립적으로 자료를 파일 형태로 배치하고 관리하는 전통적인 데이터 처리 시스템 대부분의 경우 데이터 파일과 어플리케이션이 1:1로 대응됨 -> 응용프로그램과 data 간 상호 의존성이 높다.

파일 시스템의 문제점

  • 데이터 종속성 문제 (Data Dependency)
    데이터 구조가 바뀔 때 프로그램을 수정하고 다시 컴파일해야 한다.
  • 데이터 중복성 문제 (Data Redundancy)
    한 시스템 내의 자료가 중복 저장됨 -> 데이터의 추가, 변경, 삭제가 있을 경우 데이터 간 불일치가 일어날 수 있음 (데이터 무결성 문제)

DBMS

DataBase Management System 데이터베이스를 관리하며 응용 프로그램들이 데이터베이스를 공유하며 사용할 수 있는 환경을 제공하는 소프트웨어

DBMS의 장점

  • 데이터를 체계적으로 통합하고 구성함으로써 중복을 최소화
  • 데이터의 동시 공유가 가능
  • 수정, 삭제, 검색에 용이

데이터베이스의 특징

  1. 데이터의 독립성
    • 물리적 독립성 : 데이터베이스 사이즈를 늘리거나 성능 향상을 위해 데이터 파일을 늘리거나 새롭게 추가하더라도 개념 스키마 혹은 관련된 응용 프로그램을 수정할 필요가 없다.
    • 논리적 독립성 : 논리 스키마가 변하더라도 상위 단계에 존재하는 외부 스키마가 영향을 받지 않음.
  2. 데이터의 무결성 : 여러 경로를 통해 잘못된 데이터가 발생하는 경우의 수를 방지. 데이터의 유효성 검사를 통해 데이터의 무결성을 구현한다.
  3. 데이터의 보안성 : 인가된 사용자들만 데이터베이스 혹은 데이터베이스 내 자원에 접근할 수 있도록 계정 관리 또는 접근 권한을 설정함으로써 모든 데이터에 보안을 구현할 수 있다.
  4. 데이터의 일관성 : 연관된 정보를 논리적인 구조로 관리함으로써 어떤 하나의 데이터만 변경했을 경우 발생할 수 있는 데이터의 불일치성을 배제할 수 있다. 또한 작업 즁 일부 데이터만 변경되어 나머지 데이터와 일치하지 않는 경우의 수를 배제할 수 있다.
  5. 데이터의 중복 최소화 : 데이터베이스는 데이터를 통합하여 관리함으로써 파일 시스템의 단점 중 하나인 자료의 중복과 데이터의 중복성 문제를 해결할 수 있다.

데이터베이스의 성능

데이터베이스의 성능 이슈는 디스크 입출력을 어떻게 줄이느냐에서 시작된다. 디스크 입출력이란 디스크 드라이브의 플래터(원판)을 돌려서 읽어야 할 데이터가 저장된 위치로 디스크 헤더로 이동시킨 다음 데이터를 읽는 것을 의미한다. 이때 데이터를 읽는데 걸리는 시간은 디스크 헤더를 움직여서 읽고 쓸 위치로 옮기는 단계에서 결정된다. 즉 디스크의 성능은 디스크 헤더의 위치 이동 없이 얼마나 많은 데이터를 한 번에 기록하느냐에 따라 결정된다.

그렇기 때문에 순차 입출력이 랜덤 입출력보다 빠를 수밖에 없다. 하지만 현실에서는 대부분의 입출력 작업이 랜덤 입출력이다. 랜덤 입출력을 순차 입출력으로 바꾸어 실행할 수는 없을까? 이러한 생각에서부터 시작되는 데이터베이스 쿼리 튜닝은 랜덤 입출력 자체를 줄여주는 것이 목적 이라고 할 수 있다.

테이블 & 레코드

출처

웹앱 과정 - 제이쿼리 모바일 (2)

|

제이쿼리 모바일 헤더바와 푸터바

헤더바

###툴바

  • 다른 페이지로의 이동이나 페이지 관련 처리 기능을 모아 놓은 인터페이스로 링크, 버튼, 텍스트 등으로 구성된 바 형태
  • 제이쿼리 모바일은 헤더 영역의 헤더바, 푸터 영역의 푸터바를 제공한다. 페이지의 콘텐츠 영역과는 다른 색상으로 구별되어 표시된다.
<!-- 헤더바 생성 -->
<div data-role="header"></div>
<!-- 푸터바 생성 -->
<div data-role="footer"></div>

헤더 문자열

  • 헤더 영역은 왼쪽 영역, 제목 문자열 영역, 오른쪽 영역으로 나누어진다.
  • 제목 문자열 영역의 공간은 제한됨 -> 문자열이 길어지면 자동으로 생략 기호(…)가 추가된다.
  • 주로 페이지 제목을 표시
  • <h1>~<h6> 제목 태그 중 선택 가능. 제이쿼리 모바일에서 화면 표현상의 차이는 없다. 관습적으로 <h1> 사용
<div data-role="header"><h1>헤더 문자열</h1></div>

헤더 버튼

  • 좌우에 버튼이 최대 두 개까지 표시된다.
  • 헤더 컨테이너 영역 안에서 <a> 태그는 버튼으로 자동 변환되어 표시된다.
  • 첫 번째 링크는 왼쪽 버튼으로, 두 번째 링크는 오른쪽 버튼이 된다.
  • 버튼의 너비는 문자열 길이에 따라 다르다.
<div data-role="header"><a href="#">헤더 버튼</a></div>

뒤로가기 버튼

  • data-add-back-btn="true" : 헤더 영역에 뒤로가기(back)버튼이 자동으로 표시된다. 첫 번째 페이지에는 적용되지 않고 두 번째 이후 페이지부터 동작한다. 클릭하면 바로 이전 페이지로 이동하며 이동할 때의 이전 화면 전환과 반대 방향의 애니메이션 효과
  • data-add-back-btn-text="뒤로가기" : 버튼의 문자열 변경
  • data-backbtn="false" : 뒤로가기 버튼의 자동 생성을 원하지 않을 때

오른쪽 버튼

  • <a> 태그 버튼이 첫 번째 버튼이면 기본적으로 헤더 영역의 왼쪽 버튼으로 표시됨
  • class="ui-btn-right" 속성을 <a> 태그에 추가하면 첫 번째 버튼을 오른쪽에 표시할 수 있다.
  • class="ui-btn-left" : 두 번째 버튼을 왼쪽에 표시
  • data-add-back-btn 속성값을 설정해도 헤더바에 직접 링크 버튼을 추가하면 자동 뒤로가기 버튼이 표시되지 않음

푸터바

  • 모바일 페이지의 마지막 엘리먼트
  • 보통 콘텐츠 영역 밑, 페이지의 가장 아래쪽에 위치

푸터바 문자열 추가

  • <h1>~<h6> 까지의 제목 태그를 사용할 수 있다. 헤더바에 비해 중요도 낮음 -> 보통 <h4>~<h6> 태그 사용 ```HTML

푸터 텍스트


### 푸터바 버튼 추가
- 푸터 컨테이너 안의 `<a>` 태그도 버튼으로 자동 변환된다.
- 왼쪽부터 하나씩 인라인 방식으로 추가됨
- 여러 개의 버튼 표시 가능

```HTML
<div data-rold="footer"><a href="#">푸터 버튼</a></div>
  • 이때 버튼 주위에 기본 여백이 설정되지 않음
  • 여백이 필요하다면 ui-bar 속성을 설정 : 약간의 여백을 두고 버튼을 연속으로 배열 ```HTML

### 푸터바 그룹 버튼 추가
- `data-role="controlgroup"` : 버튼 사이에 여백을 전혀 두지 않음
- 버튼을 그룹으로 모아 표시 -> 버튼들 사이의 공간과 둥근 모서리가 모두 사라짐
- `data-type="horizontal"` : 버튼들을 수평으로 나열 default는 `vertical` (수직)

## 네비게이션바와 툴바
- = 메뉴바, 탭바

### 네비게이션바
- 순서 없는 리스트 항목들을 하나의 '수평 버튼 바' 모양으로 만들어주는 버튼
- 헤더바와 푸터바 모두 추가 가능
- 헤더바에서 3개 이상의 버튼이 필요할 경우 네비게이션바를 사용한다.
- 보통 푸터바에 많이 배치
    모바일 기기를 손에 쥐고 쉽게 메뉴를 선택하도록

```HTML
<!-- 네비게이션바 선언 -->
<div data-role="navbar">
  <ul>
    <li><a href="#">page1</a></li>
    <li><a href="#">page2</a></li>
    <li><a href="#">page3</a></li>
  </ul>
</div>
  • <li> 태그의 개수만큼 네비게이션바 공간이 같은 크기로 분할됨
  • 항목이 많을수록 네비게이션바 안의 버튼 너비는 줄어듬
  • 보통 한 줄에 1~5개의 버튼을 생성
  • 6개 이상이면 한 줄에 버튼 두 개씩 여러 줄에 걸쳐 표시됨 스마트폰에서 화면 너비의 1/5 영역이 터치를 위한 최소한의 크기로 간주됨
  • class="ui-btn-active" : 여러 버튼들 중 하나가 이미 선택되었음을 활성화하여 표시

툴바 위치 설정

  • data-position="fixed" : 헤더바와 푸터 컨테이너에 설정하면 헤더바와 푸터바의 표시 위치를 화면 맨 위와 맨 밑으로 고정 가능 스크롤이 완료되면 현 화면의 맨 위와 맨 아래에 헤더바와 푸터바가 표시됨
  • data-fullscreen="true" : 헤더바와 푸터 컨테이너에 설정 content 영역을 눌러 헤더바와 푸터바를 모바일 페이지에서 사라지게 하고 필요할 때만 화면에 동적으로 표시하도록 할 수 있다. data-position="fixed" 속성과 반드시 함께 사용해야 한다. 화면을 터치하여 헤더바와 푸터바의 표시와 숨김 두 가지 상태를 반복 가능
  • 페이지 이동 시에도 화면 하단에 같은 푸터바를 설정할 수 있다. 푸터 컨테이너의 data-id 속성값을 같게 설정 -> 지속형 푸터바 ui-state-persist 클래스 속성을 추가하면 네비게이션바 안의 선택된 버튼도 그대로 활성 상태를 유지할 수 있다.