[공부]하는 몽씨/jquery plugin (7)

반응형

탭이 4,5개 이상 넘어버릴 때 디자인을 하기가 참 난감한 상황이 간혹 생깁니다. 탭을 나열하는 디자인 방식이라더라도 웹에서는 자연스러워 보일 지 모르겠지만 모바일 상에서 볼 때는 화면을 너무 차지해 지저분해보일 수 있으니까요.

이럴 때 쓰면 좋을 플러그인이 바로 slick.js 플러그인과 swiper.js 플러그인을 쓰는 방식인데요. 두 플러그인 전부 실무에서 많이 쓰는 플러그인인 만큼 실용성이 좋습니다.

먼저 <head> 안에 아래 스크립트로 세팅해줍니다.

 

<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<link rel="stylesheet" href="https://unpkg.com/swiper/swiper-bundle.min.css" />
<script src="https://unpkg.com/swiper/swiper-bundle.min.js"></script>
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/npm/slick-carousel@1.8.1/slick/slick.css"/>
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/slick-carousel@1.8.1/slick/slick.min.js"></script>

 

그 다음, <style>과 <body>, <script>에 각각 소스를 넣어주세요.

 

<style>

.slick-initialized .swipe-tab-content {
  position: relative;
  min-height: 365px;
}
@media screen and (min-width: 767px) {
  .slick-initialized .swipe-tab-content {
    min-height: 500px;
  }
}
.slick-initialized .swipe-tab {
  display: flex;
  align-items: center;
  justify-content: center;
  height: 50px;
  background: none;
  border: 0;
  color: #757575;
  cursor: pointer;
  text-align: center;
  border-bottom: 2px solid rgba(0, 0, 0, 0);
  transition: all 0.5s;
}
.slick-initialized .swipe-tab:hover {
  color: #000;
}
.slick-initialized .swipe-tab.active-tab {
  border-bottom-color: #000;
  color: #000;
  font-weight: bold;
}

.main-container {
  padding: 25px;
  background: #f1f1f1;
}

 

<body>

<div class="sub-header ">
  <div class="swipe-tabs">
    <div class="swipe-tab">One</div>
    <div class="swipe-tab">Two</div>
    <div class="swipe-tab">Three</div>
    <div class="swipe-tab">Four</div>
    <div class="swipe-tab">Five</div>
  </div>
</div>
<div class="main-container">
  <div class="swipe-tabs-container ">
    <div class="swipe-tab-content">Tab 1</div>
    <div class="swipe-tab-content">Tab 2</div>
    <div class="swipe-tab-content">Tab 3</div>
    <div class="swipe-tab-content">Tab 4</div>
    <div class="swipe-tab-content">Tab 5</div>
  </div>
</div>

 

<script>

$(function () {
	'use strict';

	var $swipeTabsContainer = $('.swipe-tabs'),
		$swipeTabs = $('.swipe-tab'),
		$swipeTabsContentContainer = $('.swipe-tabs-container'),
		currentIndex = 0,
		activeTabClassName = 'active-tab';

	$swipeTabsContainer.on('init', function(event, slick) {
		$swipeTabsContentContainer.removeClass('invisible');
		$swipeTabsContainer.removeClass('invisible');

		currentIndex = slick.getCurrent();
		$swipeTabs.removeClass(activeTabClassName);
       	$('.swipe-tab[data-slick-index=' + currentIndex + ']').addClass(activeTabClassName);
	});

	$swipeTabsContainer.slick({
		//slidesToShow: 3.25,
		slidesToShow: 3,
		slidesToScroll: 1,
		arrows: false,
		infinite: false,
		swipeToSlide: true,
		touchThreshold: 10
	});

	$swipeTabsContentContainer.slick({
		asNavFor: $swipeTabsContainer,
		slidesToShow: 1,
		slidesToScroll: 1,
		arrows: false,
		infinite: false,
		swipeToSlide: true,
    draggable: false,
		touchThreshold: 10
	});


	$swipeTabs.on('click', function(event) {
        // gets index of clicked tab
        currentIndex = $(this).data('slick-index');
        $swipeTabs.removeClass(activeTabClassName);
        $('.swipe-tab[data-slick-index=' + currentIndex +']').addClass(activeTabClassName);
        $swipeTabsContainer.slick('slickGoTo', currentIndex);
        $swipeTabsContentContainer.slick('slickGoTo', currentIndex);
    });

    //initializes slick navigation tabs swipe handler
    $swipeTabsContentContainer.on('swipe', function(event, slick, direction) {
    	currentIndex = $(this).slick('slickCurrentSlide');
		$swipeTabs.removeClass(activeTabClassName);
		$('.swipe-tab[data-slick-index=' + currentIndex + ']').addClass(activeTabClassName);
	});
});

 

