레이블이 jQuery인 게시물을 표시합니다. 모든 게시물 표시
레이블이 jQuery인 게시물을 표시합니다. 모든 게시물 표시

2015년 12월 2일 수요일

Html : 스크롤바를 모바일 형태로 꾸며 주는 "perfect-scrollbar"

요즘은 폰으로 웹을 사용하는 것이 일반적이다.
그러다 보니 PC 에서 사용하는 일반적인 웹들도 모바일 페이지를 모사하려는 경향이 있다.
뭐... 모바일 페이지가 좀 세련되어 보이긴 한다...

그 중 하나가 스크롤바.
일반적인 스크롤 바는 이런 형태.

마우스로 클릭하기 편하게 하기 위해 좀 큼지막 하다.
하지만 모바일 페이지에서 스크롤바는 대부분 좀더 가늘다. 
(터치로 스크롤하니 사실 거의 필요가 없으니...)


모바일에선 이렇게...


사용성면에선 두꺼운게 좋지만, 미관상으론 얇은게 보기 좋다.
이것을 Pc 에서도 쉽게 구현하게 해주는 "perfect-scrollbar" 이 있다.



파일은 해당 사이트의 하단에 보면 다운로드 버튼이 있다.


이것도 오픈소스라, 다운로드 버튼을 클릭하면 "GitHub" 로 이동하는데, 거기서 원하는 버젼을 다운 받으면 된다.


어차피 CSS 와 Javascript 라서 아무데나 원하는 곳에 압축을 풀고 경로만 지정하면 쓸수 있다.
원래는 jQuery 없이도 동작하지만, 요즘은 워낙 jQuery 를 많이 쓰니 그냥 쓴다고 셈치고 작업한다. (jQuery 없이 사용하는 소스를 배포 사이트에서 샘플을 보면 된다.)


보다시피 사용은 간단하다.
그냥 스타일시트와 자바스크립트를 링크하고, 스크롤바를 적용할 오브젝트를 지정하기만 하면 끝.

<!DOCTYPE HTML>
<HTML>
<HEAD>
<TITLE>perfect-scrollbar</TITLE>
<LINK href="./perfect-scrollbar/css/perfect-scrollbar.min.css" rel="stylesheet">
<STYLE>
    #Demo {
        position:relative; margin:0px auto;
        padding:0px;
        width: 600px; height: 400px;
        overflow: hidden;
    }
</STYLE>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<script src="./perfect-scrollbar/js/perfect-scrollbar.js"></script>
<SCRIPT>
    $(function() {
        Ps.initialize(document.getElementById('Demo'));
    });
</SCRIPT>
</HEAD>
<BODY>
<div class="description">
    <div id="Demo">
        <img src="Koala.jpg">
    </div>
</div>
</BODY>
</HTML>


이렇게 하면...


그냥 볼때는 아무런 스크롤바가 나타나지 않지만... 마우스를 스크롤바 위치에 올려 놓으면...


이렇게 가느다란 스크롤바가 나타난다.


2015년 9월 9일 수요일

jQuery C# : jQuery 달력이 UpdatePanel 에서 PostBack 이 발생시 더 이상 작동 하지 않을 때.

C# 에서 jQuery 달력을 쓰는데, 일반적으로는 잘 동작하는데, UpdatePanel 에 넣었더니 동작하지를 않는다.


이렇게 UpdatePanel 안에 클릭하면 달력이 나타나게 하는 텍스트 박스와 버튼을 배치 해놓고...


텍스트 박스를 클릭하면 ....


이렇게 달력이 뜬다. 그런데... 같은 UpdatePanel 내의 버튼을 클릭하여 PostBack 을 발생 시키면...


이렇게 텍스트 박스를 클릭해도 더이상 달력이 뜨지 않는다.
아무래도 UpdatePanel 영역이 갱신되면서 생성되었던 오브젝트가 없어져 버린것 같은데, 이게 생성 스크립트를  UpdatePanel 에 같이 넣어 놔도 해결이 안된다.

이때,    
    var prm = Sys.WebForms.PageRequestManager.getInstance();
    prm.add_endRequest();

