๐Ÿช„ Programming

[JS] ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ 6์ค„๋กœ ์ด๋ฏธ์ง€ ๋น„๊ต ์Šฌ๋ผ์ด๋” ๋งŒ๋“ค๊ธฐ

ColorFilter 2025. 4. 17. 20:27
๋ฐ˜์‘ํ˜•

์ด๋ฏธ์ง€ ๋น„๊ต ์Šฌ๋ผ์ด๋”๋Š” ํ•ธ๋“ค์„ ์ขŒ์šฐ๋กœ ์›€์ง์—ฌ์„œ ๋‘ ์ด๋ฏธ์ง€๋ฅผ ๋น„๊ตํ•  ์ˆ˜ ์žˆ๋Š” UI ํŒจํ„ด์œผ๋กœ ์‡ผํ•‘๋ชฐ์ด๋‚˜ ์ œํ’ˆ ์†Œ๊ฐœ ํŽ˜์ด์ง€ ๋“ฑ์—์„œ ์ž์ฃผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ด๋ฏธ์ง€ ๋น„๊ต ์Šฌ๋ผ์ด๋”๋Š” range ํƒ€์ž…์˜ input ํƒœ๊ทธ์™€ 6์ค„ ์ •๋„์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋งŒ์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋ฏธ์ง€ ์ถœ์ฒ˜ CopyHouse

 

range ํƒ€์ž…์˜ input์€ ์Šฌ๋ผ์ด๋“œ๋ฐ”๋ฅผ ์กฐ์ •ํ•˜์—ฌ ๋ฒ”์œ„ ๋‚ด ์ˆซ์ž ๊ฐ’์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋Š” ์ž…๋ ฅ ํ•„๋“œ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ œ๊ณตํ•˜๋Š” ์Šคํƒ€์ผ์ด ์ ์šฉ๋˜์–ด ์žˆ๋‹ค. ์ด ๊ธฐ๋ณธ ์Šคํƒ€์ผ์„ ๋ชจ๋‘ ์ œ๊ฑฐํ•˜๊ณ  ์ด๋ฏธ์ง€์˜ ๋„ˆ๋น„/๋†’์ด๋งŒํผ ํฌ๊ธฐ๋ฅผ ํ™•์žฅํ•˜๋ฉด, ์Šฌ๋ผ์ด๋” ์˜์—ญ์„ ํด๋ฆญ ํ˜น์€ ๋“œ๋ž˜๊ทธํ•  ๋•Œ๋งˆ๋‹ค (์Šคํƒ€์ผ์„ ์ œ๊ฑฐํ•ด์„œ ํ™”๋ฉด์— ๋ณด์ด์ง€ ์•Š๋Š”) ํ•ธ๋“ค์ด ํ•ด๋‹น ์œ„์น˜๋กœ ์ด๋™ํ•ด์„œ ๊ฐ’์ด ๋ณ€๊ฒฝ๋œ๋‹ค.

range input ๊ธฐ๋ณธ ์Šคํƒ€์ผ via MDN

 

๊ธฐ๋ณธ์ ์ธ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

์ด๋ฏธ์ง€ 1, ์ด๋ฏธ์ง€ 2๋ฅผ ๊ฐ์‹ธ๋Š” ๋งˆ์Šคํฌ ์š”์†Œ, range input, ๊ตฌ๋ถ„์„ (Separator) ๋ฐ ์ปค์Šคํ…€ ํ•ธ๋“ค ์ด๋ ‡๊ฒŒ 4๊ฐœ ๋ ˆ์ด์–ด๋ฅผ ํฌ๊ฐœ์ง€๋„๋ก ๊ตฌ์„ฑํ•œ๋‹ค. ํ•ธ๋“ค์„ ์›€์ง์ผ ๋•Œ๋งˆ๋‹ค ์Šฌ๋ผ์ด๋”(range input) ๊ฐ’ ๋งŒํผ ๋งˆ์Šคํฌ ์š”์†Œ์˜ ๋„ˆ๋น„๋ฅผ ์กฐ์ •ํ•˜๊ณ , ๋„˜์น˜๋Š” ๋ถ€๋ถ„์€ ๋ณด์ด์ง€ ์•Š๋„๋ก ์ฒ˜๋ฆฌํ•˜๋ฉด(overflow: hidden) ๊ธฐ๋ณธ์ ์ธ ์ด๋ฏธ์ง€ ๋น„๊ต ์Šฌ๋ผ์ด๋”๊ฐ€ ์™„์„ฑ๋œ๋‹ค.

