๐Ÿฅค [JS] Webucks Project (5)

luneahยท2021๋…„ 11์›” 28์ผ
0

Webucks Project

๋ชฉ๋ก ๋ณด๊ธฐ
5/10
post-thumbnail

[Mini Project] WeBucks-JS

[Mission 6] ๊ตฌํ˜„ (๋„์ „ ๊ณผ์ œ)
โœจ ๊ตฌํ˜„ ๊ธฐ๊ฐ„ : 11/26~27

[Mission 6] ๋„์ „ ๊ณผ์ œ

์ƒ์„ธ ํŽ˜์ด์ง€

  1. ๋ฆฌ๋ทฐ ๋Œ“๊ธ€์„ ์‚ญ์ œํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•ด์ฃผ์„ธ์š”.
  2. ๋ฆฌ๋ทฐ๋ณ„๋กœ ์ข‹์•„์š” ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•ด์ฃผ์„ธ์š”.

โœ”๏ธ ๋ฆฌ๋ทฐ ๋Œ“๊ธ€ ์‚ญ์ œ
[detail.js]

function uploadComment() {  
    const box = document.querySelector(".writeComment");

    const trashBtn = document.createElement("button");
    const dislikeIcon = document.createElement("i");

    trashBtn.setAttribute('class', 'trash1');
    trashBtn.innerHTML = "<i class='fas fa-trash-alt'></i>";

    // appendChild ์†์„ฑ์œผ๋กœ ์ž์‹ ์š”์†Œ๋กœ ์ถ”๊ฐ€ํ•ด์คŒ
    comments.appendChild(trashBtn);

    trashBtn.onclick = function (e) {
        box.removeChild(comments);
    };
};

[ Result ]

โญ๏ธ Struggle Point : ์ƒˆ๋กœ ์ƒ์„ฑ๋˜๋Š” ๋Œ“๊ธ€์€ ์‚ญ์ œ ์•ˆ ๋จ

classList.add() ์†์„ฑ์œผ๋กœ ์ƒˆ๋กœ ์ƒ์„ฑํ•œ ๋Œ“๊ธ€์— ํด๋ž˜์Šค๋ฅผ ๋ถ€์—ฌํ•˜๋ ค๊ณ  ํ–ˆ์œผ๋‚˜ ์ ์šฉ๋˜์ง€ ์•Š๋Š” ์˜ค๋ฅ˜๋ฅผ ๋ฐœ๊ฒฌํ–ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ฐพ์•„๋ณด๋‹ˆ ๋™์ ์œผ๋กœ ์ƒ์„ฑํ•œ ์š”์†Œ์—๋Š” classList.add ์†์„ฑ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ณ  setAttribute() ์†์„ฑ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค. ์ด๋ฅผ ์ด์šฉํ•ด ์‚ญ์ œ ๋ฒ„ํŠผ์— css ์†์„ฑ์„ ๋ถ€์—ฌํ•ด์ฃผ๊ณ  onclick ์ด๋ฒคํŠธ๋ฅผ ์ฃผ์–ด ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“ค์—ˆ๋‹ค.

โœ”๏ธ ๋ฆฌ๋ทฐ๋ณ„ ์ข‹์•„์š” ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋Š” ๊ธฐ๋Šฅ
[detail.js]

function uploadComment() {  
  const dislikeIcon = document.createElement("i");
 
  dislikeIcon.className = "far fa-heart";
  dislikeIcon.onclick = clickHeart;

  comments.appendChild(dislikeIcon);

  function clickHeart() {
          const heart = window.event.target;
          if (heart.className == 'far fa-heart') {
              heart.className = 'fas fa-heart';
              heart.style.color = '#c73d3d';
          }
          else {
              heart.className = 'far fa-heart';
              heart.style.color = '#929292'
          }
      }
};

[ Result ]

โญ๏ธ Struggle Point : ๋งจ ์œ„ ํ•˜ํŠธ๋งŒ ํด๋ฆญ ์ด๋ฒคํŠธ ์ ์šฉ๋จ