... 를 사용하면 비동기 통신을 수행 할때, 특정 스크립트를 실행 하게 할 수 있다.
즉, 이렇게...


요렇게 해놓고 다시 시도 해보면...



이렇게 PostBack 이 발생해도 텍스트 박스를 클릭시 달력 창을 띄울 수 있다.



2015년 8월 21일 금요일

jQuery : 화면 크기가 바뀔때 자동으로 크기를 조절

[예제]

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="testDivScroll.aspx.cs" Inherits="web_Tmp_testDivScroll" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
    <style>
        * {
            margin:0; padding:0;
            border:0;
        }
        html, body, .form, .wrap, .body
        { height:100%; }

        .wrap   { width:100%;}
        .head   { background-color:aqua;}
        .body   { background-color:aliceblue;; height:100%;}
        .footer { clear:both; background-color:black;}

        .left   { background-color:hotpink; float:left; width:100px; height:100%; overflow:auto;}
        .right  { background-color:olive; float:left; width:500px; height:100px; overflow:auto;}

        .divTable  {display:table;}
        .divTr  {display:table-row;}
        .divTd  {display:table-cell;}
    </style>

    <script src="http://code.jquery.com/jquery-1.8.3.js"></script>
    <script>
        $(window).resize(function () {
            setTimeout(function () {
                var w1 = $('.body').innerWidth();
                var w2 = $('.left').innerWidth();

                var h1 = $('.body').innerHeight();

                $('.right').css('width', w1 - w2);
                $('.right').css('height', h1);
            }, 1000);
        });
    </script>

</head>
<body>
    <form id="form1" class="form" runat="server">
    <div class="wrap divTable">
            <div class="head divTr">head</div>
            <div class="body divTr">
                <div class="left divTd">left</div>
                <div class="right divTd">
                    right<p/>right<p/>
                    right<p/>right<p/>
                    right<p/>right<p/>
                    right<p/>right<p/>
                    right<p/>right<p/>
                    right<p/>right<p/>
                    right<p/>right<p/>
                    right<p/>right<p/>
                    right<p/>right<p/>
                    right<p/>right<p/>
                </div>
            </div>
            <div class="footer divTr">footer</div>
    </div>
    </form>
</body>
</html>

여기서 핵심은...


이부분.
resize 가 발생할때 처리할 구문...

이렇게 해놓으면...


원래 이랬던 것이, 창의 크기를 변경 시키면...


요렇게 창의 크기에 맞에 셀크기를 조정해 준다.

여기서 "setTimeout" 을 둔것은 가끔 수치를 잘못 가져 오는데, 이걸 방지하기 위함이다.
하지만... 이렇게 해도 가끔 수치가 안맞아 레이아웃이 깨진다는거...

결국, 이걸 100% 신뢰 할 정도는 아니다.
그냥, 가끔 필요할 때 쓸만하다는 정도...

2015년 5월 19일 화요일

C# 웹서비스로 JSON 결과값 생성하기

.Net 에는 웹서비스라는 좋은 기능이 있지만, 웹서비스란게 나올 당시에는 Xml 이 대세였던지라, 기본적인 결과값은 Xml 로 나오고, 웹에서 찾을수 있는 대부분의 예제들도 거의 대부분 Xml 을 가지고 설명한다.

하지만, 요즘은 JSON 이 대세인지라... .Net 웹서비스도 JSON 결과값을 출력할 필요가 있다.

일단 간단하게 웹서비스를 하나 생성하고...



서비스 이름은 아무거나 주면 되지만, 나의 경운 testService 라고 주었다.


"다른 파일에 코드 입력" 이 체크되어 있어서 "testService.asmx" 에는 별 내용이 없다.


이대로 냅두면 되고...


"testService.cs" 를 아래와 같이 편집한다.


[Source]

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;

using System.Web.Script.Services;
using System.Web.Script.Serialization;  

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.Web.Script.Services.ScriptService]
public class testService : System.Web.Services.WebService 
{
    public testService () {
        //InitializeComponent(); 
    }

    [WebMethod]
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
    public string getMemberInfoJson()
    {
        Member[] info = new Member[] {  
            new Member()  
            {  
                Id  = "User01",  
                Name= "Guest"
            },  
            new Member()  
            {  
                Id  = "Son10001",  
                Name= "Son"
            }  
        };
        return new JavaScriptSerializer().Serialize(info);  
    }

    [WebMethod]
    public Member[] getMemberInfoXml()
    {
        Member[] info = new Member[] {  
            new Member()  
            {  
                Id  = "User01",  
                Name= "Guest"
            },  
            new Member()  
            {  
                Id  = "Son10001",  
                Name= "Son"
            }  
        };
        return info;
    }

    public class Member
    {
        public string Id { get; set; }
        public string Name { get; set; }
    }

}




다른건 별로 신경쓸것 없고, 아래에 표시한 상자의 내용만 주의 하면 된다.


이렇게 하고 웹에서 해당 웹서비스를 열어 보면...


이렇게 웹서비스가 2개 등록되어 있는게 보일것이다.
일단 JSON 이 목적이니 "getMemberInfoJson" 을 클릭해본다.


저기서 "호출" 이라는 버튼을 클릭해보면...


이렇게 JSON 형태로 결과값이 나온다.


마찬가지로 "getMemberInfoXml" 선택해 호출하면...

 이렇게 Xml 로 결과 값이 나온다.

이걸 웹에서 jQuery 로 호출해 보면...


<%@ Page Language="C#" %>

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>

    <title></title>
    <script src="js/jquery-1.4.4.min.js"></script>
    <script src="js/jquery-ui-1.8.8.custom.min.js"></script>
    <script>
        function HelloQuery() {
            $.ajax({
                type:"POST",
                url: "http://localhost:915/_Test/testService.asmx/getMemberInfoJson",
                processData:false,
                contentType:"Application/json;charset=utf-8",
                dataType:"json",
                success:function (data) {
                    alert(data.d);
                }
            });
        }
    </script>
</head>

<body>
    <form id="form1" runat="server">
    <div>
        <a href="#" onclick="HelloQuery()">Test</a>
    </div>
    </form>
</body>
</html>


이렇게 웹페이지를 만들고...


클릭해 호출... 하면...


이렇게 JSON 으로 결과값을 받을 수 있다.






2014년 10월 30일 목요일

이미지 슬라이드를 쉽게 구현 할 수 있는 Easy Slider 의 페이지 위치 바꾸기.

홈페이지를 만들다 보면 이미지 슬라이드(이미지가 주기적으로 반복되는 이미지 뷰)를 쓸경우가 많다.

기능 자체가 간단하면서도 많이 쓰이는 기능이다 보니, 워낙 많은 종류가 있는데,
요즘에 주로 사용하는 스크립트는  Easy Slider 이다.

스크립트 자체가 jQuery 기반으로 간략하게 짜여져 있어서, 쓰기도 간편하고, 문제가 발생할 일이 별로 없다.

http://cssglobe.com/easy-slider-17-numeric-navigation-jquery-slider/

여기서 배포하고 있으니, 필요하면 다운 받으면 된다.


아예 제목 부터가 "Easy" 인 만큼. 쓰는 법도 정말 간단하다.
그냥 "easySlider1.7.js" 파일을 인크루드 시킨다음.



<div id="slider">
 <ul>    
  <li><a href="http://templatica.com/preview/30"><img src="images/01.jpg" alt="Css Template Preview" /></a></li>
  <li><a href="http://templatica.com/preview/7"><img src="images/02.jpg" alt="Css Template Preview" /></a></li>
  <li><a href="http://templatica.com/preview/25"><img src="images/03.jpg" alt="Css Template Preview" /></a></li>
  <li><a href="http://templatica.com/preview/26"><img src="images/04.jpg" alt="Css Template Preview" /></a></li>
  <li><a href="http://templatica.com/preview/27"><img src="images/05.jpg" alt="Css Template Preview" /></a></li>   
 </ul>
</div>
<script type="text/javascript">
 $(document).ready(function(){ 
  $("#slider").easySlider({
   auto: true, 
   continuous: true
  });
 }); 
</script>



... 만 해주면 된다.

