[Django] clone instagram #4

์ •๋ณด๊ตฌ๋‹ˆยท2021๋…„ 12์›” 1์ผ
0

Django

๋ชฉ๋ก ๋ณด๊ธฐ
12/15
post-thumbnail

์ธ์Šคํƒ€์—์„œ ์ƒ๋‹จ โž•์•„์ด์ฝ˜์„ ๋ˆ„๋ฅด๋ฉด ์ด๋ฏธ์ง€ํŒŒ์ผ์„ ๋Œ์–ด์™€ ๊ฒŒ์‹œ๋ฌผ์„ ์—…๋กœ๋“œ๋ฅผ ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ์ฐฝ์ด ๋œฌ๋‹ค.

์ด ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

๊ทธ๋Ÿผ ์šฐ์„ , ๋ชจ๋‹ฌ์ฐฝ์— ๋Œ€ํ•ด์„œ ์•Œ์•„์•ผ ํ•œ๋‹ค.

์ƒˆ๋กœ์šด ๋ธŒ๋ผ์šฐ์ € ์ฐฝ์ด ๋œจ๋Š” ๊ฒƒ์ด ์•„๋‹Œ, ์ง€๊ธˆ ๋ณด๊ณ  ์žˆ๋Š” ํ™”๋ฉด ๋ฐ”๋กœ ์œ„์— ์•ž์œผ๋กœ ํŠ€์–ด๋‚˜์˜ค๋Š” ์ฐฝ ์„ ๋ชจ๋‹ฌ์ฐฝ์ด๋ผ ํ•œ๋‹ค.

์ธ์Šคํƒ€์˜ ๊ฒŒ์‹œ๋ฌผ ์—…๋กœ๋“œ ์ฐฝ๋„ ์ด๋Ÿฐ ๋ชจ๋‹ฌ์ฐฝ์— ํ•ด๋‹นํ•œ๋‹ค.



ํ”ผ๋“œ ์—…๋กœ๋“œ๋ฅผ ์œ„ํ•œ ๋ชจ๋‹ฌ ๋งŒ๋“ค๊ธฐ


๋ชจ๋‹ฌ์„ ๋งŒ๋“ค์–ด ์ฃผ๊ธฐ ์œ„ํ•ด ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ๋„๋ก ํ•˜๊ฒ ๋‹ค.

- templates/instagram/main.html

CSS

    .modal_overlay {
        width: 100%;
        height: 100%;
        position: absolute;
        left: 0;
        top: 0;
        display: flex;
        flex-direction: column;
        align-items: center;
        justify-content: center;
        background: rgba(0, 0, 0, 0.8);
        backdrop-filter: blur(1.5px);
        -webkit-backdrop-filter: blur(1.5px);
    }

    .modal_window {
        background: white;
        backdrop-filter: blur(13.5px);
        -webkit-backdrop-filter: blur(13.5px);
        border-radius: 10px;
        border: 1px solid rgba(255, 255, 255, 0.18);
        width: 800px;
        height: 600px;
        position: relative;
        padding: 10px;
    }

HTML

    <div id ="first-modal" class="modal_overlay">
        <div class="modal_window">
        </div>
    </div>

์œ„ ์ฝ”๋“œ๋ฅผ <style>๊ณผ <body> ๋ถ€๋ถ„์— ์ถ”๊ฐ€ํ•ด์ฃผ๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ๋ชจ๋‹ฌ์ฐฝ์ด ์ƒ๊ธด๋‹ค.

์ด๋•Œ ๋ชจ๋‹ฌ์ฐฝ์ด ๊ฐ€๋ ค์ ธ ์žˆ๋‹ค๊ฐ€ ๋– ์•ผ๋œ๋‹ค.

CSS ์ฝ”๋“œ ์ค‘ .modal_overlay ์˜ display๊ฐ€ flex์ผ ๊ฒฝ์šฐ ๋ชจ๋‹ฌ์ฐฝ์ด ๋ณด์ด๊ณ , none์ผ ๊ฒฝ์šฐ ๋ชจ๋‹ฌ์ฐฝ์ด ๋ณด์ด์ง€ ์•Š๋Š”๋‹ค.

  .modal_overlay {
        ...
        display: flex;
        ...
   }

