Accordian Panel Widthways

옆으로 열고 닫는 아코디언 패널 만들기

Step.1

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis neque urna, molestie id cursus non, bibendum nec magna. Mauris consequat faucibus ante sollicitudin ullamcorper. Proin et felis orci. Nulla vitae diam sit amet felis semper ultricies. Nulla vitae mauris sit amet augue pulvinar pulvinar. Donec tincidunt viverra turpis eget suscipit. Morbi eu lacus iaculis turpis suscipit pretium. Aenean ultricies scelerisque dictum. Phasellus tincidunt, nibh lacinia facilisis aliquam, lacus quam condimentum orci, id lacinia justo odio vel purus. Mauris molestie tortor eu purus facilisis at congue sapien commodo. Sed ac eros vitae odio ultrices mollis nec a lorem. Phasellus sit amet dolor nec tellus consequat ornare sit amet ut ipsum. Vestibulum sagittis, mi sed pulvinar semper, lacus mauris lobortis eros, eu egestas est lectus nec lacus. Donec in lacus quis elit consectetur accumsan sit amet sed tortor. Etiam id vestibulum libero. Nam faucibus tincidunt felis, eu feugiat nibh fringilla vel. Donec adipiscing dictum imperdiet. Nulla ac fringilla neque. Curabitur posuere euismod est vel vehicula. Curabitur quis ligula sit amet quam tempus venenatis.

Step.2

Integer rhoncus felis mauris. Donec massa nisi, posuere vel posuere vel, suscipit sed magna. Sed congue scelerisque odio, faucibus tempor nisl posuere condimentum. In eu tellus vitae elit consequat pretium. Maecenas nec ultrices dolor. Curabitur eu pulvinar turpis. Aenean vel tortor justo, id dapibus velit. Mauris pulvinar massa sit amet erat mollis sit amet ornare tellus aliquet. Quisque ullamcorper elementum libero, ut vehicula neque placerat nec. In hac habitasse platea dictumst. In hac habitasse platea dictumst. Morbi et ante turpis, et fringilla tortor. In hac habitasse platea dictumst. Proin eros urna, sagittis vitae tristique et, ullamcorper ac leo. Donec elementum arcu tortor. Praesent tincidunt dui in est adipiscing ac lobortis lorem porttitor. Nullam et dui elit. Vivamus hendrerit vestibulum enim, quis lobortis erat viverra vitae. Donec at pellentesque mi. Mauris lobortis libero ac metus ultricies accumsan.

Step.3

Integer pretium porttitor lectus at tempor. Donec nec cursus elit. Maecenas ornare malesuada urna vitae lobortis. Sed vulputate sapien quis purus cursus consectetur. Aenean nulla neque, egestas ut accumsan nec, convallis vel enim. Vestibulum vehicula interdum diam nec condimentum. Etiam in condimentum justo. Fusce a tortor metus, id pellentesque orci. Sed facilisis, tellus quis tempus faucibus, justo elit sodales lorem, eget placerat lectus risus bibendum ipsum. Donec varius mattis quam eu consequat. Praesent ut metus nec nibh tincidunt suscipit. Nam vulputate sodales egestas. Sed orci lectus, vestibulum ac gravida eget, congue non velit. Morbi rutrum convallis orci, in hendrerit arcu vulputate a. Aliquam aliquam facilisis libero, sit amet facilisis lacus tincidunt ac. Sed viverra nulla sit amet turpis egestas nec molestie justo congue. Vivamus a lacinia sem. Aenean ut metus arcu, non ornare orci. Praesent feugiat est eu tellus dictum ac imperdiet nisi imperdiet.

HTML

							
Step.1

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis neque urna, molestie id cursus non, bibendum nec magna. Mauris consequat faucibus ante sollicitudin ullamcorper. Proin et felis orci. Nulla vitae diam sit amet felis semper ultricies. Nulla vitae mauris sit amet augue pulvinar pulvinar. Donec tincidunt viverra turpis eget suscipit. Morbi eu lacus iaculis turpis suscipit pretium. Aenean ultricies scelerisque dictum. Phasellus tincidunt, nibh lacinia facilisis aliquam, lacus quam condimentum orci, id lacinia justo odio vel purus. Mauris molestie tortor eu purus facilisis at congue sapien commodo. Sed ac eros vitae odio ultrices mollis nec a lorem. Phasellus sit amet dolor nec tellus consequat ornare sit amet ut ipsum. Vestibulum sagittis, mi sed pulvinar semper, lacus mauris lobortis eros, eu egestas est lectus nec lacus. Donec in lacus quis elit consectetur accumsan sit amet sed tortor. Etiam id vestibulum libero. Nam faucibus tincidunt felis, eu feugiat nibh fringilla vel. Donec adipiscing dictum imperdiet. Nulla ac fringilla neque. Curabitur posuere euismod est vel vehicula. Curabitur quis ligula sit amet quam tempus venenatis.