onclick ํ•จ์ˆ˜์— classList.add(.hide)์™€ classList.remove(.hide)๋กœ ์ ์šฉํ•˜์˜€๋”๋‹ˆ ๋งจ ์œ„ ํ•˜ํŠธ๋งŒ ๋ฐ”๋€Œ๋Š” ํ˜„์ƒ์ด ๋ฐœ์ƒํ•˜์˜€๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•˜์—ฌ ๊ฐ๊ฐ์˜ ํ•˜ํŠธ์— ๋‹ค๋ฅธ ํด๋ž˜์Šค ์ด๋ฆ„์„ ์ง€์ •ํ•ด์ฃผ๊ณ  ๊ทธ์— ๋”ฐ๋ฅธ ๊ฐ๊ฐ์˜ ๋ณ€์ˆ˜๋ฅผ ์ƒ์„ฑํ•ด์ฃผ์–ด ์ ์šฉํ•˜์˜€๋‹ค.
๐Ÿ’ฌ ย  ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ œ๋Š” ํ•ด๊ฒฐ๋˜์—ˆ์œผ๋‚˜ ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง€๊ฒŒ ๋˜์–ด ๋” ๋‚˜์€ ๋ฐฉ๋ฒ•์„ ์ฐพ์•„๋ด์•ผ ๋  ๊ฒƒ ๊ฐ™๋‹ค...!

โญ๏ธ Struggle Point : ์ƒˆ๋กœ ์ƒ์„ฑ๋œ ๋Œ“๊ธ€์— ๋นˆ ํ•˜ํŠธ์™€ ์ฑ„์›Œ์ง„ ํ•˜ํŠธ ๋‘ ๊ฐœ๊ฐ€ ๋ชจ๋‘ ๋œฌ ํ›„ ํด๋ฆญ ์‹œ ํ•˜๋‚˜๊ฐ€ ์‚ฌ๋ผ์ง€๊ณ  ํด๋ฆญ ์ด๋ฒคํŠธ๊ฐ€ ์ ์šฉ๋จ

์›๋ž˜ ์žˆ๋˜ ๋Œ“๊ธ€์˜ ํ•˜ํŠธ์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ์ ์šฉํ•˜๋ ค๊ณ  ํ–ˆ์œผ๋‚˜ ์ฒ˜์Œ์— ์ฑ„์›Œ์ง„ ํ•˜ํŠธ์— hide ํด๋ž˜์Šค๊ฐ€ ์ ์šฉ๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ๋ฅผ ๋ฐœ๊ฒฌํ–ˆ๊ณ  ๋™์ ์œผ๋กœ ์ƒ์„ฑ๋œ ์š”์†Œ์ด๋ฏ€๋กœ setAttribute๋กœ ์ ์šฉํ•˜๋ ค๊ณ  ํ–ˆ์œผ๋‚˜ ์ด๊ฒƒ๋„ ์ ์šฉ๋˜์ง€ ์•Š์•˜๋‹ค. ๊ทธ๋ž˜์„œ ์ƒˆ๋กœ์šด ํ•จ์ˆ˜๋กœ clickHeart๋ฅผ ๋งŒ๋“ค๊ณ  window.event.target์„ heart๋กœ ๋งŒ๋“ค์–ด ์กฐ๊ฑด๋ฌธ์„ ์ ์šฉํ•ด์ฃผ์—ˆ๋”๋‹ˆ ํ•ด๊ฒฐ๋˜์—ˆ๋‹ค.