์ด๋ฏธ์ง€ ๋น„๊ต ์Šฌ๋ผ์ด๋” ๋ ˆ์ด์–ด ๊ตฌ์„ฑ. Separator๋Š” Image Mask ๊ฐ€์žฅ ์šฐ์ธก์— ์œ„์น˜์‹œํ‚จ๋‹ค.

 

HTML ๊ตฌ์กฐ


์ฒซ ๋ฒˆ์งธ ์ด๋ฏธ์ง€๋Š” .compare-img-one ํด๋ž˜์Šค๋กœ ์ง์ ‘ ๋ฐฐ์น˜ํ•˜๊ณ (๊ฐ€์žฅ ํ•˜๋‹จ), ๋‘ ๋ฒˆ์งธ ์ด๋ฏธ์ง€๋Š” ๋งˆ์Šคํ‚น ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด .compare-mask ์š”์†Œ ์•ˆ์— ํฌํ•จ๋˜๋„๋ก ํ•œ๋‹ค. ๋‘ ๋ฒˆ์งธ ์ด๋ฏธ์ง€๋Š” ์ฒซ ๋ฒˆ์งธ ์ด๋ฏธ์ง€ ์œ„์— ๊ฒน์นœ ์ƒํƒœ๋กœ ์œ„์น˜ํ•˜๊ฒŒ ๋œ๋‹ค. ๊ตฌ๋ถ„์„ ๊ณผ ์ปค์Šคํ…€ ํ•ธ๋“ค์€ .compare-mask ์šฐ์ธก ๋์— ์œ„์น˜ํ•ด์„œ ์ด๋ฏธ์ง€ 1๊ณผ์˜ ๊ฒฝ๊ณ„๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.

 

.compare-input ์š”์†Œ๋Š” ํด๋ฆญ ํ˜น์€ ๋“œ๋ž˜๊ทธ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ€์žฅ ์ƒ๋‹จ์— ์œ„์น˜ํ•˜๊ฒŒ ๋œ๋‹ค. ์ฐธ๊ณ ๋กœ HTML ๋ฌธ์„œ์—์„œ ํ•˜๋‹จ์— ์ž‘์„ฑํ•œ ์š”์†Œ์ผ ์ˆ˜๋ก ํ™”๋ฉด์—์„  ์œ„์— ํ‘œ์‹œ๋œ๋‹ค.

<section class="compare">
  <!-- ์ด๋ฏธ์ง€ 1 -->
  <img class="compare-img-one" src="..." />
  <!-- ์ด๋ฏธ์ง€ 2 ๋งˆ์Šคํฌ -->
  <div class="compare-mask">
    <!-- ์ด๋ฏธ์ง€ 2 -->
    <img class="compare-img-two" src="..." />
  </div>

  <!-- ์ด๋ฏธ์ง€ 1, 2 ๊ตฌ๋ถ„์„  -->
  <div class="compare-separator">
    <!-- ์ปค์Šคํ…€ ํ•ธ๋“ค (svg ์†์„ฑ ๋ฐ path ์ƒ๋žต) -->
    <svg class="compare-icon"><!-- ... --></svg>
  </div>

  <!-- range input -->
  <input class="compare-input" type="range" min="0" step="0.5" max="100" />
</section>

 

 

CSS


์ปจํ…Œ์ด๋„ˆ