이렇게 완성! 

 


하면 좋겠지만 탭 자체가 좌우 화살표가 없어 조금 불편합니다. 

화살표까지 넣어보도록 하겠습니다.

<body> .sub-header 안에 내용을 추가합니다.

 

<div class="arrowSlider">
		<span class="prev" id="aro1_prev">◀</span>
		<span class="next" id="aro1_next">▶</span>
	</div>

 

swiper 슬라이더에 slick 탭이 있는 상황이기 때문에 slick 탭에 화살표를 넣어주어야 합니다. <script>에 적어둔 내용에 아래 내용으로 수정해주세요.

 

$swipeTabsContainer.slick({
		//slidesToShow: 3.25,  // 추가 수정된 내용!
		slidesToShow: 8,
		slidesToScroll: 1,
		arrows: true, // 추가 수정된 내용!
		prevArrow: $('#aro1_prev'),  // 추가 수정된 내용!
		nextArrow: $('#aro1_next'),  // 추가 수정된 내용!
		infinite: false,
		swipeToSlide: true,
		touchThreshold: 10,
		responsive: [
		{
		  breakpoint: 934,
		  settings: {
			slidesToShow: 3,
		  }
		}
		]
	});

 

마지막으로 <style>에 아래 내용을 넣어주면 완성입니다.

 

.arrowSlider {position:relative;}
#aro1_prev {position:absolute;left:0px;cursor:pointer;}
#aro1_next {position:absolute;right:0px;cursor:pointer;}
.slick-slider {margin:0 30px;}

 

 

이렇게 되면 화살표가 있는 형태로 완성됩니다.
반응형이기 때문에 모바일에서도 깔끔하게 보여집니다. 

 

 


* 참고 : https://codepen.io/gbhasha/pen/gaggRR

반응형
반응형


[typed.js] 부트스트랩 캐러셀의 타이핑 효과넣기


이 내용을 알게 된 지 벌써 2년이나 지났는데 게으름을 피우다가 이제야 내용을 정리해서 올리네요.. 

문의할 곳이 없어서 정말 다급하게 동앗줄 잡는 심정으로 카페 문의글로 올렸었는데 

친절한 답변과 함께 꼼꼼한 첨부파일까지 올려주신 '기소기'님, 다시 한번 감사합니다. 


* 해당 답변을 받았던 카페글 : https://cafe.naver.com/hacosa/221591