문제는 숫자 페이지를 적용시켰을 땐데....



이렇게 밑에 해당 페이지가 나오게 된다.
만약 저 숫자 페이지를 상단에 오게 만들려면 어떻게 하면 될까?

간단한데...

그냥. "easySlider1.7.js" 에서



이렇게 "$(obj).after(html);" 부분을 ...


"$(obj).before(html);" 로 바꾸면 된다.


그러면 이렇게 페이지 영역이 상단으로 이동하게 된다.
이것을 이용하면, 원하는 위치에 문구를 넣거나 제목을 지정하는 것도 가능하다.


jQuery datepicker 에서 달력이 다른 레이어에 가려질때.

요즘은 jQuery 가 많이 사용되다 보니, 예전같으면 만드느라 꽤나 고생했을 달력 같은 기능들을 아주 손쉽게 달수 있어 편리하다.

하지만, 역시 완벽한 것은 없어서, datepicker 를 쓰다보면 다른 레이어 밑으로 숨어버려 곤란 할때가 있다.

바로 아래 이미지와 같은 경우인데, 텍스트 박스에 datepicker 를 달아 놓아서 해당 텍스트 박스를 클릭하면 바로아래에 달력이 나오도록 한 것인데, 그 아랬쪽에 달아 놓은 웹 에디터에 있는 체크 박스와 겹쳐지면서, 그 체크 박스가 달력 위로 나타난다.

물론 다른 아이콘이 있을 경우에는 그 아이콘들도 달력위로 불쑥 솟아나 나온다.
지금 이것은 어떻게든 피해볼려고 아이콘이 없는 쪽으로 최대한 구석에 달아 본것.
하지만,  결국 완전히 피할수는 없어서 어떻게든 달력 레이어를 상위로 올려 보낼 방법을 찾아야 했다.



일반적으로 이런경우 position:absolute 속성을 가진 레이어가 하위 레이어라 계층우선순위에서 밀려서 그런거라서, 대부분 z-index 를 높여주는거 밖에는 답이 없다.

이것은 jquery-ui.js 라는 파일을 수정하면 되는데, 특정 버젼일 경우 jquery-버젼-ui.js 이런 형태의 파일일 것이다. 뭐든 자신이 쓰고 있는걸 열어 보면된다.

하여간 해당 파일을 열어보면

 inst.dpDiv.zindex($(input).zindex()+1);

이라는 문장이 있다.


이 부분에서 +1을 높은 값으로 바꿔 주면 된다.

 inst.dpDiv.zindex($(input).zindex()+999);

나의 경우는 999를 썼지만, 적당히 높은 값이면 된다.
(이런 팝업형 기능일경우에는 무조건 최상단에 나와야 하니, 기본적으로 높은 값을 기록하는게 맞지 않나 싶지만, 배포를 그렇게 하고 있으니 어쩔수 없다.)



이렇게 수정한뒤 해당 페이지를 리로드 해서보면



이렇게 제대로 최 상위로 나오게 된다.




2014년 7월 14일 월요일

jQuery 의 dialog 를 이용한 PopUp

나모 웹에디터를 사용하던 시절이나 지금이나 홈페이지를 만들때 메인 페이지에서 빠지지지 않는 것이 있으니, 팝업창이다.
그것도 메인 페이지에서 뜨는 "광고" 혹은 "공지" 팝업창.

마구잡이로 뜨는 팝업창이 미관상 보기 않좋기도 하고, 보안상 문제가 되기도 해서, 이제는 거의 모든 웹브라우져들이 자동으로 뜨는 팝업창 자체를 아에 안띄우게 만들어 버렸지만, 끝없는 클라이언트의 요구로 이제는 팝업창이 아니라 팝업 레이어를 띄우게 되어 버렸다.

팝업 킬러 같은 것으로 어느정도 차단이 가능했던 팝업창 시절에 비하면, 아예 뜨는걸 막는게 불가능한 팝업레이어는 오히려 더 상황이 악화된게 아닌가 하는 생각도 든다... ^^;

