{"id":858,"date":"2026-06-26T13:39:03","date_gmt":"2026-06-26T13:39:03","guid":{"rendered":"https:\/\/aabbee.cafe24.com\/?p=858"},"modified":"2026-06-26T13:39:03","modified_gmt":"2026-06-26T13:39:03","slug":"skillbar","status":"publish","type":"post","link":"https:\/\/coalacoding.com\/?p=858","title":{"rendered":"\uc2a4\ud0ac\ubc14 UI"},"content":{"rendered":"<h1>\uc2a4\ud0ac\ubc14 UI<\/h1>\n<p>\uc2a4\ud0ac\ubc14\ub294 \ud3ec\ud2b8\ud3f4\ub9ac\uc624 \uc0ac\uc774\ud2b8\uc5d0\uc11c \uae30\uc220 \uc219\ub828\ub3c4\ub97c \uc2dc\uac01\uc801\uc73c\ub85c \ubcf4\uc5ec\uc8fc\ub294 UI \uc694\uc18c\uc774\ub2e4. \uc2a4\ud06c\ub864 \uc704\uce58\uc5d0 \ub530\ub77c \ub9c9\ub300\ub098 \uc6d0\uc774 \ucc44\uc6cc\uc9c0\ub294 \uc560\ub2c8\uba54\uc774\uc158\uc744 \uad6c\ud604\ud55c\ub2e4.<\/p>\n<hr>\n<h2>1. \ub9c9\ub300\ud615 \uc2a4\ud0ac\ubc14<\/h2>\n<p>\uc2a4\ud06c\ub864\uc774 \ud2b9\uc815 \uc704\uce58\uc5d0 \ub3c4\ub2ec\ud558\uba74 \ub9c9\ub300\uac00 \ub298\uc5b4\ub098\uba74\uc11c \ud37c\uc13c\ud2b8 \uc22b\uc790\uac00 \uc62c\ub77c\uac00\ub294 \uc560\ub2c8\uba54\uc774\uc158\uc774\ub2e4.<\/p>\n<blockquote>\n<p><strong>Note<\/strong>: jQuery 3 \uae30\ubc18\uc758 \ub9c9\ub300\ud615 \uc2a4\ud0ac\ubc14\ub97c \ub9cc\ub4e4\uc5b4\uc918. \uc870\uac74\uc740 \ub2e4\uc74c\uacfc \uac19\uc544. 1) \ud504\ub85c\uadf8\ub808\uc2a4 \ubc14 3\uac1c\ub97c \uc138\ub85c\ub85c \ubc30\uce58\ud558\uace0, \uac01\uac01 \ubaa9\ud45c \ud37c\uc13c\ud2b8\ub97c data-rate \uc18d\uc131\uc73c\ub85c \uc9c0\uc815\ud55c\ub2e4(30%, 90%, 60%). 2) \uc2a4\ud06c\ub864\uc774 \uc560\ub2c8\uba54\uc774\uc158 \uc601\uc5ed\uc5d0 \ub3c4\ub2ec\ud558\uba74 \ub9c9\ub300\uc758 width\uac00 0%\uc5d0\uc11c \ubaa9\ud45c \ud37c\uc13c\ud2b8\uae4c\uc9c0 2500ms \ub3d9\uc548 \ub298\uc5b4\ub09c\ub2e4. 3) \ub3d9\uc2dc\uc5d0 \ud37c\uc13c\ud2b8 \uc22b\uc790\uac00 0\ubd80\ud130 \ubaa9\ud45c\uac12\uae4c\uc9c0 \uce74\uc6b4\ud2b8\uc5c5\ub41c\ub2e4. 4) \uc560\ub2c8\uba54\uc774\uc158\uc740 1\ud68c\ub9cc \uc2e4\ud589\ub41c\ub2e4. 5) \uc774\ubca4\ud2b8 \ubc14\uc778\ub529\uc740 .on(&#39;scroll&#39;)\uc744 \uc0ac\uc6a9\ud55c\ub2e4.<\/p>\n<\/blockquote>\n<h4>HTML<\/h4>\n<pre><code class=\"language-html\">&lt;div class=&quot;content&quot;&gt;contents&lt;\/div&gt;\n&lt;div class=&quot;animation&quot;&gt;\n  &lt;div class=&quot;progress-bar&quot;&gt;\n    &lt;div class=&quot;bar&quot;&gt;&lt;\/div&gt;\n    &lt;div class=&quot;rate&quot; data-rate=&quot;30&quot;&gt;&lt;\/div&gt;\n  &lt;\/div&gt;\n  &lt;div class=&quot;progress-bar&quot;&gt;\n    &lt;div class=&quot;bar&quot;&gt;&lt;\/div&gt;\n    &lt;div class=&quot;rate&quot; data-rate=&quot;90&quot;&gt;&lt;\/div&gt;\n  &lt;\/div&gt;\n  &lt;div class=&quot;progress-bar&quot;&gt;\n    &lt;div class=&quot;bar&quot;&gt;&lt;\/div&gt;\n    &lt;div class=&quot;rate&quot; data-rate=&quot;60&quot;&gt;&lt;\/div&gt;\n  &lt;\/div&gt;\n&lt;\/div&gt;\n&lt;div class=&quot;content&quot;&gt;contents&lt;\/div&gt;\n<\/code><\/pre>\n<table>\n<thead>\n<tr>\n<th align=\"left\">\uc904<\/th>\n<th align=\"left\">\uc124\uba85<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td align=\"left\">1<\/td>\n<td align=\"left\">\uc2a4\ud06c\ub864 \ud655\uc778\uc6a9 \ucf58\ud150\uce20 \uc601\uc5ed\uc774\ub2e4<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">2<\/td>\n<td align=\"left\">\uc560\ub2c8\uba54\uc774\uc158 \uc601\uc5ed\uc758 \uc2dc\uc791\uc774\ub2e4. \uc774 \uc694\uc18c\uc758 \uc704\uce58\ub97c \uae30\uc900\uc73c\ub85c \uc2a4\ud06c\ub864\uc744 \uac10\uc9c0\ud55c\ub2e4<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">3<\/td>\n<td align=\"left\">\ud558\ub098\uc758 \ud504\ub85c\uadf8\ub808\uc2a4 \ubc14 \ubb36\uc74c\uc774\ub2e4<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">4<\/td>\n<td align=\"left\">\uc2e4\uc81c\ub85c \ub298\uc5b4\ub098\ub294 \uc0c9\uc0c1 \ub9c9\ub300\uc774\ub2e4<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">5<\/td>\n<td align=\"left\">\ud37c\uc13c\ud2b8 \uc22b\uc790\ub97c \ud45c\uc2dc\ud558\ub294 \uc601\uc5ed\uc774\ub2e4. <code>data-rate<\/code>\uc5d0 \ubaa9\ud45c \ud37c\uc13c\ud2b8 \uac12\uc744 \uc9c0\uc815\ud55c\ub2e4<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h4>CSS<\/h4>\n<pre><code class=\"language-css\">.progress-bar {\n  position: relative;\n  width: 960px;\n  height: 30px;\n  margin: 3em auto;\n  border: 1px solid green;\n}\n.progress-bar .bar {\n  position: absolute;\n  left: 0;\n  top: 0;\n  bottom: 0;\n  width: 0;\n  background: green;\n}\n.progress-bar .rate {\n  position: absolute;\n  top: 0;\n  right: 15px;\n  bottom: 0;\n  line-height: 30px;\n  font-size: 1.2em;\n  color: green;\n}\n.content {\n  height: 800px;\n  font-size: 3em;\n}\n<\/code><\/pre>\n<table>\n<thead>\n<tr>\n<th align=\"left\">\uc904<\/th>\n<th align=\"left\">\uc124\uba85<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td align=\"left\">1~7<\/td>\n<td align=\"left\"><code>.progress-bar<\/code>\ub97c <code>position: relative<\/code>\ub85c \uc124\uc815\ud558\uc5ec \ub0b4\ubd80 \uc694\uc18c\uc758 \uae30\uc900\uc810\uc73c\ub85c \ub9cc\ub4e0\ub2e4<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">8~15<\/td>\n<td align=\"left\"><code>.bar<\/code>\ub294 <code>position: absolute<\/code>\ub85c \uc67c\ucabd\uc5d0 \ubd99\uc774\uace0, <code>width: 0<\/code>\uc73c\ub85c \uc2dc\uc791\ud55c\ub2e4. jQuery\uac00 \uc774 \uac12\uc744 \ub298\ub9b0\ub2e4<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">16~24<\/td>\n<td align=\"left\"><code>.rate<\/code>\ub294 \uc624\ub978\ucabd\uc5d0 \ubc30\uce58\ud558\uc5ec \ud37c\uc13c\ud2b8 \ud14d\uc2a4\ud2b8\ub97c \ud45c\uc2dc\ud55c\ub2e4. <code>line-height<\/code>\ub85c \uc218\uc9c1 \uc911\uc559 \uc815\ub82c\ud55c\ub2e4<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">25~28<\/td>\n<td align=\"left\"><code>.content<\/code>\uc5d0 <code>height: 800px<\/code>\uc744 \uc8fc\uc5b4 \uc2a4\ud06c\ub864 \uacf5\uac04\uc744 \ud655\ubcf4\ud55c\ub2e4<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h4>JS<\/h4>\n<pre><code class=\"language-js\">$(function () {\n  var wrap = $(&#39;.progress-bar&#39;);\n  var ost = $(&#39;.animation&#39;).offset().top - 600;\n  var isAni = false;\n\n  $(window).on(&#39;scroll&#39;, function () {\n    if ($(window).scrollTop() &gt;= ost &amp;&amp; !isAni) {\n      runAnimation();\n    }\n  });\n\n  function runAnimation() {\n    wrap.each(function () {\n      var $this = $(this);\n      var bar = $this.find(&#39;.bar&#39;);\n      var txt = $this.find(&#39;.rate&#39;);\n      var rate = txt.attr(&#39;data-rate&#39;);\n\n      bar.animate({ width: rate + &#39;%&#39; }, 2500);\n\n      $({ rate: 0 }).animate(\n        { rate: rate },\n        {\n          duration: 2000,\n          progress: function () {\n            var now = this.rate;\n            txt.text(Math.floor(now) + &#39;%&#39;);\n          },\n          complete: function () {\n            isAni = true;\n          },\n        }\n      );\n    });\n  }\n});\n<\/code><\/pre>\n<table>\n<thead>\n<tr>\n<th align=\"left\">\uc904<\/th>\n<th align=\"left\">\uc124\uba85<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td align=\"left\">1<\/td>\n<td align=\"left\"><code>$(function(){})<\/code> \u2014 \ubb38\uc11c\uac00 \uc900\ube44\ub418\uba74 \uc2e4\ud589\ud558\ub294 jQuery \ub2e8\ucd95 \ubb38\ubc95\uc774\ub2e4<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">2<\/td>\n<td align=\"left\">\ubaa8\ub4e0 <code>.progress-bar<\/code> \uc694\uc18c\ub97c \uc120\ud0dd\ud558\uc5ec <code>wrap<\/code>\uc5d0 \uc800\uc7a5\ud55c\ub2e4<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">3<\/td>\n<td align=\"left\"><code>.animation<\/code> \uc601\uc5ed\uc758 \uc0c1\ub2e8 \uc704\uce58\uc5d0\uc11c 600px\uc744 \ube80 \uac12\uc744 \ud2b8\ub9ac\uac70 \uc9c0\uc810\uc73c\ub85c \uc124\uc815\ud55c\ub2e4<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">4<\/td>\n<td align=\"left\"><code>isAni<\/code> \u2014 \uc560\ub2c8\uba54\uc774\uc158 \uc2e4\ud589 \uc5ec\ubd80\ub97c \ucd94\uc801\ud558\ub294 \ud50c\ub798\uadf8 \ubcc0\uc218\uc774\ub2e4<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">6~10<\/td>\n<td align=\"left\"><code>.on(&#39;scroll&#39;)<\/code> \u2014 \uc2a4\ud06c\ub864 \uc774\ubca4\ud2b8\ub97c \ub4f1\ub85d\ud55c\ub2e4. \ud604\uc7ac \uc704\uce58\uac00 \ud2b8\ub9ac\uac70 \uc9c0\uc810 \uc774\uc0c1\uc774\uace0 \uc544\uc9c1 \uc2e4\ud589 \uc804\uc774\uba74 \uc560\ub2c8\uba54\uc774\uc158\uc744 \uc2dc\uc791\ud55c\ub2e4<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">13<\/td>\n<td align=\"left\"><code>.each()<\/code> \u2014 \uac01 <code>.progress-bar<\/code>\ub97c \uc21c\ud68c\ud558\uba70 \uac1c\ubcc4 \ucc98\ub9ac\ud55c\ub2e4<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">17<\/td>\n<td align=\"left\"><code>data-rate<\/code> \uc18d\uc131\uc5d0\uc11c \ubaa9\ud45c \ud37c\uc13c\ud2b8 \uac12\uc744 \uc77d\ub294\ub2e4<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">19<\/td>\n<td align=\"left\"><code>.bar<\/code>\uc758 <code>width<\/code>\ub97c \ubaa9\ud45c \ud37c\uc13c\ud2b8\uae4c\uc9c0 2500ms \ub3d9\uc548 \uc560\ub2c8\uba54\uc774\uc158\ud55c\ub2e4<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">21~33<\/td>\n<td align=\"left\">\uac00\uc0c1 \uac1d\uccb4 <code>{ rate: 0 }<\/code>\uc744 \ub9cc\ub4e4\uc5b4 \uc22b\uc790\ub97c 0\ubd80\ud130 \ubaa9\ud45c\uac12\uae4c\uc9c0 \uc99d\uac00\uc2dc\ud0a8\ub2e4<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">25~27<\/td>\n<td align=\"left\"><code>progress<\/code> \u2014 \ub9e4 \ud504\ub808\uc784\ub9c8\ub2e4 \ud638\ucd9c\ub418\ub294 \ucf5c\ubc31\uc774\ub2e4. \ud604\uc7ac \uac12\uc744 \ub0b4\ub9bc \ucc98\ub9ac\ud558\uc5ec \ud14d\uc2a4\ud2b8\ub85c \ud45c\uc2dc\ud55c\ub2e4<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">29~31<\/td>\n<td align=\"left\"><code>complete<\/code> \u2014 \uc644\ub8cc \uc2dc <code>isAni<\/code>\ub97c <code>true<\/code>\ub85c \ubc14\uafd4 \uc7ac\uc2e4\ud589\uc744 \ubc29\uc9c0\ud55c\ub2e4<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><Accordion title=\"jQuery .animate() \uba54\uc11c\ub4dc\ub780?\"><br \/>\n`.animate()`\ub294 CSS \uc18d\uc131 \uac12\uc744 \uc9c0\uc815\ud55c \uc2dc\uac04 \ub3d9\uc548 \uc11c\uc11c\ud788 \ubcc0\uacbd\ud558\ub294 jQuery \uba54\uc11c\ub4dc\uc774\ub2e4.<\/p>\n<pre><code class=\"language-js\">$(&#39;\uc120\ud0dd\uc790&#39;).animate({ \uc18d\uc131: \uac12 }, \uc2dc\uac04);\n<\/code><\/pre>\n<table>\n<thead>\n<tr>\n<th align=\"left\">\uc904<\/th>\n<th align=\"left\">\uc124\uba85<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td align=\"left\">1<\/td>\n<td align=\"left\">\uccab \ubc88\uc9f8 \uc778\uc790\ub294 \ubcc0\uacbd\ud560 CSS \uc18d\uc131\uacfc \ubaa9\ud45c \uac12\uc774\ub2e4. \ub450 \ubc88\uc9f8 \uc778\uc790\ub294 \ubc00\ub9ac\ucd08 \ub2e8\uc704\uc758 \uc18c\uc694 \uc2dc\uac04\uc774\ub2e4<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\uc22b\uc790 \uac12\uc744 \uac00\uc9c4 CSS \uc18d\uc131(<code>width<\/code>, <code>height<\/code>, <code>opacity<\/code> \ub4f1)\ub9cc \uc560\ub2c8\uba54\uc774\uc158\ud560 \uc218 \uc788\ub2e4.<br \/>\n<\/Accordion><\/p>\n<hr>\n<h2>1.1. \uc6d0\ud615 \uc2a4\ud0ac\ubc14<\/h2>\n<p>SVG\uc758 <code>circle<\/code> \uc694\uc18c\uc640 <code>stroke-dashoffset<\/code> \uc18d\uc131\uc744 \ud65c\uc6a9\ud55c \uc6d0\ud615 \ud504\ub85c\uadf8\ub808\uc2a4 \ubc14\uc774\ub2e4.<\/p>\n<blockquote>\n<p><strong>Note<\/strong>: jQuery 3 \uae30\ubc18\uc758 \uc6d0\ud615 \uc2a4\ud0ac\ubc14\ub97c \ub9cc\ub4e4\uc5b4\uc918. \uc870\uac74\uc740 \ub2e4\uc74c\uacfc \uac19\uc544. 1) SVG circle \uc694\uc18c(\ubc18\uc9c0\ub984 100, \ub458\ub808 628)\ub97c \uc0ac\uc6a9\ud55c \uc6d0\ud615 \ud504\ub85c\uadf8\ub808\uc2a4 \ubc14 4\uac1c\ub97c \uac00\ub85c\ub85c \ubc30\uce58\ud55c\ub2e4. 2) \uac01 \uc6d0\uc758 \uc911\uc559\uc5d0 \ud37c\uc13c\ud2b8 \uc22b\uc790\ub97c \ud45c\uc2dc\ud558\uace0, data-num \uc18d\uc131\uc73c\ub85c \ubaa9\ud45c\uac12\uc744 \uc9c0\uc815\ud55c\ub2e4(20, 60, 80, 50). 3) stroke-dasharray\uc640 stroke-dashoffset\uc744 628\ub85c \uc124\uc815\ud558\uace0, \uc2a4\ud06c\ub864 \uc2dc dashoffset\uc744 \uc904\uc5ec\uc11c \uc120\uc774 \uadf8\ub824\uc9c0\ub294 \uc560\ub2c8\uba54\uc774\uc158\uc744 \uad6c\ud604\ud55c\ub2e4. 4) 12\uc2dc \ubc29\ud5a5\ubd80\ud130 \uc2dc\uc791\ud558\ub3c4\ub85d rotate(-90deg)\ub97c \uc801\uc6a9\ud55c\ub2e4. 5) \uac01 \uc6d0\ub9c8\ub2e4 \ub2e4\ub978 stroke \uc0c9\uc0c1\uc744 \uc9c0\uc815\ud55c\ub2e4. 6) hasClass\ub85c \uc911\ubcf5 \uc2e4\ud589\uc744 \ubc29\uc9c0\ud55c\ub2e4. 7) \uc774\ubca4\ud2b8 \ubc14\uc778\ub529\uc740 .on(&#39;scroll&#39;)\uc744 \uc0ac\uc6a9\ud55c\ub2e4.<\/p>\n<\/blockquote>\n<h4>HTML<\/h4>\n<pre><code class=\"language-html\">&lt;section&gt;\n  &lt;h2&gt;content&lt;\/h2&gt;\n&lt;\/section&gt;\n&lt;div class=&quot;charts&quot;&gt;\n  &lt;div class=&quot;chart&quot;&gt;\n    &lt;h2 data-num=&quot;20&quot;&gt;0&lt;\/h2&gt;\n    &lt;svg&gt;\n      &lt;circle cx=&quot;110&quot; cy=&quot;110&quot; r=&quot;100&quot;&gt;&lt;\/circle&gt;\n    &lt;\/svg&gt;\n  &lt;\/div&gt;\n  &lt;div class=&quot;chart&quot;&gt;\n    &lt;h2 data-num=&quot;60&quot;&gt;0&lt;\/h2&gt;\n    &lt;svg&gt;\n      &lt;circle cx=&quot;110&quot; cy=&quot;110&quot; r=&quot;100&quot;&gt;&lt;\/circle&gt;\n    &lt;\/svg&gt;\n  &lt;\/div&gt;\n  &lt;div class=&quot;chart&quot;&gt;\n    &lt;h2 data-num=&quot;80&quot;&gt;0&lt;\/h2&gt;\n    &lt;svg&gt;\n      &lt;circle cx=&quot;110&quot; cy=&quot;110&quot; r=&quot;100&quot;&gt;&lt;\/circle&gt;\n    &lt;\/svg&gt;\n  &lt;\/div&gt;\n  &lt;div class=&quot;chart&quot;&gt;\n    &lt;h2 data-num=&quot;50&quot;&gt;0&lt;\/h2&gt;\n    &lt;svg&gt;\n      &lt;circle cx=&quot;110&quot; cy=&quot;110&quot; r=&quot;100&quot;&gt;&lt;\/circle&gt;\n    &lt;\/svg&gt;\n  &lt;\/div&gt;\n&lt;\/div&gt;\n&lt;section&gt;\n  &lt;h2&gt;content&lt;\/h2&gt;\n&lt;\/section&gt;\n<\/code><\/pre>\n<table>\n<thead>\n<tr>\n<th align=\"left\">\uc904<\/th>\n<th align=\"left\">\uc124\uba85<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td align=\"left\">1~3<\/td>\n<td align=\"left\">\uc2a4\ud06c\ub864 \uacf5\uac04 \ud655\ubcf4\uc6a9 \uc139\uc158\uc774\ub2e4<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">4<\/td>\n<td align=\"left\"><code>.charts<\/code> \u2014 \uc6d0\ud615 \ucc28\ud2b8\ub4e4\uc744 \uac10\uc2f8\ub294 \ucee8\ud14c\uc774\ub108\uc774\ub2e4<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">6<\/td>\n<td align=\"left\"><code>data-num=&quot;20&quot;<\/code> \u2014 \ubaa9\ud45c \ud37c\uc13c\ud2b8 \uac12\uc774\ub2e4. \ucd08\uae30 \ud14d\uc2a4\ud2b8\ub294 <code>0<\/code>\uc774\ub2e4<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">8<\/td>\n<td align=\"left\"><code>circle<\/code> \u2014 SVG \uc6d0 \uc694\uc18c\uc774\ub2e4. <code>cx<\/code>, <code>cy<\/code>\ub294 \uc911\uc2ec \uc88c\ud45c, <code>r<\/code>\uc740 \ubc18\uc9c0\ub984\uc774\ub2e4<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h4>CSS<\/h4>\n<pre><code class=\"language-css\">.charts {\n  width: 80%;\n  margin: 3rem auto;\n  display: flex;\n  justify-content: center;\n}\n.charts .chart {\n  margin: 0 20px;\n  position: relative;\n}\n.charts .chart h2 {\n  position: absolute;\n  left: 50%;\n  top: 50%;\n  transform: translate(-50%, -50%);\n  margin: 0;\n}\n.charts .chart svg {\n  width: 220px;\n  height: 220px;\n}\ncircle {\n  fill: #ffffff;\n  stroke-width: 20;\n  stroke-dasharray: 628;\n  stroke-dashoffset: 628;\n  transform: rotate(-90deg);\n  transform-origin: 50% 50%;\n  stroke-linecap: round;\n}\n.charts .chart:nth-child(1) circle { stroke: #ffc114; }\n.charts .chart:nth-child(2) circle { stroke: #ff5248; }\n.charts .chart:nth-child(3) circle { stroke: #19cdca; }\n.charts .chart:nth-child(4) circle { stroke: #4e88e1; }\nsection {\n  height: 100vh;\n}\n<\/code><\/pre>\n<table>\n<thead>\n<tr>\n<th align=\"left\">\uc904<\/th>\n<th align=\"left\">\uc124\uba85<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td align=\"left\">1~6<\/td>\n<td align=\"left\">flexbox\ub85c \uc6d0\ud615 \ucc28\ud2b8\ub4e4\uc744 \uac00\ub85c\ub85c \ub098\ub780\ud788 \ubc30\uce58\ud55c\ub2e4<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">11~17<\/td>\n<td align=\"left\"><code>h2<\/code>\ub97c <code>absolute<\/code> + <code>translate<\/code>\ub85c \uc6d0\uc758 \uc815\uc911\uc559\uc5d0 \ubc30\uce58\ud55c\ub2e4<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">22~30<\/td>\n<td align=\"left\"><code>stroke-dasharray: 628<\/code>\uc740 \uc6d0 \ub458\ub808(2\u03c0r = 2 \u00d7 3.14 \u00d7 100 \u2248 628)\uc640 \uac19\ub2e4. <code>stroke-dashoffset: 628<\/code>\uc774\uba74 \uc120\uc774 \uc644\uc804\ud788 \uc228\uaca8\uc9c4 \uc0c1\ud0dc\uc774\ub2e4<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">27<\/td>\n<td align=\"left\"><code>rotate(-90deg)<\/code> \u2014 12\uc2dc \ubc29\ud5a5\ubd80\ud130 \uc2dc\uc791\ud558\ub3c4\ub85d \ud68c\uc804\ud55c\ub2e4<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">31~34<\/td>\n<td align=\"left\">\uac01 \ucc28\ud2b8\ub9c8\ub2e4 \ub2e4\ub978 \uc0c9\uc0c1\uc744 \uc9c0\uc815\ud55c\ub2e4<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h4>JS<\/h4>\n<pre><code class=\"language-js\">$(function () {\n  var charts = $(&#39;.charts&#39;);\n  var chart = $(&#39;.chart&#39;);\n  var ost = chart.offset().top - 700;\n\n  $(window).on(&#39;scroll&#39;, function () {\n    var sct = $(this).scrollTop();\n    if (sct &gt;= ost) {\n      if (!charts.hasClass(&#39;active&#39;)) {\n        animateChart();\n        charts.addClass(&#39;active&#39;);\n      }\n    }\n  });\n\n  function animateChart() {\n    chart.each(function () {\n      var item = $(this);\n      var title = item.find(&#39;h2&#39;);\n      var num = title.attr(&#39;data-num&#39;);\n      var circle = item.find(&#39;circle&#39;);\n\n      $({ rate: 0 }).animate(\n        { rate: num },\n        {\n          duration: 1500,\n          progress: function () {\n            var now = this.rate;\n            var offset = 630 - (630 * now) \/ 100;\n            title.text(Math.floor(now));\n            circle.css({ strokeDashoffset: offset });\n          },\n        }\n      );\n    });\n  }\n});\n<\/code><\/pre>\n<table>\n<thead>\n<tr>\n<th align=\"left\">\uc904<\/th>\n<th align=\"left\">\uc124\uba85<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td align=\"left\">4<\/td>\n<td align=\"left\"><code>.chart<\/code>\uc758 \uc0c1\ub2e8 \uc704\uce58\uc5d0\uc11c 700px\uc744 \ube80 \uac12\uc744 \ud2b8\ub9ac\uac70 \uc9c0\uc810\uc73c\ub85c \uc124\uc815\ud55c\ub2e4<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">9<\/td>\n<td align=\"left\"><code>.hasClass(&#39;active&#39;)<\/code> \u2014 <code>active<\/code> \ud074\ub798\uc2a4 \uc720\ubb34\ub85c \uc911\ubcf5 \uc2e4\ud589\uc744 \ubc29\uc9c0\ud55c\ub2e4<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">11<\/td>\n<td align=\"left\">\uc560\ub2c8\uba54\uc774\uc158 \uc2e4\ud589 \ud6c4 <code>active<\/code> \ud074\ub798\uc2a4\ub97c \ucd94\uac00\ud55c\ub2e4<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">23~33<\/td>\n<td align=\"left\">\uac00\uc0c1 \uac1d\uccb4\uc758 <code>rate<\/code>\ub97c 0\ubd80\ud130 \ubaa9\ud45c\uac12\uae4c\uc9c0 1500ms \ub3d9\uc548 \ubcc0\ud654\uc2dc\ud0a8\ub2e4<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">29<\/td>\n<td align=\"left\"><code>stroke-dashoffset<\/code> \uacc4\uc0b0\uc2dd: 630(\uc804\uccb4 \ub458\ub808)\uc5d0\uc11c \uc9c4\ud589\ub960\ub9cc\ud07c \ube80\ub2e4. \uac12\uc774 \uc904\uc5b4\ub4e4\uc218\ub85d \uc120\uc774 \ub4dc\ub7ec\ub09c\ub2e4<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">30<\/td>\n<td align=\"left\">\ud604\uc7ac \uc22b\uc790\ub97c \uc815\uc218\ub85c \ubcc0\ud658\ud558\uc5ec \uc911\uc559 \ud14d\uc2a4\ud2b8\ub97c \uac31\uc2e0\ud55c\ub2e4<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">31<\/td>\n<td align=\"left\">\uacc4\uc0b0\ub41c <code>offset<\/code> \uac12\uc744 <code>circle<\/code>\uc758 <code>strokeDashoffset<\/code>\uc5d0 \ubc18\uc601\ud55c\ub2e4<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><Accordion title=\"stroke-dasharray\uc640 stroke-dashoffset\uc774\ub780?\"><br \/>\nSVG \uc120 \uc560\ub2c8\uba54\uc774\uc158\uc758 \ud575\uc2ec \uc18d\uc131 2\uac00\uc9c0\uc774\ub2e4.<\/p>\n<ul>\n<li><code>stroke-dasharray<\/code> \u2014 \uc810\uc120 \ud328\ud134\uc758 \uae38\uc774\ub97c \uc9c0\uc815\ud55c\ub2e4. \uc6d0 \ub458\ub808(628)\uc640 \uac19\uc740 \uac12\uc744 \uc8fc\uba74 \ud558\ub098\uc758 \uae34 \uc120\uc774 \ub41c\ub2e4<\/li>\n<li><code>stroke-dashoffset<\/code> \u2014 \uc810\uc120\uc758 \uc2dc\uc791 \uc704\uce58\ub97c \ubc00\uc5b4\ub0b8\ub2e4. 628\uc774\uba74 \uc120\uc774 \ubcf4\uc774\uc9c0 \uc54a\uace0, 0\uc774\uba74 \uc644\uc804\ud788 \ubcf4\uc778\ub2e4<\/li>\n<\/ul>\n<p>\uc774 \ub450 \uc18d\uc131\uc758 \uc870\ud569\uc73c\ub85c &quot;\uc120\uc774 \uadf8\ub824\uc9c0\ub294&quot; \uc560\ub2c8\uba54\uc774\uc158\uc744 \uad6c\ud604\ud55c\ub2e4.<br \/>\n<\/Accordion><\/p>\n<hr>\n<h2>1.2. SVG \ub77c\uc778\ud615 \uc2a4\ud0ac\ubc14<\/h2>\n<p><code>circle<\/code> \ub300\uc2e0 <code>line<\/code> \uc694\uc18c\ub97c \uc0ac\uc6a9\ud55c \uc9c1\uc120\ud615 \ubcc0\ud615\uc774\ub2e4.<\/p>\n<blockquote>\n<p><strong>Note<\/strong>: jQuery 3 \uae30\ubc18\uc758 SVG \ub77c\uc778\ud615 \uc2a4\ud0ac\ubc14\ub97c \ub9cc\ub4e4\uc5b4\uc918. \uc870\uac74\uc740 \ub2e4\uc74c\uacfc \uac19\uc544. 1) SVG line \uc694\uc18c(x1=0, y1=0, x2=500, y2=0)\ub97c \uc0ac\uc6a9\ud55c \uc9c1\uc120\ud615 \ud504\ub85c\uadf8\ub808\uc2a4 \ubc14 3\uac1c\ub97c \uac00\ub85c\ub85c \ubc30\uce58\ud55c\ub2e4. 2) stroke-dasharray\uc640 stroke-dashoffset\uc744 300\uc73c\ub85c \uc124\uc815\ud558\uace0, \uc2a4\ud06c\ub864 \uc2dc dashoffset\uc744 \uc904\uc5ec\uc11c \uc120\uc774 \uadf8\ub824\uc9c0\ub294 \uc560\ub2c8\uba54\uc774\uc158\uc744 \uad6c\ud604\ud55c\ub2e4. 3) \uac01 \ub77c\uc778 \uc911\uc559\uc5d0 \ud37c\uc13c\ud2b8 \uc22b\uc790 \uce74\uc6b4\ud2b8\uc5c5\uc744 \ud45c\uc2dc\ud55c\ub2e4. 4) \uac01 \ub77c\uc778\ub9c8\ub2e4 \ub2e4\ub978 stroke \uc0c9\uc0c1\uc744 \uc9c0\uc815\ud55c\ub2e4. 5) hasClass\ub85c \uc911\ubcf5 \uc2e4\ud589\uc744 \ubc29\uc9c0\ud55c\ub2e4. 6) $(function(){})\ub85c \uac10\uc2f8\uace0, \uc774\ubca4\ud2b8 \ubc14\uc778\ub529\uc740 .on(&#39;scroll&#39;)\uc744 \uc0ac\uc6a9\ud55c\ub2e4.<\/p>\n<\/blockquote>\n<h4>HTML<\/h4>\n<pre><code class=\"language-html\">&lt;section&gt;\n  &lt;h2&gt;content&lt;\/h2&gt;\n&lt;\/section&gt;\n&lt;div class=&quot;charts&quot;&gt;\n  &lt;div class=&quot;chart&quot;&gt;\n    &lt;h2 data-num=&quot;20&quot;&gt;0&lt;\/h2&gt;\n    &lt;svg&gt;\n      &lt;line x1=&quot;0&quot; y1=&quot;0&quot; x2=&quot;500&quot; y2=&quot;0&quot;&gt;&lt;\/line&gt;\n    &lt;\/svg&gt;\n  &lt;\/div&gt;\n  &lt;div class=&quot;chart&quot;&gt;\n    &lt;h2 data-num=&quot;20&quot;&gt;0&lt;\/h2&gt;\n    &lt;svg&gt;\n      &lt;line x1=&quot;0&quot; y1=&quot;0&quot; x2=&quot;500&quot; y2=&quot;0&quot;&gt;&lt;\/line&gt;\n    &lt;\/svg&gt;\n  &lt;\/div&gt;\n  &lt;div class=&quot;chart&quot;&gt;\n    &lt;h2 data-num=&quot;80&quot;&gt;0&lt;\/h2&gt;\n    &lt;svg&gt;\n      &lt;line x1=&quot;0&quot; y1=&quot;0&quot; x2=&quot;500&quot; y2=&quot;0&quot;&gt;&lt;\/line&gt;\n    &lt;\/svg&gt;\n  &lt;\/div&gt;\n&lt;\/div&gt;\n&lt;section&gt;\n  &lt;h2&gt;content&lt;\/h2&gt;\n&lt;\/section&gt;\n<\/code><\/pre>\n<table>\n<thead>\n<tr>\n<th align=\"left\">\uc904<\/th>\n<th align=\"left\">\uc124\uba85<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td align=\"left\">8<\/td>\n<td align=\"left\"><code>line<\/code> \uc694\uc18c\ub294 \uc2dc\uc791\uc810(<code>x1<\/code>, <code>y1<\/code>)\uc5d0\uc11c \ub05d\uc810(<code>x2<\/code>, <code>y2<\/code>)\uae4c\uc9c0 \uc9c1\uc120\uc744 \uadf8\ub9b0\ub2e4<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">6<\/td>\n<td align=\"left\"><code>data-num<\/code> \u2014 \ubaa9\ud45c \ud37c\uc13c\ud2b8 \uac12\uc774\ub2e4. <code>circle<\/code> \uc608\uc81c\uc640 \ub3d9\uc77c\ud55c \ubc29\uc2dd\uc774\ub2e4<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h4>CSS<\/h4>\n<pre><code class=\"language-css\">.charts {\n  width: 80%;\n  margin: 3rem auto;\n  display: flex;\n  justify-content: center;\n}\n.charts .chart {\n  margin: 0 20px;\n  position: relative;\n}\n.charts .chart h2 {\n  position: absolute;\n  left: 50%;\n  top: 50%;\n  transform: translate(-50%, -50%);\n  margin: 0;\n}\nline {\n  stroke-width: 20;\n  stroke-dasharray: 300;\n  stroke-dashoffset: 300;\n}\n.charts .chart:nth-child(1) line { stroke: #ffc114; }\n.charts .chart:nth-child(2) line { stroke: #ff5248; }\n.charts .chart:nth-child(3) line { stroke: #19cdca; }\nsection {\n  height: 100vh;\n}\n<\/code><\/pre>\n<table>\n<thead>\n<tr>\n<th align=\"left\">\uc904<\/th>\n<th align=\"left\">\uc124\uba85<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td align=\"left\">18~22<\/td>\n<td align=\"left\"><code>stroke-dasharray<\/code>\uc640 <code>stroke-dashoffset<\/code>\uc744 <code>300<\/code>\uc73c\ub85c \uc124\uc815\ud55c\ub2e4. \uc6d0\ud615\uacfc \uac19\uc740 \uc6d0\ub9ac\uc774\uc9c0\ub9cc \uc9c1\uc120 \uae38\uc774\uc5d0 \ub9de\ucd98 \uac12\uc774\ub2e4<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">23~25<\/td>\n<td align=\"left\">\uac01 \ub77c\uc778\ub9c8\ub2e4 \ub2e4\ub978 \uc0c9\uc0c1\uc744 \uc9c0\uc815\ud55c\ub2e4<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h4>JS<\/h4>\n<pre><code class=\"language-js\">$(function () {\n  var charts = $(&#39;.charts&#39;);\n  var chart = $(&#39;.chart&#39;);\n  var ost = chart.offset().top - 700;\n\n  $(window).on(&#39;scroll&#39;, function () {\n    var sct = $(this).scrollTop();\n    if (sct &gt;= ost) {\n      if (!charts.hasClass(&#39;active&#39;)) {\n        animateChart();\n        charts.addClass(&#39;active&#39;);\n      }\n    }\n  });\n\n  function animateChart() {\n    chart.each(function () {\n      var item = $(this);\n      var title = item.find(&#39;h2&#39;);\n      var num = title.attr(&#39;data-num&#39;);\n      var el = item.find(&#39;line&#39;);\n\n      $({ rate: 0 }).animate(\n        { rate: num },\n        {\n          duration: 1500,\n          progress: function () {\n            var now = this.rate;\n            var offset = 300 - (300 * now) \/ 100;\n            title.text(Math.floor(now));\n            el.css({ strokeDashoffset: offset });\n          },\n        }\n      );\n    });\n  }\n});\n<\/code><\/pre>\n<table>\n<thead>\n<tr>\n<th align=\"left\">\uc904<\/th>\n<th align=\"left\">\uc124\uba85<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td align=\"left\">1<\/td>\n<td align=\"left\">\uc6d0\ubcf8\uc5d0\ub294 <code>$(function(){})<\/code>\uac00 \uc5c6\uc5c8\uc73c\ub098, DOM \uc548\uc804\uc744 \uc704\ud574 \uac10\uc2f8\ub294 \uac83\uc774 \uc62c\ubc14\ub974\ub2e4<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">21<\/td>\n<td align=\"left\"><code>circle<\/code> \ub300\uc2e0 <code>line<\/code> \uc694\uc18c\ub97c \ucc3e\ub294\ub2e4<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">29<\/td>\n<td align=\"left\">\uacc4\uc0b0\uc2dd\uc758 \uae30\uc900\uac12\uc774 <code>630<\/code>\uc774 \uc544\ub2cc <code>300<\/code>\uc774\ub2e4. <code>stroke-dasharray<\/code> \uac12\uacfc \uc77c\uce58\uc2dc\ucf1c\uc57c \ud55c\ub2e4<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<blockquote>\n<p><strong>Warning<\/strong>: \uc6d0\ubcf8 \ucf54\ub4dc\uc5d0\uc11c \ub77c\uc778\ud615(1.2)\uc758 JS\ub294 <code>$(function(){})<\/code>\ub85c \uac10\uc2f8\uc838 \uc788\uc9c0 \uc54a\uc558\ub2e4. \ubb38\uc11c \ub85c\ub4dc \uc804\uc5d0 DOM \uc694\uc18c\ub97c \ucc3e\uc73c\uba74 <code>undefined<\/code> \uc624\ub958\uac00 \ubc1c\uc0dd\ud560 \uc218 \uc788\uc73c\ubbc0\ub85c \ubc18\ub4dc\uc2dc \uac10\uc2f8\uc57c \ud55c\ub2e4.<\/p>\n<\/blockquote>\n<hr>\n<h2>2. GSAP\uc73c\ub85c \uc6d0\ud615 \uc2a4\ud0ac\ubc14 \ub9cc\ub4e4\uae30<\/h2>\n<blockquote>\n<p>GSAP\uacfc ScrollTrigger\ub97c \uc0ac\uc6a9\ud558\uba74 jQuery \uc5c6\uc774\ub3c4 \uc2a4\ud0ac\ubc14 \uc560\ub2c8\uba54\uc774\uc158\uc744 \uad6c\ud604\ud560 \uc218 \uc788\ub2e4.<\/p>\n<\/blockquote>\n<blockquote>\n<p><strong>Note<\/strong>: GSAP\uacfc ScrollTrigger\ub85c \uc6d0\ud615 \uc2a4\ud0ac\ubc14\ub97c \ub9cc\ub4e4\uc5b4\uc918. \uc870\uac74\uc740 \ub2e4\uc74c\uacfc \uac19\uc544. 1) CSS conic-gradient\uc640 CSS \ubcc0\uc218 &#8211;p\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc6d0\ud615 \uac8c\uc774\uc9c0\ub97c \uad6c\ud604\ud55c\ub2e4. 2) gsap.to\ub85c CSS \ubcc0\uc218 &#8211;p\ub97c 0\uc5d0\uc11c \ubaa9\ud45c \ud37c\uc13c\ud2b8\uae4c\uc9c0 4\ucd08 \ub3d9\uc548 \ubcc0\uacbd\ud558\uc5ec \uac8c\uc774\uc9c0\ub97c \ucc44\uc6b4\ub2e4. 3) ease\ub294 expo.out\uc744 \uc0ac\uc6a9\ud55c\ub2e4. 4) \uc6d0 \uc911\uc559\uc758 \uc22b\uc790\ub3c4 0\ubd80\ud130 \ubaa9\ud45c\uac12\uae4c\uc9c0 \uce74\uc6b4\ud2b8\uc5c5\ud558\ub418, modifiers \ud50c\ub7ec\uadf8\uc778\uc758 toFixed()\ub85c \uc18c\uc218\uc810\uc744 \uc81c\uac70\ud55c\ub2e4. 5) ScrollTrigger\uc758 toggleActions\ub97c play pause resume reset\uc73c\ub85c \uc124\uc815\ud558\uc5ec \uc2a4\ud06c\ub864 \uc704\uce58\uc5d0 \ub530\ub77c \uc560\ub2c8\uba54\uc774\uc158\uc744 \uc81c\uc5b4\ud55c\ub2e4. 6) timeline\uc744 \uc0ac\uc6a9\ud558\uc5ec \uac8c\uc774\uc9c0 \ucc44\uc6b0\uae30\uc640 \uc22b\uc790 \uce74\uc6b4\ud2b8\ub97c \ub3d9\uc2dc\uc5d0 \uc2e4\ud589\ud55c\ub2e4.<\/p>\n<\/blockquote>\n<h3>2.1. CDN \ub85c\ub4dc<\/h3>\n<pre><code class=\"language-html\">&lt;script src=&quot;https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/gsap\/3.12.5\/gsap.min.js&quot;&gt;&lt;\/script&gt;\n&lt;script src=&quot;https:\/\/cdn.jsdelivr.net\/npm\/gsap@3.12.5\/dist\/ScrollTrigger.min.js&quot;&gt;&lt;\/script&gt;\n<\/code><\/pre>\n<table>\n<thead>\n<tr>\n<th align=\"left\">\uc904<\/th>\n<th align=\"left\">\uc124\uba85<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td align=\"left\">1<\/td>\n<td align=\"left\">GSAP \ud575\uc2ec \ub77c\uc774\ube0c\ub7ec\ub9ac\ub97c \ubd88\ub7ec\uc628\ub2e4<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">2<\/td>\n<td align=\"left\">ScrollTrigger \ud50c\ub7ec\uadf8\uc778\uc744 \ubd88\ub7ec\uc628\ub2e4. \uc2a4\ud06c\ub864 \uc704\uce58 \uae30\ubc18 \uc560\ub2c8\uba54\uc774\uc158\uc5d0 \ud544\uc694\ud558\ub2e4<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<hr>\n<h3>2.2. HTML \uad6c\uc870<\/h3>\n<pre><code class=\"language-html\">&lt;div class=&quot;circular-pbar&quot;&gt;\n  &lt;span class=&quot;circular-pbar-counter&quot;&gt;0&lt;\/span&gt;\n&lt;\/div&gt;\n<\/code><\/pre>\n<table>\n<thead>\n<tr>\n<th align=\"left\">\uc904<\/th>\n<th align=\"left\">\uc124\uba85<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td align=\"left\">1<\/td>\n<td align=\"left\">\uc6d0\ud615 \ud504\ub85c\uadf8\ub808\uc2a4 \ubc14\uc758 \ucee8\ud14c\uc774\ub108\uc774\ub2e4. CSS\uc758 <code>conic-gradient<\/code>\ub85c \uc6d0\ud615 \uac8c\uc774\uc9c0\ub97c \ub9cc\ub4e0\ub2e4<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">2<\/td>\n<td align=\"left\">\uc911\uc559\uc5d0 \ud45c\uc2dc\ud560 \uc22b\uc790 \uc601\uc5ed\uc774\ub2e4. \ucd08\uae30\uac12\uc740 <code>0<\/code>\uc774\ub2e4<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<hr>\n<h3>2.3. \uae30\ubcf8 CSS<\/h3>\n<pre><code class=\"language-css\">.circular-pbar {\n  width: 200px;\n  height: 200px;\n  border-radius: 50%;\n  background: conic-gradient(darkred 33%, 0, black);\n  position: relative;\n}\n.circular-pbar-counter {\n  position: absolute;\n  font-size: 3em;\n  color: white;\n  top: 50%;\n  left: 50%;\n  transform: translate(-50%, -50%);\n}\n<\/code><\/pre>\n<table>\n<thead>\n<tr>\n<th align=\"left\">\uc904<\/th>\n<th align=\"left\">\uc124\uba85<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td align=\"left\">3<\/td>\n<td align=\"left\"><code>border-radius: 50%<\/code>\ub85c \uc815\uc0ac\uac01\ud615\uc744 \uc6d0\uc73c\ub85c \ub9cc\ub4e0\ub2e4<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">5<\/td>\n<td align=\"left\"><code>conic-gradient<\/code> \u2014 \uc6d0\ubfd4\ud615 \uadf8\ub77c\ub514\uc5b8\ud2b8\uc774\ub2e4. <code>darkred<\/code>\uac00 33% \uc9c0\uc810\uae4c\uc9c0 \ucc44\uc6cc\uc9c0\uace0 \ub098\uba38\uc9c0\ub294 <code>black<\/code>\uc774\ub2e4<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">8~14<\/td>\n<td align=\"left\">\uc22b\uc790\ub97c <code>absolute<\/code> + <code>translate<\/code>\ub85c \uc6d0\uc758 \uc815\uc911\uc559\uc5d0 \ubc30\uce58\ud55c\ub2e4<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<hr>\n<h3>2.4. CSS \ubcc0\uc218\ub85c \uc560\ub2c8\uba54\uc774\uc158 \uc900\ube44<\/h3>\n<blockquote>\n<p><strong>Tip<\/strong>: <code>.circular-pbar<\/code>\uc5d0 CSS \uc9c0\uc5ed\ubcc0\uc218 <code>--p<\/code>\ub97c \uc120\uc5b8\ud558\uace0 0\uc744 \ud560\ub2f9\ud55c\ub2e4. \ubc30\uacbd\uc758 \uc0c9\uc0c1 \uc704\uce58\uc5d0 \uc774 \ubcc0\uc218\ub97c \ub123\uc73c\uba74 JS\uc5d0\uc11c \ubcc0\uc218 \uac12\ub9cc \ubc14\uafd4\ub3c4 \uac8c\uc774\uc9c0\uac00 \uc6c0\uc9c1\uc778\ub2e4.<\/p>\n<\/blockquote>\n<pre><code class=\"language-css\">.circular-pbar {\n  --p: 0;\n  background: conic-gradient(#df3030 var(--p, 0), 0, #cacaca);\n}\n<\/code><\/pre>\n<table>\n<thead>\n<tr>\n<th align=\"left\">\uc904<\/th>\n<th align=\"left\">\uc124\uba85<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td align=\"left\">2<\/td>\n<td align=\"left\"><code>--p: 0<\/code> \u2014 CSS \uc0ac\uc6a9\uc790 \uc815\uc758 \uc18d\uc131\uc744 \uc120\uc5b8\ud558\uace0 \ucd08\uae30\uac12 0\uc744 \ub123\ub294\ub2e4<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">3<\/td>\n<td align=\"left\"><code>var(--p, 0)<\/code> \u2014 <code>--p<\/code> \uac12\uc744 \uadf8\ub77c\ub514\uc5b8\ud2b8\uc758 \uc0c9\uc0c1 \uc704\uce58\ub85c \uc0ac\uc6a9\ud55c\ub2e4. GSAP\uc774 \uc774 \uac12\uc744 \ubcc0\uacbd\ud558\uba74 \uac8c\uc774\uc9c0\uac00 \ucc44\uc6cc\uc9c4\ub2e4<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<hr>\n<h3>2.5. GSAP\uc73c\ub85c \uac8c\uc774\uc9c0 \uc560\ub2c8\uba54\uc774\uc158<\/h3>\n<blockquote>\n<p><strong>Note<\/strong>: <code>gsap.to<\/code>\ub97c \uc0ac\uc6a9\ud558\uc5ec CSS \ubcc0\uc218 <code>--p<\/code>\uc758 \uac12\uc744 \ubcc0\uacbd\ud558\uba74 \uc6d0\ud615 \uac8c\uc774\uc9c0\uac00 \ucc44\uc6cc\uc9c4\ub2e4.<\/p>\n<\/blockquote>\n<pre><code class=\"language-js\">gsap.to(&#39;.circular-pbar&#39;, {\n  &#39;--p&#39;: &#39;33%&#39;,\n  duration: 4,\n  ease: &#39;expo.out&#39;,\n});\n<\/code><\/pre>\n<table>\n<thead>\n<tr>\n<th align=\"left\">\uc904<\/th>\n<th align=\"left\">\uc124\uba85<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td align=\"left\">1<\/td>\n<td align=\"left\"><code>gsap.to<\/code> \u2014 \ub300\uc0c1 \uc694\uc18c\ub97c \uc9c0\uc815\ud55c \uc18d\uc131 \uac12\uae4c\uc9c0 \uc560\ub2c8\uba54\uc774\uc158\ud55c\ub2e4<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">2<\/td>\n<td align=\"left\"><code>&#39;--p&#39;: &#39;33%&#39;<\/code> \u2014 CSS \ubcc0\uc218 <code>--p<\/code>\ub97c 0\uc5d0\uc11c 33%\uae4c\uc9c0 \ubcc0\uacbd\ud55c\ub2e4<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">3<\/td>\n<td align=\"left\"><code>duration: 4<\/code> \u2014 4\ucd08 \ub3d9\uc548 \uc9c4\ud589\ud55c\ub2e4<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">4<\/td>\n<td align=\"left\"><code>ease: &#39;expo.out&#39;<\/code> \u2014 \ucc98\uc74c\uc5d0 \ube60\ub974\uace0 \ub05d\uc5d0\uc11c \ub290\ub824\uc9c0\ub294 \uac00\uc18d \uace1\uc120\uc774\ub2e4<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<hr>\n<h3>2.6. \uc22b\uc790 \uce74\uc6b4\ud2b8 + ScrollTrigger \uc801\uc6a9<\/h3>\n<p>\uc2a4\ud06c\ub864 \uc704\uce58\uc5d0 \ub530\ub77c \uc22b\uc790\ub3c4 \ud568\uaed8 \uc62c\ub77c\uac00\ub3c4\ub85d \ud655\uc7a5\ud55c\ub2e4.<\/p>\n<pre><code class=\"language-js\">const circles = document.querySelectorAll(&#39;.circular-pbar&#39;);\n\ncircles.forEach((el) =&gt; {\n  const counter = el.querySelector(&#39;.circular-pbar-counter&#39;);\n  const tg = counter.textContent + &#39;%&#39;;\n\n  const tm = gsap.timeline({\n    defaults: { duration: 4, ease: &#39;expo.out&#39; },\n    scrollTrigger: {\n      trigger: el,\n      toggleActions: &#39;play pause resume reset&#39;,\n    },\n  });\n\n  tm.from(counter, {\n    textContent: 0,\n    modifiers: {\n      textContent: (textContent) =&gt; {\n        return textContent.toFixed();\n      },\n    },\n  });\n\n  tm.to(el, { &#39;--p&#39;: tg }, 0);\n});\n<\/code><\/pre>\n<table>\n<thead>\n<tr>\n<th align=\"left\">\uc904<\/th>\n<th align=\"left\">\uc124\uba85<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td align=\"left\">1<\/td>\n<td align=\"left\">\ubaa8\ub4e0 <code>.circular-pbar<\/code> \uc694\uc18c\ub97c \uc120\ud0dd\ud55c\ub2e4<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">3<\/td>\n<td align=\"left\"><code>forEach<\/code>\ub85c \uac01 \uc6d0\ud615 \ubc14\ub97c \uc21c\ud68c\ud55c\ub2e4<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">5<\/td>\n<td align=\"left\">counter \uc694\uc18c\uc758 \ud14d\uc2a4\ud2b8(\ubaa9\ud45c \ud37c\uc13c\ud2b8 \uac12)\ub97c \uc77d\uc5b4 <code>&#39;%&#39;<\/code>\uc640 \uacb0\ud569\ud55c\ub2e4. \uc774 \uac12\uc740 CSS \ubcc0\uc218\ub85c \uc0ac\uc6a9\ub41c\ub2e4<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">7~8<\/td>\n<td align=\"left\">GSAP timeline\uc744 \uc0dd\uc131\ud558\uace0 \uae30\ubcf8\uac12\uc73c\ub85c \uc9c0\uc18d \uc2dc\uac04 4\ucd08, \uac00\uc18d \uace1\uc120 <code>expo.out<\/code>\uc744 \ud560\ub2f9\ud55c\ub2e4<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">9~12<\/td>\n<td align=\"left\">ScrollTrigger\ub97c \uc5f0\uacb0\ud55c\ub2e4. <code>toggleActions<\/code>\ub294 \uc21c\uc11c\ub300\ub85c \uc9c4\uc785\/\uc774\ud0c8\/\uc7ac\uc9c4\uc785\/\uc7ac\uc774\ud0c8 \uc2dc \ub3d9\uc791\uc774\ub2e4<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">15~22<\/td>\n<td align=\"left\"><code>tm.from<\/code> \u2014 <code>textContent<\/code>\ub97c 0\ubd80\ud130 \ubaa9\ud45c\uac12\uae4c\uc9c0 \uc560\ub2c8\uba54\uc774\uc158\ud55c\ub2e4<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">17~20<\/td>\n<td align=\"left\"><code>modifiers<\/code> \u2014 \uc18d\uc131 \ubcc0\uacbd\uac12\uc744 \uc2e4\uc2dc\uac04\uc73c\ub85c \uac00\uacf5\ud558\ub294 GSAP \ub0b4\uc7a5 \ud50c\ub7ec\uadf8\uc778\uc774\ub2e4. <code>.toFixed()<\/code>\ub85c \uc18c\uc218\uc810\uc744 \uc81c\uac70\ud55c\ub2e4<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">24<\/td>\n<td align=\"left\"><code>tm.to<\/code> \u2014 CSS \ubcc0\uc218 <code>--p<\/code>\ub97c \ubaa9\ud45c\uac12\uae4c\uc9c0 \ubcc0\uacbd\ud55c\ub2e4. \uc138 \ubc88\uc9f8 \uc778\uc790 <code>0<\/code>\uc740 timeline \uc2dc\uc791\uacfc \ub3d9\uc2dc\uc5d0 \uc2e4\ud589\ud55c\ub2e4\ub294 \uc758\ubbf8\uc774\ub2e4<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><Accordion title=\"modifiers \ud50c\ub7ec\uadf8\uc778\uc774\ub780?\"><br \/>\nmodifiers\ub294 GSAP\uc5d0 \uae30\ubcf8 \ub0b4\uc7a5\ub41c \ud50c\ub7ec\uadf8\uc778\uc73c\ub85c, \uc560\ub2c8\uba54\uc774\uc158 \uc9c4\ud589 \uc911 \ud2b9\uc815 \uc18d\uc131\uc758 \uac12\uc744 \ub9e4 \ud504\ub808\uc784\ub9c8\ub2e4 \uac00\uacf5\ud560 \uc218 \uc788\ub2e4.<\/p>\n<ul>\n<li>\ubaa8\ub4e0 \uc560\ub2c8\uba54\uc774\uc158 \uc18d\uc131\uc5d0 \uc0ac\uc6a9 \uac00\ub2a5\ud558\ub2e4<\/li>\n<li>\ubc18\ub4dc\uc2dc \ud568\uc218 \ud615\ud0dc\ub85c \uc791\uc131\ud574\uc57c \ud55c\ub2e4<\/li>\n<li>\ud568\uc218\uc758 \uc778\uc790\ub85c \ud604\uc7ac \uac12\uc774 \uc804\ub2ec\ub418\uace0, \ubc18\ud658\uac12\uc774 \uc2e4\uc81c \uc801\uc6a9\ub41c\ub2e4<\/li>\n<\/ul>\n<pre><code class=\"language-js\">modifiers: {\n  textContent: (value) =&gt; {\n    return Math.round(value);\n  },\n}\n<\/code><\/pre>\n<table>\n<thead>\n<tr>\n<th align=\"left\">\uc904<\/th>\n<th align=\"left\">\uc124\uba85<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td align=\"left\">2<\/td>\n<td align=\"left\"><code>textContent<\/code> \uc18d\uc131\uc5d0 modifier\ub97c \uc801\uc6a9\ud55c\ub2e4. \ub9e4 \ud504\ub808\uc784\ub9c8\ub2e4 \uc774 \ud568\uc218\uac00 \ud638\ucd9c\ub41c\ub2e4<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">3<\/td>\n<td align=\"left\"><code>Math.round<\/code>\ub85c \ubc18\uc62c\ub9bc\ud55c \uc815\uc218\ub97c \ubc18\ud658\ud55c\ub2e4<\/td>\n<\/tr>\n<tr>\n<td align=\"left\"><\/Accordion><\/td>\n<td align=\"left\"><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n","protected":false},"excerpt":{"rendered":"<p>\uc2a4\ud0ac\ubc14 UI \uc2a4\ud0ac\ubc14\ub294 \ud3ec\ud2b8\ud3f4\ub9ac\uc624 \uc0ac\uc774\ud2b8\uc5d0\uc11c \uae30\uc220 \uc219\ub828\ub3c4\ub97c \uc2dc\uac01\uc801\uc73c\ub85c \ubcf4\uc5ec\uc8fc\ub294 UI \uc694\uc18c\uc774\ub2e4. \uc2a4\ud06c\ub864 \uc704\uce58\uc5d0 \ub530\ub77c \ub9c9\ub300\ub098 \uc6d0\uc774 \ucc44\uc6cc\uc9c0\ub294 \uc560\ub2c8\uba54\uc774\uc158\uc744 \uad6c\ud604\ud55c\ub2e4. 1. \ub9c9\ub300\ud615 \uc2a4\ud0ac\ubc14 \uc2a4\ud06c\ub864\uc774 \ud2b9\uc815 \uc704\uce58\uc5d0 \ub3c4\ub2ec\ud558\uba74 \ub9c9\ub300\uac00 \ub298\uc5b4\ub098\uba74\uc11c \ud37c\uc13c\ud2b8 \uc22b\uc790\uac00 \uc62c\ub77c\uac00\ub294 \uc560\ub2c8\uba54\uc774\uc158\uc774\ub2e4. Note: jQuery 3 \uae30\ubc18\uc758 \ub9c9\ub300\ud615 \uc2a4\ud0ac\ubc14\ub97c \ub9cc\ub4e4\uc5b4\uc918. \uc870\uac74\uc740 \ub2e4\uc74c\uacfc \uac19\uc544. 1) \ud504\ub85c\uadf8\ub808\uc2a4 \ubc14 3\uac1c\ub97c \uc138\ub85c\ub85c \ubc30\uce58\ud558\uace0, \uac01\uac01 \ubaa9\ud45c \ud37c\uc13c\ud2b8\ub97c data-rate \uc18d\uc131\uc73c\ub85c \uc9c0\uc815\ud55c\ub2e4(30%, 90%, &#8230; <a title=\"\uc2a4\ud0ac\ubc14 UI\" class=\"read-more\" href=\"https:\/\/coalacoding.com\/?p=858\" aria-label=\"\uc2a4\ud0ac\ubc14 UI\uc5d0 \ub300\ud574 \ub354 \uc790\uc138\ud788 \uc54c\uc544\ubcf4\uc138\uc694\">\ub354 \uc77d\uae30<\/a><\/p>\n","protected":false},"author":0,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[16],"tags":[],"class_list":["post-858","post","type-post","status-publish","format-standard","hentry","category-html-css-animation"],"_links":{"self":[{"href":"https:\/\/coalacoding.com\/index.php?rest_route=\/wp\/v2\/posts\/858","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/coalacoding.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/coalacoding.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"replies":[{"embeddable":true,"href":"https:\/\/coalacoding.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=858"}],"version-history":[{"count":0,"href":"https:\/\/coalacoding.com\/index.php?rest_route=\/wp\/v2\/posts\/858\/revisions"}],"wp:attachment":[{"href":"https:\/\/coalacoding.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=858"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/coalacoding.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=858"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/coalacoding.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=858"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}