1 minute read


https://github.com/SG-Marco/insta_clone_1_1


  • 모달 부분

js 부분은 아직 미흡하여 검색한 내용대로 사용. 모달 버튼 누르면 모달 활성화되면서 body 태그 부분의 스크롤을 비활성화. (overflow: hidden) 비활성화 시키는 클래스를 만든 이후 js로 조건에 따라 add or remove. 모달 꺼지는 경우는

  1. 취소버튼
  2. 모달 배경 클릭
  3. esc버튼 클릭

<!--modal-->
<div class="my-modal-bg" id="my-modal-bg">
    <div class="my-modal-case" id="my-modal-case">
        <div class="my-modal" id="my-modal">
            <button class="my-modal-btn btn1">신고</button>
            <button class="my-modal-btn btn2">팔로우 취소</button>
            <button class="my-modal-btn btn3">게시물로 이동</button>
            <button class="my-modal-btn btn4">공유 대상...</button>
            <button class="my-modal-btn btn5">링크 복사</button>
            <button class="my-modal-btn btn6">퍼가기</button>
            <button class="my-modal-btn btn7 modal_cancel_btn7" id="modal_cancel_btn7">취소</button>
        </div>

    </div>
</div>


/*modal===================================*/


#my-modal-bg{
    position: fixed;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    background-color: rgba(0, 0, 0, 0.65);
    display: none;
    flex-direction: column;
    justify-content: space-around;
    align-items: center;
    z-index: 100;
    transition: opacity 0.5s;
}

#my-modal-active-btn_1{
    cursor: pointer;
}

.my-modal-case, #my-modal-case{
    width: 260px;
    flex-shrink: 1;
    justify-content: center;
    max-height: calc(100% - 40px);
    flex-direction: column;
    align-items: stretch;
    position: relative;
}
@media (min-width: 736px) {
    .my-modal-case , #my-modal-case{
        width: 400px;
    }
}

.my-modal, #my-modal {
    background-color: rgba(255, 255, 255, 1);
    border-radius: 12px;
    max-height: 100%;
    overflow: hidden;
    flex-shrink: 0;
    position: relative;
    align-items: stretch;
    display: flex;
    flex-direction: column;
}

.my-modal-btn {
    background-color: transparent;
    cursor: pointer;
    font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
    font-size: 14px;
    line-height: 1.5;
    min-height: 48px;
    padding: 8px;
    text-align: center;
    user-select: none;
    vertical-align: middle;
    display: inline-block;
    border: 0;
    border-top: 1px solid rgba(var(--b6a,219,219,219),1);
}


.no-scroll{
    overflow: hidden;
}

  • insta_clone_1_1.js

    // ...버튼 누르면 모달창 켜짐
const modal = document.getElementById("my-modal-bg");
const btnModal_1 = document.getElementById("my-modal-active-btn_1");
const btnModal_2 = document.getElementById("my-modal-active-btn_2");
const btnModal_3 = document.getElementById("my-modal-active-btn_3");

btnModal_1.addEventListener("click", e => {
    modal.style.display = "flex";
    document.querySelector('body').classList.add('no-scroll');
});
btnModal_2.addEventListener("click", e => {
    modal.style.display = "flex";
    document.querySelector('body').classList.add('no-scroll');
});
btnModal_3.addEventListener("click", e => {
    modal.style.display = "flex";
    document.querySelector('body').classList.add('no-scroll');
});

// 모달 메뉴에서 취소버튼 누르면 꺼짐
const closeBtn = modal.querySelector(".modal_cancel_btn7")
closeBtn.addEventListener("click", e => {
    modal.style.display = "none"
    document.querySelector('body').classList.remove('no-scroll');
})
// 모달창 밖의 회색영역 클릭하면 모달 꺼짐
modal.addEventListener("click", e => {
    const evTarget = e.target
    if(evTarget.classList.contains("my-modal-bg")) {
        modal.style.display = "none"
        document.querySelector('body').classList.remove('no-scroll');

    }
})

// esc누르면 모달 꺼짐
window.addEventListener("keyup", e => {
    if(modal.style.display === "flex" && e.key === "Escape") {
        modal.style.display = "none"
        document.querySelector('body').classList.remove('no-scroll');
    }
})


  • footer 부분 구현
    footer {
      flex-grow: 1;
      flex-direction: column;
      align-items: center;
      margin: 0;
      top: 100px;
      right: 0;
      width: 100%;
      max-width: 293px;
      height: 100vh;
      margin-bottom: 30px;
      position: fixed;
      left: 54%;
      transform: translateX(43%);
      padding-top: 20px;
    }
    

    position: fixed 인 경우 부모 태그의 영향을 받지 않는데 이 부분을 transform 속성을 사용하여 인스타그램 페이지와 비슷하게 동작하도록 설정. 수치는 경험적으로 알아낼 수 밖에 없었다. 실제 인스타그램에서는 어떻게 구현했는지 모른다.


  • a 태그의 효과 없애기
    a{
          text-decoration: none;
    }
    a:hover { text-decoration:none !important }
    

    링크가 걸린 부분은 파란색과 밑줄로 표시되는데 text-decoration 을 없애주면 밑줄을 비활성화 시킨다. 색상은 다시 지정해 주어야 한다. 마우스를 위로 올렸을 때 역시 효과가 활성화 되는데 이것은 hover 옵션을 이용하여 없앨 수 있다.

저 두 속성을 하나로 묶을 수 있는지의 여부를 모르겠다.


  • 나열된 리스트들을 가로로 배치하면서 사이에 특정 기호나 문구 삽입
    insta_infos:not(:last-of-type)::after{
      content: '\00B7';
      color: rgba(var(--edc,199,199,199),1);
      margin: 0 .25em 0 .25em;
    }
    

::after를 이용하여 적용 가능하다. 마지막 리스트 뒤에는 없어야 하므로 last-of-type는 제외. \00B7은 점.


  • 특정 길이 이상의 문장을 말줄임표로
    .content_content{
      display: block;
      width: 400px;
      margin-left: 10px;
      font-weight: 400;
       text-align: left;
      white-space: nowrap;
      overflow: hidden;
      text-overflow: ellipsis;
      word-wrap: break-word;
      /*display: -webkit-box;*/
      -webkit-line-clamp: 1;
      -webkit-box-orient: vertical;
    }
    

    display: inline 에서는 안된다고 한다. 텍스트는 좌로 정렬 후 white-space: nowrap을 이용하여 다음 줄로 넘어가지 않도록 한다. overflow: hidden으로 넘어가는 부분은 가려주고, text-overflow: ellipsis로 말줄임표를 준다. -webkit-line-clamp는 보여줄 줄의 수.


  • 포스트 우측 상단의 점 세개

<svg aria-label="옵션 더 보기" color="#262626" fill="#262626" height="24" role="img"
     viewBox="0 0 24 24" width="24">
    <circle cx="12" cy="12" r="1.5"></circle>
    <circle cx="6" cy="12" r="1.5"></circle>
    <circle cx="18" cy="12" r="1.5"></circle>
</svg>

circle 태그를 이용하여 점을 그려버리는 식으로 표현했더라. 이런 방식은 상단바 검색창의 돋보기 모양도 같다.

Updated: