개발팁2021. 3. 18. 21:48

스틸 이미지가 많이 나오는 웹화면을 좀 더 다이나믹하고 보이려면 어떻게 해야 할까..

네이버 메인이나, 이미지 많은 쇼핑몰에서 주로 쓰는 방법이 마우스를 이미지 위로 올려놓을때, 이미지를 확대해서 보여주는 방법이다.

 

 

 

 

css 스타일시트를 분석해 볼 줄 안다면 아래와 같은 형태의 코드로 되어 있다는 것을 알 수 있다.

 

.default_list table tr:hover .photo img {
  -moz-transition: all 0.3s;
  -webkit-transition: all 0.3s;
  -ms-transition: all 0.3s;
  transition: all 0.3s;
  -moz-transform: scale(1.1);
  -webkit-transform: scale(1.1);
  -ms-transform: scale(1.1);
  transform: scale(1.1);
}

 

 

hover 즉, 마우스가 이미지 위로 올라왔을때 css 가 적용된다.

이미지를 확대해서 동적으로 보여주는 css 스타일은 2가지다.

 

transform: scale(1.1);

 

즉, 10% 확대해서 보여준다는 것이다.

scale(1.5) 로 하면, 50% 확대가 된다.

 

하지만, 이 효과만 있다면, 마우스 오버시 즉시 확대된다.

여기에 좀더 동적으로 보여지게 하는것이

 

transition: all 0.3s;

 

즉, 0.3 초 동인 A -> B 의 변화를 보여준다는 것이다.

 

(A)원래이미지 -> (B)확대된이미지

 

A에서 B 로 변화하는 과정을 보여준다는 것이다.

 

1.0s 로 바꾸면, 1초동안의 변화를 볼 수 있다.

 

 

어라, css 스타일은 2가지라고 했는데, 처음의 css 를 보면 몇가지 다른것들이 보인다.

 

-webkit-transform  // 크롬, 사파리
-moz-transform     // 파이어폭스
-ms-transform       // 익스플로러

 

위 3종류는 브라우저 호환성을 위해서 쓰여진 것이다.

 

 

 

이제, G마켓은 이미지 확대 기능이 적용되지 않은 사이트인데, 아래의 주소로 이동해서 테스트를 해볼 것이다.

 

corners.gmarket.co.kr/Bestsellers

 

아래 자바스크립트 코드를 실행해보자. (크롬의 개발자도구)

 

$('img').hover(function(){
    $(this).css("transform", "scale(1.1)");
    $(this).css("transition", "all 0.3s");
  }, function() {
    $(this).css("transform", "scale(1)");
});

 

이제 G마켓 사이트도 동적으로 이미지가 확대되는걸 볼 수 있다.

 

 

 

 

scale 숫자와 transition 숫자를 바꿔가면서 테스트 해보면, 재밌는 효과를 볼 수 있다.

 

Posted by 헝개
개발프로그램2019. 3. 6. 18:03

Locale File Manager

 

i18n 의 json 으로된 다국어 팩을 관리해주는 프로그램입니다.

 

 

 

 

언어별로 분리된 JSON 형식의 파일을 읽어서, 그리드에 통합하여 보여주고, 행단위로 추가/수정/삭제하여,

json 파일로 다시 저장이 가능합니다.

 

엑셀로 Export 하여, 번역가에게 전달하여, 엑셀에서 바로 번역 작업을 하고,

Import 할 수 있습니다.

 

편집이 끝난후, write 하게 되면, 각각의 언어별로 분리하여, json 파일로 저장해 줍니다.

 

 

 

각 언어별 json 파일은 아래와 같이 폴더명이 언어단축코드로 되어 있으며, 안에 .json 또는 .txt 으로 되어 있습니다.

프로그램에서 저장을 하면, 기존 로딩된 파일과 같은 이름으로 저장을 하며, 이때, 기존 파일은 .bak 파일로 백업합니다.

 

 

 

 

json 파일의 형식은 json object 형식에 맞게 되어 있어야 하며,

아래와 같이 2 depth 또는 3 depth 까지 지원합니다.

 

 

 

 

편집 방법은 그리드의 셀안에서 바로 수정이 가능하며,

오른쪽 편집 FORM 에서 수정할 수 있고, 추가도 가능합니다.

 

불필요한 행의 삭제는 그리드에서 행단위로 선택 후 Delete 키를 누르면 삭제가 됩니다.

 

 

또한 구글번역기 또는 네이버 파파고 번역기를 이용하여, 바로 번역을 해볼 수 있습니다.

 

 

 

 

편집창의 TEXTBOX 를 더블클릭하면, 자동으로 번역이 됩니다.

 

번역결과를 TEXTBOX 로 가져오기 위해서는 마우스로 번역텍스트를 긁어서 (DRAG) TEXTBOX 로 떨궈놓기 (DROP) 만 하면 됩니다.

 

 

번역가가 따로 있을경우, .json 파일로 보내주고 편집하라고 하면, 혼란이 생기기 때문에,

Export Excel 로  .xls 파일을 보내주고, 번역을 요청하십시요.

번역이 완료된 .xls 파일을 Import Excel 해서 저장하시면, 언어  단위 개별 .json 으로 저장이 됩니다.

 

 

 

ps. 윈도우10 이상, 닷넷 프레임웍 4.7.2 이상이 설치되어 있어야 실행됩니다.

 

 

LocaleFileManager_v3_3_3.zip
3.31MB

 

 

압축을 풀고 LocaleFileManager.exe 를 실행하세요.

readme.txt 파일을 읽어주세요.

 

 

 

Release Note

 

v1.6 - 2020.03.31 Release

- 네이버 파파고, 구글 번역기 선택하여 번역할 수 있는 기능 추가

 

 

본 프로그램의 첨부파일을 다른곳에 게시하실 수 없습니다. 
블로그 링크를 올리거나 소개하는 것은 전혀 상관이 없습니다.
카페가 블로그 등에 많은 소개 부탁드립니다.

 

 

Posted by 헝개
개발팁2018. 11. 7. 12:40

ajax 는 말그대로, 비동기 통신을 하기 위한, 도구이다.


jquery 에서는 $.ajax 또는 jQuery.ajax 라는 메서드를 통해서, 쉽게 ajax 를 이용할 수 있다.


내부적으로는 XMLHttpRequest 를 이용하고 있으며, 여러가지 편의 기능, option 을 제공하고 있다.


이중에서도, 매번 ajax 로 요청할때, 동일하게 사용하는 option / 처리가 끝나고 결과에(response) 대해 성공/실패/항상 처리해야 할일을 


$.ajaxSetup 에 미리 정의해 놓으면, 코드양도 줄여주고, 간결해지게 된다.



여기서 다룰 내용은, $.ajax 요청이 비동기(asyncronous) 요청이기 때문에, 이를 위해, promise 처리를 하는 방법이다.


기본적으로, $.ajax 요청의 결과를 받는 방법으로 많이 사용되는것이,


complete


success


error


ajax 요청이 완료되고 결과(response) 가 나오면, 우선적으로, complete 에 정의된, 함수 (또는 콜백함수) 가 실행이 된다.


그리고 나서, 결과가 http 오류인지 http 성공(200 ok) 인지에 따라, success / error 에 정의된 함수 (또는 콜백함수) 가 실행이 된다.


이 방식은, 비동기 요청(ajax) 를 하고 나서, 처리결과에 따라, 다음 작업을 진행해야 할때마다, 매번 callback 함수를 사용해야 하는 문제를 발생시킨다. (불편한 코드의 문제...)


다행이도, $.ajax 는 위의 함수(또는 콜백함수) 기능외에 Promise 패턴이 적용되어 있다. (jquery  의 deferred 로 구현됨)



$.ajax({ url : '/post/url', data: 'param, ... } ).then( function(result, status, responseObj) {

성공일때 내용...

}, function (result, status, responseObj) {

실패일때 처리할 내용...

});


위와 같이 코드를 작성할 수 있다, 뒤의 실패일때의 function 부분은 생략도 가능하다.


이 코드는 다시 아래와 같은 형태로 변경이 가능다.


$.ajax({ url : '/post/url', data: 'param, ... } ).done( function(result, status, responseObj) {

성공일때 내용...

}).fail(function (result, status, responseObj) {

실패일때 처리할 내용...

});


then() 은 done(), fail() 로 분리해서 처리할수 있다.

성공/실패 여부와 상관없이 항상 실행해야 할 코드는 always() 에 넣어줄 수 있다.

 $.ajax({ url : '/post/url', data: 'param, ... } ).done( function(result, status, responseObj) {


성공일때 내용...


}).fail(function (result, status, responseObj) {


실패일때 처리할 내용...


}).always(function (result, status, responseObj) {


항상 처리할 내용...


});



done() 이나 fail() 이 먼저 실행되고 난 후에 always 가 실행이 될것이다.



