[공부]하는 몽씨/tip (18)

반응형

이 이야기는 (여러 퍼블리셔들과 개발자들이 그러하듯) 스크롤을 통한 마우스휠 풀페이지의 대명사 fullpage.js를 대체하기 위한 삽질을 뜨면서 시작되었습니다. 

fullpage.js는 아시다시피 라이센스가 있는 라이브러리라서 상업적 이용은 오직 구매로써 가능해집니다. (구매가 한 큐에 되는 거였으면 이런 개고생도 안 했겠지) 결과적으로 fullpage를 구현하기 위해서는 라이브러리를 사용하기보다 직접 만드는 수 밖에 없었는데요.

처음에는 scroll snap css로 어떻게든 해보자 싶었지만 섹션과 섹션 사이에 넘어가는 애니메이션 속도를 조절하기 어려웠고 또 메뉴를 넣었더니 메뉴 링크대로 넘어가지도 않는 대환장 파티가 벌어졌습니다. 

(서치해보니 이미 저와 같은 사람이 있었다는 것에 눈물이.. https://ethansup.net/blog/scroll-snap-instead-fullpage 나는 왜 다 하고서 이걸 발견했는가)

우선 제가 구현하고자 하는 풀페이지의 기능은,

1. 전체 스크롤(마우스휠) 풀페이지일 것
2. 상단 메뉴가 fixed이고 스크롤 넘어갈 때마다 메뉴 배경이 유동적일 것
3. 풀페이지로 넘어갈 때 우측에 navigation dots가 있을 것
4. 마지막 섹션에 다다르면 footer가 올라와줄 것


인데... 이게 되면 저게 안 되고 저게 되면 이게 안 되고 결국 온갖 오만 삽질을 혼자 다 하다가 swiper.js로 fullpage.js를 어느정도 구현할 수 있다는 내용을 발견하게 되었습니다. 철이 없었죠. 이걸로 다 땡칠 줄 알았다는게... (이 이후로 ing는 계속..)

여하튼, 아래 내용은 온갖 삽질 끝에 나온 결과물입니다. 저와 같은 피해자가 없길 바라며 잡소리는 끝. (풀페이지도 끝!)

(구현결과는 꼭 codepen에서 fullpage screen으로 보세요)

 

 

See the Pen fullpage (swiper.js) by ivory (@imivory) on CodePen.

반응형
반응형

실무에서 pdf를 직접 수정하는 일이 생겨, 아크로뱃DC로 수정을 하는데 글자가 깨지는 현상이 있었습니다.

 

이렇게 아크로뱃DC 자체 내에서 깨지는 현상이 있고,

 

pdf를 열 때 연결프로그램이 인터넷(크롬,엣지)일 경우 깨지는 현상이 있는데, 전자의 경우는 아크로뱃DC에서 자체적으로 지우면 되지만 후자의 경우는 아크로뱃DC 내에서는 글자가 정상적이게 뜨는 경우가 있을 수 있습니다.

 

저의 경우에는 수정할 내용을 워드와 메모장에 옮겨놓고 복사, 붙여넣기를 해서 벌어진 문제였는데 이는 아크로뱃DC에서 복사, 붙여넣기가 아닌 수기로 작성 하면 쉽게 해결이 가능합니다.

 

(인터넷으로 열어도 정상적으로 보입니다.)

이외에 pdf를 열어보니 글자가 깨져보이는 경우가 있을 수 있는데, 이 때에는 edit > preferences(설정)으로 가셔서 좌측 page Display를 클릭, Rendering의 Smooth Text를 For Monitor로 설정을 바꿔주시면 해결됩니다.

 

 

반응형
반응형

좁은 폼 안으로 input, 특히 type이 date인 input을 넣을 때에는 안에 있는 글씨가 길 경우, 잘리는 현상이 있을 수 있습니다. 잘리는 것 정도는 어쩔 수 없다해도 date안에 든 아이콘의 공백이 너무 길어서 당황스러울 때가 있었는데요.

 

이럴 때, css로 단순하게 해결할 수 있는 방법이 있습니다.
아래 소스를 참고해주세요.

 

 

 

* 참고: 
https://stackoverflow.com/questions/65409348/html-input-date-how-to-decrease-space-between-date-and-icon

반응형
반응형

 css를 사용하다보면 디테일하게 속성을 선택해야하는 상황이 있습니다. scss를 쓰는 방법 외에 css 상에서 쓸 수 있는 방법이 있는데 바로 css 속성 다중 선택(하위 문자열 일치 속성 선택)입니다. 

예를 들어 class명이 box로 시작되는 div의 텍스트 색상 값을 바꿔야 하는 작업이 있을 경우,

 

<div class="box-1">text</div>
<div class="box-2">text</div>
<div class="box-3">text</div>
<div class="box-4">text</div>
<div class="boxs-1">text</div>
<div class="boxs-2">text</div>
<div class="boxs-3">text</div>
<div class="boxs-4">text</div>

 

css로 div값을 잡고 작업을 해도 되고 class명을 추가하는 방법이 있지만 div가 중복이 되거나 class명을 추가할 수 없는 경우에는 아래 내용으로 작업할 수 있습니다.

 

div[class*="box-"] {
	color:blue;
}

해당 css를 기입할 경우, class명이 box-로 있는 div들만 선택되게 됩니다.

 

 

 

이와 같은 방법으로 여러가지 응용을 통해 작업할 수 있는데, 기본 구문은 [att*=val]로 보시면 됩니다. 

 

[att*=val]
[속성*=문자열]

 

비슷한 속성 값으로는, [att^=val]과 [att$=val] 이 있는데, 각각 사용하는 방법이 다릅니다.

 [att^=val]는 문자열(val)이 시작하는 요소를 선택하게 해주는데, 보통 href 링크 속성값 때 많이 쓰입니다. 대표적인 예로는 아래와 같습니다.

 

a[href^="http://www.domain.com"], a[href^="http://domain.com"] {
  color: blue;
}

 

[att$=val]는 [att^=val]와 반대로 문자열(val)이 끝나는 요소를 선택하게 해줍니다. 대표적인 예로는 아래와 같습니다.

 

a[href$=".pdf"] {
  background: url(../images/pdf.png) no-repeat center right;
  padding-right: 20px;
}


* 참고: 
https://www.impressivewebs.com/css3-attribute-selectors-substring-matching/
https://www.w3.org/TR/selectors/#attribute-substrings

반응형
반응형


여러 개의 항목 중에서 하나만 선택하게 하는 선택 버튼 형태는  라디오 버튼 (input type="radio")을 쓰는 것이 가장 기본적이긴 하지만, 필요에 따라서는 a 링크를 써야할 때가 있습니다. 

이번에 제가 진행했었던 결제 페이지 만들기가 그런 경우였는데요. 아래 내용을 그대로 따라해봅시다. 

* HTML

 

<a href="#;" class="Type" id="card">
  <div class="payType on">
    <div class="payType_title">
      간편결제<br /><span>(네이버페이,카카오페이,삼성페이 등)</span>
    </div>
    <div class="chk_img" id="card_arr">
      <img src="체크용 버튼 이미지" />
    </div>
  </div>
</a>
<a href="#;" class="Type" id="card_ISP">
  <div class="payType">
    <div class="payType_title">
      신용카드 결제<br /><span>(인증서 제출방식, 앱카드)</span>
    </div>
    <div class="chk_img" id="card_ISP_arr">
      <img src="체크용 버튼 이미지" />
    </div>
  </div>
</a>
<a href="#;" class="Type" id="mobile">
  <div class="payType">
    <div class="payType_title">휴대폰 결제</div>
    <div class="chk_img" id="mobile_arr">
      <img src="체크용 버튼 이미지" />
    </div>
  </div>
</a>

<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>

* css

  .payType {
    display: block;
    border: 1px solid #dadada;
    border-radius: 5px;
    width: 517px;
    padding: 23px;
    margin-bottom: 10px;
  }
  .payType > .payType_title {
    display: inline-block;
    vertical-align: middle;
  }
  .payType_title {
    font-size: 15px;
    font-weight: 700;
    color: #ff273d;
  }
  .payType_title > span {
    font-size: 12px;
    font-weight: 500;
    color: #333;
  }
  .payType.on {
    background: #fff6f6;
    border: 1px solid #ff273d;
  }
  .chk_img {
    float: right;
    display: none;
    vertical-align: middle;
  }
  .payType.on > .chk_img {
    display: inline-block;
  }

* javascript

  $(".Type").click(function (e) {
    e.preventDefault();
    var id = $(this).attr("id");

    $(".Type .payType").removeClass("on");
    $(".chk_img").hide();
    $("#" + id + " .payType").addClass("on");
    $("#" + id + "_arr").show();
  });

이처럼 클릭 시, class를 추가 또는 제거하는 스크립트로 선택된 버튼과 선택되지 않은 버튼을 구분해줍니다.

 

 

 

위 내용으로 a링크가 아닌 라디오 버튼으로 버튼형태를 만들 수 있습니다. 아래 내용을 참고해주세요.

* html

<label class="Type" id="card">
  <div class="payType on">
    <input type="radio" name="value1" />
    <div class="payType_title">
      간편결제<br /><span>(네이버페이,카카오페이,삼성페이 등)</span>
    </div>
    <div class="chk_img" id="card_arr">
      <img src="체크용 버튼 이미지" />
    </div>
  </div>
</label>

<label class="Type" id="card_ISP">
  <input type="radio" name="value1" />
  <div class="payType">
    <div class="payType_title">
      간편결제<br /><span>(네이버페이,카카오페이,삼성페이 등)</span>
    </div>
    <div class="chk_img" id="card_ISP_arr">
      <img src="http://imivory.me/img/noname/icon_chk.png" />
    </div>
  </div>
</label>

<label class="Type" id="mobile">
  <input type="radio" name="value1" />
  <div class="payType">
    <div class="payType_title">휴대폰 결제</div>
    <div class="chk_img" id="mobile_arr">
      <img src="체크용 버튼 이미지" />
    </div>
  </div>
</label>

* css

.payType {
    display: block;
    border: 1px solid #dadada;
    border-radius: 5px;
    width: 517px;
    padding: 23px;
    margin-bottom: 10px;
  }
  .payType > .payType_title {
    display: inline-block;
    vertical-align: middle;
  }
  .payType_title {
    font-size: 15px;
    font-weight: 700;
    color: #ff273d;
  }
  .payType_title > span {
    font-size: 12px;
    font-weight: 500;
    color: #333;
  }
  .payType.on {
    background: #fff6f6;
    border: 1px solid #ff273d;
  }
  .chk_img {
    float: right;
    display: none;
    vertical-align: middle;
  }
  .payType.on > .chk_img {
    display: inline-block;
  }

  input[type="radio"] {
    display: none;
  }

* javascript

  $(".Type").click(function (e) {
    e.preventDefault();
    var id = $(this).attr("id");

    $(".Type .payType").removeClass("on");
    $(".chk_img").hide();
    $("#" + id + " .payType").addClass("on");
    $("#" + id + "_arr").show();
  });

 

 

반응형
반응형

금액 부분을 넣을 때, 숫자 3자리마다 콤마가 없으면 가독성이 떨어지기 때문에 되도록 콤마를 넣어주는 것이 좋습니다.

금액에 자동 콤마를 넣는 경우는 여러가지가 있지만 input에 사용자가 입력한 숫자에 자동적으로 넣게 하거나, 스크립트를 통해 나온 숫자에 콤마를 붙여주는 방법을 소개하려 합니다.

새로 만든 html 파일에 아래 내용을 넣어줍니다.

 

* html

<input type="text" maxlength="10" onkeyup="inputNumberFormat(this);" placeholder="input 숫자만" />

javascript 파일에 해당 내용을 넣어줍니다.
(아래 내용에는 input에 숫자만 넣을 수 있는 스크립트가 포함되어 있습니다.)

* javascript

function comma(str) {
        str = String(str);
        return str.replace(/(\d)(?=(?:\d{3})+(?!\d))/g, '$1,');
    }

    function uncomma(str) {
        str = String(str);
        return str.replace(/[^\d]+/g, '');
    } 
    
    function inputNumberFormat(obj) {
        obj.value = comma(uncomma(obj.value));
    }
    
    function inputOnlyNumberFormat(obj) {
        obj.value = onlynumber(uncomma(obj.value));
    }
    
    function onlynumber(str) {
	    str = String(str);
	    return str.replace(/(\d)(?=(?:\d{3})+(?!\d))/g,'$1');
	}

 이렇게 하면 input에 콤마를 자동적으로 넣을 수 있게 됩니다. 다음은 영역 안에 있는 숫자에 콤마를 붙여보죠.

* html

<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<span id="money">60000</span><span>원</span>

* javascript

var money = $('#money').text();
var money2 = money.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
$('#money').text(money2);

id 안에 들어오는 숫자 데이터는 자동적으로 콤마가 붙여지게 됩니다.

 

 

 


* 참고사이트
https://chobopark.tistory.com/175

 

[정규식] input숫자만입력&콤마적용 방법!!

(일부 오류가 있어 onlynumber 함수를 추가하였습니다. 2021년 5월 11일) 안녕하세요. 오늘은 정규식에서 input창에 숫자만 적히면서 콤마를 붙일수도, 안 붙일수도 있는 정규식을 이야기해보겠습니다.

chobopark.tistory.com

 

 

반응형
반응형

보통 리스트를 만들 때, 많이 쓰는 태그는 뭐니뭐니해도 <ul> 이지만 숫자 리스트를 써야할 때는 간혹 <ol>을 쓰기도 하는데, 

앞단에 숫자만 나열하기에는 아쉬움이 남아 숫자를 이쁘게 꾸며볼 생각으로 이것저것 뒤적여보던 중에 <ol>이 아닌 <ul>로, 앞단에 자동으로 카운터가 붙는 리스트를 오직 css로만 써서 만들 수 있는 팁을 발견했습니다. 

먼저 예시로 아래 내용을 준비해주세요.

 

* HTML

<ul class="num">
	<li>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Nisl tincidunt eget nullam non.</li>	
	<li>Quis hendrerit dolor magna eget est lorem ipsum dolor sit. Volutpat odio facilisis mauris sit amet massa. </li>	
	<li>Commodo odio aenean sed adipiscing diam donec adipiscing tristique. Mi eget mauris pharetra et. </li>	
</ul>

 

* CSS

ul,li {
	list-style:none;
}
.num {
    counter-reset: list-number;
    margin-bottom: 49px;
}
.num > li {
    counter-increment: list-number;
    padding-bottom: 7px;
    font-size: 20px;
}
.num > li::before {
    content: counter(list-number);
    display: inline-block;
    text-align: center;
    line-height: 1.5;
    width: 25px;
    height: 25px;
    border-radius: 50%;
    color: #fff;
    margin-right: 10px;
    background: #00CE7A;
    font-size: 16px
}

 

* 적용화면

 

 

부모 요소인 counter-reset는 카운터를 할 환경을 만들어주는 css로 list-number; 또는 list-number 0; 으로 값을 초기화 해줍니다. (여기서 list-number는 임의로 적어둔 변수입니다.)

counter-increment는 증가량으로 counter-reset과 마찬가지로 list-number; 또는 list-number 1; 으로 값을 지정해줍니다.

마지막으로 li::before에 content: counter(list-number);를 적어주면 완성됩니다.


* 참고사이트
https://developer.mozilla.org/ko/docs/Web/CSS/CSS_Counter_Styles/Using_CSS_counters
https://blog.logrocket.com/styling-numbered-lists-with-css-counters/
https://wellcode.tistory.com/12

반응형
반응형

[Tip] 웹폰트 적용 방식


웹폰트를 적용하는 방법에는 여러 가지가 있지만 제가 실무에서 웹폰트를 주로 쓰는 방식은 

보통 css 파일에서 @import url로 다른 사이트에 있는 css를 불러와 사용하는 방식입니다. 

 

이밖에도 상황에 따라 웹폰트를 다르게 적용하고는 하는데, 

그중 개인적으로 제가 자주 쓰는 방식들로 정리해보았습니다. 

 

1. @import url

 

@import url("//fonts.googleapis.com/earlyaccess/notosanskr.css"); //노토산스체
@import url("//cdn.rawgit.com/moonspam/NanumSquare/master/nanumsquare.css"); //나눔스퀘어체

 

자주 쓰는 @import url 방식으로 css 파일에 해당 웹폰트를 올려주고 font-family에 폰트를 넣어주면 적용이 끝납니다.

노토산스체는 구글 폰트에서, 나눔스퀘어체는 눈누에서 가져왔습니다.

 

* 구글폰트 : https://fonts.google.com/specimen/Noto+Sans+KR?subset=korean

* 눈누 : https://noonnu.cc/font_page/37

 

 

2. link href

 

<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@100&display=swap" rel="stylesheet">

 

html 안에 link를 넣는 방식으로 관련 소스는 @import url과 마찬가지로 구글 폰트에서 가져옵니다.

 

 

3. webfont loader

 

<script src="//ajax.googleapis.com/ajax/libs/webfont/1.4.7/webfont.js"></script>
<script>
WebFont.load({
google: {
families: ['Lato', 'Noto Sans', 'Noto Sans KR']
}
});
</script>

 

구글 웹폰트를 좀 더 빠르게 로드해야 한다면 위 소스를 추천합니다.

로드할 글꼴을 지정하기만 하면 되서 훨씬 간편하죠.

 

* webfont loader : https://github.com/typekit/webfontloader

 

 

4. 폰트파일이 있을 때

 

@font-face {
    font-family: 's-core-dream-thin';
    src: url('scdream1-webfont.woff2') format('woff2'),
        url('scdream1-webfont.woff') format('woff');
    font-weight: normal;
    font-style: normal;
}

 

가지고 있는 폰트 파일이 있다면 css파일에 직접 해당 소스를 넣는 방법도 있습니다.

format 파일은 local (사용자 환경) > eot > woff2/woff > ttf > svg 순서대로 기술하는 것이 좋습니다.

 

 

* 참고사이트 :

https://www.daleseo.com/css-web-fonts/

https://nolboo.kim/blog/2013/10/22/google-web-font-faster-tip/

https://kimdabin.tistory.com/entry/Font-format%EA%B3%BC-font-face-%EC%84%A0%EC%96%B8-%EB%B0%8F-%EC%A0%81%EC%9A%A9%EB%B2%95

반응형
반응형

[Tip] magnific popup을 iframe 안에서 열었을 시 문제점

 

 

제 포스팅에 자주 나와서 짐작하고 계시겠지만 

전 magnific popup을 실무에서 자주 사용하는 편입니다. 

 

반응형 팝업이란 장점 뿐만 아니라 유튜브(비디오) 팝업, 갤러리 형식, 모달까지 구현되는

편리한 점들이 많아서 자주 애용하고 있는데,

iframe 안에 플러그인 팝업을 띄우는 상황에서 문제점을 확인하였습니다. 

 

 

 

 

 

일반 페이지에서는 팝업이 자동적으로 높이를 측정하여 중앙에 팝업을 띄우는데,

iframe 안에서는 팝업이 자동적으로 높이를 측정할 수 없어 

팝업이 화면 중앙이 아닌 하단에 위치되거나 상단에 위치되거나 

그도 아니면 중앙이 아닌 부분에 위치하는 난감한 상황이 벌어지게 됩니다.

 

열심히 구글링을 하고 삽질을 하면서 겨우 찾아낸 방식은 아래와 같습니다.

 



$('클래스명').magnificPopup
  callbacks:
    open: resizeThumbnailViewer
    imageLoadComplete: resizeThumbnailViewer

resizeThumbnailViewer = ->
  $('.mfp-wrap').css({top: viewport.scrollTop(), height: viewport.height()})
  $('.mfp-img').css({'max-height': viewport.height()})

 

위 내용으로 적용하니 iframe 안에서도 중앙 정 가운데에 뜨는 것을 확인할 수 있었습니다.

혹시 몰라 하단에 출처도 남깁니다.

 

 

* 참고 : https://github.com/dimsemenov/Magnific-Popup/issues/728

 

반응형
반응형

[Tip] checkbox 초기화하기



모바일에서의 햄버거 메뉴를 구현 하는 중, 다른 페이지로 이동했다가 모바일에서 뒤로 가기를 하면 

햄버거 메뉴가 자동적으로 열리는 오류가 있었습니다.

페이지가 이동하면서 checkbox에 checked가 초기화되지 않고 자동적으로 checked되었기 때문에 발생한 오류였는데요. 

checked를 풀기 위해서는 페이지가 열릴 때마다 checkbox를 초기화하는 작업이 필요했습니다. 

꽤 여러 삽질을 거쳤는데요;; 제 경우는 아래 세 경우를 모두 적용하고 나서야 해당 오류에서 벗어날 수 있었습니다.





혹시 몰라 적용된 예시도 올려두겠습니다. 

(해당 내용은 두번째 방법을 제외한 내용이 들어 있습니다.)




1/ 별도 js 스크립트에서 초기화 내용 넣기


window.onpageshow = function(event) {
    if ( event.persisted || (window.performance && window.performance.navigation.type == 2)) {
	var chk = $("#menu__toggle").is(":checked");
	if(chk) {$("#menu__toggle").prop("checked", false).attr("checked", false).removeAttr("checked");}
    }
};



2/ index.html에 넣기 (jquery 사용)


<script>
function uncheck(){
	$(':checkbox:checked').prop('checked',false);
};
</script>
<body onLoad="uncheck()">


3/ autocomplete="off"를 넣기


<input type="checkbox" autocomplete="off">


* 첫번째 방법 참고 사이트 : https://dev-t-blog.tistory.com/9 , http://amabile29.blog.me/221548195341

* 두번째 방법 참고 사이트 : https://itbloger.tistory.com/1019

* 세번쨰 방법 참고 사이트 : http://triki.net/prgm/126

* 햄버거 메뉴 참고 사이트 : https://codepen.io/andreykrokhin/pen/mGEqja

반응형