최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday

티스토리 뷰

썸네일 프리뷰 jquery 코드를 가져왔는데 브라우저 오른쪽, 브라우저 하단에 잘리는 현상때문에

 

가져온 라이브러리의 이미지 처리 방식을 전부 수정하였다.

 

제이쿼리는 그냥 셀렉터 내용만 있으니 중요한게 아니라서 패스하고, 아래의 속성들로 구현할 수 있다.

 

window.innerWidth,

window.innerHeight

nautralWidth

nautalHeight 

 

참고로 가로는 510px 로 고정이고, 세로 사이즈는 비례식을 적용하여 동적으로 적용해야

 

정확하게 높이까지 적용 될 것이다.

 

HTML

<html>
  <body>
    ...
    <img src="이미지URL" data-preview-image="이미지URL">
    ...
    <script src="jquery-3.4.1.min.js"></script>
    <script src="serpiko-imagepreview.js"></script>
  </body>
</html>

 

serpiko-imagepreview.js

/**
 * serpiko 허정진
 * 
 * 2020.10.11
 * 
 */
(function($) {
	$.previewImage = function(options) {
	  var element = $(document);
	  var namespace = '.previewImage';
	    	
		var opts = $.extend({
			// 옵션
			'xOffset': 20,
			'yOffset': -20,
			'fadeIn': 'fast',

			// 기본 css
			'css': {         
				'padding': '8px',
				'border': '1px solid gray',
				'background-color': '#fff',
				'z-index': 9999,
			},

			// 고정값
			'eventSelector': '[data-preview-image]',
			'dataKey': 'previewImage',
			'overlayId': 'preview-image-plugin-overlay',
		}, options);

		var _calcWidth, _calcHeight;
		
		element.off(namespace);
			
		element.on('mouseover' + namespace, opts.eventSelector, function(e) {
			
			// 현재 마우스 커서
			const pageX = e.pageX;
			const pageY = e.pageY;

			// 이미지 원본 사이즈
			const naturalWidth = e.currentTarget.naturalWidth;
			const naturalHeight = e.currentTarget.naturalHeight;
			console.log("원래좌표", pageX, pageY);
			const src = $(this).data(opts.dataKey);

			var $element = $('<p>')
					.attr('id', opts.overlayId)
					.css('position', 'absolute')
					.css('display', 'none');

			if (opts.css) $element.css(opts.css);

			if( !src ) {
				_calcWidth = 160; // fixed
				_calcHeight = 30;
				$element.text(`썸네일 경로가 없습니다`).css("width", _calcWidth+"px");
			}else {
				_calcWidth = 510; // fixed
				// 비례식 naturalWidth : naturalHeight = _calcWidth : (h)
				_calcHeight = Math.floor( ( naturalHeight * _calcWidth ) / naturalWidth );
				$element.append($('<img>').attr('src', src));
			}

			// 사사분면
			const {quadrant,x,y} = getQuadrant(pageX,pageY);
			console.log("mouseover", quadrant, x, y);

			// 렌더
			render("append", $element,x,y);
		});
		
		//
		function getQuadrant(x, y){

			const windowWidth = window.innerWidth;
			const windowHeight = window.innerHeight;
			let quadrant = "";

			if( windowHeight/2 > y) quadrant += "Top";
			else quadrant += "Bottom";

			if( windowWidth/2 < x) quadrant += "Right";
			else quadrant += "Left";

			// console.log(quadrant);

			if( "TopLeft" === quadrant ){
				x = x + opts.xOffset;
				y = y + opts.yOffset;
			}else if( "TopRight" === quadrant ){
				x = x - _calcWidth - opts.xOffset;
				y = y + opts.yOffset;
			}else if( "BottomLeft" === quadrant ){
				x = x + opts.xOffset;
				y = y - _calcHeight - opts.yOffset;
			}else if( "BottomRight" === quadrant ){
				x = x - _calcWidth - opts.xOffset;
				y = y - _calcHeight - opts.yOffset;
			}

			return {quadrant, x, y};
		}

		//
		function render(mode="append",$element,x,y){

			if( "append" === mode ){
				$('body').append($element);
			}
			
			$element
				.css("top", y + "px")
				.css("left", x + "px")
				.fadeIn(opts.fadeIn);
		}
		

		element.on('mouseout' + namespace, opts.eventSelector, function() {
			$('#' + opts.overlayId).remove();
		});
		
		element.on('mousemove' + namespace, opts.eventSelector, function(e) {
			const pageX = e.pageX;
			const pageY = e.pageY;

			const {quadrant,x,y} = getQuadrant(pageX,pageY);
			console.log("mousemove", quadrant, x, y);
			render("move", $('#' + opts.overlayId) ,x,y);
		});
		
		return this;
	};
	
	$.previewImage();
})(jQuery);

 

 