여기서 주의할 점은, $.ajax 의 promise 패턴은 http response 의 성공(200 ok) 이냐 실패냐에 기인한다는 점이다.

이는, 논리적인 성공 실패가 아니라, 물리적인 성공/실패를 의미하는 것이다.




웹서버에서 오류가 났을때, http 오류가 아니라, 적당한 오류 코드 와 오류 메세지를 response 해준다면, 어떨까?


그렇다면, $.ajax 는 이를 성공으로 간주하게 되어, 성공(done) 에서 논리적인 오류인지를 체크해야 한다.




이를 간소화 하기 위해서 아래와 같이 $.ajax 에 또다른 Promise 패턴을 적용한 래퍼함수(Wrapper) 를 만들 수 있다.


jquery 에서는 promise 패턴을 구현하기 위해, $.Deferred 라는 것을 제공하고 있다.


(실제 promise 패턴을 이용하기 위해 Promise 객체가 있지만, IE 에서는 지원하지 않기때문에, 호환성을 위해, $.deferred 를 사용했다.)



성공, 실패에 대해서는, resolve / reject 함수를 제공하며, 결과는 promise() 를 리턴해주면 된다.


$.ajax.promise = function (options) {

    var deferred = $.Deferred();


    $.ajax(

        options

    ).done(function (result, status, responseObj) {

        if (!result.bSuccess)    // failed

        {

            deferred.reject(result, status);

            return;

        }


        //data = JSON.parse(result.sJsonData);

        data = ( result.sJsonData == null || result.sJsonData == "" ) ? null : JSON.parse(result.sJsonData);


        deferred.resolve(result, data);

    }).fail(function (result, status, responseObj) {

        deferred.reject(result, status);

    });


    return deferred.promise();

}



이 코드의 전제는 json 데이터를 받는다는 점이고, result 에 bSuccess 라는 속성이 존재한다는 점이다.


$.ajax 의 래퍼함수인 $.ajax.promise 를 이용하여, 위의 $.ajax promise 이용 예를 다시 호출해보면 아래와 같다.


 $.ajax.promise({ url : '/post/url', data: 'param, ... } ).done( function(result, data) {


성공일때 내용...


}).fail(function (result, status, responseObj) {


실패일때 처리할 내용...


}).always(function (result, status, responseObj) {


항상 처리할 내용...


});



이제, 위 코드의 성공/실패 코드는 물리적인 http 오류외에도, 논리적인 오류에도 대응되는 코드로 변경이 된다.


위 코드는 단일 ajax 코드를 실행하는 방법이고, jquery 에서는 여러개의 promise 패턴을 처리하는 방법으로,


$.when 이라는 함수를 체공한다.



