2010년 7월 29일 목요일

jQuery 로 만든 이미지 팝업창

음... 불꽃코딩으로 만들기 시작했는데... 도중에 흥이 식어서(...)

 

일단 공개하고 차차 수정해가나가는 방식으로 (뭐... 제가 언제나 그렇죠 뭐)

예제만들기도 귀찮습니다.

 

적용된 기능 : 이미지 클릭시 이미지만 블라인드, 이미지 위에서 휠 사용시 이미지 확대및 축소, 이미지 드래그 기능

 

일단 필요한 기능만 추려서 만들어봤습니다.

 

drag 는 jQuery API 를 사용해서 좀 무겁지만, 다음버젼에선 축소시킬 예정

 

 

예제 : http://mqoo.com/bbs/images/16

사용법 :


<SCRIPT LANGUAGE="JavaScript">
$(document).ready(function(){
	$(".resizeIMG").simplebox({ blind:false , img:true, drag:true });
});
</SCRIPT>
<div id='blank'></div>

다운로드 :

소스코드 : ver0.5

/*
	version :0.5
	만든이 : Sizkein
	메일주소 : sizkein@gmail.com
	문의사항 : sizkein@gmail.com
	저작권 : GPL
	공개장소 : developer.mqoo.com
*/
(function ($, window) {

	var defaults = {
		loading_text:"loading...",
		href: false,
		src: false,
		blind:true,
		title : "리사이즈된 이미지입니다.\n원본을 보시려면 클릭해 주세요.",
		opacity: 0.6,
		backgroundColor : "#000",
		fontColor : "#FFF",
		img: false,					//이것이 true 일때 작동한다.
		wheel:true,
		iframe : false,
		width: 600,
		height: 600,

		//추가 할 예정인 기능
		popup_top_left : "align='center' valign='middle' ", //일단 이름은 대충 정하자
		drag:false
	},
	simplebox = 'simplebox';

function control_box_edit(a, b){
}
function control_box_exit(a, b){
}

function blind(a, options) { 
	if(a.get(0).tagName=='A') var a = a.children();			//a 클릭이라면 chrome 나 safari,등을 위해서 img 에 블라인드를 걸기위해..

	var blind_ = new Array();
	if(options.blind){
		blind_.top = 0;
		blind_.left = 0;
		blind_.width = $(document).width();
		blind_.height = $(document).height();
	}else{
		blind_.top = a.offset().top;
		blind_.left = a.offset().left;
		blind_.width = a.width();
		blind_.height = a.height();
	}

	jQuery("<div/>")
		.attr({
			id: "index_layer"
		})
		.css({
			position:'absolute',
			top: 0,
			left: 0,
			width: 0,
			height: 0,
			zIndex: 0
		})
		.click(function(){$(this).remove()})
		.insertAfter("#blank");


	jQuery("<div/>")
		.attr({
			id: "simple_blind"
		})
		.css({
			opacity:options.opacity,
			position:'absolute',

			top: blind_.top,
			left: blind_.left,
			width: blind_.width,
			height: blind_.height,

			zIndex: 9950,
			cursor: "pointer",
			textAlign: 'center',
			color:options.fontColor,
			backgroundColor: options.backgroundColor
		})
		.bind('click',function(){
		})
		.appendTo("#index_layer");
}

function change_layer(a, options){
	//실제 사이즈를 기록해놓는다.
	var real_size = new Array();
		real_size.width = a.width();
		real_size.height = a.height();
	var simpleTLWH = new Array();
	var img_rateWH = a.width() / a.height(); //이미지 확대축소를 위한 비율작성
	var img_rateHW = a.height() / a.width();
	//사이즈를 판단한다.
	if(a.width()>$(window).width()){
		simpleTLWH.width = $(window).width()-50;
		simpleTLWH.height = simpleTLWH.width * img_rateHW;
		if(simpleTLWH.height >$(window).height()){
			simpleTLWH.height = $(window).height()-50;
			simpleTLWH.width = simpleTLWH.height * img_rateWH;
		}
	}else if(a.height()>$(window).height()){ 
		simpleTLWH.height = $(window).height()-50;
		simpleTLWH.width = simpleTLWH.height * img_rateWH;
	}else{
		simpleTLWH.width = a.outerWidth();
		simpleTLWH.height = a.outerHeight();
	}

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


	jQuery("<div/>")
		.attr({
			id: "simple_popup"
		})
		.css({
			position:'absolute',
			top: simpleTLWH.top,
			left: simpleTLWH.left,
			width: simpleTLWH.width,
			height: simpleTLWH.height,
			zIndex: 9950,
			cursor: "pointer",
			border: "3px solid #333"
		})
		.appendTo("#index_layer");


$("#simple_img_loading")
	.css({
		display:'',
		width: "100%",
		height: "100%"
	})
	.appendTo("#simple_popup");


		jQuery("<div/>")
		.attr({
			id: "control_box"
		})
		.css({
			opacity : 0,
			position:'absolute',
			top: 0,
			left: 0,
			width: "100%",
			height: 0,
			zIndex: 990,
			color: "#FFF",
			backgroundColor: "#000"
		}).appendTo("#simple_popup");





//drag 이부분은 drag
if(options.drag){
$.getScript("http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.2/jquery-ui.min.js",  function(){
	$("#simple_popup")
	.draggable().css('cursor', 'move');
});
}
//drag 끝

//휠 관련 부분
if(options.wheel){
	//wheel lib
	;(function($){
	$.fn.wheel = function( fn ){	return this[ fn ? "bind" : "trigger" ]( "wheel", fn );	};
	// special event config
	$.event.special.wheel = {
		setup: function(){
			$.event.add( this, wheelEvents, wheelHandler, {} );
			},
		teardown: function(){
			$.event.remove( this, wheelEvents, wheelHandler );
			}
		};
	// events to bind ( browser sniffed... )
	var wheelEvents = !$.browser.mozilla ? "mousewheel" : "DOMMouseScroll"+( $.browser.version<"1.9" ? " mousemove" : "" ); 
	// shared event handler
	function wheelHandler( event ){ 
		switch ( event.type ){
			case "mousemove": // FF2 has incorrect event positions
				return $.extend( event.data, { // store the correct properties
					clientX: event.clientX, clientY: event.clientY,
					pageX: event.pageX, pageY: event.pageY
					});			
			case "DOMMouseScroll": // firefox
				$.extend( event, event.data ); // fix event properties in FF2
				event.delta = -event.detail/3; // normalize delta
				break;
			case "mousewheel": // IE, opera, safari
				event.delta = event.wheelDelta/120; // normalize delta
				if ( $.browser.opera ) event.delta *= -1; // normalize delta
				break;
			}
		event.type = "wheel"; // hijack the event	
		return $.event.handle.call( this, event, event.delta );
		};
	})(jQuery);
	// wheel lib end

		$("#simple_popup").bind('wheel',function(event,delta){
			var chang_size = 50;
	//		alert($(this).width()+'/'+$(this).height());
			if(delta>0){
				$(this).css({
					top: $(this).offset().top-(chang_size/2),
					left: $(this).offset().left-(chang_size/2),
					width:$(this).width()+chang_size,
					height:($(this).width()+chang_size)*img_rateHW
				});
//				alert(parseInt(($(this).width()+chang_size)/real_size));
				control_box_edit( $(this), "이미지가 확대되었습니다.");
				return false;
			}else{
				$(this).css({
					top: $(this).offset().top+(chang_size/2),
					left: $(this).offset().left+(chang_size/2),
					width:$(this).width()-chang_size,
					height:($(this).width()-chang_size)*img_rateHW
				});
				control_box_edit( $(this), "이미지가 축소되었습니다.");
				return false;
			}
		})
}

}

function iframe_layer(a, option){
	jQuery("<div/>")
	.attr('id', 'simple_iframe')
	.css({
		position:'absolute',
		width: option.width,
		height: option.height,
//		top: $(window).height()-option.height,
		top: 0,
		left: 0,
		border: "3px solid #333",
		zIndex: 990
//		backgroundColor: "000"

	})
	.appendTo("#blank");

jQuery("<iframe/>")
	.attr('src', option.href)
	.css({
		width: "100%",
		height: "100%",
		border: "3px solid #333",
		zIndex: 990
		})
	.appendTo("#simple_iframe");

}

	publicMethod = $.fn[simplebox]  = $.fn.simplebox = $[simplebox] = function (options, callback) {
		var $this = this;
		options = jQuery.extend(defaults, options);

		if (callback) {
			options.onComplete = callback;
		}

		if (!$this[0] || $this.selector === undefined) {
			$this = $('<a/>');
			options.open = true; // assume an immediate open
		}


$this.live("click", function(e){
//블라인드의 종류를 찾아 건다.


	if(options.img){
		blind($(this), options);
		var img_src = options.href || $(this).attr("href") || $(this).attr("src");
		jQuery("<img id='simple_img_loading' src='"+img_src+"' style='display:none;' />").appendTo("#index_layer");
		$("#simple_img_loading").load(function(){
			change_layer($(this), options);
		})
	}

	if(options.iframe && options.href){
		iframe_layer($(this), options);
	}


	return false;
}).css('cursor', 'pointer');



		return $this;
	};

	publicMethod.settings = defaults;

	// Initializes simplebox when the DOM has loaded
	$(publicMethod.init);

}(jQuery, this));