스크립트 복사하기

더보기

/**

 * serpiko 허정진

 * 

 * 2020.10.11

 * 

 */

(function($) {

  $.previewImage = function(options) {

    var element = $(document);

    var namespace = '.previewImage';

        

    var opts = $.extend({

      // 옵션

      'xOffset': 20,

      'yOffset': -20,

      'fadeIn': 'fast',

 

      // 기본 css

      'css': {         

        'padding': '8px',

        'border': '1px solid gray',

        'background-color': '#fff',

        'z-index': 9999,

      },

 

      // 고정값

      'eventSelector': '[data-preview-image]',

      'dataKey': 'previewImage',

      'overlayId': 'preview-image-plugin-overlay',

    }, options);

 

    var _calcWidth_calcHeight;

    

    element.off(namespace);

      

    element.on('mouseover' + namespaceopts.eventSelectorfunction(e) {

      

      // 현재 마우스 커서

      const pageX = e.pageX;

      const pageY = e.pageY;

 

      // 이미지 원본 사이즈

      const naturalWidth = e.currentTarget.naturalWidth;

      const naturalHeight = e.currentTarget.naturalHeight;

      console.log("원래좌표"pageXpageY);

      const src = $(this).data(opts.dataKey);

 

      var $element = $('<p>')

          .attr('id'opts.overlayId)

          .css('position''absolute')

          .css('display''none');

 

      if (opts.css$element.css(opts.css);

 

      if( !src ) {

        _calcWidth = 160// fixed

        _calcHeight = 30;

        $element.text(`썸네일 경로가 없습니다`).css("width"_calcWidth+"px");

      }else {

        _calcWidth = 510// fixed

        // 비례식 naturalWidth : naturalHeight = _calcWidth : (h)

        _calcHeight = Math.floor( ( naturalHeight * _calcWidth ) / naturalWidth );

        $element.append($('<img>').attr('src'src));

      }

 

      // 사사분면

      const {quadrant,x,y} = getQuadrant(pageX,pageY);

      console.log("mouseover"quadrantxy);

 

      // 렌더

      render("append"$element,x,y);

    });

    

    //

    function getQuadrant(xy){

 

      const windowWidth = window.innerWidth;

      const windowHeight = window.innerHeight;

      let quadrant = "";

 

      ifwindowHeight/2 > yquadrant += "Top";

      else quadrant += "Bottom";

 

      ifwindowWidth/2 < xquadrant += "Right";

      else quadrant += "Left";

 

      // console.log(quadrant);

 

      if"TopLeft" === quadrant ){

        x = x + opts.xOffset;

        y = y + opts.yOffset;

      }else if"TopRight" === quadrant ){

        x = x - _calcWidth - opts.xOffset;

        y = y + opts.yOffset;

      }else if"BottomLeft" === quadrant ){

        x = x + opts.xOffset;

        y = y - _calcHeight - opts.yOffset;

      }else if"BottomRight" === quadrant ){

        x = x - _calcWidth - opts.xOffset;

        y = y - _calcHeight - opts.yOffset;

      }

 

      return {quadrantxy};

    }

 

    //

    function render(mode="append",$element,x,y){

 

      if"append" === mode ){

        $('body').append($element);

      }

      

      $element

        .css("top"y + "px")

        .css("left"x + "px")

        .fadeIn(opts.fadeIn);

    }

    

 

    element.on('mouseout' + namespaceopts.eventSelectorfunction() {

      $('#' + opts.overlayId).remove();

    });

    

    element.on('mousemove' + namespaceopts.eventSelectorfunction(e) {

      const pageX = e.pageX;

      const pageY = e.pageY;

 

      const {quadrant,x,y} = getQuadrant(pageX,pageY);

      console.log("mousemove"quadrantxy);

      render("move"$('#' + opts.overlayId) ,x,y);

    });

    

    return this;

  };

  

  $.previewImage();

})(jQuery);

 

원본 :https://github.com/zpalffy/preview-image-jquery

 

 

zpalffy/preview-image-jquery

jQuery plugin that adds an image preview mouseover to any element on the page with a data-preview-image attribute. - zpalffy/preview-image-jquery

github.com

결과

만약 썸네일 src가 유효하지 않다면... 아래와 같이 표시되도록 하였다.

댓글