메뉴 건너뛰기

조회 수 8168 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄 첨부
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄 첨부

▶▷ 알아두면 좋은 것들

CSS, <STYLE> 태그 접근법, event-onmouseover, event-onmouseout, <DIV> 태그

관련글

 

 이번 글에서는 메뉴 만들기를 해볼까 합니다.

CSS의 visibility 나 display속성을 이용해서 DIV를 감춘다든지 해서 구현을 하는 방법도 있지만,

최대한 CSS를 적게 써가면서 기본적인 이벤트만으로 만들어 볼까해요.

 

 핵심적으로 쓰인 이벤트 속성으로 srcElement와 toElement 프로퍼티가 있는데요. 설명은 다음과 같습니다.

fromElement - 이벤트가 일어나기 이전의 요소가 담긴다. 

srcElement - 이벤트가 일어난 요소가 담긴다.

toElement - 이벤트가 일어나고 이동할 다음요소가 담긴다

 

그리고 메뉴가 구성되는 방법은 다음과 같겠습니다.

 

 

서브메뉴가 화면 밖에 위치하고 있다가 메뉴에 마우스가 위치하면, 메뉴 밑으로 다시 이동하는 방법입니다.

 

 그렇다면 소스를 보시죠 ^^

 


소스(Source)

소스다운  Doit.html

 

<HTML>
<HEAD>
<TITLE>자바스크립트를 활용한 메뉴 네비게이션 만들기</TITLE>
</HEAD>
<SCRIPT language="javaScript">
 
1. function subMenuRollover(obj){
2.  obj.style.color="white";
3.  obj.style.backgroundColor="black";
 }
 
4. function subMenuRollout(obj){
      obj.style.color="black";
      obj.style.backgroundColor="white";
 }
 
5. function showUpSubMenu(targetDiv){
6.    var srcElement=event.srcElement;
7.    targetDiv.style.left=srcElement.offsetLeft;
8.    targetDiv.style.top=srcElement.offsetTop+srcElement.height;
 }
 
 function hideSubMenu(targetDiv){
      var srcElement=event.srcElement;
9.    if(event.toElement != targetDiv && targetDiv.contains(event.toElement) == false){
           targetDiv.style.left=-100000; 
     }

 }


</SCRIPT>

<BODY>

 <IMAGE src=menu1.png width=100 height=35 onmouseover=showUpSubMenu(menu1) onmouseout=hideSubMenu(menu1)>
 <IMAGE src=menu2.png width=100 height=35 onmouseover=showUpSubMenu(menu2) onmouseout=hideSubMenu(menu2)>
 
10. <DIV ID=menu1 style="position : absolute;left:-10000px;"  onmouseout=hideSubMenu(this)>
  <TABLE border=0>
   <TR>
    <TD onmouseover=subMenuRollover(this) onmouseout=subMenuRollout(this)>서브메뉴1-1</TD>
    <TD onmouseover=subMenuRollover(this) onmouseout=subMenuRollout(this)>서브메뉴1-2</TD>
   </TR>
  </TABLE>
 </DIV>
 <DIV ID=menu2 style="position : absolute;left:-10000px;" onmouseout=hideSubMenu(this)>
  <TABLE>
   <TR>
    <TD onmouseover=subMenuRollover(this) onmouseout=subMenuRollout(this)>서브메뉴2-1</TD>
    <TD onmouseover=subMenuRollover(this) onmouseout=subMenuRollout(this)>서브메뉴2-2</TD>
   </TR>
  </TABLE>
 </DIV>
</BODY>

</HTML>

 


소스설명

1. 롤오버 설정