Step.2

Integer rhoncus felis mauris. Donec massa nisi, posuere vel posuere vel, suscipit sed magna. Sed congue scelerisque odio, faucibus tempor nisl posuere condimentum. In eu tellus vitae elit consequat pretium. Maecenas nec ultrices dolor. Curabitur eu pulvinar turpis. Aenean vel tortor justo, id dapibus velit. Mauris pulvinar massa sit amet erat mollis sit amet ornare tellus aliquet. Quisque ullamcorper elementum libero, ut vehicula neque placerat nec. In hac habitasse platea dictumst. In hac habitasse platea dictumst. Morbi et ante turpis, et fringilla tortor. In hac habitasse platea dictumst. Proin eros urna, sagittis vitae tristique et, ullamcorper ac leo. Donec elementum arcu tortor. Praesent tincidunt dui in est adipiscing ac lobortis lorem porttitor. Nullam et dui elit. Vivamus hendrerit vestibulum enim, quis lobortis erat viverra vitae. Donec at pellentesque mi. Mauris lobortis libero ac metus ultricies accumsan.

Step.3

Integer pretium porttitor lectus at tempor. Donec nec cursus elit. Maecenas ornare malesuada urna vitae lobortis. Sed vulputate sapien quis purus cursus consectetur. Aenean nulla neque, egestas ut accumsan nec, convallis vel enim. Vestibulum vehicula interdum diam nec condimentum. Etiam in condimentum justo. Fusce a tortor metus, id pellentesque orci. Sed facilisis, tellus quis tempus faucibus, justo elit sodales lorem, eget placerat lectus risus bibendum ipsum. Donec varius mattis quam eu consequat. Praesent ut metus nec nibh tincidunt suscipit. Nam vulputate sodales egestas. Sed orci lectus, vestibulum ac gravida eget, congue non velit. Morbi rutrum convallis orci, in hendrerit arcu vulputate a. Aliquam aliquam facilisis libero, sit amet facilisis lacus tincidunt ac. Sed viverra nulla sit amet turpis egestas nec molestie justo congue. Vivamus a lacinia sem. Aenean ut metus arcu, non ornare orci. Praesent feugiat est eu tellus dictum ac imperdiet nisi imperdiet.

옆으로 움직이는 아코디언은 대부분 라벨 텍스트를 위에서 아래로 표시하지만 HTML과 CSS에서는 위에서 아래로 표시하는 텍스트의 표현이 불가능하므로 이미지를 이용할 필요가 있습니다. 라벨을 이미지로 만들기 위해 dl태그를 div태그로 감싸고 각각의 dt태그에 id속성을 추가하였으며 dt태그 안에 span 태그를 추가하였습니다.

CSS

							div#widthways {width:600px;height:300px;margin:50px auto;overflow:hidden;}
							div#widthways dl{width:700px;height:300px;}
							div#widthways dl dt{width:35px;height:300px;float:left;}
							div#widthways dl dt span{display:block;width:100%;height:100%;text-indent:-9999px;}
							div#widthways dl dt span.over{cursor:pointer;}
							div#widthways dl dt span.selected{cursor:default;}
							div#widthways dl dt#step1 span{background:url("/florakid_lib/images/sample/background-1.jpg");}
							div#widthways dl dt#step1 span.over{background:url("/florakid_lib/images/sample/background-1-over.jpg");}
							div#widthways dl dt#step1 span.selected{background:url("/florakid_lib/images/sample/background-1-selected.jpg");}
							div#widthways dl dt#step2 span{background:url("/florakid_lib/images/sample/background-2.jpg");}
							div#widthways dl dt#step2 span.over{background:url("/florakid_lib/images/sample/background-2-over.jpg");}
							div#widthways dl dt#step2 span.selected{background:url("/florakid_lib/images/sample/background-2-selected.jpg");}
							div#widthways dl dt#step3 span{background:url("/florakid_lib/images/sample/background-3.jpg");}
							div#widthways dl dt#step3 span.over{background:url("/florakid_lib/images/sample/background-3-over.jpg");}
							div#widthways dl dt#step3 span.selected{background:url("/florakid_lib/images/sample/background-3-selected.jpg");}
							div#widthways dl dd{margin:0;width:496px;height:300px;float:left;background:#d4d0c8;overflow:hidden;}
							div#widthways dl dd p{width:455px;text-align:1em;padding:20px;}
						