์ž์‹ ์š”์†Œ๋“ค์„ ์ปจํ…Œ์ด๋„ˆ์ธ .compare ์š”์†Œ ๊ธฐ์ค€์œผ๋กœ ๋ฐฐ์น˜ํ•˜๊ธฐ ์œ„ํ•ด position: relative ์†์„ฑ์„ ์„ค์ •ํ•œ๋‹ค. ํ•„์š”ํ•œ CSS ๋ณ€์ˆ˜๋„ ์ปจํ…Œ์ด๋„ˆ์— ์ •์˜ํ•œ๋‹ค. ๋ถ€๋ชจ ์š”์†Œ์—์„œ ์ •์˜ํ•œ CSS ๋ณ€์ˆ˜๋Š” ์ž์‹ ์š”์†Œ์—์„œ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค.

.compare {
  --mask-width: 50%; /* slider value */
  --handle-size: 33px;

  position: relative;
}

 

์ด๋ฏธ์ง€ 1

Baseline (๋ฒ ์ด์Šค๋ผ์ธ): ๊ธ€์ž ์•„๋ž˜์— ์žˆ๋Š” ๊ฐ€์ƒ์˜ ์„ . ํ…์ŠคํŠธ ์š”์†Œ๋Š” ๊ธ€์ž๋งˆ๋‹ค ๋†’์ด๊ฐ€ ๋‹ค๋ฅด๋”๋ผ๋„ ์ด ์„ ์„ ๊ธฐ์ค€์œผ๋กœ ๋‚˜๋ž€ํžˆ ๋ฐฐ์น˜๋œ๋‹ค. g, j, p, q, y ๊ฐ™์€ ๊ธ€์ž๋Š” ๊ผฌ๋ฆฌ ๋ถ€๋ถ„์ด ๋ฒ ์ด์Šค๋ผ์ธ ์•„๋ž˜๋กœ ๋‚ด๋ ค๊ฐ„๋‹ค. ์ด๋ ‡๊ฒŒ ๋ฒ ์ด์Šค๋ผ์ธ ํ•˜๋‹จ์œผ๋กœ ํ™•์žฅ๋˜๋Š” ๋ถ€๋ถ„์€ Descender๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

 

์ด๋ฏธ์ง€ ํƒœ๊ทธ์˜ display ์†์„ฑ ๊ธฐ๋ณธ๊ฐ’์€ inline์ด๊ธฐ ๋•Œ๋ฌธ์— ํ…์ŠคํŠธ์ฒ˜๋Ÿผ ๋ฒ ์ด์Šค๋ผ์ธ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌ๋œ๋‹ค. ์ด๋•Œ ์ด๋ฏธ์ง€ ํ•˜๋‹จ์— descender๋ฅผ ๊ฐ€์ง„ ๊ธ€์ž๋“ค์„ ์œ„ํ•œ ๊ณต๊ฐ„์ด ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋œ๋‹ค. ์ด ํ•˜๋‹จ ์—ฌ๋ฐฑ์„ ์—†์• ๊ณ  ์‹ถ์œผ๋ฉด ์ด๋ฏธ์ง€์˜ display ์†์„ฑ์„ block์œผ๋กœ ์„ค์ •ํ•˜๋ฉด ๋œ๋‹ค.

.compare-img-one {
  width: 100%; /* ๋ถ€๋ชจ ์š”์†Œ ๋„ˆ๋น„๋งŒํผ ์ด๋ฏธ์ง€ ํฌ๊ธฐ ์ œํ•œ */
  display: block; /* ์ด๋ฏธ์ง€ ์•„๋ž˜ ์ƒ์„ฑ๋˜๋Š” ํ•˜๋‹จ ์—ฌ๋ฐฑ์„ ์—†์• ๊ธฐ ์œ„ํ•ด block์œผ๋กœ ๋ณ€๊ฒฝ */
}

 

์ด๋ฏธ์ง€ 2 ๋งˆ์Šคํฌ

