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

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

Webucks Project

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

[Mini Project] WeBucks-JS

[Mission 4~5] ๊ตฌํ˜„ (์ถ”๊ฐ€ ๊ตฌํ˜„ ์‚ฌํ•ญ)
โœจ ๊ตฌํ˜„ ๊ธฐ๊ฐ„ : 11/24~25

[Mission 4] ์ปคํ”ผ ์ƒ์„ธ ํŽ˜์ด์ง€ ๋ ˆ์ด์•„์›ƒ ๊ตฌํ˜„

  1. HTML, CSS๋กœ ์Šคํƒ€๋ฒ…์Šค ์ƒ์„ธ ํŽ˜์ด์ง€๋ฅผ ๊ตฌํ˜„ํ•ด ์ฃผ์„ธ์š”.
  2. ์‹ค์ œ ํŽ˜์ด์ง€๊ฐ€ ์•„๋‹ˆ๋ผ ์•„๋ž˜ ์ด๋ฏธ์ง€์— ์žˆ๋Š” ๋ถ€๋ถ„๋งŒ ๊ตฌํ˜„ํ•ด์ฃผ์„ธ์š”.
  3. ์›ํ•˜์‹œ๋Š” ์ปคํ”ผ ํ•˜๋‚˜๋ฅผ ๊ณจ๋ผ ๊ตฌํ˜„ํ•ด์ฃผ์„ธ์š”. ๋‹จ, ์•Œ๋Ÿฌ์ง€ ์ •๋ณด ๋ฐ•์Šค๋Š” ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์•Œ๋Ÿฌ์ง€ ์ •๋ณด๊ฐ€ ์—†๋‹ค๋ฉด ์•Œ๋Ÿฌ์ง€ ์ •๋ณด๊ฐ€ ์—†๋‹ค๋ผ๋Š” ๋ฌธ๊ตฌ๋ฅผ ๋„ฃ์–ด์ฃผ์„ธ์š”.

โœ”๏ธ ์ œํ’ˆ ์˜์–‘ ์ •๋ณด ์‚ฌ์ด ์„ธ๋กœ ์ ์„  ํ‘œํ˜„
[detail.html]

<section class="main">
  <hr class="between">
</section>

[detail.css]
- width์™€ height๋กœ ๊ธธ์ด ์กฐ์ •, border-left: dashed๋กœ ์ ์„  ํ‘œํ˜„

.main .between {
  background-color: #a0a0a0;
  border: 0;
  border-left: 1px dashed #ffffff;
  width: 1px;
  height: 100px;
  margin: -135px 0 0 335px;
}

โœ”๏ธ ๋ฆฌ๋ทฐ ๋Œ“๊ธ€ ์ฐฝ ๊ตฌํ˜„
[detail.html]
- ๋Œ“๊ธ€ ์ „์ฒด ๊ฐ์‹ธ๋Š” div ์•ˆ์— span ํƒœ๊ทธ๋กœ ์•„์ด๋””์™€ ๋‚ด์šฉ ๊ตฌ๋ถ„ํ•˜์—ฌ ๊ตฌ์„ฑํ•ด์คŒ
- input ํƒœ๊ทธ์— placeholder ์ง€์ •

<div class="review">
      <div class="commentText"><span class="id">coffee_lover </span><span class="text">๋„ˆ๋ฌด ๋ง›์žˆ์–ด์š”!</span></div>
      <div class="commentText"><span class="id">CHOCO7 </span><span class="text">์˜ค๋Š˜๋„ ํ™”์ดํŠธ ์ดˆ์ฝœ๋ฆฟ ๋ชจ์นด๋ฅผ ๋งˆ์‹œ๋Ÿฌ ๊ฐ‘๋‹ˆ๋‹ค.</span></div>
      <div class="commentText"><span class="id">legend_dev </span><span class="text">์ง„์งœ ํ™”์ดํŠธ ์ดˆ์ฝœ๋ฆฟ ๋ชจ์นด๋Š” ์ „์„ค์ด๋‹ค. ์ง„์งœ ํ™”์ดํŠธ ์ดˆ์ฝœ๋ฆฟ ๋ชจ์นด๋Š” ์ „์„ค์ด๋‹ค. ์ง„์งœ ํ™”์ดํŠธ ์ดˆ...</span></div>
      <div class="writeComment">
	   <!--์ƒˆ ๋Œ“๊ธ€ ์ž…๋ ฅ ๋  ๊ณต๊ฐ„-->
      </div>
      <div>
          <input class="comment" placeholder="๋ฆฌ๋ทฐ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.">
      </div>
</div>

โœ”๏ธ footer ํƒœ๊ทธ ํ•˜๋‹จ ๊ณ ์ •
[detail.css]
- ๋ถ€๋ชจ ์†์„ฑ์— relative, ์ž์‹ ์†์„ฑ์ธ footer์— absolute ์ ์šฉ
- min-height: 100% ์ ์šฉํ•˜์—ฌ ์ปจํ…์ธ  ์–‘์ด ์ž‘์•„๋„ ํ™”๋ฉด์— ๊ฝ‰์ฐฐ ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ฆ