부트스트랩의 캐러셀 (http://bootstrapk.com/javascript/#carousel)을 사용하는 중에 

안에 들어가는 글자를 타이핑효과가 나게끔 넣어야하는 부분이 있었는데요.


 여기서 중요한 건 타이핑 뿐만 아니라 타이핑이 다 끝난 후에 (글씨가 다 작성된 후에) 

슬라이더가 옆으로 이동하게 만들어야하는 부분에 있었습니다.



https://github.com/mattboldt/typed.js/


타이핑 효과가 나는 플러그인은 위 URL에서 다운 받았습니다.

기본적으로 세팅해야할 소스는 제이쿼리, 부트스트랩, 그리고 타이핑 플러그인, 이렇게 세팅 먼저 해주셔야합니다.





<!-- 제이쿼리 -->
<script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
<!-- 부트스트랩  -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap-theme.min.css">
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/js/bootstrap.min.js"></script>
<!-- 타이핑 플러그인 -->
<script src="https://cdn.jsdelivr.net/npm/typed.js@2.0.11"></script>



해당 소스들을 세팅해주시고 html에 캐러셀 소스를,
css에는 캐러셀에 넣을 스타일을 넣어주세요.







<div id="carousel-example-generic" class="carousel slide" data-ride="carousel" data-interval="false">
  <!-- Wrapper for slides -->
  <div class="carousel-inner" role="listbox">
    <div class="item active">
      <div class="item_bg"></div>
	  <div class="carousel-caption">
		<span class="typing"></span>
      </div>
    </div>
    <div class="item">
      <div class="item_bg"></div>
	  <div class="carousel-caption">
		<span class="typing"></span>
      </div>
    </div>
    <div class="item">
     <div class="item_bg"></div>
	  <div class="carousel-caption">
		<span class="typing"></span>
      </div>
    </div>
  </div>
  <!-- Controls -->
  <a class="left carousel-control" href="#carousel-example-generic" role="button" data-slide="prev">
    <span class="glyphicon glyphicon-chevron-left" aria-hidden="true"></span>
    <span class="sr-only">Previous</span>
  </a>
  <a class="right carousel-control" href="#carousel-example-generic" role="button" data-slide="next">
    <span class="glyphicon glyphicon-chevron-right" aria-hidden="true"></span>
    <span class="sr-only">Next</span>
  </a>
</div>






ul,li {
	list-style:none;
	margin:0px;
	padding:0px;
}
.item_bg {
  background-color:#757575;
  height:200px;
}
.carousel-caption {
  padding-top:0px;
  padding-bottom:60px;
}
#typed,#typed2,#typed3 {
	font-size:25px;
	color:#fff;

}
.typing {
	font-size: 20px;
}
.typing::after {
	content: '|';
	display: inline;
	-webkit-animation: blink 0.7s infinite;
	-moz-animation: blink 0.7s infinite;
	animation: blink 0.7s infinite;
}
.typing-cursor{
   opacity: 0;
	display: none;
}
@keyframes blink{
	0% { opacity:1; }
	50% { opacity:0; }
	100% { opacity:1; }
}
@-webkit-keyframes blink{
	0% { opacity:1; }
	50% { opacity:0; }
	100% { opacity:1; }
}
@-moz-keyframes blink{
	0% { opacity:1; }
	50% { opacity:0; }
	100% { opacity:1; }
}





마지막으로 javascript를 넣고 마무리해주시면 됩니다. 






$(function(){

	var carouselWrap = $('#carousel-example-generic'),
		 typedTxtArr = [
			'First Carousel Text',
			'Second Carousel Text',
			'Third Carousel Text'
		 ],
		 typed, typedObj;	

	var typedFunc = function( a, b ) {
		typed = new Typed(a[0], {
			strings: [
				typedTxtArr[ b ]
			],
			stringsElement: null,
			typeSpeed: 70,
			startDelay: 1000,
			smartBackspace: false,
			backSpeed: 60,
			backDelay: 5000,
			loop: true,
			loopCount: 5,
			showCursor: false,
			cursorChar: "|",
			attr: null,
			contentType: 'html',
			callback: function() {},
			preStringTyped: function() {},
			onStringTyped: function() {
				setTimeout(function(){
					carouselWrap.carousel('next');
				}, 1000);
			},
			resetCallback: function() {},
			onReset: function(self) { 
				
			}
		});
	}

	carouselWrap.on('slid.bs.carousel', function () {
		var idx =$(this).find('.active').index(),
			 typedObj = $('.typing').eq( idx );
			 typed.destroy();
			 typedFunc( typedObj, idx );
	});
	
	// init
	typedFunc( $('.typing').eq(0), 0); 

});




반응형
반응형




[fakeLoader] 간단한 로딩중 화면 띄우는 플러그인



 페이지가 로드될 때 페이지가 다 띄워질 때까지 띄워지는 로딩중 화면을 제이쿼리 플러그인으로 간단하게 구현해보려 합니다. 

 다양한 로딩중 제이쿼리 플러그인이 있는데 그 중 fakeLoader로 로딩중 화면을 만들어보도록 하겠습니다. 



https://github.com/joaopereirawd/fakeLoader.js



먼저, 해당 페이지에 접속하셔서  fakeLoader를 다운받아주세요. 

알집을 다운 받으시면 알집 안에 fakeLoader.js와 fakeLoader.css를 

