ย
Ajax๋ (Asynchronous Javascript And Xml, ๋น๋๊ธฐ์ ์ธ ์๋ฐ์คํฌ๋ฆฝํธ์ xml)์ ์ฝ์์
๋๋ค.
ย
- ๋น๋๊ธฐ์ ์ธ ๋ฐฉ์ : ์ฌ๋ฌ๊ฐ์ง ์ผ๋ค์ ๋ถ์ ํํ์ฌ ์ฒ๋ฆฌํ๋ ๊ฒ์ ๋งํฉ๋๋ค.
- ๋๊ธฐ์ ์ธ ๋ฐฉ์ : ์๋ฒ์ ์ฐ๊ฒฐํ์ง ์๊ณ ์น ์ฌ์ดํธ๋ฅผ ๋ง๋ค๊ฒ ๋๋ ๊ฒฝ์ฐ ๋งํฉ๋๋ค.
ย
์๋ฅผ ๋ค์ด sns์ฑ์ ์ผ๊ณ ํ์ด์ง๋ฅผ ๋ด๋ฆฌ๋ฉด์ ํฌ์คํธ๋ค์ด ๋ก๋ฉ์ด ๋๊ฑฐ๋ ๋๊ธ์ ๋ฌ๊ฒ ๋๋ฉด ๋๊ธ์ ๋จ ๊ฒ์๋ฌผ์ด ์
๋ฐ์ดํธ ๋๋ ๋ฑ ์ฌ๋ฌ๊ฐ์ง ํ๋ก์ธ์ค๋ค์ด ๋
๋ฆฝ์ ์ผ๋ก ์๋ํ๋ ๊ฒ์ ๋น๋๊ธฐ์ ์ธ ๋ฐฉ์์ด๋ผ๊ณ ํ๋ฉด, ๋๊ธฐ์ ์ธ ๋ฐฉ์์ ๋ค๋ฅธ ์ผ๋ค์ด ๋๋ ๋ ๊น์ง ๊ธฐ๋ค๋ฆฝ๋๋ค.
ย
Ajax ํต์ ์ ํ๊ธฐ ์ํด์ ์๋ฒ์์ ์ฐ๊ฒฐ์ด ํ์์ ์
๋๋ค. ์๋ฒ๋ฅผ ์ฐ๊ฒฐํ๊ธฐ ์ํด์ php, python ๋ฑ์ ํตํด์ ์๋ฒ๋ฅผ ์ด๊ฑฐ๋, ๋ก์ปฌ ํธ์คํธ ์๋ฒ๋ฅผ ํ์ฉํด์ผ ํฉ๋๋ค. WebStorm๊ณผ PhpStormWebStorm๊ณผ PhpStorm์ ๋ก์ปฌ ํธ์คํธ๋ฅผ ์ง์ํ๊ธฐ ๋๋ฌธ์ ํฌ๋กฌ ๋ฒํผ์ ๋๋ฅด๋ฉด ์ฝ๊ฒ ๋ก์ปฌ ํธ์คํธ๋ฅผ ์ด ์ ์์ต๋๋ค.
ย
ย
ย
WebStorm๊ณผ PhpStorm๋ฅผ ์ฌ์ฉํ์์ง ์๋ ๋ถ๋ค์ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์ฌ์ฉํด์ ๋ก์ปฌ ํธ์คํธ ํน์ ์๋ฒ๋ฅผ ๋ค์ด๋ฐ์์ ์ด์ฉํ์
์ผ ํฉ๋๋ค.
ย
์๋ฒ๋ฅผ ์ฌ์
จ๋ค๋ฉด ์ข์์๋ฅผ ๋๋ ์ ๋ ์ข์์์ ๊ฐ์ ๋ฐ๊พธ๋ ๊ธฐ๋ฅ์ ์ถ๊ฐํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
ย
XML http request๋ฅผ ์ฌ์ฉํ Ajax๊ฐ ์ฌ์ค ๋ฐ๋ก ํ์ฉํ๊ธฐ์๋ ๋ค์ ์ด๋ ต๊ธฐ ๋๋ฌธ์ ์ ํฌ ๊ฐ์์์๋Jquery๋ฅผ ์ฌ์ฉํ Ajax ํต์ ์ ์ฌ์ฉํ๋๋ก ํ๊ฒ ์ต๋๋ค. ๋จผ์ , Jquery๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ Jquery ์์ง์ ๊ฐ์ ธ์์ผ ํฉ๋๋ค. ๊ทธ๋์ https://code.jquery.com/ ์ ์๋ ์ฝ๋๋ฅผ ๊ฐ์ ธ์์ ์ถ๊ฐํด์ฃผ์ด์ผ ํฉ๋๋ค. ์ด ์ฝ๋๋ ์ธํฐ๋ท์ด ์ฐ๊ฒฐ๋์ด ์์๋๋ง Jquery ์์ง์ ๋ถ๋ฌ์ฌ ์ ์์ต๋๋ค. ์ธํฐ๋ท ์ฐ๊ฒฐ์ด ์๋ ๋ถ๋ค์ ์์ค์ฝ๋์ ๋ค์ด๋ก๋ ๋ ๊ฒฝ๋ก๋ฅผ ๋ฃ์ด์ฃผ์๋ฉด ๋ฉ๋๋ค.
ย
ํ์ผ๋ช
:
index.html
... <script src="https://code.jquery.com/jquery-3.5.1.js"></script> <!--<script src="js/jquery-3.5.1.js"></script>--> <script src="js/main.js"></script> </body> </html>
ย
Jquery๋ฅผ ์ฌ์ฉํ Ajax ํต์ ์ $.ajax๋ก ์์์ ํฉ๋๋ค.
๋จผ์ , type์ ์ง์ ํด ์ฃผ์ด์ผ ํฉ๋๋ค. type์ GET๊ณผ POST๋ฐฉ์์ด ์๋๋ฐ ์ผ๋ฐ์ ์ผ๋ก POST ๋ฐฉ์์ ์ฌ์ฉํฉ๋๋ค. ์ด๋, type์ Method๋ก ๋ฐ๊ฟ ์
๋ ฅํ์
๋ ๋ฉ๋๋ค.
URL์ ๋ฐ์ดํฐ ํ์
์ ์๋ฒ์ธก์ผ๋ก ๋ณด๋ผ ๋,
- GET : ๋ฐ์ดํฐ๋ฅผ url ๊ฒฝ๋ก๋ฅผ ๋ค์ ๋ถ์ฌ์ ๋ณด๋ธ๋ค
- POST : ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ผ ๋, url ๊ฒฝ๋ก ์๋ตํ๊ณ ๋ณด๋ธ๋ค
ย
ํ์ผ๋ช
:
js/main.js
... function deligationFunc(e){ let elem = e.target; // ํด๋ฆญํ ์์ ๊ฐ์ ธ์ค๊ธฐ // console.log(e.target); // console.log(elem); // ์๋ชป ํด๋ฆญํ ๊ฒฝ์ฐ while(!elem.getAttribute('data-name')){ // elem์ ๋ถ๋ชจ๋ฅผ ์ฐพ์ elem = elem.parentNode; if(elem.nodeName ==='BODY'){ // body๊น์ง ์ด๋ฒคํธ๊ฐ ์๋ ๊ฒฝ์ฐ elem=null; return; } // data-name์ ๊ฐ์ง ์์ฑ์ ์ฐพ์๋๊น์ง ๋ถ๋ชจ์๊ฒ ์ ๊ทผ์ ๋ฐ๋ณต } if(elem.matches('[data-name="heartbeat"]')){ // console.log("ํํธ!"); $.ajax({ Method:'POST', // ์๋ฌ๋ ๊ฒฝ์ฐ GET์ผ๋ก ๋ณ๊ฒฝํ๊ธฐ url:'data/like.json', data: 37, dataType:'json', // ์ด๋ป๊ฒ ๋ค์ด์ฌ์ง ์ค์ success: function(response){ // ํต์ ์ ์ฑ๊ณตํ ๋ฐ์ดํฐ๊ฐ response๋ก ๋ค์ด์จ๋ค let likeCount =document.querySelector('#like-count-37'); likeCount.innerHTML = '์ข์์' + response.like_count +'๊ฐ'; } }) }else if(elem.matches('[data-name="bookmark"]')){ console.log("๋ถ๋งํฌ!"); }else if(elem.matches('[data-name="share"]')){ console.log("๊ณต์ !"); }if(elem.matches('[data-name="more"]')){ console.log("๋๋ณด๊ธฐ!"); } elem.classList.toggle('on'); // on ํด๋์ค ์ฃผ๊ธฐ } ...
ย
data: 37, let likecount =document.querySelector('#like-count-37'); ๋ถ๋ถ์ ์๋๋ data:[pk], ('#like-count-')+pk ๋ก pk๋ฅผ ๋ฐ์ ๊ฐ ์ ์ ๋ค์ด ๊ฐ๊ณ ์๋ ๊ณ ์ ํ ๋ฒํธ๋ฅผ ์ฐ์ด์ฃผ๊ฑฐ๋ ์ฐ๊ฒฐํด ์ค๋๋ค.
์ง๊ธ ์ด ๋ถ๋ถ์ backend๊ฐ ๊ตฌํ๋์ง ์์ ๋ฐ์ดํฐ๊ฐ ์๊ธฐ ๋๋ฌธ์ ์์๋ก ์์ฑํ ๋ถ๋ถ์
๋๋ค.
ย
์ฝ๋๋ฅผ ์์ฑํ์
จ๋ค๋ฉด
data
ํด๋๋ฅผ ๋ง๋ค๊ณ ์์ like.json
์ ๋ง๋ค์ด ์ค๋๋ค.ย
ย
ํ์ผ๋ช
:
data/like.json
{ "like_count": 1, "message": "์ข์์" }
ย
์๋ ์ฝ๋์์ id๋ฅผ like-count-37๋ก ๋ฐ๊ฟ์ค๋๋ค. ์ด๋, ๋ค๋ฅธ article์๋ ์ ์ฉํด ์ฃผ์
์ผ ํฉ๋๋ค.
ย
ํ์ผ๋ช
:
index.html
... <div class="likes m_text"> ์ข์์ <span id="like-count-37">2,346</span> ๊ฐ </div> ...
ย
๊ทธ๋ฆฌ๊ณ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์๋ฉด ์๋์ ๊ฐ์ด ๊ธ์๊ฐ ์ค๋ณต๋์ ๋ํ๋๋ ๋ชจ์ต์ ๋ณผ ์ ์์ต๋๋ค. ์ด์ ๋ HTML์์ ๊ธฐ๋ณธ ํ
์คํธ๋ฅผ ์ถ๊ฐํ๊ธฐ ๋๋ฌธ์
๋๋ค. ํ
์คํธ๋ฅผ ์ง์์ฃผ๋๋ก ํ๊ฒ ์ต๋๋ค.
ย
ํ์ผ๋ช
:
index.html
... <div class="likes m_text"> <span id="like-count-37">2,346</span> </div> ...
ย
๊ทธ๋ฌ๋ฉด ํด๋ฆญํ๋ ์๊ฐ ๊ธ์๊ฐ ์ ์ถ๋ ฅ๋๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
ย
Ajax ํต์ ์ ํ์ธํ ์ ์๋ ๋ฐฉ๋ฒ์ Network ํญ์์ ํ์ธํ์ค ์ ์์ต๋๋ค. ์ด ํญ์ ์๋ฒ์ ์ด๋ค ํต์ ์ ํ์๋์ง ๋ณด์ฌ์ฃผ๋ ํญ์
๋๋ค.
ย
๋ง์ฝ Ajax ํต์ ์ ํ์ง ์์๋ค๋ฉด ํํธ๋ฅผ ๋๋ฅด๋ ์๊ฐ ์ข์์๋ผ๋ ๊ธ์๊ฐ ๋์ค๊ณ ํ์ด์ง๊ฐ ๋ฆฌ๋ก๋ ๋ฉ๋๋ค. Ajax ํต์ ์ ์ด์ฉํ๊ณ ํํธ๋ฅผ ๋๋ฅด๊ฒ ๋๋ฉด
like.json
์ด๋ผ๋ ํด๋๊ฐ ๋์ค๊ฒ ๋ฉ๋๋ค. ํน์ ์ค๋ฅ๊ฐ ๋๋ ๊ฒฝ์ฐ Ajax ํ์
์ GET์ผ๋ก ๋ณ๊ฒฝํด๋ณด์ธ์!ย
๋ํ Ajax ํต์ ์ด ์ ๋ ๊ฒฝ์ฐ๋ฅผ ์ํ ์์ธ์ฒ๋ฆฌ ์ฝ๋๋ ์ถ๊ฐํด์ฃผ๋๋ก ํ๊ฒ ์ต๋๋ค.
ย
ํ์ผ๋ช
:
js/main.js
... function deligationFunc(e){ let elem = e.target; // ํด๋ฆญํ ์์ ๊ฐ์ ธ์ค๊ธฐ // console.log(e.target); // console.log(elem); // ์๋ชป ํด๋ฆญํ ๊ฒฝ์ฐ while(!elem.getAttribute('data-name')){ // elem์ ๋ถ๋ชจ๋ฅผ ์ฐพ์ elem = elem.parentNode; if(elem.nodeName ==='BODY'){ // body๊น์ง ์ด๋ฒคํธ๊ฐ ์๋ ๊ฒฝ์ฐ elem=null; return; } // data-name์ ๊ฐ์ง ์์ฑ์ ์ฐพ์๋๊น์ง ๋ถ๋ชจ์๊ฒ ์ ๊ทผ์ ๋ฐ๋ณต } if(elem.matches('[data-name="heartbeat"]')){ // console.log("ํํธ!"); $.ajax({ Method:'POST', // ์๋ฌ๋ ๊ฒฝ์ฐ GET์ผ๋ก ๋ณ๊ฒฝํ๊ธฐ url:'data/like.json', data: 37, dataType:'json', // ์ด๋ป๊ฒ ๋ค์ด์ฌ์ง ์ค์ success: function(response){ // ํต์ ์ ์ฑ๊ณตํ ๋ฐ์ดํฐ๊ฐ response๋ก ๋ค์ด์จ๋ค let likeCount =document.querySelector('#like-count-37'); likeCount.innerHTML = '์ข์์' + response.like_count +'๊ฐ'; }, error: function(request,status,error){ alert('๋ก๊ทธ์ธ์ด ํ์ํฉ๋๋ค.'); window.location.replace('https://www.naver.com'); // ์์ ์๋ฌ ์น ํ์ด์ง } }) }else if(elem.matches('[data-name="bookmark"]')){ console.log("๋ถ๋งํฌ!"); }else if(elem.matches('[data-name="share"]')){ console.log("๊ณต์ !"); }if(elem.matches('[data-name="more"]')){ console.log("๋๋ณด๊ธฐ!"); } elem.classList.toggle('on'); // on ํด๋์ค ์ฃผ๊ธฐ } ...
ย
์ด๋ฒ์ ๋ถ๋งํฌ ๊ธฐ๋ฅ์ ์ถ๊ฐํด๋ด
์๋ค. ๋ถ๋งํฌ ๊ธฐ๋ฅ๋ ์ข์์ ๊ธฐ๋ฅ๊ณผ ์ ์ฌํ๊ฒ ์ถ๊ฐํด์ฃผ๋ฉด ๋ฉ๋๋ค.
์ด๋ฒ์๋ pk ๊ฐ์ ๋ฐ์์์ ์ข์์ ๊ธฐ๋ฅ์ ์์ ํด๋ณด๊ณ ๋ถ๋งํฌ ๊ธฐ๋ฅ๋ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก backend ๊ตฌํ์ด ๋์ง ์์๊ธฐ ๋๋ฌธ์ html id ๊ฐ๊ณผ name ๊ฐ์ 37๋ก ์์๋ก ์ง์ ํด์ฃผ๊ณ backend ๋ถ๋ถ์์ name="{{pk}}"๋ก ๋ฐ๊ฟ์ค ๊ฒ์
๋๋ค.
ย
ํ์ผ๋ช
:
index.html
... <div class="bottom_icons"> <div class="left_icons"> <div class="heart_btn"> <div class="sprite_heart_icon_outline" name="37" data-name="heartbeat"></div> </div> <div class="sprite_bubble_icon"></div> <div class="sprite_share_icon" data-name="share"></div> </div> <div class="right_icon"> <div class="sprite_bookmark_outline" name ="37" data-name="bookmark"></div> </div> </div> <div class="likes m_text"> <span id="like-count-37">2,346</span> <span id="bookmark-count-37"></span> </div> ...
ย
ํ์ผ๋ช
:
js/main.js
... function deligationFunc(e){ let elem = e.target; // ํด๋ฆญํ ์์ ๊ฐ์ ธ์ค๊ธฐ // console.log(e.target); // console.log(elem); // ์๋ชป ํด๋ฆญํ ๊ฒฝ์ฐ while(!elem.getAttribute('data-name')){ // elem์ ๋ถ๋ชจ๋ฅผ ์ฐพ์ elem = elem.parentNode; if(elem.nodeName ==='BODY'){ // body๊น์ง ์ด๋ฒคํธ๊ฐ ์๋ ๊ฒฝ์ฐ elem=null; return; } // data-name์ ๊ฐ์ง ์์ฑ์ ์ฐพ์๋๊น์ง ๋ถ๋ชจ์๊ฒ ์ ๊ทผ์ ๋ฐ๋ณต } if(elem.matches('[data-name="heartbeat"]')){ // console.log("ํํธ!"); let pk=elem.getAttribute('name'); // pk๊ฐ์ ๋ฐ์์จ๋ค $.ajax({ Method:'POST', // ์๋ฌ๋ ๊ฒฝ์ฐ GET์ผ๋ก ๋ณ๊ฒฝํ๊ธฐ url:'data/like.json', data: {pk}, dataType:'json', // ์ด๋ป๊ฒ ๋ค์ด์ฌ์ง ์ค์ success: function(response){ // ํต์ ์ ์ฑ๊ณตํ ๋ฐ์ดํฐ๊ฐ response๋ก ๋ค์ด์จ๋ค let likeCount =document.querySelector('#like-count-37'); likeCount.innerHTML = '์ข์์' + response.like_count +'๊ฐ'; }, error: function(request,status,error){ alert('๋ก๊ทธ์ธ์ด ํ์ํฉ๋๋ค.'); window.location.replace('https://www.naver.com'); // ์์ ์๋ฌ ์น ํ์ด์ง } }) }else if(elem.matches('[data-name="bookmark"]')){ // ๋ถ๋งํฌ ํด๋ฆญ ์ ์คํ // console.log("๋ถ๋งํฌ!"); let pk=elem.getAttribute('name'); // pk๊ฐ์ ๋ฐ์์จ๋ค $.ajax({ Method:'POST', /* ์๋ฌ๋ ๊ฒฝ์ฐ GET์ผ๋ก ๋ณ๊ฒฝํ๊ธฐ */ url: 'data/bookmark.json', data: {pk}, dataType: 'json', success: function(response){ let bookmarkCount=document.querySelector('#bookmark-count-37'); bookmarkCount.innerHTML = '๋ถ๋งํฌ' + response.bookmark_count +'๊ฐ'; }, error:function(request, status, error){ alert('๋ก๊ทธ์ธ์ด ํ์ํฉ๋๋ค.'); window.location.replace('https://www.naver.com'); // ์์ ์๋ฌ ์น ํ์ด์ง } }) }else if(elem.matches('[data-name="share"]')){ console.log("๊ณต์ !"); }if(elem.matches('[data-name="more"]')){ console.log("๋๋ณด๊ธฐ!"); } elem.classList.toggle('on'); // on ํด๋์ค ์ฃผ๊ธฐ } ...
ย
๋ ๋ง์ฐฌ๊ฐ์ง๋ก
bookmark.json
์ ์ถ๊ฐํฉ๋๋ค.ย
ํ์ผ๋ช
:
data/bookmark.json
{ "bookmark_count": 1, "message": "๋ถ๋งํฌ" }
ย
๊ทธ๋ฌ๋ฉด ๋ถ๋งํฌ๋ ์ ์ถ๋ ฅ์ด ๋๊ณ Ajax ํต์ ๋ ์ ๋์๋ ๊ฒ์ ํ์ธํ์ค ์ ์์ต๋๋ค.
ย
ย
์ด์ ๋๊ธ ๊ธฐ๋ฅ์ผ๋ก ๋์ด๊ฐ ๋ณด๊ฒ ์ต๋๋ค. ๋๊ธ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๊ธฐ ์ํด์ data-name="comment"์ data-name=comment_delete๋ฅผ HTML ํ์ผ๊ณผ JS ํ์ผ์ ์ถ๊ฐํด ์ฃผ๊ฒ ์ต๋๋ค. comment๋ ๊ฒ์๋ผ๋ ๊ธ์๋ฅผ ๋๋ฅด๊ฒ ๋๋ฉด comment๊ฐ ๋ฌ๋ฆฌ๊ฒ ๋ฉ๋๋ค.
ย
ํ์ผ๋ช
:
index.html
... <div class="comment_field" id="add-comment-post37"> <input type="text" placeholder="๋๊ธ๋ฌ๊ธฐ..."> <div class="upload_btn m_text" data-name="comment">๊ฒ์</div> </div> ...
ย
๋ํ ์์ง ๊ธ์๋ฅผ ์
๋ ฅํ์์ ๋๋ง ๊ฒ์ ๋ฒํผ์ด ํด๋ฆญ๋๋ ๋ถ๋ถ์ ๊ตฌํํ์ง ์์์ผ๋ฏ๋ก, ์์๋ก ๋ฒํผ์์ pointer-events:none; ๋ถ๋ถ์ ์ง์์ฃผ๋๋ก ํ๊ฒ ์ต๋๋ค.
ย
ํ์ผ๋ช
:
css/style.css
... .contents .comment_field .upload_btn{ color: #3897f0; position: absolute; right: 20px; top: 50%; transform: translateY(-50%); /* y์ถ์ผ๋ก ์ค์ ์ ๋ ฌ */ cursor: pointer; /* pointer-events: none; ์ฒ์์๋ ํด๋ฆญ์ด ๋์ง ์๋๋ก ํ๋ค */ opacity: 0.6; } ...
ย
ํ์ผ๋ช
:
js/main.js
... function deligationFunc(e){ let elem = e.target; // ํด๋ฆญํ ์์ ๊ฐ์ ธ์ค๊ธฐ // console.log(e.target); // console.log(elem); // ์๋ชป ํด๋ฆญํ ๊ฒฝ์ฐ while(!elem.getAttribute('data-name')){ // elem์ ๋ถ๋ชจ๋ฅผ ์ฐพ์ elem = elem.parentNode; if(elem.nodeName ==='BODY'){ // body๊น์ง ์ด๋ฒคํธ๊ฐ ์๋ ๊ฒฝ์ฐ elem=null; return; } // data-name์ ๊ฐ์ง ์์ฑ์ ์ฐพ์๋๊น์ง ๋ถ๋ชจ์๊ฒ ์ ๊ทผ์ ๋ฐ๋ณต } if(elem.matches('[data-name="heartbeat"]')){ // console.log("ํํธ!"); let pk=elem.getAttribute('name'); // pk๊ฐ์ ๋ฐ์์จ๋ค $.ajax({ Method:'POST', // ์๋ฌ๋ ๊ฒฝ์ฐ GET์ผ๋ก ๋ณ๊ฒฝํ๊ธฐ url:'data/like.json', data: {pk}, dataType:'json', // ์ด๋ป๊ฒ ๋ค์ด์ฌ์ง ์ค์ success: function(response){ // ํต์ ์ ์ฑ๊ณตํ ๋ฐ์ดํฐ๊ฐ response๋ก ๋ค์ด์จ๋ค let likeCount =document.querySelector('#like-count-37'); likeCount.innerHTML = '์ข์์' + response.like_count +'๊ฐ'; }, error: function(request,status,error){ alert('๋ก๊ทธ์ธ์ด ํ์ํฉ๋๋ค.'); window.location.replace('https://www.naver.com'); // ์์ ์๋ฌ ์น ํ์ด์ง } }) }else if(elem.matches('[data-name="bookmark"]')){ // ๋ถ๋งํฌ ํด๋ฆญ ์ ์คํ // console.log("๋ถ๋งํฌ!"); let pk=elem.getAttribute('name'); // pk๊ฐ์ ๋ฐ์์จ๋ค $.ajax({ Method:'POST', /* ์๋ฌ๋ ๊ฒฝ์ฐ GET์ผ๋ก ๋ณ๊ฒฝํ๊ธฐ */ url: 'data/bookmark.json', data: {pk}, dataType: 'json', success: function(response){ let bookmarkCount=document.querySelector('#bookmark-count-37'); bookmarkCount.innerHTML = '๋ถ๋งํฌ' + response.bookmark_count +'๊ฐ'; }, error:function(request, status, error){ alert('๋ก๊ทธ์ธ์ด ํ์ํฉ๋๋ค.'); window.location.replace('https://www.naver.com'); // ์์ ์๋ฌ ์น ํ์ด์ง } }) }else if(elem.matches('[data-name="comment"]')){ let content = document.querySelector('#add-comment-post37 > input[type=text]').value; console.log(content); if(content.length >140){ alert('๋๊ธ์ ์ต๋ 140์ ์ ๋ ฅ ๊ฐ๋ฅํฉ๋๋ค. ํ์ฌ ๊ธ์์ : ' + content.length); return; } $.ajax({ Method:'POST', url:'./comment.html', // ./๋ ํ์ฌ ํด๋๋ฅผ ๋ปํจ data: { 'pk': 37, 'content': content }, dataType:'html', success: function(data){ document.querySelector('#comment-list-ajax-post37').insertAdjacentHTML('afterbegin',data); }, error:function(request,status,error){ alert('๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค.'); } }) }else if(elem.matches('[data-name="comment_delete"]')){ // console.log("๋๋ณด๊ธฐ!"); }else if(elem.matches('[data-name="share"]')){ console.log("๊ณต์ !"); }if(elem.matches('[data-name="more"]')){ console.log("๋๋ณด๊ธฐ!"); } elem.classList.toggle('on'); // on ํด๋์ค ์ฃผ๊ธฐ } ...
ย
ํ๊ทธ ์์ฒด๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ insertAdjacentHTML ๋ผ๋ ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
element.insertAdjacentHTML(position, text);
- position : ์ด๋ ๋ถ๋ถ์๋ค ์ถ๊ฐํ ์ง
- text : ์ถ๊ฐํ ๋ฐ์ดํฐ
ย
ย
๋๊ธ์ ์ญ์ ํ ์ ์๋ ๋ฒํผ๋ ๊ฐ์ด ๋ง๋ค๋๋ก ํ๊ฒ ์ต๋๋ค.
ย
ํ์ผ๋ช
:
comment.html
<div class="comment-detail"> <div class="nick_name m_text">kindtiger</div> <div>๊ฐ์์ง๊ฐ ๋๋ฌด ๊ท์ฌ์~!~! <button data-name="comment_delete">์ญ์ </button></div> </div>
backend ๋ถ๋ถ์์ ๋๊ธ ์
๋ ฅํ ๊ฒ์ ๊ฐ์์ง๊ฐ ๋๋ฌด ๊ท์ฌ์~!~! ๋ถ๋ถ์ ๋ํ๋๋๋ก ํ ๊ฒ์
๋๋ค.
ย
ํ์ผ๋ช
:
index.html
... <div class="comment_container"> <div class="comment" id="comment-list-ajax-post37"> <div class="nick_name m_text">dongdong2</div> <div>๊ฐ์์ง๊ฐ ๋๋ฌด ๊ท์ฌ์์~!</div> </div> <div class="small_heart"> <div class="sprite_small_heart_icon_outline"></div> </div> </div> ...
ย
๊ธ์๋ฅผ ์ฐ๊ณ ๊ฒ์๋ผ๋ ๋ฒํผ์ ๋๋ฅด๋ฉด ํต์ ์ด ์ ์ด๋ฃจ์ด์ง๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค. ๋๊ฐ์ ๊ธ์๊ฐ ๋ค์ด์ค๋ ์ด์ ๋
comment.html
์ ์๋ ๊ธ์๋ฅผ ์ฐ์ด๋ด๊ธฐ ๋๋ฌธ์
๋๋ค. ๋ํ ์ฌ๊ธฐ์ comment-detail๋ก ํ๋ฒ ๊ฐ์ธ์ฃผ์๊ธฐ ๋๋ฌธ์ index.html
๋ถ๋ถ๋ ํ๋ฒ ๋ ๊ฐ์ธ์ฃผ๋๋ก ํ๊ฒ ์ต๋๋ค. ย
ํ์ผ๋ช
:
index.html
... <div class="comment_container"> <div class="comment" id="comment-list-ajax-post37"> <div class="comment-detail"> <div class="nick_name m_text">dongdong2</div> <div>๊ฐ์์ง๊ฐ ๋๋ฌด ๊ท์ฌ์์~!</div> </div> </div> <div class="small_heart"> <div class="sprite_small_heart_icon_outline"></div> </div> </div> ...
ย
comment-detail์ด ์์ด๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค. ๋๊ธ๋ค์ด ์ง๊ธ ๊ฐ๋ก ๋ฐฐ์น๊ฐ ๋๊ณ ์๊ธฐ ๋๋ฌธ์ ์ธ๋ก๋ฐฐ์น๊ฐ ๋๋๋ก ์์ ํ๊ฒ ์ต๋๋ค.
ย
ํ์ผ๋ช
:
css/style.css
... .contents .comment_container{ display:flex; /* ๊ฐ๋ก๋ฐฐ์น */ justify-content: space-between; align-items: center; padding: 5px 20px; } .contents .comment_container .comment{ display:flex; /* ๊ฐ๋ก๋ฐฐ์น */ flex-direction: column; font-size: 14px; } .contents .comment_container .comment-detail{ display: flex; /* ๊ฐ๋ก๋ฐฐ์น */ } .contents .comment_container .comment .nick_name{ margin-right: 10px; /* ์์ด๋์ ๋๊ธ ๊ฐ์ ๊ฑฐ๋ฆฌ ์ค์ */ } ...
ย
ย
๊ฒ์ ๋ฒํผ์ด ๋๋ฅด๋ ์๊ฐ ์
๋ ฅํ ๊ธ์๊ฐ ์ด๊ธฐํ ๋๋๋ก ๋ง๋ค์ด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
ย
ํ์ผ๋ช
:
js/main.js
... function deligationFunc(e){ let elem = e.target; // ํด๋ฆญํ ์์ ๊ฐ์ ธ์ค๊ธฐ // console.log(e.target); // console.log(elem); // ์๋ชป ํด๋ฆญํ ๊ฒฝ์ฐ while(!elem.getAttribute('data-name')){ // elem์ ๋ถ๋ชจ๋ฅผ ์ฐพ์ elem = elem.parentNode; if(elem.nodeName ==='BODY'){ // body๊น์ง ์ด๋ฒคํธ๊ฐ ์๋ ๊ฒฝ์ฐ elem=null; return; } // data-name์ ๊ฐ์ง ์์ฑ์ ์ฐพ์๋๊น์ง ๋ถ๋ชจ์๊ฒ ์ ๊ทผ์ ๋ฐ๋ณต } if(elem.matches('[data-name="heartbeat"]')){ // console.log("ํํธ!"); let pk=elem.getAttribute('name'); // pk๊ฐ์ ๋ฐ์์จ๋ค $.ajax({ Method:'POST', // ์๋ฌ๋ ๊ฒฝ์ฐ GET์ผ๋ก ๋ณ๊ฒฝํ๊ธฐ url:'data/like.json', data: {pk}, dataType:'json', // ์ด๋ป๊ฒ ๋ค์ด์ฌ์ง ์ค์ success: function(response){ // ํต์ ์ ์ฑ๊ณตํ ๋ฐ์ดํฐ๊ฐ response๋ก ๋ค์ด์จ๋ค let likeCount =document.querySelector('#like-count-37'); likeCount.innerHTML = '์ข์์' + response.like_count +'๊ฐ'; }, error: function(request,status,error){ alert('๋ก๊ทธ์ธ์ด ํ์ํฉ๋๋ค.'); window.location.replace('https://www.naver.com'); // ์์ ์๋ฌ ์น ํ์ด์ง } }) }else if(elem.matches('[data-name="bookmark"]')){ // ๋ถ๋งํฌ ํด๋ฆญ ์ ์คํ // console.log("๋ถ๋งํฌ!"); let pk=elem.getAttribute('name'); // pk๊ฐ์ ๋ฐ์์จ๋ค $.ajax({ Method:'POST', /* ์๋ฌ๋ ๊ฒฝ์ฐ GET์ผ๋ก ๋ณ๊ฒฝํ๊ธฐ */ url: 'data/bookmark.json', data: {pk}, dataType: 'json', success: function(response){ let bookmarkCount=document.querySelector('#bookmark-count-37'); bookmarkCount.innerHTML = '๋ถ๋งํฌ' + response.bookmark_count +'๊ฐ'; }, error:function(request, status, error){ alert('๋ก๊ทธ์ธ์ด ํ์ํฉ๋๋ค.'); window.location.replace('https://www.naver.com'); // ์์ ์๋ฌ ์น ํ์ด์ง } }) }else if(elem.matches('[data-name="comment"]')){ let content = document.querySelector('#add-comment-post37 > input[type=text]').value; console.log(content); if(content.length >140){ alert('๋๊ธ์ ์ต๋ 140์ ์ ๋ ฅ ๊ฐ๋ฅํฉ๋๋ค. ํ์ฌ ๊ธ์์ : ' + content.length); return; } $.ajax({ Method:'POST', url:'./comment.html', // ./๋ ํ์ฌ ํด๋๋ฅผ ๋ปํจ data: { 'pk': 37, 'content': content }, dataType:'html', success: function(data){ document.querySelector('#comment-list-ajax-post37').insertAdjacentHTML('afterbegin',data); }, error:function(request,status,error){ alert('๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค.'); } }) document.querySelector('#add-comment-post37>input[type=text]').value=''; }else if(elem.matches('[data-name="comment_delete"]')){ // console.log("๋๋ณด๊ธฐ!"); }else if(elem.matches('[data-name="share"]')){ console.log("๊ณต์ !"); }if(elem.matches('[data-name="more"]')){ console.log("๋๋ณด๊ธฐ!"); } elem.classList.toggle('on'); // on ํด๋์ค ์ฃผ๊ธฐ } ...
ย
๋๊ธ ์ญ์ ๋ถ๋ถ๋ ๋๊ธ ์ถ๊ฐ๋ถ๋ถ๊ณผ ์ ์ฌํ๊ฒ ์งํํ์๋ฉด ๋ฉ๋๋ค.
ย
ํ์ผ๋ช
:
js/main.js
... function deligationFunc(e){ let elem = e.target; // ํด๋ฆญํ ์์ ๊ฐ์ ธ์ค๊ธฐ // console.log(e.target); // console.log(elem); // ์๋ชป ํด๋ฆญํ ๊ฒฝ์ฐ while(!elem.getAttribute('data-name')){ // elem์ ๋ถ๋ชจ๋ฅผ ์ฐพ์ elem = elem.parentNode; if(elem.nodeName ==='BODY'){ // body๊น์ง ์ด๋ฒคํธ๊ฐ ์๋ ๊ฒฝ์ฐ elem=null; return; } // data-name์ ๊ฐ์ง ์์ฑ์ ์ฐพ์๋๊น์ง ๋ถ๋ชจ์๊ฒ ์ ๊ทผ์ ๋ฐ๋ณต } if(elem.matches('[data-name="heartbeat"]')){ // console.log("ํํธ!"); let pk=elem.getAttribute('name'); // pk๊ฐ์ ๋ฐ์์จ๋ค $.ajax({ Method:'POST', // ์๋ฌ๋ ๊ฒฝ์ฐ GET์ผ๋ก ๋ณ๊ฒฝํ๊ธฐ url:'data/like.json', data: {pk}, dataType:'json', // ์ด๋ป๊ฒ ๋ค์ด์ฌ์ง ์ค์ success: function(response){ // ํต์ ์ ์ฑ๊ณตํ ๋ฐ์ดํฐ๊ฐ response๋ก ๋ค์ด์จ๋ค let likeCount =document.querySelector('#like-count-37'); likeCount.innerHTML = '์ข์์' + response.like_count +'๊ฐ'; }, error: function(request,status,error){ alert('๋ก๊ทธ์ธ์ด ํ์ํฉ๋๋ค.'); window.location.replace('https://www.naver.com'); // ์์ ์๋ฌ ์น ํ์ด์ง } }) }else if(elem.matches('[data-name="bookmark"]')){ // ๋ถ๋งํฌ ํด๋ฆญ ์ ์คํ // console.log("๋ถ๋งํฌ!"); let pk=elem.getAttribute('name'); // pk๊ฐ์ ๋ฐ์์จ๋ค $.ajax({ Method:'POST', /* ์๋ฌ๋ ๊ฒฝ์ฐ GET์ผ๋ก ๋ณ๊ฒฝํ๊ธฐ */ url: 'data/bookmark.json', data: {pk}, dataType: 'json', success: function(response){ let bookmarkCount=document.querySelector('#bookmark-count-37'); bookmarkCount.innerHTML = '๋ถ๋งํฌ' + response.bookmark_count +'๊ฐ'; }, error:function(request, status, error){ alert('๋ก๊ทธ์ธ์ด ํ์ํฉ๋๋ค.'); window.location.replace('https://www.naver.com'); // ์์ ์๋ฌ ์น ํ์ด์ง } }) }else if(elem.matches('[data-name="comment"]')){ let content = document.querySelector('#add-comment-post37 > input[type=text]').value; console.log(content); if(content.length >140){ alert('๋๊ธ์ ์ต๋ 140์ ์ ๋ ฅ ๊ฐ๋ฅํฉ๋๋ค. ํ์ฌ ๊ธ์์ : ' + content.length); return; } $.ajax({ Method:'POST', url:'./comment.html', // ./๋ ํ์ฌ ํด๋๋ฅผ ๋ปํจ data: { 'pk': 37, 'content': content }, dataType:'html', success: function(data){ document.querySelector('#comment-list-ajax-post37').insertAdjacentHTML('afterbegin',data); }, error:function(request,status,error){ alert('๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค.'); } }) document.querySelector('#add-comment-post37>input[type=text]').value=''; }else if(elem.matches('[data-name="comment_delete"]')){ $.ajax({ Method:'POST', /* ์๋ฌ๋ ๊ฒฝ์ฐ GET์ผ๋ก ๋ณ๊ฒฝํ๊ธฐ */ url:'data/delete.json', data: { 'pk': 37, /* 'pk':pk */ }, dataType:'json', success: function(response){ if(response.status){ let comt = document.querySelector('.comment-detail'); comt.remove(); } }, error:function(request, status ,error){ alert('๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค..'); window.location.replace('https://www.naver.com'); // ์์ ์๋ฌ ์น ํ์ด์ง } }) }else if(elem.matches('[data-name="share"]')){ console.log("๊ณต์ !"); }if(elem.matches('[data-name="more"]')){ console.log("๋๋ณด๊ธฐ!"); } elem.classList.toggle('on'); // on ํด๋์ค ์ฃผ๊ธฐ } ...
ย
delete.json
ํ์ผ์ ์์ฑํฉ๋๋ค.ย
ํ์ผ๋ช
:
data/delete.json
{ "message": "์ญ์ ์๋ฃ", "status": "1" }
ย
์ ์์ฑํ๋ค๋ฉด ์ญ์ ๋ฒํผ์ ๋๋ ์ ๋ ๋ฒํผ์ด ์ญ์ ๋๊ณ Ajax ํต์ ๋ ์ด๋ฃจ์ด์ง๋๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
ย
ย
์์ฑ๋ ์ฝ๋๋ ์๋์ ๊ฐ์ต๋๋ค.
ย
ํ์ผ๋ช
:
index.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <title>Title</title> <link rel="stylesheet" href="css/reset.css"> <link rel="stylesheet" href="css/style.css"> </head> <body> <section id="container"> <header id="header"> <section class="inner"> <h1 class="logo"> <a herf="index.html"> <div class="sprite_insta_icon"></div> <div class="sprite_write_logo"></div> </a> </h1> <div class="search_box"> <input type="text" placeholder="๊ฒ์" id="search-field"> <div class="fake_field"> <span class="sprite_small_search_icon"></span> <span>๊ฒ์</span> </div> </div> <div class="right_icons"> <div class="sprite_camera_icon"></div> <div class="sprite_compass_icon"></div> <div class="sprite_heart_icon_outline"></div> <div class="sprite_user_icon_outline"></div> </div> </section> </header> <!--**ํ์๊น์ง ๋ฐ๋ณต--> <div class="hidden_menu"> <div class="scroll_inner"> <div class="user"> <div class="thumb_img"><img src="imgs/thumb.jpeg" alt="ํ๋กํ์ฌ์ง"></div> <div class="id">kindtigerrr</div> </div> </div> </div> <!--**--> <section id="main_container"> <div class="inner"> <div class="contents_box"> <article class="contents"> <header class="top"> <div class="user_container"> <div class="profile_img"> <img src="imgs/thumb.jpeg" alt="ํ๋กํ์ด๋ฏธ์ง"> </div> <div class="user_name"> <div class="nick_name m_text">KindTiger</div> <div class="country s_text">Seoul, South Korea</div> </div> </div> <div class="sprite_more_icon" data-name="more"></div> </header> <div class="img_section"> <div class="trans_inner"> <div> <img src="imgs/img_section/img01.jpg" alt="visual01"> </div> </div> </div> <div class="bottom_icons"> <div class="left_icons"> <div class="heart_btn"> <div class="sprite_heart_icon_outline" name="39" data-name="heartbeat"></div> </div> <div class="sprite_bubble_icon"></div> <div class="sprite_share_icon" data-name="share"></div> </div> <div class="right_icon"> <div class="sprite_bookmark_outline" data-name="bookmark"></div> </div> </div> <div class="likes m_text"> <span id="like-count-37">2,346</span> <span id="bookmark-count-37"></span> </div> <div class="comment_container"> <div class="comment" id="comment-list-ajax-post37"> <div class="comment-detail"> <div class="nick_name m_text">dongdong2</div> <div>๊ฐ์์ง๊ฐ ๋๋ฌด ๊ท์ฌ์์~!</div> </div> </div> <div class="small_heart"> <div class="sprite_small_heart_icon_outline"></div> </div> </div> <div class="timer">1์๊ฐ ์ </div> <div class="comment_field" id="add-comment-post37"> <input type="text" placeholder="๋๊ธ๋ฌ๊ธฐ..."> <div class="upload_btn m_text" data-name="comment">๊ฒ์</div> </div> </article> </div> <div class="side_box"> <div class="user_profile"> <div class="profile_thumb"> <img src="imgs/thumb.jpeg" alt="ํ๋กํ์ฌ์ง"> </div> <div class="detail"> <div class="id m_text">KindTiger</div> <div class="ko_name">์ฌ์ ๋ฒ</div> </div> </div> <article class="story"> <header class="story_header"> <div>์คํ ๋ฆฌ</div> <div class="more">๋ชจ๋ ๋ณด๊ธฐ</div> </header> <div class="scroll_inner"> <div class="thumb_user"> <!--**ํ์๊น์ง ๋ฐ๋ณต--> <div class="profile_thumb"> <img src="imgs/thumb02.jpg" alt="ํ๋กํ์ฌ์ง"> </div> <div class="detail"> <div class="id">kind_tigerrrr</div> <div class="time">1์๊ฐ ์ </div> </div> <!--**--> </div> </div> </article> <article class="recommend"> <header class="reco_header"> <div>ํ์๋์ ์ํ ์ถ์ฒ</div> <div class="more">๋ชจ๋ ๋ณด๊ธฐ</div> </header> </article> </div> </div> </section> </section> <script src="https://code.jquery.com/jquery-3.5.1.js"></script> <!--<script src="js/jquery-3.5.1.js"></script>--> <script src="js/main.js"></script> </body> </html>
ย
ํ์ผ๋ช
:
css/style.css
.sprite_insta_icon{ display: inline-block; background: url('../imgs/background01.png') no-repeat -53px -235px; width: 22px; height: 22px; } .sprite_write_logo{ display: inline-block; background: url('../imgs/background01.png') no-repeat -94px -72px; width: 103px; height: 29px; } .sprite_compass_icon{ display: inline-block; background: url('../imgs/background01.png') no-repeat -130px -286px; width: 23px; height: 23px; } .sprite_user_icon_outline{ display: inline-block; background: url('../imgs/background01.png') no-repeat -272px -182px; width: 22px; height: 24px; } .sprite_heart_icon_outline{ display: inline-block; background: url('../imgs/background01.png') no-repeat -52px -261px; width: 24px; height: 22px; } .sprite_small_search_icon{ display: inline-block; background: url('../imgs/background01.png') no-repeat -337px -246px; width: 10px; height: 10px; } .sprite_more_icon{ display: inline-block; background: url('../imgs/background01.png') no-repeat -301px -218px; width: 15px; height: 3px; } .sprite_bubble_icon{ display: inline-block; background: url('../imgs/background01.png') no-repeat -239px -202px; width: 24px; height: 24px; } .sprite_share_icon{ display: inline-block; background: url('../imgs/background01.png') no-repeat -324px -52px; width: 21px; height: 24px; } .sprite_bookmark_outline{ display: inline-block; background: url('../imgs/background01.png') no-repeat -237px -286px; width: 19px; height: 24px; } .sprite_bookmark_outline.on { background: url('../imgs/background01.png') no-repeat -159px -286px; width: 19px; height: 24px; } .sprite_bookmark_outline.on{ background: url('../imgs/background01.png') no-repeat -159px -286px; width: 19px; height: 24px; } .sprite_small_heart_icon_outline{ display: inline-block; background: url('../imgs/background01.png') no-repeat -323px -274px; width: 12px; height: 11px; } .sprite_camera_icon{ display: inline-block; background: url('../imgs/background01.png') no-repeat -271px -104px; width: 24px; height: 22px; } .sprite_insta_big_logo{ display: inline-block; background: url('../imgs/background02.png') no-repeat -98px -150px; width: 175px; height: 51px; } .sprite_plus_icon{ display: inline-block; background: url('../imgs/background01.png') no-repeat -187px -202px; width: 23px; height: 23px; } body{ background: #fafafa; } #header{ width: 100%; /* ๊ณต์ค์ ๋จ๊ธฐ ์ํจ */ position: absolute; /* ๊ฐ์ฅ ์์ ์ฌ๋ผ๊ฐ ์์ด์ผ ํ๊ธฐ ์ํจ */ z-index: 999; /* absolute์ ๊ฒฝ์ฐ ์ต์ x์ถ์์ 1๊ฐ y์ถ์์ 1๊ฐ์ ๊ฐ์ ์ฃผ์ด์ผ ํจ */ left: 0; top: 0; background: white; border-bottom: 1px solid rgba(0,0,0,0.1); } #header.on{ position: fixed; /* ์๋จ์ ๊ณ ์ ๋์ ๊ฐ์ด ์์ง์ */ } #header .inner{ /* inner ์์ ์ปจํ ์ธ ๋ฅผ ๋ฃ์ผ๋ฉด ์์ ๊ฐ์ด ๋ค์ด์ด */ width: 975px; height: 77px; margin: 0 auto; /* ๊ฐ์ด๋ฐ ์ ๋ ฌ */ display: flex; /* ๊ฐ๋ก ๋ฐฐ์น */ justify-content: space-between; /* x์ถ ์ ๋ ฌ_๊ณต๊ฐ์ ์๋์ผ๋ก ๋ถ๋ฐฐํจ */ align-items: center; /* y์ถ ์ ๋ ฌ */ transition: all 1s; /* ์์ฐ์ค๋ฌ์ด ํจ๊ณผ */ } #header.on .inner{ height: 52px; } #header .inner .logo > a{ color: transparent; /* ๋ฐฐ๊ฒฝ์์ ํฌ๋ช ํ๊ฒ ๋ง๋ฌ */ } #header .inner .logo div{ vertical-align: middle; } #header .inner .logo .sprite_insta_icon{ position: relative; /* after์๊ฒ ์์น ๊ธฐ์ค์ ์ ๋ฌํด์ฃผ๊ธฐ ์ํจ */ margin-right: 30px; } #header .inner .logo .sprite_insta_icon:after{ content: ''; /* ๊ณต๋ฐฑ์ ๋ฐ์์ด */ width: 1px; height: 28px; background: #000; position: absolute; /* ๋ถ๋ชจ๋ฅผ ๊ธฐ์ค์ผ๋ก ์์น๋ฅผ ์ก์ */ right: -15px; top: -4px; transition: all .5s; } #header .search_box{ position: relative; /* ๊ธฐ์ค์ ์ ์ก๊ณ ๊ฐ๋ก ๋ฐฐ์น */ } #search-field{ width: 185px; height: 28px; background: #fafafa; border: 1px solid #dbdbdb; border-radius: 3px; padding: 3px 30px; /* ์์๋ ์์ชฝ */ color: #999; font-weight: 400; text-align: left; /* ๊ธ์ ์ ๋ ฅ ์ ์ผ์ชฝ๋ถํฐ ๋ณด์ด๋๋ก ํ๊ธฐ ์ํจ */ font-size: 14px; outline: none; /* ํฌ์ปค์ค ํ์ ๋ ๋ํ๋๋ ํ๋์ */ } #search-field::placeholder{ /* ์ฝ๋ก 2๊ฐ(::) - ์์ฑ์ ํ์ */ font-size: 0; /* ํฌ์ปค์ค๊ฐ ๋์ง ์์ ๋ ๊ฒ์ ๊ธ์๊ฐ ๋ณด์ด์ง ์๋๋ก ํ๊ธฐ ์ํจ */ } #search-field:focus::placeholder{ font-size: 14px; /* ํฌ์ปค์ค ๋์์ ๋ ๊ฒ์ ๊ธ์๊ฐ ๋ณด์ด๋๋ก ํ๋ค */ } #header .search_box .fake_field{ position: absolute; /* ๊ฒ์ ์ฐฝ ์์ ๊ธ์๋ฅผ ๋ณด์ด๊ธฐ ์ํจ */ /* ๊ฐ์ด๋ฐ ๋ฐฐ์นํ๋ ๊ณต์ */ left: 50%; top: 50%; transform: translate(-50%, -50%); pointer-events: none; /* ๊ฒ์์ ๋๋ ์ ๋์๋ ํฌ์ธํฐ ์ธ์์ด ์ ๋จ */ } /* ๋ฌผ๊ฒฐ(~) - ๊ทผ์ฒ์ ์๋ fake_field */ #search-field:focus~.fake_field > span:nth-child(1){ transform: translateX(-105px); /* ๋๋ณด๊ธฐ๋ฅผ ์ผ์ชฝ์ผ๋ก ์ด๋ */ } #search-field:focus~.fake_field > span:nth-child(2){ display: none; /* ํฌ์ปค์ค ๋์์ ๋ ๊ธ์ ์จ๊ธฐ๊ธฐ */ } #header .right_icons{ width: 132px; /* ๋ถ๋ชจ๊ฐ ์ข์ฐ๊ฐ ๊ณ ์ */ display: flex; justify-content: space-between; /* x์ถ ์ ๋ ฌ_๊ณต๊ฐ์ ์๋์ผ๋ก ๋ถ๋ฐฐํจ */ } #header .inner .logo div:nth-child(2){ transform: translateY(2px); transition:all .5s; } #header.on .inner .logo .sprite_insta_icon:after{ opacity:0; } #header.on .inner .logo div:nth-child(2){ opacity:0; } /* ์์ด์ฝ ์ฌ๋ผ์ง๊ฒ ํ๋ ๋ถ๋ถ */ #header .inner .logo .sprite_insta_icon{ position: relative; /* after์๊ฒ ์์น ๊ธฐ์ค์ ์ ๋ฌํด์ฃผ๊ธฐ ์ํจ */ margin-right: 30px; } #main_container{ padding-top: 130px; display: flex; /* ์ปจํ ์ธ ๊ฐ ๊ฐ์ด๋ฐ์ ์์นํ ์ ์๋๋ก ํจ */ justify-content: center; /* x์ถ ๊ฐ์ด๋ฐ ์ ๋ ฌ */ } #main_container .inner{ width: 935px; /* height: 500px; */ /* background: red; */ position: relative; /* ๊ธฐ์ค์ ์ inner๋ก ๋ณ๊ฒฝํ๊ธฐ ์ํจ */ } .contents_box{ } .contents{ width: 614px; /* height: 500px; */ border: 1px solid rgba(0,0,0,0.09); border-radius: 3px; /* ํ ๋๋ฆฌ๋ฅผ ๋ฅ๊ธ๊ฒ ๋ง๋ฌ */ margin-bottom: 60px; /* ๋ค๋ฅธ contents๋ค์ด ๋ฐ๋ ค์ผ ๋๊ธฐ ๋๋ฌธ์ ์ฌ์ด์ ์ฌ๋ฐฑ์ ์ค๋ค */ background: white; } .contents .top{ display: flex; /* ๊ฐ๋ก ๋ฐฐ์น */ justify-content: space-between; /* x์ถ ์ ๋ ฌ_๊ณต๊ฐ์ ์๋์ผ๋ก ๋ถ๋ฐฐ */ align-items: center; padding: 10px 20px; /* ์์๋ ์์ชฝ */ } .contents .top .profile_img{ width: 32px; height: 32px; border-radius: 50%; /* ํ ๋๋ฆฌ๋ฅผ ๋ฅ๊ธ๊ฒ ์ค์ 50% -> ์์ ํํ */ overflow: hidden; /* ์์์ด ํฌ๊ธฐ๊ฐ ๋์น์ง ์๋๋ก ํ๋ค */ margin-right: 10px; } .contents .top .profile_img img{ width: 100%; /* 100%๊ฐ ์์ ๊ฒฝ์ฐ ์ด๋ฏธ์ง๊ฐ ๋ค์ด๊ฐ์ง ์์ */ } .contents .top .user_container{ display: flex; /* ๊ฐ๋ก ๋ฐฐ์น */ } .m_text{ font-size: 14px; font-weight: bold; } .s_text{ font-size: 12px; } .contents .img_section{ overflow: hidden; /* ์์์ด ๋ถ๋ชจ์ ํฌ๊ธฐ๋ฅผ ๋์ง ์๋๋ก ํ๋ค */ } .contents .img_section img{ width: 100%; /* ๋ถ๋ชจ์ ํฌ๊ธฐ 100%๋ฅผ ๋ฐ๋๋ค */ } .contents .bottom_icons{ display: flex; /* ๊ฐ๋ก ๋ฐฐ์น */ justify-content: space-between; /* x์ถ ์ ๋ ฌ_๊ณต๊ฐ์ ์๋์ผ๋ก ๋ถ๋ฐฐํจ */ align-items: center; /* y์ถ ๊ฐ์ด๋ฐ ์ ๋ ฌ */ padding: 10px 20px; } .contents .bottom_icons .left_icons{ display: flex; /* ๊ฐ๋ก ๋ฐฐ์น */ } .contents .bottom_icons .left_icons > div{ margin-right: 10px; } /* .heart_btn.on .sprite_heart_icon_outline */.sprite_heart_icon_outline.on{ background: url('../imgs/background01.png') no-repeat -26px -261px; } .contents .likes{ padding: 5px 20px; color: #262626; } .contents .comment_container{ display: flex; /* ๊ฐ๋ก ๋ฐฐ์น */ justify-content: space-between; align-items: center; padding: 5px 20px; } .contents .comment_container .comment{ display: flex; /* ๊ฐ๋ก ๋ฐฐ์น */ flex-direction: column; font-size: 14px; } .contents .comment_container .comment-detail{ display: flex; /* ๊ฐ๋ก๋ฐฐ์น */ } .contents .comment_container .comment .nick_name{ margin-right: 10px; /* ์์ด๋์ ๋๊ธ ๊ฐ์ ๊ฑฐ๋ฆฌ ์ค์ */ } .contents .comment_container .comment .nick_name{ margin-right: 10px; /* ์์ด๋์ ๋๊ธ ๊ฐ์ ๊ฑฐ๋ฆฌ ์ค์ */ } .contents .timer{ font-size: 10px; letter-spacing: 0.2px; /* ์๊ฐ ์กฐ์ */ color: #999; border-bottom: 1px solid rgba(0,0,0,0.09); /* ์๋์ชฝ ์ค์ ์ถ๊ฐ */ padding: 10px 20px; } .contents .comment_field{ min-height: 56px; padding: 0 20px; position: relative; /* ์์๋ค์ด absolute๋ก ์๋ฆฌ๋ฅผ ์ก๊ธฐ ์ํจ */ } .contents .comment_field input{ width: 100%; height: 56px; border: none; outline: none; background: transparent; /* ํฌ๋ช ํ๊ฒ ์ค์ */ } .contents .comment_field input:focus ~ .upload_btn{ pointer-events: initial; /* ํฌ์ธํฐ ์ด๋ฒคํธ ์ด๊ธฐํ */ opacity: 1; } .contents .comment_field .upload_btn{ color: #3897f0; position: absolute; right: 20px; top: 50%; transform: translateY(-50%); /* y์ถ์ผ๋ก ์ค์ ์ ๋ ฌ */ cursor: pointer; /* pointer-events: none; ์ฒ์์๋ ํด๋ฆญ์ด ๋์ง ์๋๋ก ํ๋ค */ opacity: 0.6; } .contents .bottom_icons .right_icon > div{ cursor: pointer; /* ๋๋ฅผ ์ ์๋๋ก ํ๊ธฐ ์ํจ */ } .side_box{ width: 293px; /* height: 300px; */ /* background: rgba(255,0,0,0.16); */ position: absolute; /* ๋ถ๋ชจ๋ฅผ ๊ฐ๋ ๊ธฐ์ค์ ์ ์ก์ง ์์ผ๋ฉด ๊ผญ๋๊ธฐ๊น์ง ์ฌ๋ผ๊ฐ */ right: 0; top: 0; } .side_box.on{ position: fixed; /* ํ๋ฉด์ ๊ณ ์ */ top: 80px; } .side_box .profile_thumb{ width: 50px; height: 50px; border-radius: 50%; overflow: hidden; /* ์ด๋ฏธ์ง๊ฐ ๋์น์ง ์๋๋ก ํ๋ค */ margin-right: 10px; } .side_box .profile_thumb img{ width: 100%; height: 100%; } .side_box .user_profile{ display: flex; /* ๊ฐ๋ก ๋ฐฐ์น */ align-items: center; font-size: 14px; color: #262626; } .side_box .detail .id{ margin-bottom: 5px; } .side_box .detail .ko_name{ font-size: 12px; color: #999; } .side_box > article{ border: 1px solid rgba(0,0,0,0.09); border-radius: 3px; margin-bottom: 20px; width: 291px; font-size: 14px; color: #262626; font-weight: bold; background: white; } .side_box > article > header{ display: flex; /* ๊ฐ๋ก ๋ฐฐ์น */ align-items: center; justify-content: space-between; padding: 15px 20px; color: #999; } .side_box > article > header .more{ font-size: 12px; color: #262626; cursor: pointer; } .thumb_user{ display: flex; align-items: center; padding: 10px 20px; } .thumb_user .profile_thumb{ width: 34px; /* ํฌ๊ธฐ๊ฐ ์ข ๋ ์๊ฒ ๋ง๋ฌ */ height: 34px; } .thumb_user .time{ font-size: 10px; letter-spacing: 0.2px; color: #999; } .side_box .scroll_inner{ height: 182px; overflow-x: hidden; /* x์ถ_์์์ด ๋ถ๋ชจ ๋์ง ๋ชปํ๊ฒ ํ๋ค */ overflow-y: auto; /* ์๋์ผ๋ก ์คํฌ๋กค์ ๋ณด์ฌ์ฃผ๊ฑฐ๋ ์จ๊น */ /* overflow: hidden auto; x์ถ, y์ถ ํ๋ฒ์ ์ค์ */ } .hidden_menu{ display: none; width: 600px; /* background: red; */ position: absolute; left: 50%; transform: translateX(-50%); /* x์ถ ๊ฐ์ด๋ฐ ์ ๋ ฌ */ top: 100px; overflow: hidden; /* ์์๋ค์ด ๋์น์ง ์๋๋ก ํ๋ค */ border: 1px solid rgba(0,0,0,0.09); border-radius: 3px; } .hidden_menu .scroll_inner{ height: 100px; /* ๋์ด๊ฐ์ ์์์๊ฒ ์ค๋ค */ width: auto; overflow-x: auto; /* ํญ๋ชฉ์ด ๋ง์์ง ๊ฒฝ์ฐ ์์์ ์คํฌ๋กค์ด ์์ฑ */ overflow-y: hidden; display: flex; /* ๊ฐ๋ก๋ฐฐ์น */ align-items: center; padding: 0 10px; } .hidden_menu .scroll_inner .user{ width: 80px; height: 80px; display: flex; flex-direction: column; /* ๊ฐ๋ก ์ค์ ์ ๋ ฌ์ ์ธ๋ก ์ค์ ์ ๋ ฌ๋ก ๋ณ๊ฒฝ */ align-items: center; margin-right: 15px; justify-content: space-between; /* ์ด๋ฏธ์ง๋ ์๋ก ์์ด๋๋ ์๋๋ก ์ค์ */ } .hidden_menu .scroll_inner .user .id{ font-size: 12px; color: #262626; } .hidden_menu .thumb_img{ width: 56px; height: 56px; border-radius: 50%; overflow: hidden; } .hidden_menu .thumb_img img{ width: 100%; height: 100%; } @media screen and (max-width:1000px){ #header .inner{ width: 97.5%; } #main_container{ padding-top: 220px; } #main_container .inner{ width: 93.5%; } .contents_box{ display: flex; flex-direction: column; /* ์ธ๋ก ๋ฐฐ์น ๋ฐ๋๋ก ํ๋ค */ align-items: center; /* ์ผ์ชฝ์ผ๋ก ์น์ฐ์ณ ์ง๋ ๊ฑธ ๋ฐฉ์ง */ } .side_box{ /* ์ฌ์ด๋ ๋ฐ์ค ์จ๊ธฐ๊ธฐ */ display: none; } .hidden_menu{ display: block; } } @media screen and (max-width:650px){ #header .search_box{ display: none; } .hidden_menu{ width: 95%; } }
ย
ํ์ผ๋ช
:
js/main.js
/* const heart = document.querySelector( '.heart_btn'); // ํํธ ์์ ๋ถ๋ถ์ ์ ํํด์ ๊ฐ์ ธ์ด */ const header = document.querySelector('#header'); const sidebox = document.querySelector( '.side_box'); // SelectorAll์ ํ์ฉํด ๋ชจ๋ ์์๋ฅผ ๊ฐ์ ธ์ด const variableWidth = document.querySelectorAll(".contents_box .contents"); const deligation = document.querySelector(".contents_box"); /* heart.addEventListener('click', function(){ console.log('hit'); heart.classList.toggle('on'); // ํํธ๋ฅผ ํด๋ฆญํ๋ฉด .on ํด๋์ค๋ฅผ ์ถ๊ฐ }); */ function deligationFunc(e){ let elem = e.target; // ํด๋ฆญํ ์์ ๊ฐ์ ธ์ค๊ธฐ // console.log(e.target); // console.log(elem); // ์๋ชป ํด๋ฆญํ ๊ฒฝ์ฐ while(!elem.getAttribute('data-name')){ // elem์ ๋ถ๋ชจ๋ฅผ ์ฐพ์ elem = elem.parentNode; if(elem.nodeName ==='BODY'){ // body๊น์ง ์ด๋ฒคํธ๊ฐ ์๋ ๊ฒฝ์ฐ elem=null; return; } // data-name์ ๊ฐ์ง ์์ฑ์ ์ฐพ์๋๊น์ง ๋ถ๋ชจ์๊ฒ ์ ๊ทผ์ ๋ฐ๋ณต } if(elem.matches('[data-name="heartbeat"]')){ // console.log("ํํธ!"); let pk=elem.getAttribute('name'); // pk๊ฐ์ ๋ฐ์์จ๋ค $.ajax({ Method:'POST', // ์๋ฌ๋ ๊ฒฝ์ฐ GET์ผ๋ก ๋ณ๊ฒฝํ๊ธฐ url:'data/like.json', data: {pk}, dataType:'json', // ์ด๋ป๊ฒ ๋ค์ด์ฌ์ง ์ค์ success: function(response){ // ํต์ ์ ์ฑ๊ณตํ ๋ฐ์ดํฐ๊ฐ response๋ก ๋ค์ด์จ๋ค let likeCount =document.querySelector('#like-count-37'); likeCount.innerHTML = '์ข์์' + response.like_count +'๊ฐ'; }, error: function(request,status,error){ alert('๋ก๊ทธ์ธ์ด ํ์ํฉ๋๋ค.'); window.location.replace('https://www.naver.com'); // ์์ ์๋ฌ ์น ํ์ด์ง } }) }else if(elem.matches('[data-name="bookmark"]')){ // ๋ถ๋งํฌ ํด๋ฆญ ์ ์คํ // console.log("๋ถ๋งํฌ!"); let pk=elem.getAttribute('name'); // pk๊ฐ์ ๋ฐ์์จ๋ค $.ajax({ Method:'POST', /* ์๋ฌ๋ ๊ฒฝ์ฐ GET์ผ๋ก ๋ณ๊ฒฝํ๊ธฐ */ url: 'data/bookmark.json', data: {pk}, dataType: 'json', success: function(response){ let bookmarkCount=document.querySelector('#bookmark-count-37'); bookmarkCount.innerHTML = '๋ถ๋งํฌ' + response.bookmark_count +'๊ฐ'; }, error:function(request, status, error){ alert('๋ก๊ทธ์ธ์ด ํ์ํฉ๋๋ค.'); window.location.replace('https://www.naver.com'); // ์์ ์๋ฌ ์น ํ์ด์ง } }) }else if(elem.matches('[data-name="comment"]')){ let content = document.querySelector('#add-comment-post37 > input[type=text]').value; console.log(content); if(content.length >140){ alert('๋๊ธ์ ์ต๋ 140์ ์ ๋ ฅ ๊ฐ๋ฅํฉ๋๋ค. ํ์ฌ ๊ธ์์ : ' + content.length); return; } $.ajax({ Method:'POST', url:'./comment.html', // ./๋ ํ์ฌ ํด๋๋ฅผ ๋ปํจ data: { 'pk': 37, 'content': content }, dataType:'html', success: function(data){ document.querySelector('#comment-list-ajax-post37').insertAdjacentHTML('afterbegin',data); }, error:function(request,status,error){ alert('๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค.'); } }) document.querySelector('#add-comment-post37>input[type=text]').value=''; }else if(elem.matches('[data-name="comment_delete"]')){ $.ajax({ Method:'POST', /* ์๋ฌ๋ ๊ฒฝ์ฐ GET์ผ๋ก ๋ณ๊ฒฝํ๊ธฐ */ url:'data/delete.json', data: { 'pk': 37, /* 'pk':pk */ }, dataType:'json', success: function(response){ if(response.status){ let comt = document.querySelector('.comment-detail'); comt.remove(); } }, error:function(request, status ,error){ alert('๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค..'); window.location.replace('https://www.naver.com'); // ์์ ์๋ฌ ์น ํ์ด์ง } }) }else if(elem.matches('[data-name="share"]')){ console.log("๊ณต์ !"); }if(elem.matches('[data-name="more"]')){ console.log("๋๋ณด๊ธฐ!"); } elem.classList.toggle('on'); // on ํด๋์ค ์ฃผ๊ธฐ } function resizeFunc(){ // console.log('resize!!'); if(pageYOffset >= 10){ let calcWidth = (window.innerWidth *0.5) +167; // ์น ํ์ด์ง ๊ธฐ๋ฐ์ผ๋ก ์์น ์ฌ์กฐ์ // console.log(window.innerWidth); sidebox.style.left = calcWidth +'px'; } if(matchMedia('screen and (max-width : 800px)').matches){ // ์ฌ๋ฌ๊ฐ์ ์ปจํ ์ธ ๋ฐ์ค๊ฐ ์์ผ๋ฏ๋ก ๋ฐฐ์ด ํ์ฉ for(let i=0; i<variableWidth.length; i++){ variableWidth[i].style.width = window.innerWidth -20 +'px'; } }else{ for(let i=0; i<variableWidth.length; i++){ if(window.innerWidth >600) // ๋ํดํธ ๊ฐ์ด 614 ์ด๋ฏ๋ก 614 ์ด์ ์ปค์ง์ง ์๊ฒ ํ๊ธฐ ์ํจ variableWidth[i].removeAttribute('style'); } } } function scrollFunc(){ // console.log(pageYOffset); if(pageYOffset >= 10){ // ๋๋๊ทธํ ๊ฒฝ์ฐ header.classList.add('on'); if(sidebox){ sidebox.classList.add('on'); }resizeFunc(); }else{ header.classList.remove('on'); if(sidebox){ sidebox.classList.remove('on'); sidebox.removeAttribute('style'); } } } setTimeout(function (){ scrollTo(0,0); },100); // ์๋ก๊ณ ์นจํ๋ฉด ํ๋ฉด์ด ์ ค ์๋ก ๊ฐ๋๋ก ํ๋ค if(deligation){ deligation.addEventListener('click',deligationFunc); } window.addEventListener( 'resize', resizeFunc); window.addEventListener('scroll', scrollFunc); // ์คํฌ๋กค ์ด๋ฒคํธ ๋ฐ์ ์ scrollFunc ์คํ