html {
  position: relative;
  min-height: 100%;
  margin: 0;
}

body {
  min-height: 100%;
}

footer {
  position: absolute;
  width: 100%;
  display: flex;
  align-items: center;
  justify-content: space-around;
}

[ Result ]
- footer ์•„๋ž˜ copyright ๋ถ€๋ถ„ ์ถ”๊ฐ€ ๊ตฌํ˜„

footer์˜ ์š”์†Œ๋“ค์„ ํ•œ ๋ฒˆ์— ๋ชจ๋‘ ์ •๋ ฌํ•ด์ค„ ์ˆ˜ ์—†๋Š” ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒจ ์•„๋ž˜ ์‚ฌ์ง„๊ณผ ๊ฐ™์ด ๋ฉ”๋‰ด๋ฅผ ํ•˜๋‚˜์”ฉ ๋‚˜๋ˆ„์–ด div๋ฅผ ์„ค์ •ํ•˜๊ณ  flex ์†์„ฑ์„ ์‚ฌ์šฉํ•ด ์ •๋ ฌํ•ด์ฃผ์—ˆ๋‹ค.



[Mission 5] ์ปคํ”ผ ์ƒ์„ธ ํŽ˜์ด์ง€ ๊ธฐ๋Šฅ ๊ตฌํ˜„

  1. ์ปคํ”ผ์— ์ข‹์•„์š” ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•ด์ฃผ์„ธ์š”
    • ํ•˜ํŠธ ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ ํ•˜ํŠธ์˜ ์ƒ‰์ด ๋ถ‰์€์ƒ‰์œผ๋กœ ๋ณ€ํ•˜๊ฒŒ ๊ตฌํ˜„ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
  2. ๋ฆฌ๋ทฐ๋กœ ๋Œ“๊ธ€์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•ด์ฃผ์„ธ์š”.
    • input์ฐฝ์— ๋ฆฌ๋ทฐ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์—”ํ„ฐ๋ฅผ ๋ˆ„๋ฅด๋ฉด ๋Œ“๊ธ€์ด ์ถ”๊ฐ€๋˜๋„๋ก ๊ตฌํ˜„ํ•ด์ฃผ์„ธ์š”.

โœ”๏ธ ์ข‹์•„์š” ๋ฒ„ํŠผ ๊ธฐ๋Šฅ ๊ตฌํ˜„
[detail.html]

<div class="heart">
     <i class="far fa-heart fa-lg white"></i>  <!--๋นˆ ํ•˜ํŠธ ์•„์ด์ฝ˜-->
     <i class="fas fa-heart fa-lg red hide"></i>  <!--์ฑ„์›Œ์ง„ ํ•˜ํŠธ ์•„์ด์ฝ˜-->
</div>

[detail.css]

.hide {
  display: none;
}

[detail.js]

const dislikeBtn = document.querySelector('.white');
const likeBtn = document.querySelector('.red');

dislikeBtn.onclick = function () {    // ๋นˆํ•˜ํŠธ ํด๋ฆญํ–ˆ์„ ๋•Œ 
    dislikeBtn.classList.add('hide');  // ๋นˆํ•˜ํŠธ์— .hide ์ ์šฉ
    likeBtn.classList.remove('hide');   // ๋นจ๊ฐ„ํ•˜ํŠธ์— ์ ์šฉ๋˜์–ด ์žˆ๋˜ .hide ์‚ญ์ œ
}

[ Result ]
- ํ•˜ํŠธ์— ๋งˆ์šฐ์Šค ํ˜ธ๋ฒ„ ์‹œ cursor: pointer๋กœ ๋ณ€๊ฒฝ

โœ”๏ธ ๋Œ“๊ธ€ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ ๊ตฌํ˜„
[detail.html]

<div class="review">
    <p class="reviewTitle">๋ฆฌ๋ทฐ</p>
    <hr>
    <div class="commentText">
    	<span class="id">coffee_lover </span>
    	<span class="text">๋„ˆ๋ฌด ๋ง›์žˆ์–ด์š”!</span>
    </div>
    <div class="commentText">
    	<span class="id">CHOCO7 </span>
    	<span class="text">์˜ค๋Š˜๋„ ํ™”์ดํŠธ ์ดˆ์ฝœ๋ฆฟ ๋ชจ์นด๋ฅผ ๋งˆ์‹œ๋Ÿฌ ๊ฐ‘๋‹ˆ๋‹ค.</span>
    </div>
    <div class="commentText">
    	<span class="id">legend_dev </span>
    	<span class="text">์ง„์งœ ํ™”์ดํŠธ ์ดˆ์ฝœ๋ฆฟ ๋ชจ์นด๋Š” ์ „์„ค์ด๋‹ค. ์ง„์งœ ํ™”์ดํŠธ ์ดˆ์ฝœ๋ฆฟ ๋ชจ์นด๋Š” ์ „์„ค์ด๋‹ค. ์ง„์งœ ํ™”์ดํŠธ ์ดˆ...</span>
    </div>
    <div class="writeComment">
	<!--๋Œ“๊ธ€ ์ถ”๊ฐ€ ๋  ๊ณต๊ฐ„-->
    </div>
    <div>
        <input class="comment" type="text" placeholder="๋ฆฌ๋ทฐ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”." />
    </div>