하여간, 요즘은 onLoad 시 window.open() 으로 여는 팝업창이 기본적으로 필터링 되어 열리지 않으므로 어쩔수 없이 레이어를 써서 팝업창을 구현하는데, 어차피 어려운 기능은 아니긴하나, jQuery 를 이용하면 훨씬 간단히 구현 할 수 있다.

단, <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> 으로 doctype 이 지정되어 있을경우 안먹히는 경우도 있으니 주의...

참고 : http://api.jqueryui.com/dialog/

<link rel="stylesheet" href="//code.jquery.com/ui/1.11.0/themes/smoothness/jquery-ui.css">
<script src="//code.jquery.com/jquery-1.10.2.js"></script>
<script src="//code.jquery.com/ui/1.11.0/jquery-ui.js"></script>

<div id="dialog" style="width:80%" title="Dialog Title">
 <div style="width:100%">
   <font color="red"><b>
   팝업창 내용
   </b></font>
 </div>
</div>
<script>
 $( "#dialog" ).dialog({ 
                autoOpen:true, //자동으로 열리지않게
    width:450,
    height:180,
    modal:false, //모달대화상자
                resizable:false, //크기 조절 못하게
    show : 'slide', hide : 'slide',
    position : [500, 500],
                
                buttons:{
                    "확인":function(){
                        $(this).dialog("close");
                    }
                }
 });
</script>


2014년 6월 30일 월요일

JQuery 를 이용한 Header & Footer

모바일 페이지를 만들다 보면 상단 타이틀과 하단 바로 가기를 구현하기 위한 Footer 를 구현해야 할때가 있다.

물론 그냥 공통 모듈 만들어서 include 형태로 html 로 간단히 구현할수도 있겠지만, 모바일이다 보니 해상도 처리도 그렇고 jQuery 로 처리하는 것이 여러모로 보기가 좋다.


<!DOCTYPE html>
<html>
<head>
 <script src="http://code.jquery.com/jquery-1.9.1.min.js"></script>
 <script src="http://code.jquery.com/mobile/1.3.2/jquery.mobile-1.3.2.min.js"></script>

 <link rel="stylesheet" href="http://code.jquery.com/mobile/1.3.2/jquery.mobile-1.3.2.min.css" />
 <style>
  div.m_footer{position:fixed;z-index:100000;left:0;bottom:0;width:100%;height:50px;}
  #m_footer_icon{width:520px;margin:0 auto 0;list-style:none;padding:0;}
  #m_footer_icon li{height:53px;float:left;margin:0;padding:0;}
  #m_footer_icon li a{display:block;}
 </style>
</head>

<body>

<div data-role="page">
  <div data-role="header">
    <a href="#" data-role="button" data-icon="home">Home</a>
    <h1>타이틀</h1>
    <a href="#" data-role="button" data-icon="search">Search</a>
  </div>

  <div data-role="content">
    <h1>본문</h1>
  </div>

  <div data-role="footer" data-position="fixed" class="m_footer">
   <ul id="m_footer_icon">
   <li style="position:relative"><a href="#" data-role="button" data-icon="plus">Home</a></li>
   <li style="position:relative"><a href="#" data-role="button" data-icon="plus">Sub Menu01</a></li>
   <li style="position:relative"><a href="#" data-role="button" data-icon="plus">Sub Menu02</a></li>
   <li style="position:relative"><a href="#" data-role="button" data-icon="plus">Sub Menu03</a></li>
   <li style="position:relative"><a href="#" data-role="button" data-icon="plus">Search</a></li>
   </ul>
  </div>

</div>
</body>
</html>

위의 코드를 사용하면 창의 크기가 변하더라도 항상 Footer 가 최 하단에 있게 된다.
중요 한 것은 [data-position="fixed"] 인데 이 옵션이 붙어 있으면 헤더와 풋터가 폼의 상/하단에 항상 고정되어 있게 된다.
(추가: 기본적으로 content 영역을 클릭시 헤더와 풋터가 사라지게 되어 있는데, data-tap-toggle="false" 를 덧붙여 놓으면 해당 기능이 작동하지 않는다.)

주의 해야 할것은 jQuery 첨부 순서도 위의 코드 순서로 해야지, 순서가 바뀌어도 적용이 안된다.