function subMenuRollover(obj){-

- 롤오버를 할 수 있는 메소드 입니다.

 

2. 스타일(style) - 글자색 설정

obj.style.color="white";

- 스타일 객체로 접근해서 글자색을 바꿀 수 있습니다.

 

3. 스타일(style) - 배경색 설정

obj.style.backgroundColor="black";

- 스타일 객체로 접근해서 배경색을 바꿀 수 있습니다.

 

4. 롤아웃 설정

function subMenuRollout(obj){

- 롤아웃를 할 수 있는 메소드 입니다.

 

5. 서브메뉴 보이기

function showUpSubMenu(targetDiv){

- 서브메뉴를 보여주는 메소드 입니다.

 

6. 현재요소 참조

var srcElement=event.srcElement;

- event 객체에서 현재 엘리먼트를 나타내는 srcElement 를 다시 변수에다 담습니다.

 

7. 서브메뉴의 x 좌표 설정

targetDiv.style.left=srcElement.offsetLeft;

- offsetLeft 라는 프로퍼티는 현재 참조하고 있는 엘리먼트(srcElement)의 x 좌표를 나타냅니다.

즉, 기준-여기서는 브라우저 왼쪽-이 되고 있는 곳으로부터 떨어진 픽셀 수를 의미합니다.

 

 그리고 대상이 되는 Div, 즉, 서브메뉴를 담고 있는 Div의 스타일 객체에 접근을 해서 left 값을 설정해 줍니다.

 

8. 서브메뉴의 y 좌표 설정

targetDiv.style.top=srcElement.offsetTop+srcElement.height;

- 위와 동일합니다. 여기서 offsetTop은 기준-여기서는 브라우저 위쪽-이 되고 있는 곳으로부터 떨어진 픽셀 수를 의미합니다.

그리고 현재 참조하고 있는 엘리먼트의 높이 값을 더해서 서브메뉴가 바로 아래에 나타날 수 있도록 합니다.

 

  역시나, 대상이 되는 Div, 즉, 서브메뉴를 담고 있는 Div의 스타일 객체에 접근을 해서 top 값을 설정해 줍니다.

 

 7번과 8번을 그림으로 나타내면 이렇습니다.

 

 

 

9. 서브메뉴를 감추는 조건

if(event.toElement != targetDiv && targetDiv.contains(event.toElement) == false){
    targetDiv.style.left=-100000;
}

- 다시금 화면 밖으로 멀리 보내어 버립니다.

여기서 중요한 조건이 두가지 인데요.

 

 첫번째 조건인 event.toElement != targetDiv 에 대해서는 이해하기가 쉬울겁니다.

'메뉴1'이라는 이미지를 벗어날때 targetDiv-여기서는 서브메뉴1 이됩니다.- 이 아니라면입니다.

즉, '메뉴1'이미지를 벗어나면 서브메뉴가 없어져야 하는데, 단, 이미지를 떠나 벗어나는 곳이 서브메뉴라면, 계속해서 서브메뉴를 보여주어야 한다는 점입니다. 서브메뉴를 클릭하려 이동했는데 '메뉴' 이미지를 벗어났다고 해서, 갑자기 서브메뉴가 사라진다면 곤란하겠죠?

 

 두번째 조건인 targetDiv.contains(event.toElement) == false 는 생각해보셔야 할 것이 있습니다.

첫번째 조건만으로 조건문을 만들었다면, 서브메뉴1로는 이동을 했으나, 마우스 커서가 서브메뉴1에 있는 요소, 즉 TD안에 있는 내용으로 커서가 이동을 하게 되면, 서브메뉴1이 아닌 다른 요소라 생각을 해서 서브메뉴가 다시 사라지게 됩니다.

 이를 해결하려면 위와 같이 조건을 만들어야 하는데요. 이때, contains라는 메소드는 인자로 들어온 것이 자기 자신을 참조하고 있는 targetDiv 에 포함이 된다면 true값을 반환하고, 그렇지 않으면 false 값을 반환합니다.

 이로써, 서브메뉴 Div 내에 있는 요소로 접근을 하더라도, 서브메뉴가 사라지지 않죠.

 

 

 

10. 서브메뉴가 감출 곳 지정

<DIV ID=menu1 style="position : absolute;left:-10000px;" onmouseout=hideSubMenu(this)>

- 서브메뉴 Div를 다시 사라지게 합니다.


List of Articles
번호 제목 날짜 조회 수
147 자바스크립트로 네트워크 연결 확인하기 (Navigator onLine Property) file 2015.06.19 6197
146 정규식을 이용한 실시간 콤마(comma) 넣기 2015.06.19 7876
145 정규식을 이용한 콤마(comma) 제거하기 2015.06.19 6804
144 텍스트박스(input type = "text") 숫자 증가, 감소 시키기 - 쇼핑몰 주문 수량 file 2015.06.19 12283
143 Checkbox : 체크박스 체크여부 확인 file 2015.06.19 19010
142 마우스 드래그, 오른쪽 팝업메뉴, 선택 막기 (IE11, 파이어폭스, 크롬 확인) 2015.06.19 8577
141 예제 - 자바스크립트로 현재 달의 달력 만들기 (calendar) 2015.06.19 10063
140 핸드폰 번호 일부 마스킹크 작업 (정규식 이용) 2015.06.19 10741
139 창에 대한 정보얻기 (창 크기, 창 위치) file 2015.06.19 7297
138 Location 객체 - URL 파싱 - URL에서 전달인자 추출하기 함수 작성 file 2015.06.19 8523
137 예제 - 이미지를 원본 크기로 볼 수 있도록 새창으로 열기 확장 (리사이징 및 이미지 드래그) file 2015.06.19 6798
136 창 크기 최대화 시키기 file 2015.06.19 12224
135 JSON API - JSON.parse(), JSON.stringify() ( json 형태의 문자열을 JSON객체로 , JSON객체를 문자열로 ) file 2015.06.19 6289
134 자바스크립트 API 문서 2015.06.19 9086
133 공백 검사 함수 2015.06.19 14595
132 자바스크립트 아이디 기억하기 기능 구현 (쿠키저장) file 2015.06.19 10924
131 [라디오버튼 오류 체크] 간단한 문제 예제 file 2015.06.19 7712
130 iframe사용시 높이 자동 조절 2015.06.19 6958
129 이벤트 - 페이지 로드 후 이벤트 처리하기 ( window.onload ) file 2015.06.19 10871
128 jquery offset()을 이용한 부드러운 스크롤 이동 2016.09.01 7277
Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 ... 13 Next
/ 13

하단 정보를 입력할 수 있습니다

© k2s0o1d4e0s2i1g5n. All Rights Reserved