</div>

[detail.css]

.writeComment {
  font-size: 14px;
  margin-left: 21px;
}

.userId {
  font-weight: bold;
}

[detail.js]

const commentInput = document.querySelector('.comment');

function uploadComment() {  
    const box = document.querySelector(".writeComment"); // ๋Œ“๊ธ€ ์ „์ฒด ์š”์†Œ๋ฅผ ๊ฐ์‹ธ๋Š” ๋ฐ•์Šค ์ƒ์„ฑ

    // ๋Œ“๊ธ€ ์š”์†Œ ์ƒ์„ฑ
    const comments = document.createElement("div");
    const userId = document.createElement("span");
    const review = document.createElement("span");

    // ํ•ด๋‹น ๋Œ“๊ธ€ ์š”์†Œ๊ฐ€ ๋‚˜ํƒ€๋‚ผ ๊ฒƒ html์—์„œ ์„ ํƒ
    comments.classList.add("writeComment")
    userId.classList.add("userId");
    review.classList.add("text");
  
    userId.innerHTML = "luneah ";   // userId ์ง€์ •ํ•˜์—ฌ ๋Œ“๊ธ€ ๋‹ฌ๋ฉด ID ์นธ์— ๋œจ๊ฒŒ ํ•จ
    review.innerText = commentInput.value;  // input์— ๋“ค์–ด์˜จ ๊ฐ’ ๋ถˆ๋Ÿฌ์˜ด

    // appendChild ์†์„ฑ์œผ๋กœ ์ž์‹ ์š”์†Œ๋กœ ์ถ”๊ฐ€ํ•ด์คŒ
    comments.appendChild(userId);
    comments.appendChild(review);
    box.appendChild(comments);
}
  • ์•„๋ฌด๊ฒƒ๋„ ์ž…๋ ฅํ•˜์ง€ ์•Š์•˜์„ ๋•Œ๋Š” ์—”ํ„ฐ๋ฅผ ๋ˆŒ๋Ÿฌ๋„ ์—…๋กœ๋“œ ๋˜์ง€ ์•Š๊ฒŒ ๊ตฌํ˜„ํ•จ
//์—”ํ„ฐํ‚ค๋กœ ๋Œ“๊ธ€ ๋‹ฌ๊ธฐ
commentInput.addEventListener("keypress",(e) => {
    if(e.keyCode === 13 && commentInput.value.length !== 0){    // ์—”ํ„ฐํ‚ค๋ฅผ ๋ˆ„๋ฅด๊ณ , input์— ๋“ค์–ด์˜จ ๊ฐ’์˜ ๊ธธ์ด๊ฐ€ 0์ด ์•„๋‹ ๋•Œ ์—…๋กœ๋“œ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•จ
        uploadComment();
        commentInput.value = "";   // ์—…๋กœ๋“œ ํ›„ input ์นธ ๊ณต๋ฐฑ์œผ๋กœ ๋งŒ๋“ฆ
    }
});

[Result]

โญ๏ธ Struggle Point : uploadComment ํ•จ์ˆ˜ ์ž‘์„ฑ

input์— ๋Œ“๊ธ€์„ ์ž…๋ ฅํ–ˆ์„ ๋•Œ ๋Œ“๊ธ€์ด ์ถ”๊ฐ€๋  ๊ณต๊ฐ„์„ ์žก์•„์คฌ์œผ๋‚˜ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ชฐ๋ž๋‹ค. userId์™€ text๋ฅผ ๋ชจ๋‘ ๋‹ด์„ ์ˆ˜ ์žˆ๋Š” div๋ฅผ ์ƒ์„ฑํ•ด์ค˜์„œ ๋‹ด์œผ๋ฉด ๋˜๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๊ณ  ์ด์— ๊ด€ํ•œ ๋ฐฉ๋ฒ•์„ ์ฐพ์•„๋ณด์•˜๋‹ค. createElement์™€ appendChild, innerHTML๊ณผ innerText์˜ ์ฐจ์ด์  ๋“ฑ์„ ์ž˜ ์•Œ์ง€ ๋ชปํ•ด์„œ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ–ˆ๋Š”๋ฐ ๊ฒ€์ƒ‰์„ ํ†ตํ•ด ์“ฐ์ž„๊ณผ ์ฐจ์ด๋ฅผ ์ธ์ง€ํ•˜๊ณ  ์ด๋ฅผ ํ™œ์šฉํ•ด ๊ตฌํ˜„ํ–ˆ๋‹ค.

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

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