IT정보/jQuery_javaScript
[제이쿼리] 기본 가로스크롤 선택요소 중앙정렬 & 스크롤에 따른 처음과 끝 버튼 처리 PC와 M버전별
천재소년s
2023. 1. 17. 13:34
반응형
모바일 : 기본 가로스크롤 선택요소 중앙정렬
임시로 스크롤은 보여지게 해놓음
.mobile.prodPaySort {position:relative;overflow:hidden;margin: 12px -20px 0;padding:0 10px;} .mobile.prodPaySort .scrollx{overflow-x:auto;white-space: nowrap;} .mobile.prodPaySort .scrollx::-webkit-scrollbar {display: block;width:1px;height:1px;-webkit-overflow-scrolling: touch;} .mobile.prodPaySort .scrollx::-webkit-scrollbar-thumb {height:30%;background-color:transparent;border-radius: 50px;box-shadow:none;} .mobile.prodPaySort .scrollx::-webkit-scrollbar-track {background-color:transparent;} .mobile.prodPaySort .btn_ctrl{position:absolute;top: 50%;display:flex;visibility:hidden;opacity:0;transition:all 0.2s;width:28px;height:40px;transform: translateY(-50%);z-index:100;font-size:1px;color:transparent;text-align:center;align-items: center;justify-content: center;} .mobile.prodPaySort .btn_ctrl.prev{left:0;} .mobile.prodPaySort .btn_ctrl.next{right:0;} .mobile.prodPaySort .btn_ctrl.prev:after, .mobile.prodPaySort .btn_ctrl.next:after{content:'';display:block;position:absolute;width:8px;height:12px;background:url('/images/mobile/common/btn_next02.png') no-repeat 0 0;background-size:8px auto;} .mobile.prodPaySort .btn_ctrl.prev:after{transform: rotate(-180deg);} .mobile.prodPaySort .btn_ctrl.prev:before, .mobile.prodPaySort .btn_ctrl.next:before{content:'';position:absolute;top:0;display:block;width:60px;height:100%;} .mobile.prodPaySort .btn_ctrl.prev:before{left:0; background: rgb(255,255,255); background: -moz-linear-gradient(90deg, rgba(255,255,255,1) 30%, rgba(255,255,255,0) 100%); background: -webkit-linear-gradient(90deg, rgba(255,255,255,1) 30%, rgba(255,255,255,0) 100%); background: linear-gradient(90deg, rgba(255,255,255,1) 30%, rgba(255,255,255,0) 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr="#ff0000",endColorstr="#ffffff",GradientType=1); } .mobile.prodPaySort .btn_ctrl.next:before{right:0; background: rgb(255,255,255); background: -moz-linear-gradient(270deg, rgba(255,255,255,1) 30%, rgba(255,255,255,0) 100%); background: -webkit-linear-gradient(270deg, rgba(255,255,255,1) 30%, rgba(255,255,255,0) 100%); background: linear-gradient(270deg, rgba(255,255,255,1) 30%, rgba(255,255,255,0) 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr="#ff0000",endColorstr="#ffffff",GradientType=1); } .mobile.prodPaySort .btn_ctrl.show{visibility:visible;opacity:1;} .mobile.prodPaySort .inner {font-size:0;} .mobile.prodPaySort button {display:inline-block;padding:0 15px;height:32px;font-size:14px;color:#525252;vertical-align:top;} .mobile.prodPaySort button.active {color:#fff;font-weight:bold;background-color:#000;border-radius:20px;}
//양쪽 버튼 컨트롤 var popupBtnWidthArr = function popupBtnWidth(){ var $popupScroll = $('.mobile').find('.scrollx'); var step = $popupScroll.parent().width()/2; $popupScroll.each(function(i){ var $btnPrev = $(this).parent().find(".btn_ctrl.prev"); var $btnNext = $(this).parent().find(".btn_ctrl.next"); if($(this).outerHeight() == $popupScroll.find('.inner').outerHeight()){ // 스크롤이 있을때와 없을때 버튼 보여지게 $btnNext.removeClass('show'); $btnPrev.removeClass('show'); }else{ $btnNext.addClass('show'); } $('#selectPaymentPop .btnLayerClose').on("click", function(e) { //팝업 닫았을때 버튼 초기화 $btnPrev.removeClass('show'); }); $(this).on('scroll', function() { $val = $(this).scrollLeft(); var time = 100; //스크롤 처음 $val == 0 ? $btnPrev.removeClass('show') : $btnPrev.addClass('show'); //스크롤 끝 ($val + $(this).outerWidth() + 1 >= $(this)[0].scrollWidth) ? $btnNext.removeClass('show') : $btnNext.addClass('show'); }); $btnPrev.on("click", function(e) { btnCtrlMove(e, this, 0) }); $btnNext.on("click", function(e) { btnCtrlMove(e, this, 1) }); function btnCtrlMove(e, _this, move) { e.preventDefault(); move == 0 ? moveText = "-=" : moveText = "+="; $(_this).parent().prev().stop().animate( { scrollLeft: moveText + step + "px" }, 250); } }); } popupBtnWidthArr() $('.mobile.prodPaySort button').on('click', function(){ $(this).addClass('active').siblings().removeClass('active'); scrollCenter($('.pc.prodPaySort .scrollx'),".active", 200); }); //scrollCenter($('.mobile.prodPaySort .scrollx'),".active", 200); var scrollCenter = function(target, elem, speed) { var active = $(target).find(elem); // find the active element var activeWidth = active.outerWidth() / 2; // get active width center var pos = active.position() == undefined ? 0 : active.position().left + activeWidth; //get left position of active li + center position 0613 개발수정 var elpos = $(target).scrollLeft(); // get current scroll position var elW = $(target).width() + 40; //get div width pos = pos + elpos - elW / 2; // for center position if you want adjust then change this $(target).animate({ scrollLeft: pos }, speed == undefined ? 1000 : speed); return target; };
PC : 기본 가로스크롤 선택요소 중앙정렬 (참고 : 개발처리로 버튼이 계속 그려지는 경우의 스크립트 처리)
임시로 스크롤은 보여지게 해놓음
.pc.prodPaySort {position:relative;max-height: 78px;overflow:hidden;border-bottom:1px solid #f3f3f3;} .pc.prodPaySort .scrollx{overflow-x:auto;white-space: nowrap;} .pc.prodPaySort .btn_ctrl{position:absolute;top: 50%;display:flex;visibility:hidden;opacity:0;transition:all 0.2s;margin-top:3px;width:30px;height:50px;transform: translateY(-50%);z-index:100;font-size:1px;color:transparent;align-items: center;justify-content: center;} .pc.prodPaySort .btn_ctrl.prev{left:0;} .pc.prodPaySort .btn_ctrl.next{right:0;} .pc.prodPaySort .btn_ctrl.prev:after, .pc.prodPaySort .btn_ctrl.next:after{content:'';position:absolute;display:block;width:9px;height:12px;background:url('/images/pc/common/btn_next02.png') no-repeat 0 0;border:1px solid red;} .pc.prodPaySort .btn_ctrl.prev:after{transform: rotate(-180deg);} .pc.prodPaySort .btn_ctrl.prev:before, .pc.prodPaySort .btn_ctrl.next:before{content:'';position:absolute;top:0;display:block;width: 80px;height:100%;} .pc.prodPaySort .btn_ctrl.prev:before{left:0; background: rgb(255,255,255); background: -moz-linear-gradient(90deg, rgba(255,255,255,1) 30%, rgba(255,255,255,0) 100%); background: -webkit-linear-gradient(90deg, rgba(255,255,255,1) 30%, rgba(255,255,255,0) 100%); background: linear-gradient(90deg, rgba(255,255,255,1) 30%, rgba(255,255,255,0) 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr="#ff0000",endColorstr="#ffffff",GradientType=1); } .pc.prodPaySort .btn_ctrl.next:before{right:0; background: rgb(255,255,255); background: -moz-linear-gradient(270deg, rgba(255,255,255,1) 30%, rgba(255,255,255,0) 100%); background: -webkit-linear-gradient(270deg, rgba(255,255,255,1) 30%, rgba(255,255,255,0) 100%); background: linear-gradient(270deg, rgba(255,255,255,1) 30%, rgba(255,255,255,0) 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr="#ff0000",endColorstr="#ffffff",GradientType=1); } .pc.prodPaySort .btn_ctrl.show{visibility:visible;opacity:1;} .pc.prodPaySort .inner {width:auto;padding:20px 0 16px;font-size:0;} .pc.prodPaySort button {margin-top:5px;padding:0 20px;height:36px;font-size:16px;color:#000;font-weight:700;border-radius:27.5px;text-align:center;} .pc.prodPaySort button + button{margin-left:4px;} .pc.prodPaySort button span{color:#000;} .pc.prodPaySort button.active {color:#fff;background-color:#000;} .pc.prodPaySort button.active span {color:#fff;}
//양쪽 버튼 컨트롤 var popupBtnWidthArr2 = function popupBtnWidth(){ var $popupScroll = $('.pc').find('.scrollx'); var step = $popupScroll.parent().width()/2; $popupScroll.each(function(i){ var $btnPrev = $(this).parent().find(".btn_ctrl.prev"); var $btnNext = $(this).parent().find(".btn_ctrl.next"); if($(this).outerHeight() == $popupScroll.find('.inner').outerHeight()){ // 스크롤이 있을때와 없을때 버튼 보여지게 $btnNext.removeClass('show'); $btnPrev.removeClass('show'); }else{ $btnNext.addClass('show'); } $('#btnPplChoiceClose').on("click", function(e) { //팝업 닫았을때 버튼 초기화 $btnPrev.removeClass('show'); }); $(this).on('scroll', function() { $val = $(this).scrollLeft(); var time = 100; //스크롤 처음 $val == 0 ? $btnPrev.removeClass('show') : $btnPrev.addClass('show'); //스크롤 끝 ($val + $(this).outerWidth() + 1 >= $(this)[0].scrollWidth) ? $btnNext.removeClass('show') : $btnNext.addClass('show'); }); $btnPrev.on("click", function(e) { btnCtrlMove(e, this, 0) }); $btnNext.on("click", function(e) { btnCtrlMove(e, this, 1) }); function btnCtrlMove(e, _this, move) { e.preventDefault(); move == 0 ? moveText = "-=" : moveText = "+="; $(_this).parent().prev().stop().animate( { scrollLeft: moveText + step + "px" }, 250); } }); } popupBtnWidthArr2(); $('.pc.prodPaySort button').on('click', function(){ $(this).addClass('active').siblings().removeClass('active'); scrollCenter2($('.pc.prodPaySort .scrollx'),".active", 200); }); //scrollCenter2($('.pc .scrollx'),".active", 200); var scrollCenter2 = function(target, elem, speed) { var active = $(target).find(elem); // find the active element var pos = active.position() == undefined ? 0 : active.position().left + active.outerWidth() / 2; var boxHarf = $(target).width()/2; $(target).stop().delay(1).animate({ scrollLeft: pos - boxHarf }, speed == undefined ? 1000 : speed); return target; };
반응형