var pr1 =  $.ajax.promise({ url : '/post/url', data: 'param, ... } );

var pr2 =  $.ajax.promise({ url : '/post/url', data: 'param, ... } );

var pr3 =  $.ajax.promise({ url : '/post/url', data: 'param, ... } );


$.when(pr1, pr2, pr3).done(function() {

      모두 성공일때...

});

비동기 메서드이기 때문에, 위의 3줄은 같은 시기에 실행이 되지만, 결과는 제각각 다르게 나올것이다.

하지만, 모든 실행이 끝나고 나서, 처리해야할 내용이 있을때,

done() 함수에 넣어주면 된다.


$.when 도 promise 패턴으로 구현되어 있기 때문에,


done / fail / then 모두 사용가능하다.



Posted by 헝개
개발팁2016. 9. 12. 13:48

jquery 를 이용한 드래그앤드랍 파일업로드 방법이다.

 

우선, 파일을 탐색기에서 드래그하여, 드랍할 영역을 아래와 같이 만든다.

 

<style>
    #dropzone
    {
        border:2px dotted #3292A2;
        width:90%;
        height:50px;
        color:#92AAB0;
        text-align:center;
        font-size:24px;
        padding-top:12px;
        margin-top:10px;
    }
</style>

 

<div id="dropzone">Drag & Drop Files Here</div> 

 

웹브라우저로 보면, 아래와 같이 나타나게 된다.

 

 

이제 div 영역에 아래와 같이, 자바스트립트로 drag & drop 을 허용해준다.

 

$(function () {
     var obj = $("#dropzone");

     obj.on('dragenter', function (e) {
          e.stopPropagation();
          e.preventDefault();
          $(this).css('border', '2px solid #5272A0');
     });

     obj.on('dragleave', function (e) {
          e.stopPropagation();
          e.preventDefault();
          $(this).css('border', '2px dotted #8296C2');
     });

     obj.on('dragover', function (e) {
          e.stopPropagation();
          e.preventDefault();
     });

     obj.on('drop', function (e) {
          e.preventDefault();
          $(this).css('border', '2px dotted #8296C2');

          var files = e.originalEvent.dataTransfer.files;
          if(files.length < 1)
               return;

          F_FileMultiUpload(files, obj);
     });

});

 

div 영역의 dotted 테두리에 드래그 하여 마우스를 올리면, 아래와 같이 solid 테두리로 변경된다.

 

 

drop 이벤트를 보면, e.originalEvent.dataTransfer.files 에서 멀티업로드시, drop 했던 파일 목록을 가져와서, 업로드 하는 함수를 호출하고 있다. 이 영역이 파일뿐만 아니라, 다른 것들도 drag and drop 이 허용되기 때문에, 파일이 있는 경우만, 업로드 처리를 하고 있다.

 

이제 실제, 서버로 업로드 하는 자바스크립트는 아래와 같다.

 

// 파일 멀티 업로드
function F_FileMultiUpload(files, obj) {
     if(confirm(files.length + "개의 파일을 업로드 하시겠습니까?") ) {
         var data = new FormData();
         for (var i = 0; i < files.length; i++) {
            data.append('file', files[i]);
         }

         var url = "<서버 파일업로드 URL>";
         $.ajax({
            url: url,
            method: 'post',
            data: data,
            dataType: 'json',
            processData: false,
            contentType: false,
            success: function(res) {
                F_FileMultiUpload_Callback(res.files);
            }
         });
     }
}

// 파일 멀티 업로드 Callback
function F_FileMultiUpload_Callback(files) {
     for(var i=0; i < files.length; i++)
         console.log(files[i].file_nm + " - " + files[i].file_size);
}

 

 

drop 했던 파일 목록은, FormData 형태의 file 배열로 넘긴다.

이는 INPUT 태그의 file 과 같다.

서버의 <서버 파일업로드 URL> 은 php, asp.net, java 등의 기존 업로드 로직을 그대로 사용하면 된다.

서버쪽은, 다르게 처리할 부분이 전혀없다.

 

예제에서 사용한 서버코드는 asp.net 에서, Request.Files 로 업로드 파일을 저장하고, 저장된 결과의 파일명과 파일사이즈를 json 형태로 리턴하였다.

 

 

Posted by 헝개
개발팁2016. 8. 25. 10:51

안드로이드 앱을 만들어보신분이라면 토스트 메세지가 어떤건지 바로 이해하실것이다.
순서대로 올라와서, 자동으로 사라지는 메세지 박스이다.

구조가 간단해서 직접 만들어보셔도 좋을것이다.
아래 링크에서 기존에 만들어진 jquery 플러그인을 다운받아보자.

 

https://github.com/Soldier-B/jquery.toast

 

 

html 파일에 css 와 js 파일을 넣고, 토스트메세지를 호출하면 된다.

 

<link rel="stylesheet" type="text/css" href="jquery.toast.min.css" />
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="jquery.toast.min.js"></script> 

 

 

$.toast('메세지', 옵션);

 

메세지는 html 코드로, 문자열에 html 태그를 포함할 수도 있다.
옵션은 json 방식으로 넣어주면된다.
json 은 javascript object notation 으로, { } 로 둘러싸인 객체 표현법이다.


 

$.toast('일반 메세지입니다.');

기본 메세지에, 기존옵션을 사용하여, 5초후에 사라진다.

 

$.toast('<h4>위험</h4> 이것은 위험 메세지입니다.', { type: 'danger', duration : 2000 } );

경고 메세지로, duration 값을 2000 으로 주었기 때문에, 2초후에 사라진다.

 

$.toast('<h4>정보</h4> 이것은 정보 메세지입니다.', { type: 'info', sticky : true } );

정보 메세지이고, sticky 에 true라고 주었기 때문에, x 버튼을 눌러 닫기 전까지는 계속 표시된다.

 

$.toast('<h4>성공</h4> 이것은 성공 메세지입니다.', { type: 'success', duration: 3000 } );

성공 메세지이고, 3초후에 자동으로 사라진다.

 

그외에도 toast 의 config 를 설정할 수 도 있다.

이 config 값은 최초에 1회만 설정하면, 이후 toast 메세지는 모두 설정값에 따라 나타난다.

 

기존으로 toast 메세지는 화면의 center 에 나오며, 메세지박스 사지는 500 이다.

 

$.toast.config.align = 'right';
$.toast.config.width = 300;

 

 

 

 

Posted by 헝개
개발팁2016. 7. 13. 12:00

jQuery 를 이용하여, AJAX 를 호출하는경우, 이미지를 표시하는 방법이다.

 

$.ajax 를 이용하여, 데이터를 불러오거나, 데이터를 저장할때,

작업시간이 많이 걸리는 경우에는, 로딩중임을 표시하는 이미지가 화면에 나타나도록 해준다.

 

 

 

여기서 사용한, 로딩이미지는 위의 이미지로, 마우스 오른쪽 버튼을 눌러서, 저장하여 사용해도 된다.

 

$.ajax({
       type: "POST"
       , contentType: "application/x-www-form-urlencoded"
       , url: "http://bemeal2.tistory.com/media/data"
       , data: "onLoad=%5Btype%20Function%5D&count=15&page=1"
       , async: true
       , error: function (res) {
              console.log("ajax error - " + res);
       }
       , success: function (res) {
              console.log("ajax success - " + res);
       }
       , beforeSend: function () {
              var width = 0;
              var height = 0;
              var left = 0;
              var top = 0;

              width = 50;
              height = 50;


              top = ( $(window).height() - height ) / 2 + $(window).scrollTop();
              left = ( $(window).width() - width ) / 2 + $(window).scrollLeft();

 

              if($("#div_ajax_load_image").length != 0) {
                     $("#div_ajax_load_image").css({
                            "top": top+"px",
                            "left": left+"px"
                     });
                     $("#div_ajax_load_image").show();
              }
              else {
                     $('body').append('<div id="div_ajax_load_image" style="position:absolute; top:' + top + 'px; left:' + left + 'px; width:' + width + 'px; height:' + height + 'px; z-index:9999; background:#f0f0f0; filter:alpha(opacity=50); opacity:alpha*0.5; margin:auto; padding:0; "><img src="file://D:\\temp\\ajax_loader.gif" style="width:50px; height:50px;"></div>');
              }

       }
       , complete: function () {
                     $("#div_ajax_load_image").hide();
       }
});

 

 

다른 코드는 기존 사용하던거 그대로 놓고, beforeSend 와 complete 만 가져가서 사용하면 된다.

beforeSend 는 AJAX 요청하기 전에 실행되며, complete 는 AJAX 응답이 완료되면, 오류던지 성공이던지 상관없이 호출이 된다.

 

 , beforeSend: function () {
              var width = 0;
              var height = 0;
              var left = 0;
              var top = 0;

 

              width = 50;
              height = 50;
              top = ( $(window).height() - height ) / 2 + $(window).scrollTop();
              left = ( $(window).width() - width ) / 2 + $(window).scrollLeft();

 

              if($("#div_ajax_load_image").length != 0) {
                     $("#div_ajax_load_image").css({
                            "top": top+"px",
                            "left": left+"px"
                     });
                     $("#div_ajax_load_image").show();
              }
              else {
                     $('body').append('<div id="div_ajax_load_image" style="position:absolute; top:' + top + 'px; left:' + left + 'px; width:' + width + 'px; height:' + height + 'px; z-index:9999; background:#f0f0f0; filter:alpha(opacity=50); opacity:alpha*0.5; margin:auto; padding:0; "><img src="file://D:\\temp\\ajax_loader.gif" style="width:50px; height:50px;"></div>');
              }

       }

 

img 태그의 src 속성은 실제 웹서버의 URL 로 변경해야한다.

로딩 이미지를 화면의 정 중앙에 보여주는 코드이다.

 

       , complete: function () {
                     $("#div_ajax_load_image").hide();
       }

 

AJAX가 완료되면, 로딩 이미지를 숨긴다. 이는 다음번 AJAX 호출이 될때 그대로 재사용하여, show() 메서드로 보여줄 수 있기에 감추기만 한 것이다.

 

 

 

실제 위 코드로 실행한 예이다.

 

 

 

하지만, $.ajax 를 작성시마다, 매번 위 코드를 복사해서 붙여넣기하는것은, 좋지 않은 방법인다.

 

common.js 파일을 만들어서, $.ajaxSetup 을 한번만 구현해 놓으면, 위의 코드를 매번 작성하지 않아도 된다.

 

 $.ajaxSetup({

... // 이 안에, beforeSend, complete. error 를 붙여넣으면 된다.

)};

 

Posted by 헝개