2010년 2월 22일 월요일

도메인이 다른 외부의 서버가 열려있는지 확인하는 방법.

<SCRIPT>
<!--
$(document).ready(function(){
	var _server_ = 0;
	$.getScript("http://도메인.com/server_check.js",function(){alert("서버오픈 여부"+_server_ );});
});
//-->
</SCRIPT>

server_check.js 파일 내부에 서버가 열렸을경우에 확인할수 있는 파일을 부릅니다.

_server_ = 1;

 

javascript의 도메인크로스가 되지 않는 문제로 html 파일을 불러올수가 없더군요.

 

json, xml, js 파일등은 크로스 도메인을 지원하는듯 합니다.

 

위와 같은 방식으로 사용했더니 되는군요

 

개인서버 사용시 일정시간대만 컴퓨터를 틀어놓을 경우 이용가능할듯합니다.

 

일정트래픽문제 이제 안뇽 ㅠㅠ

2009년 12월 19일 토요일

GTUP 모임에 다녀왔습니다.

사진기도, 휴대폰도 두고가는 바람에 남긴건 없지만,

 

시설은 굉장히 좋았습니다.

 

음식, 과자 마음대로 먹을수 있게 준비해놓은것이 본사와 비슷하더군요

 

 

하지만 모임의 내용에 있어서는 구글의 신기술을 이용하는 방법이 아닌 대체적인 소개랄까...

 

