[FE] 헤더에 hover할 때 메뉴 나오도록 하기 (getBoundingClientRect())
이거 하나 만드는데 너무 오래걸렸다 흑흑... 너무 멍청한 실수를 했기때문인데, 실수1) hover 처리를 자바스크립트에서 하려고 한 점, header 아래에 나올 이 밀리면 안되고 메뉴에 덮여야 한다는
ala-nueva.tistory.com
어제 다 해놓고 서버에 적용할때 안떠서 당황했는데, 나중에 뒤지면서 보니 내가 어제 d:none 이나 opacity설정을 넣었다뺐다 하면서 테스트하다가 메뉴 내부 css에 opacity:0으로 되어있어서 그런거였다................... 이게 개발자도구에선 메뉴가 계속 투명으로 보임 + 계속 전체를 감싼 부모박스만 체크하느라 내부 속성이 보이질 않음의 총체적 난국이라 발견이 늦었음.
뭐가 잘못된줄 알고 작은 박스를 새로 만들어서 한참을 예행연습하고도 또 적용이 안되길래 그제서야 css를 깊숙히 뒤져본 나란 인간.. ㅠ ㅠ
그래도 덕분(?)에 더 나은 방향으로 일단 하긴 했으니 다행이라 해야할지 😂 다음엔 생각지 못한 부분도 꼭 찾아보자...
개선사항1) css 속성에 opacity와 top을 사용해서 위에서 아래로 내려오도록 구현함.
: 원래대로 d:none을 사용했으면 엄청 어색했을텐데 absolute로 left는 조정했으면서 top으로 위에 숨겨놓고 내려오게 한단 생각을 왜 못했는지 모르겠다.d:none에 너무 꽂혀있었음.
.octaheader {
background-color: white; // 기본으로 투명이라 숨어있는 메뉴를 가리기위해 흰색으로 지정해줌
position:relative;
}
.octaheader .parent:hover .menubox { // 헤더+메뉴가 같이감싸진 부모에 hover를 줘야 메뉴에 마우스가있어도 안사라짐
position: absolute; //위치지정을 위한 absolute
left: 460px; // js에 의해 left값은 계속 바뀐다
transition: top 0.2s ease-out, opacity 1s ease-in; // 적당한 눈속임을 위한 transition
top: 57px; // 헤더 선을 살짝 가리도록 1px 줄임
opacity:1; // 나타나면서 불투명이 됨
z-index:999; // 다른 부분과 겹칠때 묻힐때가 있어서 가장 앞으로 꺼내줌
}
.menubox{
position: absolute;
top: -72px; //숨어있음
opacity:0; //투명
}
개선사항2) hover속성은 css로만 끝내고 js는 left만 계산함. 이때 load보다 더 빠르게 구동되게함. (튕김방지)
window.addEventListener("DOMContentLoaded", function() {
let header = this.document.querySelector(".octaheader");
let menubox = header.querySelector(".menubox");
let logo = header.querySelector(".logo-mini");
setLeftPosition();
function setLeftPosition() {
let x = logo.getBoundingClientRect().left;
let leftValue = x - 22;
// left 속성 설정
menubox.style.left = leftValue + "px";
console.log(leftValue);
}
// 초기화 및 리사이즈 이벤트에 대한 처리
window.addEventListener("resize", setLeftPosition);
});
Window: DOMContentLoaded 이벤트 - Web API | MDN
DOMContentLoaded 이벤트는 HTML 문서가 완전히 구문 분석되고 모든 지연된 스크립트(<script defer src="…">와 <script type="module">)가 다운로드되고 실행될 때 발생합니다. 이미지, 서브프레임, 비동기 스크
developer.mozilla.org
문서에 이미지가 다 생기고 나서 js가 작동하다보니 자꾸 오른쪽에서 왼쪽으로 튕기듯 메뉴가 나오는게 적나라하게 보였다. 그래서 dom이 분석되자마자 비동기적으로 적용될 수 있도록 DOMContentLoaded 이벤트로 읽어들여줌.
mdn에서 보니 원래 대상은 로드된 문서라는데, 그래도 다른로드보다 빨리 되다보니 딜레이 현상이 줄었다. 좀더 매끄럽게 하려면 어떻게 할지 고민해볼것...

'😵 ~23.11.10 > ✨ Prj.BuildDiary' 카테고리의 다른 글
<textarea>에서 DB저장 후 줄바꿈 출력하기 (0) | 2023.11.05 |
---|---|
[FE] VUE.js로 화면 구현하기 (공지사항 조회 페이지 re-build) (1) | 2023.10.29 |
[FE] 헤더에 hover할 때 메뉴 나오도록 하기 (getBoundingClientRect()) (1) | 2023.10.15 |
[FE] JS 부모이벤트 정리, 자바스크립트로 ellipsis처리, 조건에 따른 css처리 (2) | 2023.10.15 |
[DB] 좋아요,북마크 여부 체크하는 SQL문 (0) | 2023.10.15 |