์ด๋ฏธ์ง€ ๋งˆ์Šคํฌ๋Š” ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์œ„์น˜ํ•ด์•ผ ํ•˜๋ฏ€๋กœ position: absolute๋ฅผ ์„ค์ •ํ•œ๋‹ค. ์Šฌ๋ผ์ด๋“œ ํ•ธ๋“ค์„ ์กฐ์ •ํ•  ๋•Œ๋งˆ๋‹ค ์Šฌ๋ผ์ด๋” ๊ฐ’์ด --mask-width CSS ๋ณ€์ˆ˜์— ๋ฐ˜์˜๋˜๋ฉฐ, ์ด ๊ฐ’์€ ์ด๋ฏธ์ง€ ๋งˆ์Šคํฌ ์š”์†Œ์˜ ๋„ˆ๋น„๋กœ ์ ์šฉ๋œ๋‹ค. ๋งŒ์•ฝ --mask-width ๊ฐ€ 50%๋ผ๋ฉด ์ด๋ฏธ์ง€ 2๋Š” ์ ˆ๋ฐ˜๋งŒ ํ‘œ์‹œ๋œ๋‹ค. ๋‚˜๋จธ์ง€ ์˜์—ญ์€ overflow: hidden ์†์„ฑ์— ์˜ํ•ด ์ž˜๋ฆผ์ฒ˜๋ฆฌ ๋˜๊ณ , ๊ทธ ์•„๋ž˜์— ์žˆ๋˜ ์ด๋ฏธ์ง€ 1์ด ํ‘œ์‹œ๋œ๋‹ค.

.compare-mask {
  position: absolute;
  inset: 0;
  width: var(--mask-width);
  height: 100%;
  overflow: hidden;
}

.compare-img-two {
  height: 100%;
  /* width: auto ๊ธฐ๋ณธ๊ฐ’ -> ์›๋ณธ ์ด๋ฏธ์ง€ ๋„ˆ๋น„๋กœ ๋ Œ๋”๋ง */
}

 

์ด๋ฏธ์ง€ ๊ตฌ๋ถ„์„ , ์ปค์Šคํ…€ ํ•ธ๋“ค

ํ˜„์žฌ ์„ค์ •๋œ ์ด๋ฏธ์ง€ ๋งˆ์Šคํฌ ๋„ˆ๋น„๋งŒํผ ๊ตฌ๋ถ„์„ ์„ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ด๋™์‹œํ‚ค๋ฉด ์ด๋ฏธ์ง€ ๋งˆ์Šคํฌ ๋ฐ”๋กœ ์šฐ์ธก(ํ™”๋ฉด์— ๋ณด์ด๋Š” ์ด๋ฏธ์ง€ 1 ์‹œ์ž‘ ์ง€์ )์— ์œ„์น˜ํ•˜๊ฒŒ ๋œ๋‹ค. ์ด ์ƒํƒœ์—์„œ ๊ตฌ๋ถ„์„  ๋„ˆ๋น„์˜ ์ ˆ๋ฐ˜๋งŒํผ ๋‹ค์‹œ ์™ผ์ชฝ์œผ๋กœ ์ด๋™ํ•˜๋ฉด ์ •ํ™•ํžˆ ๋‘ ์ด๋ฏธ์ง€์˜ ๊ฒฝ๊ณ„์— ๊ฑธ์น˜๊ฒŒ ๋œ๋‹ค.

.compare-separator {
  position: absolute;
  inset: 0;
  width: 2px;
  height: 100%;
  left: var(--mask-width); /* ๋งˆ์Šคํฌ ๋„ˆ๋น„๋งŒํผ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ด๋™ */
  translate: -50%; /* ์ž์‹  ๋„ˆ๋น„์˜ 50% ๋งŒํผ ์™ผ์ชฝ์œผ๋กœ ์ด๋™(1px) */
  background: var(--bg-color);
}

 