dt태그와dd태그는 float:left를 이용하여 옆으로 나란히 배치하고 있습니다. dl태그의 폭은 dt태그(35px*3). dd태그(495px)를 합친 값이 되므로 600px이 되어야 하지만 패널이 열고 닫히는 타이밍에 600을 넘어버리는 라인은 잘려 버리는 경우가 있을 수 있기 때문에 700px로 설정하여 라인이 잘리는 것을 막았습니다. 그 대신 dl태그를 감싸는 div#widthways태그에 width:600px과 overflow:hidden을 설정하여 남는 100px만큼 표시를 숨기고 있습니다.

dd태그에는 overflow:hidden. dd태그의 p태그에 width:455px을 설정하고 있습니다. 패널이 열리고 닫힐 때 dd태그의 width가 변경되어도 패널의 텍스트 영역이 변하지 않게 하기 위해서입니다. 이런 설정을 하지 않으면 슬라이드 애니메이션 중에 텍스트가 깨져버릴 수 있습니다.(p태그의 경우, (width:455px+padding:20px*2=width:495px)로 dd태그의 영역을 꽉 채워서 하나의 box형식을 유지합니다.)

SCRIPT

							$(document).ready(function(){
								$("dd:not(:first)","#widthways").css("width","0px");
								$("dt:first span","#widthways").addClass("selected");
								$("dl dt").click(function () {
									if ($("+dd",this).css("width")=="0px") {
										$("dt:has(.selected) +dd").animate({"width":"0px"});
										$("+dd", this).animate({"width":"495px"});
										$("dt span").removeClass("selected");
										$("span",this).addClass("selected");
									}
								}).mouseover(function(){
									$("span", this).addClass("over");
								}).mouseout(function(){
									$("span", this).removeClass("over");
								});
							});
						

최초로 표시되는 설정에서는 첫 번째 이외의 패널(dd태그)의 width를 0px로 변경합니다.

							$("dd:not(:first)").css("width","0px");
						

첫 번째의 dt태그에 대해서 class 속성 "selected"를 추가하고 펼쳐져 있는 라벨의 스타일을 설정합니다.

							$("dt:first span").addClass("selected");
						

if문으로 클릭된 라벨에 해당하는 패널(dd태그)의 폭이 0인 경우의 처리를 기술합니다.

							if ($("+dd"),this).css("width")=="0px") {...}
						

라벨이 클릭되면 class속성이 "selected"인 태그를 포함한 dt태그(선택되어 있는 상태인dt태그)의 다음 dd태그의 폭(width)을 0으로 변경합니다. 폭의 변경에는 임의의 class 속성값을 애니메이션 효과로 변경시키는 animate()를 사용합니다. 이렇게 하면 열리는 패널이 닫힙니다.

							$("dt:has(.selected) +dd").animate({"width":"0px"});
						

같은 식으로 클릭된 태그의 다음 dd태그의 폭(width)을 animate()로 495px로 변경합니다. 이렇게 하면 클릭된 라벨에 해당하는 패널이 펼쳐집니다.

							$("+dd", this).animate({"width":"495px"});
						

클릭된 라벨을 선택된 상태로 하기 위해 모든 span태그에 있는 class 속성값 "selected"를 삭제하고 클릭된 dt태그 안의 span태그에 class속성값 "selected"를 재설정합니다.

							$("dt span").removeClass("selected");
							$("span", this).addClass("selected");
						

마지막으로 mouseover/mouseout 이벤트로 롤오버 처리를 설정하면 완성입니다.

							$("dl dt").click(function() {
								... 중략... 
							}).mouseover(function() {
								$("span", this).addClass("over");
							}).mouseout(function() {
								$("span", this).removeClass("over");
							});