๋”ฐ๋ผ์„œ ์‚ฌ์šฉ์ž๊ฐ€ โž•๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๊ธฐ ์ „์—๋Š” display: none์œผ๋กœ ์„ค์ •ํ•ด๋‘์—ˆ๋‹ค๊ฐ€, โž•๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋Š” ์ˆœ๊ฐ„ display: flex๋กœ ๋ฐ”๊ฟ”์ฃผ๋ฉด ๋  ๊ฒƒ์ด๋‹ค.

๋˜ํ•œ ๋ชจ๋‹ฌ์ฐฝ์ด ๋– ์žˆ๋Š” ๊ฒฝ์šฐ์— ์Šคํฌ๋กค์ด ์‚ฌ๋ผ์ง€๋„๋ก ํ•ด์•ผํ•œ๋‹ค.


ํด๋ฆญ์‹œ ๋ชจ๋‹ฌ์ฐฝ ๋„์šฐ๊ธฐ

๋™์ ์ธ ์›€์ง์ž„์„ ๋งŒ๋“ค์–ด ์ฃผ๊ธฐ ์œ„ํ•ด์„œ ์ œ์ด์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด์ฃผ๋„๋ก ํ•˜๊ฒ ๋‹ค.

์ด๋•Œ ์ œ์ด์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด์ฃผ๋ ค๋ฉด ์ž„ํฌํŠธ๋ฅผ ๋ฐ˜๋“œ์‹œ ํ•ด์ค˜์•ผ ํ•œ๋‹ค!

<!-- Jquery -->
<script  src="http://code.jquery.com/jquery-latest.min.js"></script>

์šฐ์„  ์‚ฌ์šฉ์ž๊ฐ€ ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €๋Š”์ง€ ์•ˆ๋ˆŒ๋ €๋Š”์ง€ ์•Œ๊ธฐ ์œ„ํ•ด์„œ๋Š” id=""๊ฐ’์ด ํ•„์š”ํ•˜๋‹ค.

<span id="nav-bar-add-box" class="material-icons-outlined">add_box</span>

์ •ํ•ด์ค€ id๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์ œ์ด์ฟผ๋ฆฌ๋ฅผ ์ด์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž๊ฐ€ ์–ด๋–ค ์•ก์…˜์„ ์ทจํ–ˆ์„ ๋•Œ ๊ทธ๊ฒƒ์— ์ƒ์‘ํ•˜๋Š” ๋™์ ์ธ ๊ฒฐ๊ณผ๋ฅผ ๋งŒ๋“ค์–ด๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

์ง€๊ธˆ์€ ์‚ฌ์šฉ์ž๊ฐ€ ์ƒ๋‹จ์— โž• ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ ๋ชจ๋‹ฌ์ฐฝ์ด ๋‚˜ํƒ€๋‚˜๋„๋ก ์ œ์ด์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ๋„๋ก ํ•˜๊ฒ ๋‹ค.

<script>
  $('#nav-bar-add-box').click(function(){
      $('#first-modal').css({
      display : 'flex'
      })
  });
</script>



์Šคํฌ๋กค๋ฐ” ์—†์• ๊ธฐ

๋ชจ๋‹ฌ์ฐฝ์ด ๋„์›Œ์กŒ์„ ๋•Œ ์Šคํฌ๋กค์„ ์—†์• ์ฃผ๋Š” ์ œ์ด์ฟผ๋ฆฌ๋ฅผ ํ•˜๋‚˜๋” ์ถ”๊ฐ€ํ•ด์ค€๋‹ค.

jquery

  $('#nav-bar-add-box').click(function(){
      $('#first-modal').css({
        display : 'flex'
      });

      $(document.body).css({
        overflow : 'hidden'
      });
  });