๋กœ๊ทธ์ธ ํŽ˜์ด์ง€

  1. id๊ฐ€ ์ด๋ฉ”์ผ ํ˜•์‹์— ๋งž์œผ๋ฉด ์ด๋ฉ”์ผ input์˜ border๊ฐ€ ์ดˆ๋ก์ƒ‰์œผ๋กœ ๋ฐ”๋€Œ๊ฒŒ ๊ตฌํ˜„ํ•ด์ฃผ์„ธ์š”.
  2. password๋Š” ์˜์–ด ์†Œ๋ฌธ์ž, ์˜์–ด ๋Œ€๋ฌธ์ž, ํŠน์ˆ˜๋ฌธ์ž, ์ˆซ์ž๋ฅผ ํฌํ•จํ•œ 8์ž ์ด์ƒ์ž…๋‹ˆ๋‹ค. ์ด ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋ฉด ํŒจ์Šค์›Œ๋“œ input์˜ border๊ฐ€ ์ดˆ๋ก์ƒ‰์œผ๋กœ ๋ฐ”๋€Œ๊ฒŒ ๊ตฌํ˜„ํ•ด์ฃผ์„ธ์š”.
  3. ๋กœ๊ทธ์ธ ๋ฒ„ํŠผ ํ™œ์„ฑํ™” ์กฐ๊ฑด๋„ ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ id, password ์กฐ๊ฑด์œผ๋กœ ๋งž์ถ”์–ด ์ฃผ์„ธ์š”.
  4. ๋น„๋ฐ€๋ฒˆํ˜ธ input ๋‚ด๋ถ€ ์˜ค๋ฅธ์ชฝ์— show, hide ๋ฒ„ํŠผ์„ ๋งŒ๋“ค์–ด show ์ผ ๋•Œ๋Š” ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ๋ณด์ด๊ฒŒ, hide์ผ ๋•Œ๋Š” type="password"๊ฐ€ ๋˜๋„๋ก ํ•ด์ฃผ์„ธ์š”.

โœ”๏ธ ์•„์ด๋””์™€ ํŒจ์Šค์›Œ๋“œ๊ฐ€ ์กฐ๊ฑด์— ๋งž์„ ์‹œ border๋ฅผ ์ดˆ๋ก์ƒ‰์œผ๋กœ ๋ณ€๊ฒฝํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ
[login.js]

const idBox = document.getElementById('loginId');
const pwBox = document.getElementById('loginPw');

idBox.onkeyup = function () {
    const userId = document.querySelector('.id');

    if (userId.value.includes('@')) {
        userId.style.borderColor = 'green';
    }
    else {
        userId.style.borderColor = '#e3e3e3';
    }
};