첫화면을 로딩중 화면으로 띄우고 싶은 html 안에 스크립트로 세팅해주세요.



<link rel="stylesheet" href="fakeLoader.css">
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script src="fakeLoader.js"></script>


<body> 바로 다음 안으로 <div id="fakeLoader"></div>를 넣어주세요. 



 <div id="fakeLoader"></div>



 그 다음 </body> 안에 해당 스크립트를 넣어주세요. 스크립트 안에 해당 설정내용을 표기해두었는데

 spinner의 경우에는 데모페이지에서 원하는 로딩이미지타입을 골라야합니다.



http://joaopereirawd.github.io/fakeLoader.js/demo/demo1.html



위 URL 데모페이지에서 원하는 spinner를 골라 적어주세요.



<script>
$(document).ready(function(){
	$("#fakeLoader").fakeLoader({
		timeToHide:1200, // 로딩중에 걸리는 시간, 1000은 1초
		bgColor:"#f8f8f8", // 배경색
		spinner:"spinner2" // 로딩중으로 원하는 로딩이미지타입
	});
});
</script>



이렇게 세팅하면 로딩중 페이지가 완성되는데요, 원하는 로딩중 페이지가 이렇게 이미지만 있는 것이 아니라 

썸네일처럼 글자까지 있는 것을 만들고 싶으신 분들은 fakeLoader.js 안의 26번째줄을 보시면

 //Customized Spinners 라는 주석과 함께 spinner 변수들이 적혀져 있습니다.  

그 안에 해당 글귀나 혹은 글자 이미지를 넣어주시면 썸네일같은 로딩중 페이지를 만들 수 있습니다. 참고해주세요!



참고: http://joaopereirawd.github.io/fakeLoader.js/

반응형
반응형



[JQueryRotate] 이미지 회전 애니메이션


이미지를 회전하게 만들어주는 제이쿼리 플러그인입니다. 


이미지를 계속 회전하게 만들 수도 있고 45도 각도로 이미지를 기울일 수도 있고 

마우스 오버할 때, 또는 클릭할 때 이미지를 회전하게 만들 수 도 있죠. 

여러가지 방법들이 있지만 그 중 이미지를 계속 빙글빙글 돌아가게 만드는 예제를 소개할까 합니다. 


먼저 jquery plugin 파일을 다운로드 받아주세요.


jQueryRotateCompressed.js


다운로드 받은 js(jQueryRotateCompressed.js)를 폴더에 넣어주시고 스크립트를 html으로 넣어줍니다.



<script src="jQueryRotateCompressed.js"></script>



그 다음 빙글빙글 돌아가게 만드는 이미지를 <body> 안에 넣어주시는데 이미지의 id값은 image로 주시고

 해당 스크립트를 돌아가게 만들 스크립트 소스를 </body> 앞에 넣어줍니다.



<img src="---.jpg" id="image">



var angle = 0;
setInterval(function(){
      angle+=3;
     $("#image").rotate(angle);
},50);


완성된 데모페이지는 아래 URL에서 확인하실 수 있습니다.

보시는 것처럼 제이쿼리플러그인과 스크립트로 쉽고 간단하게 이미지를 회전시킬 수 있죠.


http://jsfiddle.net/xpdd0vz2/ (데모페이지)



내용을 단순하게 정리하기는 했지만 이것이 부족하다고 느끼시는 분들은 

이미지를 회전시키는 다양한 방법과 응용은 참조 페이지 안에서 참고 부탁드립니다.


참조 :  http://jqueryrotate.com/



반응형
반응형



[lazy load] 이미지 로딩을 지연시켜주는 이미지 플러그인



lazy는 게으른, 느릇한, 여유로운을 뜻하는 형용사입니다. 

단어의 뜻 그대로 lazyload는 게으른 이미지 로딩 플러그인을 뜻하는데요. 

즉 lazy load plugin은 화면에 보이는 영역의 이미지만 동적으로 로딩시켜 페이지의 로딩속도 향상, 

서버의 트래픽 절감 시켜주는 효과를 주는 이미지 플러그인입니다. 

말로 설명하자니 뭔가 체감이 안되실텐데요. 먼저 예제 사이트를 보시죠.



