|
JQuery-UI를 이용하면, 일관성 있는 웹 어플리케이션을 작성할 수 있다. JQuery-UI 라이브러리는 jqueryui.com에서 다운받을 수 있다. 원한다면 다운받기 전에 테마를 설정할 수도 있다. 다운로드 받은 JQuery UI 파일을 적절한 디렉토리로 옮기고 다음과 같이 CSS와 스크립트를 임포트 한다.
<link href="css/ui-lightness/jquery-ui-1.10.4.custom.css" rel="stylesheet">
<script src="js/jquery-1.10.2.js"></script>
<script src="js/jquery-ui-1.10.4.custom.js"></script>
그리고, JQuery UI를 적용하기 위하기 위해서는 HTML 태그 객체 별로 적절한 함수를 호출해야 한다.
우선, HTML 태그를 참조하는 JQuery 객체를 만들고 객체에 적용하고자 하는 위젯 함수를 호출하면 JQuery UI가 적용된다. 버튼을 예로 들면,
<script>
$(document).ready(function(){
$("#mybutton").button();
});
</script>
...
<button id="mybutton">A button element</button>
JQuery-UI 버튼 위젯을 적용하기 위한 함수는 button()이다. 위 예에서 id가 mybutton인 객체에서 button()을 호출했으므로, 이 객체가 참조하는 HTML 태그의 UI에 JQuery-UI 버튼 위젯 스타일이 적용된다.
위 예에서는 <button>에 적용했지만, 꼭 버튼일 필요가 없다. 다음 예제에서는 <button>, <a>, <p> 엘리먼트에 버튼 위젯을 적용했다.
Example: Button Widget
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
<link href="css/ui-lightness/jquery-ui-1.10.4.custom.css" rel="stylesheet">
<script src="js/jquery-1.10.2.js"></script>
<script src="js/jquery-ui-1.10.4.custom.js"></script>
<script>
$(document).ready(function(){
$("#mybutton1, #mybutton2, #mybutton3").button();
});
</script>
</head>
<body>
<button id="mybutton1">A button element</button>
<a href="#" id="mybutton2">A button element</a>
<p id="mybutton3">A button element</p>
</body>
</html>
위젯을 Enable/Disable 하는 방법은 공통적으로 다음과 같다.
$("selector").widget-fucntion( "option", "disabled", true );
widget-function은 각 위젯별 함수이다. 버튼의 경우 button()이다.
disable된 위젯을 다시 enable하고 싶다면 true 대신 false를 입력하고 호출한다.
또한, 위젯을 옵션 값을 가져오거나 설정하는 방법도 공통적으로 다음과 같다.
// getter
var value = $(".selector").widget-fucntion ("option", "option-name" );
// setter
$(".selector").widget-fucntion ("option", "option-name", value );
- 일반 버튼
앞의 예제에서 이미 살펴보았다.
$("#mybutton1, #mybutton2, #mybutton3").button();
...
<button id="mybutton1">A button element</button>
- 아이콘 버튼
아이콘 버튼은 button() 함수의 파라미터로 설정한다. 사용된 아이콘들은 JQuery UI에 포함된 것들이다. 아이콘 텍스트를 보여주지 않으려면 text:false를 지정한다. text:false로 지정된 버튼에 호버하면 <button>태그의 텍스트를 보여준다.
$("#myiconbtn1").button({
icons: {
primary: "ui-icon-locked"
},
text: false
});
$("#myiconbtn2").button({
icons: {
primary: "ui-icon-locked"
}
});
- 토글버튼
토글버튼은 체크박스를 버튼으로 만들면 된다. <input>의 id와< label>의 for가 동일해야 스타일이 적용된다.
$("#mycheck").button();
...
<input type="checkbox" id="mycheck"><label for="mycheck">Toggle</label>
- 버튼셋(체크박스 버튼)
체크박스에 대해 buttonset()을 호출하면 멀티-셀렉션 버튼 셋이 된다.
$("#mybtnset").buttonset();
...
<div id="mybtnset">
<input type="checkbox" id="check1"><label for="check1">B</label>
<input type="checkbox" id="check2"><label for="check2">I</label>
<input type="checkbox" id="check3"><label for="check3">U</label>
</div>
- 버튼셋(라디오버튼 버튼)
라디오버튼에 대해 buttonset()을 호출하면 싱글-셀렉션 버튼 셋이 된다.
$("#myradiobtnset").buttonset();
...
<div id="myradiobtnset">
<input type="radio" id="radio1" name="radio">
<label for="radio1">Choice 1</label>
<input type="radio" id="radio2" name="radio" checked="checked">
<label for="radio2">Choice 2</label>
<input type="radio" id="radio3" name="radio">
<label for="radio3">Choice 3</label>
</div>
오토컴플릿은 autocomplete() 함수를 이용하며, 단어 리스트는 배열 형식으로 제공한다.
var availableTags = ["ActionScript","AppleScript","Asp"];
$("#myautocomplete").autocomplete({
source: availableTags
});
...
<input id="myautocomplete" title="type "a"">
탭은 tabs() 함수로 적용된다. 탭에서 탭버튼은 <ul>, <li>로 구성한다. 각 탭버튼(<li>)의 내용은 <a> 태그로 구성되며, 탭 내용과는 href를 이용해 연결한다. 아래 예에서 href=”#tabs-1”인 버튼을 누르면 id=”tabs-1”인 <div>의 내용을 보여준다.
$("#tabs").tabs();
...
<div id="tabs">
<ul> <!-- 탭버튼 -->
<li><a href="#tabs-1">First</a></li>
<li><a href="#tabs-2">Second</a></li>
<li><a href="#tabs-3">Third</a></li>
</ul> <!-- 탭 내용-->
<div id="tabs-1">Lorem ipsum ....</div>
<div id="tabs-2">Phasellus ma... </div>
<div id="tabs-3">Nam dui erat,...</div>
</div>
아코디언은 accordion() 함수를 이용한다. HTML 태그의 형식은 헤더 태그가 아코디언 라벨이 되고 바로 그 아래의 <div>가 내용이 된다.
$("#myaccordion").accordion();
...
<div id="myaccordion">
<h3>First</h3>
<div>Lorem ips....</div>
<h3>Second</h3>
<div>Phasellus ...</div>
<h3>Third</h3>
<div>Nam dui era...<div>
</div>
아코디언의 기본 아이콘을 바꾸고 싶다면 icons 옵션을 설정한다. icons 옵션 데이터에서 header는 일반 상태, activeHeader는 선택된 상태를 의미한다.
var icons = {
header: "ui-icon-circle-arrow-e",
activeHeader: "ui-icon-circle-arrow-s"}; // 선택상태
$("#myaccordion_icon").accordion({
icons: icons
});
다이얼로그는 dialog() 함수를 이용한다. 파라미터로 “open”, “close”를 주면 다이얼로그 열기 닫기 동작을 수행한다. 다이얼로그에 대해 세세한 설정(아래 예에서는 버튼)을 위해 JSON 형식의 파라미터를 넘긴다.
다이얼로그의 타이틀은 HTML 태그에서 title 속성 값을 이용해 설정한다.
// 다이얼로그
$("#mydlg").dialog({
autoOpen: false,
width: 400,
buttons: [
{
text: "Ok",
click: function() {
$( this ).dialog( "close" );
}
},
{
text: "Cancel",
click: function() {
$( this ).dialog( "close" );
}
}
]
});
// 다이얼로그를 열기 위한 버튼 클릭 이벤트
$("#mydlg-link").button().click(function(){
$("#mydlg").dialog("open");
event.preventDefault();
});
...
<div id="mydlg" title="Dialog Title">
<p>Lorem....</p>
</div>
다이얼로그 설정을 위한 JSON 타입 파라미터로 사용할 수 있는 옵션 필드들은 다음과 같은 것들이 있다.
resizable: true | false; (default false)
draggable: true | false; (default true)
height: size
width: size
modal: true | false (default false)
closeOnEscape: true | false (default true)
buttons: object array or json object
show: effect object
hide: effect object
close: event processing function
beforClose: event processing function
이름으로부터 직관적으로 알 수 있는 설정들이다. buttons는 예제에서 볼 수 있듯이, text와 click으로 구성된 json 타입을 할당하면 된다. text가 다이얼로그 버튼 라벨이고 click의 함수는 클릭했을 때 동작할 함수이다. 다이얼로그의 modal 옵션은 디폴트가 false이다.
show와 hide는 다이얼로그에 효과를 주기 위한 옵션이다. 예를 들어,
show: {
effect: "blind",
duration: 1000
},
hide: {
effect: "blind",
duration: 1000
}
효과에 대해서는 http://jqueryui.com/hide/, http://jqueryui.com/show/ 참조.
다음은 이러한 설정들을 추가한 다이얼로그 설정이다. 그리고, 어떤 버튼이 눌렸는지 알기 위해 $(this).data()를 이용했다.
// 다이얼로그 설정
$( "#mydlg" ).dialog({
autoOpen: false,
width: 400,
// Button 설정
buttons: [
{
text: "Ok",
click: function() {
// $(this): dialog div, event: button level event
$(this).data("return", true); // close 이벤트에서 참조하기 위해.
$(this).dialog("close");
}
},
{
text: "Cancel",
click: function() {
$(this).data("return", false); // close 이벤트에서 참조하기 위해.
$(this).dialog("close");
}
}
],
modal: true, //모달
closeOnEscape: false, //ESC키에 다이얼로그가 닫히지 않도록
draggable: false, //드래그 금지
// Effect
show: {
effect: "blind",
duration: 700
},
hide: {
effect: "blind",
duration: 700
},
// 다이얼로그를 닫을 때 발생하는 이벤트.
close: function( event, ui ) {
var ret = $(this).data("return"); // OK, Cancel 버튼의 값 설정 참조.
alert(ret);
}
});
위 옵션 속성들은 다음과 같이 “option”을 지정하여 설정할 수도 있다.
$(".selector").dialog("option", option_name, option_value);
예를 들어,
$(".selector").dialog("option", "closeOnEscape", false );
이런 옵션 설정 방식은 다른 위젯 함수들도 동일하게 적용된다.
데이트 픽커는 달력을 이용해 사용자가 날짜를 입력할 수 있게 해주는 위젯이다. 데이트 픽커를 보여주기 위한 함수는 datepicker()이다. 이를 <div> 엘리먼트에서 호출하면 바로 달력을 보여주고, <input type=”text”> 엘리먼트에서 호출하면 필드 클릭 시에 달력을 보여준다. 보여준 달력의 날짜를 클릭하면 날짜가 입력된다.
$( "#mydatepicker" ).datepicker();
...
<input type="text" id="mydatepicker"></p>
날짜 포맷
입력되는 날짜의 포맷을 변경하려면 dateFormat 옵션 필드 값을 지정한다.
$("#mydatepicker").datepicker({
dateFormat: "yy/mm/dd"
});
or
$("#mydatepicker").datepicker( "option", "dateFormat", "yy/mm/dd");
포맷으로 사용할 수 있는 요소는 다음과 같다.
- d - day of month (no leading zero)
- dd - day of month (two digit)
- o - day of the year (no leading zeros)
- oo - day of the year (three digit)
- D - day name short
- DD - day name long
- m - month of year (no leading zero)
- mm - month of year (two digit)
- M - month name short
- MM - month name long
- y - year (two digit)
- yy - year (four digit)
- @ - Unix timestamp (ms since 01/01/1970)
- ! - Windows ticks (100ns since 01/01/0001)
- '...' - literal text
- '' - single quote
- anything else - literal text
표시언어
표시언어를 지정하려면 다음과 같이 지역 코드를 입력한다.
$.datepicker.setDefaults( $.datepicker.regional["fr"] );
//or 호출시: $( selector ).datepicker( $.datepicker.regional["fr"] );
단, 한국 지역은 제공하고 있지 않기 때문에 다음과 같이 한글로 된 데이터를 제공해야 한다.
$.datepicker.regional['ko'] = {
closeText: '닫기',
prevText: '이전달',
nextText: '다음달',
currentText: '오늘',
monthNames: ['1월','2월','3월','4월','5월','6월','7월','8월','9월','10월','11월','12월'],
monthNamesShort: ['1월','2월','3월','4월','5월','6월','7월','8월','9월','10월','11월','12월'],
dayNames: ['일','월','화','수','목','금','토'],
dayNamesShort: ['일','월','화','수','목','금','토'],
dayNamesMin: ['일','월','화','수','목','금','토'],
dateFormat: 'yy-mm-dd',
yearSuffix: '년'};
$.datepicker.setDefaults( $.datepicker.regional["ko"] );
날짜 제한
사용자가 선택할 수 있는 최대, 최소 날짜 범위 지정에는 minDate, maxDate 옵션이 이용된다. 이 옵션의 값은 연월일로 이루어진 완전한 날짜나 상대적 날짜를 입력할 수 있다. 상대적 날짜는 숫자 또는 문자열로 주어진다. 숫자는 일수를 의미하고 문자열은 숫자와 함께 y, m, w, d (년, 월, 주, 일)를 이용해 구성한다. 숫자 앞에 붙는 +는 이후 –는 이전을 의미한다.
예를 들어, 다음 설정은 이전 10일, 이후 1달 10일이 날짜 선택 범위임을 의미한다.
$("#mydatepicker").datepicker({
minDate: -10,
maxDate: "+1M 10D"
});
이렇게 설정할 경우, 달력 UI에서 해당 범위의 날짜만을 선택할 수 있다.
minDate, maxDate를 이용해 from, to 날짜 선택을 할 수 있다.
$("#mydate_from").datepicker({
onClose: function( selectedDate ) {
$( "#mydate_to" ).datepicker( "option", "minDate", selectedDate );
}
});
$("#mydate_to").datepicker({
onClose: function( selectedDate ) {
$( "#mydate_from" ).datepicker( "option", "maxDate", selectedDate );
}
});
...
from: <input type="text" id="mydate_from">
to: <input type="text" id="mydate_to">
onClose는 날짜 선택이 끝날 때 일어나는 이벤트이고 selectedDate는 선택한 날짜이다. from 쪽에서 선택한 날짜는 to 쪽의 최소 날짜로 to 쪽에서 선택한 날짜는 from 쪽의 최대 날짜로 설정한다.
그 밖에
아이콘을 클릭해야 달력을 보이도록 설정하려면 다음과 같이 한다.
$("#mydate_button").datepicker({
showOn: "button",
buttonImage: "img/calendar.gif",
buttonImageOnly: true,
buttonText: "Open Calender"
});
내용은 직관적으로 파악할 수 있다. 아이콘이 top에 정렬되어 있지 보기에 안 좋을 것이다. 달력 아이콘과 관련된 스타일 클래스 ui-datepicker-trigger를 참조해 정렬 스타일을 추가한다.
.datepicker_icon_pos {
position: relative;
vertical-align: middle;
margin-left: 5px;
}
...
$(".ui-datepicker-trigger").addClass("datepicker_icon_pos");
그 밖에 옵션들로는 다음과 같은 것이 있다.
numberOfMonths: number
defaultDate: string
firstDay: 0 | 1
numberOfMonths는 한 화면에 보일 달의 수, defaultDate는 말 그대로 디폴트 날짜로 설정하지 않았다면 현재 날짜이다. firstDay는 1주일의 시작을 의미한다. 0이면 Sunday, 1이면 monday이다.
메뉴 위젯은 menu() 함수를 이용한다. 그리고 메뉴는 리스트 태그 <ul>, <li>로 구성한다.
바로 예를 살펴본다.
.ui-menu { width: 150px; }
...
$("#mymenu").menu();
...
<ul id="mymenu">
<li><a href="#">menu item 1</a></li>
<li><a href="#">menu item 2</a></li>
<li><a href="#">menu item 3</a></li>
<li>
<a href="#">menu item4</a>
<ul>
<li><a href="#">menu subitem 1</a></li>
<li><a href="#">menu subitem 2</a></li>
<li><a href="#">menu subitem 3</a></li>
</ul>
</li>
<li class="ui-state-disabled"><a href="#">menu item5</a></li>
<li><a href="#"><span class="ui-icon ui-icon-disk"></span>Save</a></li>
</ul>
메뉴의 기본 width 설정에 의해 화면을 다 채우므로, .ui-menu 클래스를 이용해 width를 지정한다.
서브 메뉴를 만들려면, <li> 내에 다시 <ul>을 포함시켜 만들면 된다.
메뉴 항목 중에 disable 시키려는 항목은 클래스로 ui-state-disabled를 지정한다.
위에서 사용한 아이콘 추가는 JQuery에서 제공하는 기본 아이콘을 이용했다. <span> 태그 부분이 아이콘 부분이다.
프로그레스바는 progressbar() 함수를 이용한다. progressbar()의 옵션을 살펴보면
- max: number
- value: number | false
max는 프로그래스바의 최대 값이다. value는 프로그레스바의 초기값 혹은 진행 값을 나타낸다. value가 false로 설정되면 프로그레스바의 중간 상태를 나타낸다. 간단한 예제를 살펴보면,
// progress bar
$( "#myprogress" ).progressbar({
max: 100;
value: 20
});
...
<div id="myprogress"></div>
프로그레스바의 이벤트로 change, complete가 있다. change는 프로그레스바의 값이 변할 때마다 호출되고 complete는 max값에 도달하면 발생한다.
다음은 change, complete 이벤트와 타이머를 이용해 progress를 시뮬레이션하는 예제이다.
.ui-progressbar {
position: relative;
}
.progress-label {
position: absolute;
left: 50%;
top: 4px;
font-weight: bold;
text-shadow: 1px 1px 0 #fff;
}
...
// progressing.....
$( "#myprogress2" ).progressbar({
max: 10000,
value: 0,
change: function() {
$(".progress-label").text(
Math.floor($(this).progressbar("value")/100) + "%" );
},
complete: function() {
window.clearInterval($("#myprogress2").data("timerID"));
$(".progress-label").text("Complete");
}
});
// progress 시작 버튼
$("#progress_start").click(function(){
// loading message
$("#myprogress2").progressbar("value", false);
$(".progress-label").text("Loading ...");
// delay
window.setTimeout(startProgress, 1000);
});
// progressbar 갱신
function startProgress(){
var unit = 20; // 20ms
var progressBar = $("#myprogress2");
progressBar.progressbar("value", 0);
var intervalID = window.setInterval(function(){
var currProgress = progressBar.progressbar("value");
progressBar.progressbar("value", currProgress + unit);
progressBar.data("timerID", intervalID);
}, unit);
}
// progress 클리어 버튼
$("#progress_clear").click(function(){
// clear timer
var intervalID = $("#myprogress2").data("timerID");
window.clearInterval(intervalID);
// clear progressbar
$("#myprogress2").progressbar("value", 0);
$(".progress-label").text("");
});
// .ui-progressbar, .ui-widget-header ui-progressbar-value .ui-widget-content
// progress color 변경
// $("#myprogress2").find(".ui-progressbarvalue").css("background","#6699FF");
...
<div id="myprogress2"><div class="progress-label"></div></div><br>
<button id="progress_start">progress start</button>
<button id="progress_clear">progress clear</button>
슬라이더는 slider() 함수를 이용한다. slider()의 옵션 속성 range는 min, max or true 값을 갖는다.
range: min | max | true
- min: 슬라이더 바의 선택 값 이하를 쉐이딩
- max: 슬라이더 바의 선택 값 이상을 쉐이딩
- true: 범위 선택
Range: min or max
range로 min 또는 max를 선택하는 경우, 설정은 다음과 같이 할 수 있다.
// min
$("#myslider_min").slider({
range: "min",
min: 0,
max: 100,
value: 35
});
...
<div id="myslider_range_true"></div>
min, max 옵션은 슬라이더로 선택할 수 있는 최대, 최소 범위로, 슬라이더 선택 결과 값은 최소 초과 최대 미만이다. value 옵션은 초기값이나, 바를 움직이면 value 값이 변한다. 현재 선택 값을 얻어오거나 설정하는 방법은
var currValue = $("#myslider_min").slider("value"); // getter
$("#myslider_min").slider( "value", 55 ); // setter
Range: true
range로 true를 선택한 경우, 설정은 다음과 같이 할 수 있다.
$("#myslider_range_true").slider({
range: true,
min: 0, // min/max
max: 100,
values: [17, 67] // 선택된 min/max
});
...
<div id="myslider_range_true"></div> <br><br>
min, max는 같은 의미이고 값 values가 다르다. values는 초기 슬라이더 선택 범위이다. 슬라이더 바를 움직이면 values가 변한다. 현재 선택 값을 얻어오거나 설정하는 방법은
var currValues = $("#myslider_range_true").slider("values"); //getter
$("#myslider_range_true").slider("values", [10 90] ); // setter
여기서 currValues는 배열로 currValues [0]는 현재 선택된 최소값, currValues[1]은 현재 선택된 최대값이다. 최소/최대를 각각 다루는 방법은 다음과 같다. 0은 선택된 최소값, 1은 선택된 최대 값을 나타낸다.
// getter
var currMin = $("#myslider_range_true").slider("values", 0); // get min
var currMax = $("#myslider_range_true").slider("values", 1); // get max
// setter
$("#myslider_range_true").slider( "values", 0, 10); // set min
$("#myslider_range_true").slider( "values", 1, 90); // set max
Event
슬라이더 값의 변화와 관련 있는 이벤트로 slide와 change가 있다. slide는 바를 움직일 때마다, change는 움직이다가 멈추었을 때 발생한다. 둘 다 이벤트 핸들러 함수 형식은 동일하다. 예를 들어,
slide: function(event, ui){
$("#slider_value1").html(ui.value);
}
change: function(event, ui){
$("#slider_value1").html(ui.value);
}
range: true일 때, 이벤트에서 ui.value 대신 ui.values[0], ui.values[1]을 이용한다.
ETC
그 외, 옵션으로
- orientation: "horizontal" | "vertical"
- step: number
orientation은 슬라이더를 수직 방향으로 혹은 수평 방향으로 위치시키는 옵션이다.
step은 슬라이더를 한 번 움직일 때 변할 값의 단위이다.
설정 이후에 min, max 같은 옵션 값을 얻고자 한다면, $(selector).widget_function(“option”, option_name)을 이용한다. 슬라이더의 경우에는 다음과 같이 이용된다.
$("selector").slider("option","min");
$("selector").slider("option","max");
다른 옵션 값들도 동일한 방식을 적용하면 된다.
스피너는 spinner() 함수를 이용한다.
$("#myspinner").spinner();
...
<input id="myspinner" name="value">
스피너의 옵션 몇 가지만 나열하면
- min: number
- max: number
- step: number
min, max는 스피너로 지정할 수 있는 최대, 최소값을 의미한다. step은 스피너 버튼을 눌렀을 때, 값을 증가 혹은 감소시킬 단위이다.
스피너의 값을 Get/Set하는 방법은 다음과 같다.
$(selector).spinner("value");
$(selector).spinner("value", 10);
value는< input> 태그의 value 속성이다. 따라서, 초기값을 지정하고자 한다면 <input> 태그의 value 값을 설정한다.
그리고, spinner의 이벤트로 spin 이벤트가 있다. 이 이벤트는 값이 변할 때마다 발생한다.
spinner에 대한 예를 들고, 넘어간다.
$("#myspinner").spinner({
min: 0,
max: 100,
step: 5,
spin: function(event, ui) {
var currValue = $(this).spinner("value");
var changeValue = ui.value;
if( currValue > changeValue) {
$("#myspinner_message").html("changed to "
+ changeValue+" (down)");
} else if(currValue < changeValue) {
$("#myspinner_message").html("changed to "
+ changeValue+" (up)");
}
}
});
...
Select a value:
<input id="myspinner" name="spinvalue" value="10"> <br>
value: <span id="myspinner_message"></span>
모던 브라우져가 툴팁을 기본으로 지원한다. 태그의 속성 title 값을 툴팁 텍스트로 이용한다.
<p title="this is tooltip">test</p>
JQuery에서는 tooltip() 함수로 툴팁을 지원한다. 툴팁 텍스트는 동일하게 title 속성을 이용한다.
$(document).tooltip();
...
<p title="tooltip display">tooltip-test</p>
<a href="#" title="tooltip display">tooltip-test</a>
툴팁 스타일링은 툴팁 CSS를 변경하거나 CSS를 추가하여 수행할 수 있다. 툴팁과 관련된 CSS는
ui-tooltip: 툴팁 컨테이너 스타일
ui-tooltip-content: 툴팁 콘텐츠 스타일
다음은 ui-tooltip으로 보더 색상과 배경 색을 바꾸고 ui-tooltip-content으로 텍스트 폰트를 변경했다. 그리고 ui-toolip:after 수도 엘리먼트로 화살표를 추가한 예제이다.
/* 툴팁 스타일 */
.ui-tooltip {
background-image:
linear-gradient(rgba(255,255,255, 0.5), rgba(255,255,255, 0));
background-color: #99CCFF;
border-radius: 10px;
border: 2px solid #6699FF;
padding: 15px 20px;
}
.ui-tooltip-content {
font: bold 1em Arial, Helvetica, sans-serif;
color: #111;
}
/* 삼각형 */
.ui-tooltip:after {
content: "";
position: absolute;
left: 50%;
bottom: -24px; /* 툴팁 컨테이너 바로 아래 */
margin-left: -24px;
width: 0px;
height: 0px;
border-style: solid;
border-left: 10px solid transparent;
border-right: 10px solid transparent;
border-top: 12px solid #6699FF;
border-bottom: 12px solid transparent;
}
...
// 툴팁
$(document).tooltip({position: {
my: "center bottom-15",
at: "center top"
}
});
my, at 모두 정렬에 관련된 옵션으로 “horizontal vertical” 값이다.
my는 위치시킬 엘리먼트의 정렬 기준이고 at은 부모 엘리먼트에서 위치시킬 엘리먼트의 정렬을 의미한다. 즉, 툴팁의 “center bottom-15”를 부모 엘리먼트의 “center top”에 위치시킨다.
아이콘은 class를 이용해 지정한다. class=”ui-icon 아이콘-이름”
다음 예에서< li>의 class 설정은 보기 좋게 만들기 위한 것이다.
<ul id="icons" class="ui-widget ui-helper-clearfix">
<li class="ui-state-default ui-corner-all" title=".ui-icon-carat-1-n"><span class="ui-icon ui-icon-carat-1-n"></span></li>
<li class="ui-state-default ui-corner-all" title=".ui-icon-carat-1-ne"><span class="ui-icon ui-icon-carat-1-ne"></span></li>
<li class="ui-state-default ui-corner-all" title=".ui-icon-carat-1-e"><span class="ui-icon ui-icon-carat-1-e"></span></li>
<li class="ui-state-default ui-corner-all" title=".ui-icon-carat-1-se"><span class="ui-icon ui-icon-carat-1-se"></span></li>
<li class="ui-state-default ui-corner-all" title=".ui-icon-carat-1-s"><span class="ui-icon ui-icon-carat-1-s"></span></li>
</ul>
전체 아이콘 리스트는 다음 링크를 참조하라.
http://api.jqueryui.com/theming/icons/
JQuery에서 클래스는 Theming과 연관성이 깊다. 각 위젯 별로 Theming을 위한 별도의 클래스들이 존재한다. 이에 대해서는 위젯 별로 API Document를 참조해 보아라.
여기서는 프레임워크 스타일에 대해 주로 설명할 것이다.
(참조: http://api.jqueryui.com/theming/css-framework/)
Widget Containers
- ui-widget: 모든 위젯의 컨테이너 클래스. font-family와 font-size를 위젯에 적용함.
- .ui-widget-header: 헤더 컨테이너에 적용되는 클래스..
- .ui-widget-content: 콘텐츠 컨테이너에 적용되는 클래스.
Interaction States
- .ui-state-default: 버튼 같은 clickable 엘리먼트에 적용되는 클래스.
- ui-state-hover: 버튼 같은 clickable 엘리먼트에 mouseover 상태를 적용하는 클래스.
- ui-state-focus: 버튼 같은 clickable 엘리먼트에 focus 상태를 적용하는 클래스
- ui-state-active: 버튼 같은 clickable 엘리먼트에 active 상태를 적용하는 클래스
Interaction Cues
- ui-state-highlight: 하일라이트 또는 셀렉터블 엘리먼트에 적용되는 클래스.
- ui-state-error: 에러 메시지 컨테이너 엘리먼트에 적용되는 클래스.
- ui-state-error-text: 백그라운드 없이 에러 텍스트의 컬러에 적용되는 클래스.
- ui-state-disabled: diabled된 엘리먼트에 적용되는 클래스.
- ui-priority-primary: 계층적인 버튼이 필요한 상황에서 priority-1 버튼에 적용되는 클래스.
- ui-priority-secondary: 계층적인 버튼이 필요한 상황에서 priority-2 버튼에 적용되는 클래스.
Icons
States and images
- ui-icon: 아이콘 엘리먼트에 적용되는 기본 클래스.
Icon types
ui-icon이 선언된 후에 아이콘의 타입을 기술하기 위해 .ui-icon-{icon type}-{icon sub description}-{direction} 신택스를 갖는 클래스를 지정할 수 있다.
Corner Radius helpers
- ui-corner-tl: top-left corner radius
- ui-corner-tr: top-right corner radius
- .ui-corner-bl: bottom-left corner radius
- ui-corner-br: top-right corner radius
- ui-corner-top: top corner radius
- ui-corner-bottom: bottom corner radius
- ui-corner-right: right corner radius
- ui-corner-left: left corner radius
- ui-corner-all: all corners radius
Overlay & Shadow
- ui-widget-overlay: 100% 너미와 높이로 스크린을 오버레이하는 클래스. background color/texture, screen opacity를 적용함.
- ui-widget-shadow: 위젯 쉐도우 엘리먼트를 오버레이하기 위해 적용되는 클래스. background color/texture, corner radius, opacity, opt/left offset, shadow “thickness”를 적용함. thickness는 패딩으로 조절하고 offset은 top과 left 마진으로 조절함.
Example: ui-state-
<!-- button shape -->
<h3>ui-state-default, hover, focus</h3>
<div id="btn_shape" class="ui-state-default ui-corner-all">default state</div> <br>
<div id="btn_shape" class="ui-state-hover ui-corner-all">hover state</div>
Example: ui-state-highlight
<div class="ui-state-highlight ui-corner-all"
style="margin-top: 20px; padding: 0 .7em; width: 300px">
<p><span class="ui-icon ui-icon-info"
style="float: left; margin-right: .3em;"></span>
<strong>Hey!</strong> Sample ui-state-highlight style.</p>
</div>
Example: ui-state-error
<div class="ui-state-error ui-corner-all"
style="padding: 0 .7em; width: 300px">
<p><span class="ui-icon ui-icon-alert" s
tyle="float: left; margin-right: .3em;"></span>
<strong>Alert:</strong> Sample ui-state-error style.</p>
</div>
Example: ui-widget-header, content
<div class="ui-widget-content"
style="width: 300px;height: 300px;padding: 0.5em;">
<h3 class="ui-widget-header" style="margin: 0;text-align: center;">ui-widget-header and content</h3>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit...</p>
</div>
Example: overlay
<div class="ui-overlay" style="position:relative;width:500px;height:300px">
<!-- dark & slash pattern with opacity -->
<div class="ui-widget-overlay"
style="position:absolute;"></div>
<!-- more dark shadow area width opacity-->
<div class="ui-widget-shadow ui-corner-all"
style="width: 302px; height: 152px; position: absolute; left: 50px; top: 30px;"></div>
<!-- light gray box -->
<div class="ui-widget-content ui-corner-all"
style="position: absolute; width: 280px;
height: 130px;left: 50px; top: 30px; padding: 10px;">
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit...</p>
</div>
</div>
엘리먼트를 드래그 가능하게 하려면 엘리먼트에 대해 draggable() 함수를 호출한다.
$("selector").draggable();
draggable의 옵션으로는 다음과 같은 것들이 있다.
- scroll: true | false
- axis: "x" | "y"
- containment: "parent" | "document" | "window" | "selector"
- distance: px
- delay: ms
- handle: "selector"
- revert: true | false | "valid" | "invalid"
- helper: "clone" | function
scroll은 드래그하는 범위가 화면을 벗어날 경우에 자동으로 스크롤 되도록 할 것인지에 대한 것이다. axis는 드래그 방향을 x 축 방향 혹은 y축 방향으로 고정하기 위한 것이다.
containment는 드래그 가능 범위를 제한하기 위한 것이다.
distance는 최소한 px 만큼 마우스 드래그가 발생해야만 엘리먼트의 이동이 시작되도록 설정한다.
delay는 드래그 시작 후 ms가 지난 후에 엘리먼트 이동이 시작되도록 설정한다.
handle은 draggable로 설정된 엘리먼트에서 드래그 핸들을 지정하는데 이용한다. 이 엘리먼트를 마우스로 드래그 해야 드래그가 시작된다.
revert는 드래그를 멈추고 마우스 버튼-업 했을 때 원래 위치로 돌아갈지를 설정한다. true면 항상 돌아간다. valid와 invalid는 droppable 엘리먼트와의 동작에서 revert를 수행하는 방식을 지정한다. valid면 드롭된 후에도 revert한다. invalid면 droppable 영역 외에서는 revert되지만, droppable 영역에 드롭된 후에는 revert 되지 않는다.
helper: “clone”으로 설정하면, 엘리먼트는 그대로 있고 엘리먼트의 모양이 복사되어 이동된다. “clone” 대신 함수를 이용하여 커스텀 클론 모양을 만들 수 있다.
draggable의 이벤트로는 drag, start, stop로 이 이벤트 함수의 인터페이스는 function(event, ui)로 동일하다.
Example:
// draggable
$("#draggable").draggable({
scroll: true,
drag: function(event, ui){
// relative with parent (top, left)
var pos = ui.position;
// absolute (top, left)
var offset = ui.offset;
$("#disptext").text("position: ("+pos.top+","+pos.left+"), "
+ "offset: (" + Math.floor(offset.top) +"," +
Math.floor(offset.left) +")");
}
});
...
<p>Info: <span id="disptext"></span></p>
<div id="draggable" class="ui-widget-content">
<p>Drag me around</p>
</div>
드래그 가능한 엘리먼트를 특정 엘리먼트로 드롭 가능하게 하려면, 드래그 엘리먼트를 받아들일 엘리먼트에서 droppable() 함수를 이용한다.
$("selector").droppable();
droppable() 함수의 주요 옵션은 다음과 같은 것들이 있다.
- accept: "selector"
- activeClass: "css class"
- hoverClass: "css class"
- greedy: true | false
- revert: "valid" | "invalid"
accept은 만약 명시된다면, 명시된 엘린먼트만 이 엘리먼트에 드롭할 수 있다. activeClass와 hoverClass는 active or hover 상태에서 적용할 css를 지정한다. greedy는 droppable 엘리먼트가 중첩되어 있을 때, 부모로 이벤트가 전파되는 것을 막아준다.
droppable과 관련된 주요 이벤트는 drop으로, function(event, ui) 인터페이스를 갖는다. 이 함수의 파라미터 중, ui.draggable은 드롭된 엘리먼트에 대한 객체이다. 만약, accept를 명시했고 accept에 없는 엘리먼트가 드롭된다면 drop 이벤트는 발생하지 않는다.
Example:
...
.box1 {
float: left;
width: 150px;
height: 150px;
padding: 0.5em;
margin: 10px;
}
#droppable {
float: right;
width: 300px;
height: 300px;
padding: 10px;
margin: 10px;
}
...
$(function() {
// draggable
$(".draggable").draggable({
revert: "invalid"
});
$("#droppable").droppable({
accept: "[id ^= 'item']", // item으로 시작되는 id 엘리먼트만 받음.
activeClass: "ui-state-hover",
hoverClass: "ui-state-active",
greedy: true,
drop: function(event, ui) {
// #droppable의 리스트에 드래그된 엘리먼트 추가
var ulelem = $(this).find("ul");
ulelem.find(".dropmessage").remove();
$("<li></li>").text(ui.draggable.text()).appendTo(ulelem[0]);
// 드래그된 엘리먼트 감추기
ui.draggable.css("display","none");
}
});
});
...
<div id="item1" class="ui-widget-content box1 draggable">
<p>drag item 1</p>
</div>
<div id="item2" class="ui-widget-content box1 draggable">
<p>drag item 2</p>
</div>
<div class="ui-widget-content box1 draggable">
<p>drag item 3/this is not accepted.</p>
</div>
<div id="droppable" class="ui-widget-content">
<ul>
<li class="dropmessage">Drag to Here</li>
</ul>
</div>
엘리먼트가 리사이즈 가능하게 하려면 resizable() 함수를 이용한다.
$("selector").resizable();
resizable() 함수의 주요 옵션은 다음과 같다.
- animate: true | false
- containment: "selector"
- helper: css class
- maxHeight: number
- maxWidth: number
- minHeight: number
- minWidth: number
- aspectRatio: true | aspect ratio
- grid: number | [x_num y_num]
- ghost: true | false
animate는 최종 사이즈 변환 후에 엘리먼트를 애니메이션 효과와 함께 리사이즈한다. 사이즈 변환 중에는 점선의 가이드만 보인다.
containment는 지정된 엘리먼트의 범위 내에서만 리사이즈가 가능하도록 제한한다.
helper는 사이즈 변환 중에 보여줄 가이드의 스타일을 지정한다. 최종 사이즈 변환 후에 엘리먼트가 리사이즈 된다. 미리 정의된 클래스 중에 "ui-resizable-helper"가 있다.
min/max-들은 최소, 최대 너비와 높이를 지정한다.
aspectRatio는 리사이즈 할 때 가로 세로 길이의 비율을 유지할지에 대한 옵션이다. true면 원래 비율을 유지한다. 다른 숫자를 지정하면 해당 비율을 유지한다.
grid는 리사이즈에 그리드를 적용하는 옵션으로, 이 그리드에 따라서만 사이즈가 변경된다. 옵션 값만큼 리사이즈 가능 영역을 나누어 그리드를 만든다. (그리드가 보이지는 않음)
ghost가 true면 리사이즈 가이드와 함께 투명도가 적용된 엘리먼트를 함께 보여준다.
Example:
$("#resizable").resizable();
...
<div id="resizable" class="ui-widget-content box1">
<h3 class="ui-widget-header">Resizable</h3>
</div>
선택 가능한 엘리먼트로 지정하려면 selectable() 함수를 이용한다.
$("selector").selectable();
selectable로 지정된 엘리먼트가 선택 중이면 .ui-selecting 클래스가 지정되고 선택 완료되면 .ui-selected 클래스가 지정된다.
selectable()의 이벤트로는 selected, unselected, stop 등이 있다. 이벤트 핸들러 함수의 인터페이스는 function(event, ui)로 동일하다. selected 이벤트에서 선택된 엘리먼트는 ui.selected로, unselected 이벤트에서 선택 해제된 엘리먼트는 ui.unselected로 접근할 수 있다. stop 이벤트에서 ui는 형식상 있는 것으로 아무 역할을 하지 않는다.
바로 예제를 살펴본다.
Example
$( "#selectable" ).selectable({
stop: function() {
var result = $( "#select-result" ).empty();
// 선택된 엘리먼트에 대해 각가에 대해
$(".ui-selected", this).each(function() {
var index = $( "#selectable li" ).index(this);
result.append( " #" + ( index + 1 ) );
});
}
});
...
<p id="feedback">
<span>You've selected:</span> <span id="select-result">none</span>.
</p>
<ol id="selectable">
<li class="ui-widget-content">Item 1</li>
<li class="ui-widget-content">Item 2</li>
<li class="ui-widget-content">Item 3</li>
<li class="ui-widget-content">Item 4</li>
<li class="ui-widget-content">Item 5</li>
<li class="ui-widget-content">Item 6</li>
</ol>
sortable은 리스트의 아이템을 드래그해 재정렬할 수 있게 해주는 기능으로 sortable() 함수를 이용한다.
$("selector").sortable();
주요 옵션은 다음과 같다.
- placeholder: css class
- connectWith: "selector"
- dropOnEmpty: true | false
- items: “selector”
- cancel: “selector”
placehoder는 아이템을 위치시킬 부분에 적용할 css 클래스를 지정한다.
connectWidth는 엘리먼트 교환을 할 다른 sortable 리스트를 지정한다. 만약, 두 리스트가 서로를 connectWith로 지정하면 두 리스트 간에 엘리먼트를 교환할 수 있다.
dropOnEmpty를 false로 지정하면 리스트가 비더라도 엘리먼트를 받을 수 있다. 이 옵션을 false로 지정하지 않은 상태에서 리스트가 비게 되면 엘리먼트를 더 이상 받을 수 없다.
items는 sortable한 엘리먼트 아이템들을 지정한다. cancel은 sortable하지 않을 엘리먼트 아이템을 지정한다.
Example:
$("#sortable").sortable();
$("#sortable").disableSelection();
<ul id="sortable">
<li class="ui-state-default">Item 1</li>
<li class="ui-state-default">Item 2</li>
<li class="ui-state-default">Item 3</li>
<li class="ui-state-default">Item 4</li>
<li class="ui-state-default">Item 5</li>
<li class="ui-state-default">Item 6</li>
<li class="ui-state-default">Item 7</li>
</ul>
JQuery-Mobile인 웹 어플을 위한 자바스크립트 라이브러리이다. 이 라이브러리를 포함시키는 방법은 JQuery로부터 다운받아 설치하거나 온라인 설치하는 것이다.
<meta name="viewport"
content="width=device-width, initial-scale=1" charset="EUC-KR">
<link rel="stylesheet"
href="css/themes/default/jquery.mobile-1.4.2.min.css">
<script src="js/jquery.js"></script>
<script src="js/jquery.mobile-1.4.2.min.js"></script>
메타데이터 viewport는 페이지 크기에 대한 정보를 제공하는 역할을 한다. 위 설정은 페이지 스크린의 너비를 장치의 픽셀 너비로 설정한다.
직접 다운받아 임포트하는 방법 대신 외부 링크를 이용하길 원한다면 다음과 같이 한다.
<link rel="stylesheet"
href="http://code.jquery.com/mobile/1.4.2/jquery.mobile-1.4.2.min.css">
<script src="http://code.jquery.com/jquery-1.10.2.min.js"></script>
<script
src="http://code.jquery.com/mobile/1.4.2/jquery.mobile1.4.2.min.js">
</script>
JQuery-Mobile 페이지는 div 태그와 data-role을 이용해 구성한다. 다음은 단일 페이지 구성에 대한 예이다.
<div data-role="page" id="pageone">
<div data-role="header">
<h1>Header Text</h1>
</div>
<div data-role="main" class="ui-content">
<p>Hello World</p>
</div>
<div data-role="footer">
<h1>Footer Text</h1>
</div>
</div>
한 페이지는 data-role이 page인 <div> 태그로 감싸인다. 이 페이지 내부는 헤더(header), 메인 콘텐츠(main), 풋터(footer)로 구성된다.
여러 개의 페이지를 구성하고자 한다면, 페이지를 연속해서 사용하면 된다. 페이지 간의 이동은 <a> 태그를 이용하며, 페이지의 아이디를 링크로 사용하면 된다. 페이지를 다이얼로그 형태로 보여줄 수도 있다. data-dialog=”true” 속성을 추가하면 된다.
<div data-role="page" id="pageone">
...
<div data-role="main" class="ui-content">
<p>This is Page One.</p>
<a href="#pagetwo">Go to Page Two</a>
<a href="#pagethree">Go to Page Three</a>
</div>
...
</div>
<div data-role="page" id="pagetwo">
...
<div data-role="main" class="ui-content">
<p>This is Page Two.</p>
<a href="#pageone">Go to Page One</a>
</div>
...
</div>
<div data-role="page" data-dialog="true" id="pagethree">
...
<div data-role="main" class="ui-content">
<p>This is Page Three.</p>
<a href="#pageone">Go to Page One</a>
</div>
...
</div>
기본적인 페이지 구성을 위한 data-role을 살펴보았다. 나머지 data-role 목록은 다음과 같다.
- "button"
- "collapsible"
- "collapsible-set"
- "content"
- "controlgroup"
- fieldcontain"
- "flipswitch"
- "footer"
- "header"
- "listview"
- "navbar"
- "page"
- "popup"
JQuery Mobile 사용법은 w3school을 참조하라.
|