์Šคํฌ๋กค๋ฐ”๋Š” ์ „์ฒด ๋ฐ”๋””ํ™”๋ฉด์—์„œ ์‚ฌ๋ผ์ ธ์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ๋ฐ ์ œ์ด์ฟผ๋ฆฌ์˜ ์„ ํƒ์ž๋ฅผ document.body๋กœ ์ง€์ •ํ•ด์ฃผ์—ˆ๋‹ค.

overflow: 'hidden'์„ ํ†ตํ•ด ๋ชจ๋‹ฌ์ฐฝ์ด ํด๋ฆญ๋˜์—ˆ์„ ๋•Œ ์Šคํฌ๋กค๋ฐ”๊ฐ€ ์ˆจ๊ฒจ์ง„๋‹ค.



๋ชจ๋‹ฌ์ฐฝ ๋‹ซ๊ธฐ๋ฒ„ํŠผ ๋งŒ๋“ค๊ธฐ

๋ชจ๋‹ฌ์ฐฝ์„ ๋„์› ์œผ๋ฉด ์ด์ œ ๋ชจ๋‹ฌ์ฐฝ ๋‹ซ๊ธฐ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•ด๋ณผ ๊ฒƒ์ด๋‹ค.

์šฐ์„  ๋ชจ๋‹ฌ์ฐฝ์— ๋‹ซ๊ธฐ ์•„์ด์ฝ˜์„ ๋งŒ๋“ค์–ด์ฃผ๋„๋ก ํ•˜๊ฒ ๋‹ค.

CSS

    .modal-title {
        display: flex;
        flex-direction: row;
        justify-content: space-between;
        font-weight: bold;
        font-size: 17px;
        /* border-bottom: solid 1px rgb(202, 202, 202); */
    }

    .modal-title-side {
        width: 40px;
        text-align: center;
    }

HTML

    <!-- ๋ชจ๋‹ฌ์ฐฝ -->
    <div class="modal-overlay">
        <div class="modal-window">
            <div class="modal-title">
                <div class="modal-title-side"></div>
                <div>์ƒˆ ๊ฒŒ์‹œ๋ฌผ ๋งŒ๋“ค๊ธฐ</div>
                <div class="modal-title-side">
                    <span id ="modal-close" class="material-icons-outlined">
                        close
                    </span>
                </div>
            </div>
        </div>
    </div>

์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์ค€ ๋’ค ์„œ๋ฒ„๋ฅผ ํ™•์ธํ•ด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค


๋‹ซ๊ธฐ ์•„์ด์ฝ˜์„ ๋งŒ๋“ค์–ด์คฌ์œผ๋ฉด, ์‹ค์ œ๋กœ ๋‹ซ๊ธฐ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ ๋ชจ๋‹ฌ์ฐฝ์ด ๋‹ซํžˆ๋„๋ก ์ œ์ด์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•ด์ค€๋‹ค.

jquery

$('#modal-close').click(function(){
    $('.modal-overlay').css({  
      display : 'none'
    });
});



๋“œ๋ž˜๊ทธ์ธ ๋“œ๋กญ๊ธฐ๋Šฅ ๋งŒ๋“ค๊ธฐ

์‹ค์ œ ์ด๋ฏธ์ง€ ํŒŒ์ผ์„ ๋“œ๋ž˜๊ทธ ํ•ด์„œ ๋“œ๋กญํ•˜๋ฉด ํŒŒ์ผ์ด ์—…๋กœ๋“œ ๋˜๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค.

์šฐ์„  ์ด๋ฏธ์ง€๋ฅผ ๋Œ์–ด๋‹ค ๋†“๋Š” ๋ ˆ์ด์•„์›ƒ์„ ๋งŒ๋“ค์–ด ์ฃผ๋„๋ก ํ•˜๊ฒ ๋‹ค.

css

.modal-img-space {
    width: 625px;
    height: 635px;
    margin-top: 10px;
    text-align: center;
}

html

