| 제목 | 풀다운 메뉴(pulldown menu) css, js | ||
|---|---|---|---|
| 글쓴이 | darkninja | 작성시각 | 2023/05/13 22:45:28 |
|
|
|||
|
구시대의 유물인 풀다운 메뉴(pulldown menu) 입니다. 참고. https://github.com/codrops/Blueprint-HorizontalDropDownMenu/blob/master/js/cbpHorizontalMenu.js https://tympanus.net/codrops/2013/03/05/horizontal-drop-down-menu/ https://codyhouse.co/gem/mega-dropdown 10년쯤 묵은 코드인데 이제서야 개선할 실력이 되었네요. 참고한 소스중에 사라진 분도 계시고... 소스부분을 수정하면 정상적인 동작이 안될 가능성이 아주 많습니다 분석을 먼저 하신 후에 사용 바랍니다.
github 에 보관창고를 마련했습니다. https://github.com/darkninjaaa index.php
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<link rel="stylesheet" type="text/css" href="menu.css"; />
<style type="text/css" media="screen">
html,
body {
margin: 0;
height: 100%;
font-family: "맑은 고딕", "Malgun Gothic", "나눔고딕", "NanumGothic", "굴림", "Gulim", "Tahoma", "Verdana", "sans-serif";
}
.clearfix:before {
content: " ";
display: table;
}
.clearfix:after {
content: " "; /* Older browser do not support empty content */
display: table;
clear: both;
}
.clearfix8:after { /* if you don't require IE...8 support, the following is fine too: */
content: "";
display: table;
clear: both;
}
</style>
</head>
<body>
<div class="nav clearfix">
<div id="nav-button" class="nav-button">nav button</div>
<ul id="nav-ul" class="nav-ul submenu">
<li><a href="/" hyperlink="true" target_blank="true"><span>Home</span></a></li>
</li>
<li><a><span class="hassubmenu">php</span></a>
<ul class="submenu">
<li><a href="file"><span>File</span></a></li>
<li><a href="image"><span>Image</span></a></li>
<li><a href="json"><span>Json</span></a></li>
</ul>
</li>
<li><a><span class="hassubmenu">BLOG</span></a>
<ul class="submenu">
<li><a><span>HTML</span></a></li>
<li class="dropright"><a><span class="hassub">Design</span></a>
<ul>
<li><a><span>HTML</span></a></li>
<li><a><span>CSS</span></a></li>
<li class="dropright"><a><span class="hassub">Design</span></a>
<ul>
<li><a><span>Design</span></a></li>
<li class="dropright"><a><span class="hassub">HTML</span></a>
<ul>
<li class="dropright"><a><span class="hassub">ul class="submenu"</span></a>
<ul>
<li><a><span>who am i</span></a>
<li><a><span>who are u</span></a>
<li><a><span>who is dog</span></a>
</ul>
</li>
<li><a><span>li class="dropright"</span></a></li>
<li><a><span>span class="hassub"</span></a></li>
</ul>
</li>
<li><a><span>CSS</span></a></li>
<li><a><span>JavaScript</span></a></li>
</ul>
</li>
<li><a><span>JavaScript</span></a></li>
</ul>
</li>
<li><a><span>CSS</span></a></li>
<li><a><span>JavaScript</span></a></li>
</ul>
</li>
<li><a><span class="hassubmenu">Work</span></a>
<ul class="submenu">
<li><a><span>Web Design</span></a></li>
<li><a><span>Typography</span></a></li>
<li><a><span>Front-End</span></a></li>
</ul>
</li>
<li><a><span class="hassubmenu">Etc</span></a>
<ul class="submenu">
<div class="menucolumns">
<div class="menucolumn-12 clearfix">
<div class="menucol-12 menucol highlighted">
<div class="menucol-inner">
Tomatoes
</div>
</div>
<div class="menucol-3 menucol">
<div class="menucol-inner">
<h5>abc</h5>
<ul>
<li><a target="_blank" href="https://www.youtube.com/results?search_query=grafting+tree">grafting tree</a></li>
</ul>
</div>
</div>
<div class="menucol-3 menucol">
<div class="menucol-inner">
<h5>def</h5>
<ul>
<li><a>Apple</a></li>
</ul>
</div>
</div>
<div class="menucol-3 menucol">
<div class="menucol-inner">
<h5>ghi</h5>
<ul>
<li><a>Banana</a></li>
</ul>
</div>
</div>
<div class="menucol-3 menucol">
<div class="menucol-inner">
<h5>zzz</h5>
<ul>
<li><a>Grape</a></li>
</ul>
</div>
</div>
</div>
</div>
</ul>
</li>
<li><a><span>About</span></a></li>
<div class="menu_right">
who am i ?
</div>
</ul>
</div>
<script type="text/javascript" src="menu.js"></script>
<script>
let menu = new Menu({
nav_button : "nav-button",
nav_ul : "nav-ul"
});
</script>
</body>
</html>
menu.css
/* menu-sub */
.submenuopen .submenu {
display: block;
}
.menu_right {
float: right;
padding: 0px 3px 0px 0px;
}
.menu_right form,
.menu_right form span {
font-size: 12px;
}
.nav {
position: relative;
}
.nav-button {
display: none;
}
.nav-ul {
display: block;
position: relative;
width: 100%;
z-index:5555;
list-style: none;
list-style-type: none;
margin: 0px;
padding: 0px;
letter-spacing: 0px;
word-spacing: 0px;
white-space: nowrap;
border-bottom: 0px solid #777;
font-size: 16px;
background: #acacac;
}
.nav ul li {
position:relative;
display: block;
color: #fff;
list-style: none;
font-size: 16px;
}
.nav ul li span {
font-size: 16px;
}
.nav a {
text-decoration: none;
}
.nav ul li a {
padding: 0 10px 0 10px;
color:#111;
text-decoration: none;
}
.nav-ul li.submenuopen > a {
color: #333;
background: #47a3da;
}
.nav-ul li.submenuopen > a:hover {
color: #eee;
background: #47a3da;
}
/* first level */
.nav-ul > li:hover > a {
color: #888;
background: #e9e9e9;
}
.nav-ul.submenu {
position:relative;
float: left;
}
.nav-ul.submenu > li {
float: left;
margin: 0px 0px 0px 0px;
display: inline;
}
.nav-ul.submenu > li .hassubmenu:after {
width: 0;
height: 0;
border: 5px solid transparent;
border-bottom: none;
border-top-color: #fff;
content: '';
vertical-align: middle;
display: inline-block;
position: relative;
right: -5px;
}
/* second level */
.nav-ul li > ul {
display: none;
position: absolute;
top: 0;
left: 100%;
white-space: nowrap;
background: #bbb;
z-index:7777;
padding: 2px;
min-width: 110px;
}
.nav-ul li.submenuopen > ul {
background: #bbb;
}
.nav-ul li:hover > ul {
display: block;
background: #ccc;
z-index:9999;
}
.nav-ul li:hover > ul li a {
display: block;
}
.nav-ul li > ul li a:hover {
color: #888;
background: #e9e9e9;
}
.nav-ul li > ul li .hassub:after {
content: '+';
/*position: absolute;*/
top: 50%;
right: 5px;
margin-top: -11px;
}
.nav-ul > li > ul.submenu {
position: absolute;
top: 100%;
left: 0;
}
.nav-ul > li > ul.submenu .menucolumns { /*do not set background-color*/
padding: 0 5px 5px 0;
}
.nav-ul > li > ul.submenu .menucolumns ul li a:hover {
color: #333;
background: #f5f5f5;
}
.nav-ul > li > ul.submenu .menucolumns .highlighted {
background: #9f9f9f;
border: 1px solid #c1c1c1;
}
/* third level */
.nav-ul .dropright ul {
display: none;
position: absolute;
top: 0;
left: 100%;
white-space: nowrap;
background: #ccc;
z-index:8888;
}
/* more level */
.nav-ul .dropright ul ul {
background: #c7c7c7;
}
.menucolumn-1 {width: 55px;}
.menucolumn-2 {width: 110px;}
.menucolumn-3 {width: 165px;}
.menucolumn-4 {width: 220px;}
.menucolumn-5 {width: 275px;}
.menucolumn-6 {width: 330px;}
.menucolumn-7 {width: 385px;}
.menucolumn-8 {width: 440px;}
.menucolumn-9 {width: 495px;}
.menucolumn-10 {width: 550px;}
.menucolumn-11 {width: 605px;}
.menucolumn-12 {width: 660px;}
.menucolumn-13 {width: 715px;}
.menucolumn-14 {width: 770px;}
.menucolumn-15 {width: 825px;}
.menucolumn-16 {width: 880px;}
.menucolumn-17 {width: 935px;}
.menucolumn-18 {width: 990px;}
.menucolumn-19 {width: 1045px;}
.menucolumn-20 {width: 1100px;}
.menucol-1 { width:50px; }
.menucol-2 { width:105px; }
.menucol-3 { width:160px; }
.menucol-4 { width:215px; }
.menucol-5 { width:270px; }
.menucol-6 { width:325px; }
.menucol-7 { width:380px; }
.menucol-8 { width:435px; }
.menucol-9 { width:490px; }
.menucol-10 { width:545px; }
.menucol-11 { width:600px; }
.menucol-12 { width:655px; }
.menucol-13 { width:710px; }
.menucol-14 { width:765px; }
.menucol-15 { width:820px; }
.menucol-16 { width:875px; }
.menucol-17 { width:930px; }
.menucol-18 { width:985px; }
.menucol-19 { width:1040px; }
.menucol-20 { width:1095px; }
.menucol-1, .menucol-2, .menucol-3, .menucol-4, .menucol-5, .menucol-6, .menucol-7, .menucol-8, .menucol-9, .menucol-10, .menucol-11, .menucol-12, .menucol-13, .menucol-14, .menucol-15, .menucol-16, .menucol-17, .menucol-18, .menucol-19, .menucol-20 {
display:inline-block;
float: left;
position: relative;
margin: 5px 0 0 5px;
background: #aaa;
}
.menucol-inner {
padding: 5px;
}
.submenu {
font-size: 16px;
}
.submenu h3 {
color: #555;
background: #939393;
padding: 2px 3px 2px 3px;
margin: 0;
font-size: 120%;
}
.submenu h4 {
color: #555;
background: #939393;
padding: 2px 3px 2px 3px;
margin: 0;
font-size: 110%;
}
.submenu h5 {
color: #555;
background: #939393;
padding: 2px 3px 2px 3px;
margin: 0;
font-size: 100%;
}
/* Examples for media queries */
@media screen and (max-width: 35em) {
.nav {
position: relative;
}
.nav-button {
display: block;
cursor: pointer;
font-size: 110%;
font-weight: 700;
margin: 0;
padding: 5px;
background: #39b1cc;
}
.nav-button::before {
display: block;
content: '';
position: absolute;
height: 3px;
width: 22px;
border-top: 3px solid #d3eced;
right: 7px;
top: 8px;
}
.nav-button::after {
display: block;
content: '';
position: absolute;
height: 3px;
width: 22px;
border-top: 3px solid #d3eced;
border-bottom: 3px solid #d3eced;
right: 7px;
top: 14px;
}
.nav-ul {
height: auto;
display: none;
position: relative;
white-space: nowrap;
}
.nav-ul.open {
display: block;
}
.nav-ul li a {
padding: 0 10px 0 10px;
}
.submenu li {
display: block;
}
.menu_right {
float:none;
}
.menu_right form {
padding: 0 0;
}
/* first level */
.nav-ul li {
float: none;
}
.nav-ul.submenu {
position:relative;
}
.nav-ul.submenu > li {
position:relative;
display: block;
float: none;
padding: 0;
}
/* second level */
.nav-ul li > ul {
position: static;
display: none;
}
.nav-ul li > ul.submenu {
position:relative;
top: 0;
left: 0;
}
.nav-ul li > ul.submenu .menucolumns {
margin: 0px 0 0 0;
padding: 0 2px 0 0;
}
/* third level */
.nav-ul .dropright ul {
position: static;
padding: 0 0 0 3px;
}
/* more level */
.nav-ul .dropright ul ul {
}
.menucol-1, .menucol-2, .menucol-3, .menucol-4, .menucol-5, .menucol-6, .menucol-7, .menucol-8, .menucol-9, .menucol-10, .menucol-11, .menucol-12, .menucol-13, .menucol-14, .menucol-15, .menucol-16, .menucol-17, .menucol-18, .menucol-19, .menucol-20 {
float: none;
width: auto;
margin: 2px 0 2px 2px;
}
.menucolumn-1, .menucolumn-2, .menucolumn-3, .menucolumn-4, .menucolumn-5, .menucolumn-6, .menucolumn-7, .menucolumn-8, .menucolumn-9, .menucolumn-10, .menucolumn-11, .menucolumn-12, .menucolumn-13, .menucolumn-14, .menucolumn-15, .menucolumn-16, .menucolumn-17, .menucolumn-18, .menucolumn-19, .menucolumn-20 {
width: auto;
}
.nav-ul > li > ul.submenu .menucolumns .menucol {
position:relative;
display: block;
float: none;
padding: 0;
}
}
menu.js
/**
* Menu.js v1.0.0
*/
var MENU_NAV_BUTTON = "nav-button"
var MENU_NAV_UL = "nav-ul"
var _typeof =
typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ?
function(obj) { return typeof obj; } :
function(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
var _extends = Object.assign || function(target) {
for (var i = 1; i < arguments.length; i++) {
var source = arguments[i];
for (var key in source) {
if (Object.prototype.hasOwnProperty.call(source, key)) {
target[key] = source[key];
}
}
}
return target;
};
var _createClass = function() {
function defineProperties(target, props)
{
for (var i = 0; i < props.length; i++)
{
var descriptor = props[i];
descriptor.enumerable = descriptor.enumerable || false;
descriptor.configurable = true;
if ("value" in descriptor) descriptor.writable = true;
Object.defineProperty(target, descriptor.key, descriptor);
}
}
return function(Constructor, protoProps, staticProps) {
if (protoProps) defineProperties(Constructor.prototype, protoProps);
if (staticProps) defineProperties(Constructor, staticProps);
return Constructor;
};
}();
function _classCallCheck(instance, Constructor)
{
if (!(instance instanceof Constructor)) {
throw new TypeError("Cannot call a class as a function");
}
}
var Menu = function()
{
function Menu()
{
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
_classCallCheck(this, Menu);
_extends(this, {
nav_button: MENU_NAV_BUTTON, /* id */
nav_ul: MENU_NAV_UL /* id */
}, options);
this.LastselectedulLi = null;
this.init();
}
_createClass( Menu,
[
{
key: "init",
value: function init() {
this.setListner_Navclick();
this.setListner_NavUlLiclick();
this.setListner_bodyclick();
this.setListner_bodykeyup();
}
},
{
key: "setListner_Navclick",
value: function setListner_Navclick() {
var _thisNavclick = this;
var nav_button = document.getElementById(_thisNavclick.nav_button);
nav_button.addEventListener('click', function(event) {
event.preventDefault();
var nav_ul = document.getElementById(_thisNavclick.nav_ul);
if (nav_ul.classList.contains('open')) {
nav_ul.classList.remove('open');
}
else {
nav_ul.classList.add('open');
}
return false;
} );
}
},
{
key: "setListner_NavUlLiclick",
value: function setListner_NavUlLiclick() {
var _thisNavUlLi = this;
var menuItems = document.querySelectorAll("#"+_thisNavUlLi.nav_ul+" > li > a > span")
for (var i = 0; i < menuItems.length; i++) {
menuItems[i].addEventListener('click', function(event) {
event.preventDefault();
_thisNavUlLi.NavUlLi_open(event);
return false;
} );
}
}
},
{
key: "NavUlLi_open",
value: function NavUlLi_open(event) {
var itemulLi = event.target.parentNode.parentNode;
if( this.LastselectedulLi !== null ) {
if (this.LastselectedulLi.classList.contains('submenuopen')) {
this.LastselectedulLi.classList.remove('submenuopen');
}
}
if( this.LastselectedulLi == itemulLi ) {
if (itemulLi.classList.contains('submenuopen')) {
itemulLi.classList.remove('submenuopen');
}
this.LastselectedulLi = null;
}
else {
if (event.target.parentNode.getAttribute('hyperlink') != "true") {
itemulLi.classList.add('submenuopen');
this.LastselectedulLi = itemulLi;
}
}
if (event.target.parentNode.getAttribute('hyperlink') == "true") {
if (event.target.parentNode.getAttribute('target_blank') == "true")
window.open(event.target.parentNode.getAttribute('href'));
else
location.href = event.target.parentNode.getAttribute('href');
}
}
},
{
key: "setListner_bodyclick", //display: none; nav-ul > li > ul
value: function setListner_bodyclick() {
var _thisbodyclick = this;
var body = document.body;
body.addEventListener('click', function(event) {
var itemulLi = _thisbodyclick.LastselectedulLi;
// event.target.closest('.')
// event.target.parentNode.querySelector('.')
if (itemulLi !== null && ! itemulLi.contains(event.target.parentNode)) {
if (itemulLi.classList.contains('submenuopen')) {
itemulLi.classList.remove('submenuopen');
}
_thisbodyclick.LastselectedulLi = null;
}
} );
}
},
{
key: "setListner_bodykeyup", //display: none; nav-ul > li > ul
value: function setListner_bodykeyup() {
var _thisbodykeyup = this;
var body = document.body;
body.addEventListener('keyup', function(event) {
if (event.code == 'Escape') {
var itemulLi = _thisbodykeyup.LastselectedulLi;
if (itemulLi !== null) {
if (itemulLi.classList.contains('submenuopen')) {
itemulLi.classList.remove('submenuopen');
}
_thisbodykeyup.LastselectedulLi = null;
}
}
} );
}
}
]
);
return Menu;
}();
if ((typeof module === "undefined" ? "undefined" : _typeof(module)) === 'object') {
module.exports = Menu;
}
|
|||
| 다음글 | ajaxcall - How can I make an A... (1) | ||
| 이전글 | ci4 초 간단 csv 작성 [한글 안깨짐] | ||
| 없음 |