메뉴 건너뛰기

조회 수 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
번호 제목 날짜 조회 수
187 HTML 화면을 PDF로 출력 file 2019.01.08 5205
186 == / === / != / !== 차이 2018.11.07 1443
185 오늘 날짜 구하기 2018.11.07 1411
184 jQuery 엘리먼트 선택 2018.10.27 1732
183 자바스크립트 urlencode(), urldecode(), rawurlencode(), rawurldecode() 2018.10.27 1913
182 자바스크립트 배열 중복값 다루기 2018.10.27 3898
181 JavaScript 출생년도에 따른 나이 계산 자바스크립트 2018.09.28 3252
180 엔터키 / enter key submit form 2018.09.28 1528
179 팝업창 차단 "허용 메시지" 2018.09.28 1738
178 테이블에서 해당 열의 인덱스 값 얻는 방법 2018.08.29 2789
177 key pressing 누르거나 클릭중인 이벤트 예제 2018.08.29 1619
176 유용한 스크립트 모음 2018.07.24 2293
175 cross site scripting을 막기위한...javascript 2018.07.24 1596
174 다음 우편번호(주소) api 예시 file 2018.07.04 4902
173 스마트에디터(SmartEditor)에서 textarea 유효성 체크하기 2018.07.04 3963
172 반복문 사용할때 태그 식별하기 data-item 2018.07.04 1849
171 SelectBox에서 선택된 항목의 텍스트, 값 가져오기 선택 옵션 넣기. 2018.07.04 4014
170 체크박스(CheckBox) 전체 선택, 전체 해제 checked file 2018.07.04 2910
169 스마트 에디터 (네이버 에디터) 에디터 내에서 이미지 크기 줄이기.(리사이징) file 2018.07.04 2711
168 Javascript selectbox selected 컨트롤 file 2018.06.21 10055
Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 ... 13 Next
/ 13

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

© k2s0o1d4e0s2i1g5n. All Rights Reserved