์ปค์Šคํ…€ ํ•ธ๋“ค ์—ญ์‹œ top, left, translate ์†์„ฑ์„ ์ด์šฉํ•ด์„œ ๊ฒฝ๊ณ„์„  ์ค‘์•™์— ๊ฑธ์น˜๋„๋ก ์ž‘์„ฑํ•œ๋‹ค. ์ฐธ๊ณ ๋กœ ๋Œ€๋ถ€๋ถ„์˜ ๋ธŒ๋ผ์šฐ์ €์—์„  translate, rotate, scale ๋“ฑ์˜ ์†์„ฑ์„ ๋…๋ฆฝ์ ์ธ CSS ์†์„ฑ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. 2021๋…„ ์ด์ „์˜ ๊ตฌํ˜• ๋ธŒ๋ผ์šฐ์ €์—์„  ์—ฌ์ „ํžˆ transform: translate(x, y) ํ˜•ํƒœ๋กœ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

.compare-icon {
  position: absolute;
  top: 50%;
  left: var(--mask-width);
  width: var(--handle-size);
  height: var(--handle-size);
  translate: -50% -50%;
  padding: 6px;
  color: var(--bg-color);
  background: white;
  stroke-width: 2px;
  border: 2px solid currentColor;
  border-radius: 50%;
}

 

Range Input

์ปค์Šคํ…€ ํ•ธ๋“ค ์ฝ”๋“œ๋ฅผ ์ž ์‹œ ์ œ๊ฑฐํ•œ ๋’ค ๊ฐ€์žฅ์ž๋ฆฌ๋กœ ๋“œ๋ž˜๊ทธํ•ด ๋ณด๋ฉด, ๊ตฌ๋ถ„์„ ๊ณผ ํ•ธ๋“ค ์‚ฌ์ด์— ๊ฐ„๊ฒฉ์ด ์ƒ๊ธฐ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ๊ฐ„๊ฒฉ์€ ์ •ํ™•ํžˆ ํ•ธ๋“ค ๋„ˆ๋น„์˜ ์ ˆ๋ฐ˜๋งŒํผ ๋ฒŒ์–ด์ง„๋‹ค. ํ•ธ๋“ค์ด ์Šฌ๋ผ์ด๋“œ ์˜์—ญ์„ ๋ฒ—์–ด๋‚˜์ง€ ์•Š๋„๋ก ๋‚ด๋ถ€์ ์œผ๋กœ ์ผ์ • ๋น„์œจ๋งŒํผ ์ด๋™์„ ์ œํ•œํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฌํ•œ ํ˜„์ƒ์ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ.

 

์•„๋ž˜ ์ด๋ฏธ์ง€์ฒ˜๋Ÿผ ์Šฌ๋ผ์ด๋”(range input) ์–‘์ชฝ์— ํ•ธ๋“ค ๋„ˆ๋น„์˜ ์ ˆ๋ฐ˜๋งŒํผ(๋ฒŒ์–ด์ง„ ๊ฐ„๊ฒฉ) ๊ณต๊ฐ„์„ ์ถ”๊ฐ€ํ•˜๋ฉด, ํ•ธ๋“ค์˜ ์ค‘์‹ฌ์ด ์Šฌ๋ผ์ด๋” ๋์ ์— ์ •ํ™•ํžˆ ์œ„์น˜ํ•ด์„œ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋œ๋‹ค.

.compare-input {
  appearance: none; /* ์Šฌ๋ผ์ด๋” ๊ธฐ๋ณธ ์Šคํƒ€์ผ ์ œ๊ฑฐ */
  background: none; /* ์Šฌ๋ผ์ด๋” ๋ฐฐ๊ฒฝ ์ œ๊ฑฐ */

  position: absolute;
  inset: 0; /* ๋„ค ๋ฐฉํ–ฅ์˜ ์—ฌ๋ฐฑ์„ ๋ชจ๋‘ 0์œผ๋กœ ์„ค์ •ํ•˜๋ฉด ๋ถ€๋ชจ ์š”์†Œ ํฌ๊ธฐ๋งŒํผ ์ฑ„์›€ */
  cursor: col-resize;

  /* ํ•ธ๋“ค์˜ ์ค‘์‹ฌ์ด ์Šฌ๋ผ์ด๋” ๋์ ์— ์œ„์น˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ์กฐ์ • */
  width: calc(100% + var(--handle-size));
  left: calc(var(--handle-size) / -2);
}

 