<div id ="first-modal" class="modal-overlay">
    <div class="modal-window">
        <div class="modal-title">
            <div class="modal-title-side"></div>
            <div>์ƒˆ ๊ฒŒ์‹œ๋ฌผ ๋งŒ๋“ค๊ธฐ</div>
            <div class="modal-title-side">
                <span id ="modal-close" class="material-icons-outlined">
                  close
                </span>
            </div>
        </div>
        <div class="modal-img-space">
            <span> ์‚ฌ์ง„์„ ์—ฌ๊ธฐ์— ๋Œ์–ด๋‹ค ๋†“์œผ์„ธ์š”. </span>
        </div>
    </div>
</div>

๋ ˆ์ด์•„์›ƒ์„ ์žก์•„์ค€ ๋’ค ๋“œ๋ž˜๊ทธ์•ค๋“œ๋กญ ๊ธฐ๋Šฅ์„ ์ œ์ด์ฟผ๋ฆฌ๋กœ ์ž‘์„ฑํ•ด์ค€๋‹ค.

jquery

$('.modal-img-space')
        .on("dragover", dragOver)
        .on("dragleave", dragOver)
        .on("drop", uploadFiles);

    function dragOver(e){
        e.stopPropagation();
        e.preventDefault();
        
        if (e.type == "dragover") {
            $(e.target).css({
                "background-color": "black",
                "outline-offset": "-20px"
            });
        } else {
            $(e.target).css({
                "background-color": "white",
                "outline-offset": "-10px"
            });
        }
    }

    function uploadFiles(e){
        e.stopPropagation();
        e.preventDefault();
        
        e.dataTransfer = e.originalEvent.dataTransfer; 
        var files =  e.dataTransfer.files;

        if (files.length > 1) {
            alert('ํ•˜๋‚˜๋งŒ ์˜ฌ๋ ค๋ผ.');
            return;
        }

        if (files[0].type.match(/image.*/)) {
            $(e.target).css({
                "background-image": "url(" + window.URL.createObjectURL(files[0]) + ")",
                "outline": "none",
                "background-size": "100% 100%"});
        }else{
            alert('์ด๋ฏธ์ง€๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.');
            return;
        }
    }

์‹ค์ œ๋กœ ์„œ๋ฒ„์—์„œ ์‚ฌ์ง„ํŒŒ์ผ์„ ๋“œ๋ž˜๊ทธํ•ด์„œ ๋†“์œผ๋ฉด ์‚ฌ์ง„์ด ์ž˜ ๋“ค์–ด์˜ค๋Š” ๊ฒƒ์„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค.




์ด๋ฏธ์ง€ ์—…๋กœ๋“œ ์™„๋ฃŒ์‹œ ํ™”๋ฉด ๋ณ€ํ™˜


์ง€๊ธˆ๊นŒ์ง€ ๋งŒ๋“ค์–ด์ค€ ์ฒซ๋ฒˆ์งธ ๋ชจ๋‹ฌ์— ์‚ฌ์ง„ ํŒŒ์ผ์ด ์—…๋กœ๋“œ ๋˜์—ˆ์„ ๋•Œ, ํ”ผ๋“œ์˜ ๋‚ด์šฉ์„ ์ ์„ ์ˆ˜ ์žˆ๋Š” ๋‘๋ฒˆ์งธ ๋ชจ๋‹ฌ๋กœ ํ™”๋ฉด ๋ณ€ํ™˜์„ ํ•ด์ค˜์•ผํ•œ๋‹ค.

๋”ฐ๋ผ์„œ ๋‘๋ฒˆ์งธ ๋ชจ๋‹ฌ์„ ๋งŒ๋“ค์–ด์ฃผ๊ณ , ์ฒซ๋ฒˆ์งธ ๋ชจ๋‹ฌ์—์„œ ์‚ฌ์ง„์ด ์—…๋กœ๋“œ ๋˜๋Š” ์ˆœ๊ฐ„ ๋‘๋ฒˆ์งธ ๋ชจ๋‹ฌ์„ ๋„์›Œ์ค„ ์ˆ˜ ์žˆ๋„๋ก ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ๋„๋ก ํ•˜๊ฒ ๋‹ค.

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