안드로이드에 대한 많은 정보를 기대했는데 기대에 조금 미치지 못했습니다.

 

2차 3차때는 더욱더 발전될 GTUP 모임이 되길 바랍니다

2009년 12월 13일 일요일

이게 진정한 IT계의 천재다...Talks Pranav Mistry: SixthSense

기사 : http://www.ted.com/talks/lang/kor/pranav_mistry_the_thrilling_potential_of_sixthsense_technology.html

 

동영상의 View subtitles 를 클릭후 언어를 Korean 으로 바꿔주시면 친절하게도 한국어로 자막이 나옵니다

 

인도의 한 개발자가 개발한 가상현실...

 

컴퓨터만 붙잡고 있으면서 2D현실에 익숙해진 저로서는 확! 하고 와닫는 프로그래밍 기법이 생각나질 않는군요 ㅠ...

 

 

가상현실을 이용한...

 

돈이 없어서 개발을 하기 힘들다고 생각, 말하는것조차 자신이 멍청하게 느껴집니다.

 

 

 

이 사람은 6년전에 단돈 5$로 핑거포인트를 만들었습니다.

 

그냥 할말없이 천재라는 생각뿐이 안드는군요

 

그리고 이 천재는 자신이 만든 이 기술을 오픈소스로 공개하겠다고 했습니다.

정말 뭐라 할말이 없네요.

 

증강현실에 대한 개념이라도 잡으러 가봐야겠습니다

 

마이너리티 리포트가 다시한번 생각납니다

 

2009년 12월 10일 목요일

Acer의 안드로이드폰

http://www.engadget.com/2009/12/09/acer-liquid-a1-unboxed-video-style/

 

 

PC 시장에서도 슬슬 스마트폰을 풀고 있네요

 

것도 풀스팩으로...

 

1Ghz Snapdragon CPU

Andorin 2.0

 

기본 스팩은 드루이드보다 상향됬네요

 

 

외국처럼 새로나온 휴대폰을 통신사 눈치보지말고 그냥 써보고 싶습니다...

2009년 12월 4일 금요일

영문 문자입력의 신기원 스와이프(swype)

이번 옴니아2에서는 스와이프 기술을 적용했다고 한다.

아직 우리나라말은 적용되지 않는 기술인것 같지만
영문 입력에 있어서는 정말 두말할것없는 최고의 기술인것 같다.

키보드로 치는것보다 빠를수도 있고 아닐수도 있지만,
휴대용 기기에서는 혁명적인 키보드 입력방식인것 같다.


 

 

 

 

 

우리나라도 언제까지나 기존방식을 고집하지않고 새로운 아이디어를 내어야 할것이다.

특히 SKT 언제까지나 통메에 얽혀있는 모습을 보고싶진 않다.

 

2009년 11월 21일 토요일

jQuery label 정렬하기?

뭐라고 명명해야할지 모르겠네요.

 

그냥 정리하는겁니다.

 

적용전)

 

적용후)

 

지정한 라벨의 가장 넓은 크기를 구해서 그 클래스의 넓이를 같은 길이로 맞춰주는거죠.

 

참 쉽죠잉.

 

 

<SCRIPT LANGUAGE="JavaScript">
<!--
// 함수는 아래와 같습니다.
function max_width(a){
    var max = 0;
    $(a).find("label").each(function(){
        if ($(this).width() > max)
            max = $(this).width();
    }).css({display:"inline-block",width:max});
}

//돔 레디 안쪽에 아래와 같은 문장을 넣어줘야 합니다.
$(document).ready(function(){
    max_width('#auth');
});
//-->
</SCRIPT>

<!--예문 코드는 아래와 같습니다.--> <div id="auth"> <label>Doraemong</label> <select>......</select> <label>test</label> <select>......</select> <label>Pokémon World</label> <select>......</select> </div>


 

 

이 후에 max_write 문만 돔레디에 추가해주면

정해놓은 div 아이디값 아래에 있는 label 크기를 구해서 가장 큰 라벨크기로 전부 고정시킵니다~

 

간단한겁니다. 꾿