pwBox.onkeyup = function () {
    const userPw = document.querySelector('.pw');
    const regexPw = /(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[#?!@$%^&*-]).{8,20}/;

    if (regexPw.test(userPw.value)) {
        userPw.style.borderColor = 'green';
    }
    else {
        userPw.style.borderColor = '#e3e3e3';
    }
};

[ Result ]

โญ๏ธ Struggle point : ์ •๊ทœ์‹ ํ‘œํ˜„ ์ดํ•ด

์กฐ๊ฑด์— ๋งž๋Š” ๋น„๋ฐ€๋ฒˆํ˜ธ์ผ ๋•Œ ํ…Œ๋‘๋ฆฌ ์ƒ‰ ๋ณ€๊ฒฝํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ์ •๊ทœ์‹์„ ํ†ตํ•ด ๊ตฌํ˜„ํ•œ๋‹ค๋Š” ์ ์„ ์•Œ์•˜๊ณ  ์ •๊ทœ์‹์— ๋Œ€ํ•ด ์ฐพ์•„๋ณด์•˜๋Š”๋ฐ ์‚ฌ๋žŒ๋งˆ๋‹ค ์“ฐ๋Š” ๋ฐฉ์‹์ด ๋‹ฌ๋ผ์„œ ํŒŒ์•…ํ•˜๊ธฐ ์–ด๋ ค์› ๋‹ค. ๊ทธ๋ž˜์„œ ์—ฌ๋Ÿฌ ์ •๊ทœ์‹์„ ์ฐธ๊ณ ํ•˜์—ฌ ๋‚ด๊ฐ€ ๊ตฌํ˜„ํ•œ ํŽ˜์ด์ง€์— ๋งž๋Š” ํ˜•์‹์„ ์ฐพ์•„์„œ ์ ์šฉํ•˜์˜€๋‹ค!

โญ๏ธ Struggle point : ํ…Œ๋‘๋ฆฌ ๋ฐ”๊นฅ ํด๋ฆญํ•ด์•ผ ์ดˆ๋ก์ƒ‰์œผ๋กœ ๋ณด์ด๋Š” ํ˜„์ƒ

์กฐ๊ฑด์— ๋งž๊ฒŒ ํ•จ์ˆ˜๊ฐ€ ์ž˜ ์ž‘๋™๋˜๋‚˜ input ๋ฐ”๊นฅ์„ ๋ˆŒ๋Ÿฌ์•ผ ์ดˆ๋ก์ƒ‰์œผ๋กœ ๋ณด์ด๋Š” ํ˜„์ƒ์ด ๋ฐœ์ƒํ–ˆ๋‹ค. ์ฐพ์•„๋ณด๋‹ˆ input ํƒœ๊ทธ์—๋Š” outline ์†์„ฑ์ด ๊ธฐ๋ณธ์œผ๋กœ ์ฃผ์–ด์ ธ ์žˆ์–ด์„œ ๊ทธ ์†์„ฑ์„ ์—†์• ์ฃผ์–ด์•ผ ๋ฐ”๋กœ ๋ณด์ธ๋‹ค๊ณ  ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๋ณด๊ณ  css์—์„œ input ํƒœ๊ทธ์˜ ์†์„ฑ์„ outline์„ none์œผ๋กœ ์„ค์ •ํ•˜์˜€๋”๋‹ˆ ํ•ด๊ฒฐ๋˜์—ˆ๋‹ค!

โœ”๏ธ ๋น„๋ฐ€๋ฒˆํ˜ธ hide, show ๊ธฐ๋Šฅ
[login.js]

show.addEventListener('click', e => {
    if (e.target.className == "fa fa-eye eye") {
        e.target.className = "far fa-eye-slash eye";
        pwInput.setAttribute('type', 'text');
    }
    else {
        e.target.className = "fa fa-eye eye";
        pwInput.setAttribute('type', 'password');
    }
});

[ Result ]

โญ๏ธ Struggle point : ๋ˆˆ ๋ชจ์–‘ ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ input ๊ฐ’ ๋ณด์ด๊ธฐ

๋ฒ„ํŠผ์„ ํด๋ฆญํ–ˆ์„ ๋•Œ input์˜ ๊ฐ’์„ ๋ณด์ด๊ฒŒ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์„ ๊ณ ๋ฏผํ–ˆ๋Š”๋ฐ ํƒœ์˜๋‹˜์˜ input์˜ type์ด ๋ญ๋ƒ๊ณ  ํ•˜๋Š” ํ•œ ๋งˆ๋””์— ์•„ํ•˜..! ํ•˜๊ณ  ๊นจ๋‹ซ๊ฒŒ ๋˜์—ˆ๋‹ค. ๊ทธ๋ž˜์„œ pwInput์— setAttribute ์†์„ฑ์„ ์ด์šฉํ•ด ํƒ€์ž…์„ ๋ณ€๊ฒฝํ•ด์ฃผ์—ˆ๋”๋‹ˆ ํ•ด๊ฒฐ๋˜์—ˆ๋‹ค.



๋ฆฌ์ŠคํŠธ ํŽ˜์ด์ง€

  1. ์ปคํ”ผ ์ด๋ฆ„ ์˜† ์ข‹์•„์š” ๋ฒ„ํŠผ(ํ•˜ํŠธ)๋ฅผ ๋ˆŒ๋ €์„ ๋•Œ ๋ถ‰์€์ƒ‰ ํ•˜ํŠธ๋กœ ๋ณ€ํ•˜๊ฒŒ ๊ตฌํ˜„ํ•ด์ฃผ์„ธ์š”.
  2. ๋ฆฌ์ŠคํŠธ ํŽ˜์ด์ง€๋ฅผ ๋ฐ˜์‘ํ˜•์œผ๋กœ ๊ตฌํ˜„ํ•ด์ฃผ์„ธ์š”.

โœ”๏ธ ์ปคํ”ผ๋ณ„ ์ข‹์•„์š” ๋ฒ„ํŠผ ๊ธฐ๋Šฅ
[list.html]

<section class="wrapper">
        <div class="img">
            <div class="scale"><img alt="ํ† ํ”ผ๋„› ์ฝœ๋“œ ๋ธŒ๋ฃจ" src="img/coffee.jpg" /></div>
            <p>ํ† ํ”ผ๋„› ์ฝœ๋“œ ๋ธŒ๋ฃจ &nbsp;<i class="far fa-heart" onclick="clickHeart();"></i></p>
        </div>
</section>

[list.js]

like.onclick = clickHeart;

function clickHeart() {
    const heart = window.event.target;
    if (heart.className == 'far fa-heart') {
        heart.className = 'fas fa-heart';
        heart.style.color = '#c73d3d';
    }
    else {
        heart.className = 'far fa-heart';
        heart.style.color = 'black'
    }
};

[ Result ]

โญ๏ธ Struggle point : ๋งจ ์ฒ˜์Œ ํ•˜ํŠธ๋งŒ ์ ์šฉ ์ž˜ ๋˜๊ณ  ๋‹ค๋ฅธ ํ•˜ํŠธ๋“ค์€ ๋‘ ๋ฒˆ์งธ ํด๋ฆญ๋ถ€ํ„ฐ ์ ์šฉ๋˜๋Š” ํ˜„์ƒ

๊ธฐ๋Šฅ ์ž‘๋™์€ ์ž˜ ๋˜๋‚˜ ๋‘ ๋ฒˆ์งธ ํ•˜ํŠธ๋ถ€ํ„ฐ๋Š” ํด๋ฆญ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐ”๋กœ ์ ์šฉ๋˜์ง€ ์•Š๋Š” ํ˜„์ƒ์ด ๋ฐœ์ƒํ•˜์—ฌ ๊ทธ ์ด์œ ๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด html๊ณผ js ํŒŒ์ผ์„ ์ž์„ธํžˆ ๋ณด์•˜๋‹ค. ๋ช‡ ์ค„ ๋˜์ง€ ์•Š๋Š” ์ฝ”๋“œ์—ฌ์„œ ๋ฆฌ๋ทฐ ๋Œ“๊ธ€๊ณผ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ์ ์šฉํ•ด์ฃผ์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋Š”๋ฐ html์—์„œ ์•„์ด์ฝ˜์— ๋‹ค๋ฅธ ํด๋ž˜์Šค ์ด๋ฆ„์„ ์ถ”๊ฐ€๋กœ ์ ์šฉํ•ด์ฃผ์–ด ์ฐจ์ด์ ์ด ์ƒ๊ธด ๊ฒƒ์„ ๋ฐœ๊ฒฌํ•˜๊ณ  ์ด๋ฅผ ์ง€์›Œ์ฃผ์—ˆ๋”๋‹ˆ ํ•ด๊ฒฐ๋˜์—ˆ๋‹ค!
๐Ÿ’ฌ ย  js์—์„œ๋Š” ํด๋ž˜์Šค ์ด๋ฆ„์„ ์“ฐ๋Š” ๊ฒƒ๋ณด๋‹ค ์•„์ด๋””๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์Šต๊ด€์„ ๋“ค์ด์ž!

โœ”๏ธ ๋ฐ˜์‘ํ˜•์œผ๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ
- media ์ฟผ๋ฆฌ ์‚ฌ์šฉํ•ด ํ™”๋ฉด์ด ์ค„์–ด๋“ค์—ˆ์„ ๋•Œ ํ•ด๋‹น ์‚ฌํ•ญ ์ ์šฉ

@media screen and (max-width: 850px) {
  .header {
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    padding: 8px 24px;
    height: 90px;
  }

  .headerMenu {
    width: 100%;
    display: flex;
    flex-direction: column;
    align-items: center;
  }

  .headerMenu li {
    width: 50%;
  }

  .header h2 {
    width: 100%;
    display: flex;
    justify-content: flex-start;
    margin: -5px 0 0 10px;
  }
}

[ Result ]

๐Ÿ’ฌ ย  ๋ฐ˜์‘ํ˜• ์›น ๊ตฌ์„ฑ์€ ์•„์ง ๋ถ€์กฑํ•œ ๋ถ€๋ถ„์ด ๋งŽ์•„์„œ ๋” ๊ณต๋ถ€๊ฐ€ ํ•„์š”ํ•  ๊ฒƒ ๊ฐ™๋‹ค..!

profile
ํ•˜๋Š˜์ด์˜ ๊ฐœ๋ฐœ ์ผ๊ธฐ

0๊ฐœ์˜ ๋Œ“๊ธ€