http://appelsiini.net/projects/lazyload/fadein/



해당 사이트처럼 이미지들이 전부 나오는게 아니라 이미지가 보고 있는 영역에 도달해야지만 로딩이 되게끔 보여지고 있습니다. 

세팅하는 방법도 무척 단순하죠. 아래 URL로 들어가시면 플러그인을 받을 수 있는 github 다운로드 페이지가 뜹니다. 

페이지에서 해당 파일을 다운받아주세요. 페이지가 열리지 않는다면 여기서 다운받아주세요.


https://plugins.jquery.com/lazyload/

jquery.lazyload.min.js



파일을 받으셨다면 jquery.lazyload.min.js 파일을 폴더에 넣고 아래 스크립트를 </head> 안의 ctrl+c, ctrl+v 해주세요.


<script src="jquery.lazyload.min.js"></script>


html 안의 이미지를 넣을 부분에 class를 lazy라고 표기해주세요. (이미지들은 가지고 계신 이미지들을 넣어주시면 됩니다.)


<img class="lazy" src="...">
<img class="lazy" src="...">
<img class="lazy" src="...">


마지막으로 lazyload를 실행시키기 위한 스크립트를 넣어주면 완성입니다.


$("img.lazy").lazyload({
	effect : "fadeIn"
});


참조 :  http://appelsiini.net/projects/lazyload/



이 글을 올린 지가 2017년이었는데 덧글이 달려있어 오랜만에 확인해보니 

버전이 업데이트 되서 작동을 하지 않는 이슈가 있었다는 걸 뒤늦게 알게 되었습니다 ㅠㅠ

버전 1.8.2의 lazyload 플러그인 내용으로 수정된 파일과 변경된 페이지를 공유드립니다. 내용 참고 부탁드립니다.


https://appelsiini.net/projects/lazyload/



반응형
반응형


[animate/waypoints] 스크롤에 반응하는 스크롤 애니메이션


이번에 소개할 제이쿼리 플러그인은, css만으로 애니메이션 효과를 쉽게 구현할 수 있는 animate 제이쿼리 플러그인과 

크롤을 하면 지정한 위치 영역에 이벤트를 발생시키는 waypoints 제이쿼리 플러그인 이렇게 두가지 입니다. 


waypoints 같은 경우는 앞글, 카운트업(보러가기)의 스크립트 설명 때에 잠시 나왔었는데, 

스크롤에 맞춰 이벤트가 실행되기 때문에 스크롤이 느리게, 혹은 빠르게 내려간다하더라도 

이벤트가 늦게 나오거나 이벤트가 (이미 실행된 뒤이기 때문에 멈춰보이거나 하는 일들이 현저히 줄어들게 됩니다. 

게다가 이미지들이 살아있는 것처럼 움직여주는 animate를 함께 쓰게 되면 웹페이지를 보다 생동감있게 표현할 수 있게 되는거죠.


https://github.com/daneden/animate.css

https://github.com/imakewebthings/waypoints



위 URL로 들어가시면 플러그인을 받을 수 있는 github 다운로드 페이지가 뜹니다. 페이지에서 해당 파일을 다운받아주세요. 

페이지가 열리지 않는다면 여기서 다운받아주세요.


waypoints-master.zip

animate.css-master.zip



waypoints는 lib 폴더 안에 jquery.waypoints.min.js를 가져와주시고 animate는 animate.min.css를 가져와주시면 됩니다. 

각각 받은 파일을 폴더에 넣고 아래 스크립트를 </head> 안의 ctrl+c, ctrl+v 해주세요.



<link rel="stylesheet" href="animate.min.css">
<script src="jquery.waypoints.min.js"></script>

그리고 애니메이션이 들어가야할 영역에 class를 animated라고 표기해주세요.


<div id="blue"> ... </div>
<div id="red" class="animated"> ... </div>
<div id="yellow"> ... </div>

다음은 waypoints를 실행시키기 위한 기본 문법 스크립트입니다.


$(document).ready(function(){
  $('#red').css('opacity', 0);
 
  $('#red').waypoint(function() {
      $('#red').addClass('원하는 애니메이션효과');
  }, { offset: '50%' });
 
});



 원하는 애니메이션 효과라고 써놓은 부분은 

https://daneden.github.io/animate.css/에 들어가셔서 

원하시는 애니메이션 효과를 골라 적용하시면 됩니다. 


 offset 값은 애니메이션이 나타나는 지점을 결정하는 값으로 50%정도로 적용시켜놓으면 

애니메이션이 나와야하는 영역의 맨 앞이 보이는 화면의 50% 스크롤이 이동되고 나서야 이벤트가 적용됩니다.  

예시 페이지는 아래를 참고해주세요.




참조사이트 :  https://spin.atomicobject.com/2015/05/31/scroll-anmiation-css-waypoints/




해당 소스로 진행했을 때, 내용이 전혀 먹히지 않는다는 문의가 있었습니다.

이 글을 올렸을 당시가 2017년도로 당시 animate.css버전이 3.5.2였는데,

현재는 4.1.1로 업그레이드도 된 데다가 classname이 변경된 사항을 뒤늦게 확인하였습니다.


변경 전 : class="animated" 
변경 후 : class="animate__animated"

변경 전 : fadeInLeft
변경 후 : animate__fadeInLeft


아래는 현재 버전으로 수정된 소스이며,

상세 내용은 https://animate.style/ 사이트에서 확인 부탁드립니다.





반응형
반응형



[Counter-Up] 지정된 숫자까지 카운트업, 숫자애니메이션


지정된 숫자까지 카운트업을 시켜주는 제이쿼리 플러그인입니다. 


다른 카운트업 플러그인은 적용시켰을 때 하단에 있다하더라도 메인화면이 뜨자마자 실행이 되어버려서 

스크롤을 내려 하단에 갔을 때는 이미 실행된 뒤라 애니메이션 효과를 기대하기가 힘들었는데, 

이 플러그인은 지정된 숫자까지 타이머처럼 숫자가 휘리릭 돌아가는 애니메이션 효과와 더불어 

화면에 숫자가 드러나야만 실행이 된다는 장점이 있습니다. 

하단에 적용했다하더라도 스크롤이 하단으로 내려가서 화면에 숫자가 나타나야지만 실행이 된다는 거죠. 



https://github.com/bfintal/Counter-Up



위 URL로 들어가시면 플러그인을 받을 수 있는 github 다운로드 페이지가 뜹니다. 페이지에서 해당 파일을 다운받아주세요. 

다운로드 페이지가 열리지 않는다면 다운로드할 수 있는 파일을 올려둘테니 여기서 다운로드 받아주시면 됩니다.


Counter-Up-master.zip



<script src="http://cdnjs.cloudflare.com/ajax/libs/waypoints/2.0.3/waypoints.min.js"></script>
<script src="jquery.counterup.min.js"></script>


waypoint는 스크롤 할 때 해당 위치서 실행시킬 수 있도록 구현해주는 스크립트입니다. 

전부 ctrl+c, ctrl+v해서 </head> 안이나 </body> 안에 넣어주세요. 

html 안에는 숫자를 넣어야할 곳에 class를 "counter"라고 넣어주시면 됩니다. 



<span class="counter">1,234,567.00</span>
<span>$</span><span class="counter">1.99</span>
<span class="counter">12345</span>

그 다음, 아래의 스크립트도 ctrl+c, ctrl+v해서 같이 넣어주시면 됩니다.



$('.counter').counterUp({
    delay: 10,
    time: 1000
});

 

delay는 숫자당 돌아가는 속도를 지연시켜주는 요소이며  숫자가 높으면 높을 수록 숫자가 돌아가는 속도가 느려집니다.  
time은 카운트업 해주는 애니메이션의 전체 지속시간으로 1000일 경우, 1초를 의미합니다. 
이 부분을 생각하고 설정하게 되면 원하는 속도로 숫자가 돌아가게 되죠.


데모 페이지 들어가보기


내용을 정리해두긴 했지만 해당 페이지에 다 나와있는 내용을 고스란히 가져온거라 

보시고서 응용적인 부분에서는 이해가 가지 않는 부분이 있을 수도 있습니다. 해당 부분은 github에서 참고 부탁드립니다.



반응형