์ปค์Šคํ…€ ํ•ธ๋“ค ์•„์ด์ฝ˜์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ::-webkit-slider-thumb ๊ฐ€์ƒ ์š”์†Œ์— appearance: none; ์†์„ฑ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๋ธŒ๋ผ์šฐ์ € ๊ธฐ๋ณธ ์Šคํƒ€์ผ์„ ์ œ๊ฑฐํ•œ๋‹ค. ์ด๋•Œ width ๊ฐ’์„ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ํ•ธ๋“ค์ด ์Šฌ๋ผ์ด๋” ํŠธ๋ž™ ๋„ˆ๋น„๋งŒํผ ํ™•์žฅ๋˜๋Š” ํ˜„์ƒ์ด ๋ฐœ์ƒํ•˜๋ฏ€๋กœ ์ปค์Šคํ…€ ํ•ธ๋“ค ํฌ๊ธฐ์— ๋งž๊ฒŒ ๋„ˆ๋น„๋ฅผ ์„ค์ •ํ•ด์ค€๋‹ค.

.compare-input::-webkit-slider-thumb {
  appearance: none; /* Range Input ๊ธฐ๋ณธ ํ•ธ๋“ค ์Šคํƒ€์ผ ์ œ๊ฑฐ */
  width: var(--handle-size); /* width ์ง€์ • ์•ˆํ•˜๋ฉด ํŠธ๋ž™ ๊ฝ‰ ์ฑ„์›€ */
}

 

 

JavaScript


๋ถ€๋ชจ ์š”์†Œ์— ์„ ์–ธํ•œ CSS ๋ณ€์ˆ˜๋Š” ์ž์‹ ์š”์†Œ์—์„œ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ž์‹ ์š”์†Œ์—์„œ ๋™์ผํ•œ ๋ณ€์ˆ˜ ์ด๋ฆ„์œผ๋กœ ์žฌ์ •์˜(์˜ค๋ฒ„๋ผ์ด๋“œ)ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

 

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋Š” ๋ณต์žกํ•œ ๋กœ์ง ์—†์ด range input ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋งŒ ํ• ๋‹นํ•˜๋ฉด ๋œ๋‹ค. input ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ๋งˆ๋‹ค(์Šฌ๋ผ์ด๋“œ ํ•ธ๋“ค ๋“œ๋ž˜๊ทธ) --mask-width CSS ๋ณ€์ˆ˜ ๊ฐ’์„ ์—…๋ฐ์ดํŠธํ•˜๋ฉด, ํ•ด๋‹น ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด๋ฏธ์ง€ ๋งˆ์Šคํฌ, ๊ตฌ๋ถ„์„ , ์ปค์Šคํ…€ ํ•ธ๋“ค์— ๋ฐ”๋กœ ๋ฐ˜์˜๋œ๋‹ค.

const $compare = document.querySelector(".compare");
const $compareInput = document.querySelector(".compare-input");

// range input ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค --mask-width CSS ๋ณ€์ˆ˜ ์—…๋ฐ์ดํŠธ
// .compare ์ž์‹ ์š”์†Œ์—์„œ ํ•ด๋‹น CSS ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๋ณ€๊ฒฝ๋œ ๊ฐ’์ด ์ ์šฉ๋จ
$compareInput.addEventListener("input", (e) => {
  $compare.style.setProperty("--mask-width", `${e.target.value}%`);
});

 

 

์™„์„ฑ CodePen


 

 

๋ ˆํผ๋Ÿฐ์Šค


 

Image comparison slider in 6 lines of JavaScript

Image comparison component leveraging native HTML range input and a few lines of JavaScript.

muffinman.io

 

<input type="range"> - HTML: HyperText Markup Language | MDN

<input> elements of type range let the user specify a numeric value which must be no less than a given value, and no more than another given value. The precise value, however, is not considered important. This is typically represented using a slider or dia

developer.mozilla.org

 

๋ฐ˜์‘ํ˜•