티스토리 뷰
숫자가 단계적으로 카운트 되는 것을 간만해 작업해 보았다.
핵심은 배열의 Array.prototype.unshift(), Array.prototype.shift() 그리고 setTimeout() 이다.
HTML
- 테스트 할 숫자 두개정도 준비한다.
<div class="min">0</div>
<div class="max">0</div>
CSS
- 폰트사이즈 및 스타일링은 대충 알아서 적절히 한다.
.min,
.max{line-height:1.4;font-size:30px;font-weight:bold;color:#333;}
JS
- 카운트 모션 함수와 그 모션이 여러개 일 경우를 감안한 함수를 작성한다.
function counterUp( settings ){
var $settings = settings;
var $target =$settings.ele;
var countUpDatas = [];
var countFuncs;
var nums = [];
var delay=$settings.delay || 0.7;
var time=$settings.time || 400;
var divisions = time / delay;
var num = $settings.num;
//콤마가 있는지 체크 정규식
var isComma = /[0-9]+,[0-9]+/.test(num);
num = num.replace(/,/g, '');
// 숫자 목록 생성
for (var i = divisions; i >= 1; i--) {
// int 인 경우 int로 유지
var newNum = parseInt(num / divisions * i);
// 쉼표가있는 경우 쉼표 유지
if (isComma) {
while (/(\d+)(\d{3})/.test(newNum.toString())) {
newNum = newNum.toString().replace(/(\d+)(\d{3})/, '$1'+','+'$2');
}
}
nums.unshift(newNum);
}
countUpDatas=nums;
$target.text('0');
// 완료 될 때까지 번호를 업데이트
function updateNum() {
$target.text( countUpDatas.shift() );
//숫자를 담고 있는 배열 길이가 존재한다면 계속해서 루프 시킴.
if ( countUpDatas.length ) {
setTimeout( countFuncs, delay);
} else {
delete countUpDatas;
countUpDatas=null;
countFuncs=null;
}
}
countFuncs=updateNum;
// 카운트 시작
setTimeout( countFuncs, delay);
}
//실행할 카운트가 여러개일 경우 설정.
function numberMotion( items ) {
if(Object.prototype.toString.call( items )!=='[object Array]'){ return }
for( var i=0;i<items.length;i++){
counterUp( {num:items[i].num, ele:items[i].ele });
}
}
numberMotion( [ {num:'3,120', ele:$('.min') }, {num:'6,032,178', ele:$('.max') }]);
3자리수이상일 경우 내부에서 자동 콤마가 입력되게끔 설정하였다.
대략적인 방식은 numberMotion함수에 전달되는 숫자가 만약 3,000 이라면
2에서 3,000사이의 숫자를 계산된 시간의 수 만큼 루프로 배열에 담아둔다.
예) [12, 23, 25, 36,.........,'2,992', '3,000'] 이런식으로 말이다.
참고로 배열에 숫자가 3자리까지는 number인데 그 4자리 수부터는 문자열로 들어간다.
왜냐하면 정규식( 숫자가 3자리면서 1번이상 반복되는 수)으로 콤마가 들어가겠끔 하였고 콤마+숫자 표현은 결국 문자열이기에 그렇다.
그렇게 저장된 배열( countUpData )을
1. Array내장함수 shift()로 값을 하나씩 가져온다.
2. 그 가져온 값을 dom에 노출시킨다.
1번과 2번을 배열( countUpData )의 길이값(countUpData.length)이 0이 될때까지
루프(재귀방식)시킨다.
( setTimeout을 실행하는 함수 내부에 재호출하여 재귀함수처럼 루프가 된다. )
데모는 아래 주소로 확인할 수 있다.
demo: https://codepen.io/uxicode/pen/qzJKRb
'Programming language > javascript' 카테고리의 다른 글
code copy ( ctrl+c, ctrl+v 효과 ) (0) | 2021.01.10 |
---|---|
디스트럭쳐링이란 (0) | 2021.01.10 |
RxJs (0) | 2021.01.10 |
swiper ( 슬라이더 / 캐러셀 ) 라이브러리 (0) | 2021.01.08 |
[gulp ts] gulp 를 통한 typescript 변환 (0) | 2021.01.08 |
- Total
- Today
- Yesterday
- Aptana
- for of 구문
- 자바스크립트
- react-router-dom
- interceptors
- 앵귤러
- JsDoc
- Intrinsic
- icon font
- 아이콘 폰트 만들기
- Vue3
- svg 폰트
- React.StrictMode
- 리프래시토큰
- 반복문
- Angular
- cordova
- vue-router
- IntrinsicElements
- react
- git checkout -b
- svg icon font
- svg모션
- 내장요소
- CSS
- RefreshToken
- anime.js
- 태그
- git
- 코도바
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |