亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

以JavaScript來實現WordPress中的二級導航菜單的方法

2019-11-20 11:01:12
字體:
來源:轉載
供稿:網友

導航菜單
導航菜單早已 "深入民心", 在博客上的應用日益重要且多樣. 從本文開始, 我將開展幾個關于 WordPress 導航菜單的話題, 討論如何在 WordPress 上使用和加強導航菜單, 話題間有一定的承接關系, 難度也會逐步增加.

20151214144601612.png (266×24)

WordPress 上的導航菜單一般有兩種, 頁面導航菜單和分類導航菜單.
可曾記得? WordPress 是可以撰寫獨立頁面的, 頁面導航菜單就是以首頁和各個獨立頁面組成的菜單. 而分類導航菜單則是以首頁和各個分類組成的菜單.
這是效果演示
既然菜單由首頁和獨立頁面列表或首頁和分類列表所組成, 我們就需要處理兩個環節, 即首頁菜單項和其他菜單項.
另外, 我們還需要處理菜單項的三個狀態, 即一般狀態, 當前菜單項狀態 (如: 在首頁中, 首頁菜單項就是當前菜單項) 和選中菜單項狀態.
也就是說, 我們共需要處理 3 個事情:
1. 首頁外的其他菜單項
2. 首頁菜單項
3. 菜單項處于不同狀態時的視覺效果

預想結構:

<div id="menubar"> <ul class="menus"> <li class="..."><a href="http://.../">Home</a></li> <li class="..."><a href="http://.../">菜單項1</a></li> <li class="..."><a href="http://.../">菜單項2</a></li> <li class="..."><a href="http://.../">菜單項3</a></li> ... </ul></div>

頁面導航菜單

1. 獨立頁面列表作為菜單項
調用 wp_list_pages 獲取獨立頁面列表, 并使用以下參數:
depth: 列表深度(層的最大數量), 本文討論的是一級菜單, 故最大深度為 1
title_li: 標題字符串, 這里不需要, 設為 0
sort_column: 列表項的排序方式, 根據創建頁面時所設定的 order 進行升序排列
打印獨立頁面菜單項的語句是:

<?php wp_list_pages('depth=1&title_li=0&sort_column=menu_order'); ?>

2. 首頁菜單項
由于一般獨立頁面的 class 是 page_item, 當前獨立頁面的 class 是 current_page_item. 當頁面是首頁時, 首頁菜單項的 class 應該是 current_page_item, 其他情況則是 page_item. 為此, 我們需要一段分支代碼來為它確定 class:

<?php // 如果是首頁, class 是 current_page_itemif (is_home()) { $home_menu_class = 'current_page_item';// 如果不是首頁, class 是 page_item} else { $home_menu_class = 'page_item';} ?>

打印首頁菜單項的語句是:

<li class="<?php echo($home_menu_class); ?>"> <a title="Home" href="<?php echo get_settings('home'); ?>/">Home</a></li>

3. 菜單的樣式
這是一個從普遍到特殊的處理過程, 一般菜單項的樣式放前面, 當前和選中菜單項的樣式放在后面, 當后者條件滿足就會覆蓋前者的樣式, 從而改變外觀.

/* 菜單項 */#menubar ul.menus li { float:left; /* 靠左浮動 */ list-style:none; /* 清空列表風格 */ margin-right:1px; /* 右側的間隔 */}/* 菜單項鏈接 */#menubar ul.menus li a { padding:5px 10px; /* 內邊距 */ display:block; /* 顯示為塊 */ color:#FFF; /* 文字顏色 */ background:#67ACE5; /* 背景顏色 */ text-decoration:none; /* 沒有下橫線 */}/* 當前菜單項鏈接 */#menubar ul.menus li.current_page_item a { background:#5495CD; /* 背景顏色 */}/* 選中菜單項鏈接 */#menubar ul.menus li a:hover { background:#4281B7; /* 背景顏色 */}

分類導航菜單

1. 分類列表作為菜單項
調用方法 wp_list_categories 獲取分類列表, 并使用以下參數:
depth: 列表深度(層的最大數量), 本文討論的是一級菜單, 故最大深度為 1
title_li: 標題字符串, 這里不需要, 設為 0
orderby: 列表項的排序方式, 根據創建頁面時所設定的 order 進行升序排列
show_count: 是否顯示該分類的文章數量, 這里不需要顯示, 設為 0
打印分類菜單項的語句是:

<?php wp_list_categories('depth=1&title_li=0&orderby=name&show_count=0'); ?>

2. 首頁菜單項
與頁面導航菜單相似, 只是菜單項的 class 有所不同.
page_item 更改為 cat-item
current_page_item 更改為 current-cat

3. 菜單的樣式
因為菜單項的 class 略有不同, 所以也需稍作修改.
current_page_item 更改為 current-cat


二級導航菜單

20151214144739496.png (460×160)

我們已經知道菜單如何創建了, 這回我們要使用分類列表做成二級導航菜單. 我們要做的其實是在原有的基礎上改出二級菜單, 以及對二級菜單進行處理. (請確保的的分類中包含子分類, 否則調不出二級菜單.)
我們共需要處理 3 個事情:
1. 調出二級菜單 (子分類)
2. 二級菜單的樣式
3. 二級菜單的效果

預想結構

<div id="menubar"> <ul class="menus"> <li class="..."><a href="http://.../">Home</a></li> <li class="...">  <a href="http://.../">菜單1</a>  <ul class="children">  <li class="..."><a href="http://.../">菜單項1</a></li>  <li class="..."><a href="http://.../">菜單項2</a></li>  <li class="..."><a href="http://.../">菜單項3</a></li>  </ul> </li> <li class="...">  <a href="http://.../">菜單2</a>  <ul class="children">  <li class="..."><a href="http://.../">菜單項4</a></li>  </ul> </li> <li class="...">  <a href="http://.../">菜單3</a>  <ul class="children">  <li class="..."><a href="http://.../">菜單項5</a></li>  <li class="..."><a href="http://.../">菜單項6</a></li>  </ul> </li> ... </ul></div>

實施操作

1. 調出二級菜單 (子分類)
是否還記得制作導航菜單時是如何設定列表深度的? 當時將深度設為 1 是為了不顯示子分類, 現在要二級子分類當然要將深度設為 2 了.
depth: 列表深度(層的最大數量), 本文討論的是二級菜單, 故最大深度為 2.
打印分類菜單項的語句是:

<?php wp_list_pages('depth=2&title_li=0&sort_column=menu_order'); ?>

2. 二級菜單的樣式
也只是在本來的樣式上進行修改, 加上子分類的樣式.

/* 二級菜單 */#menubar ul.children { display:none; /* 初始化頁面時不顯示出來 */ padding:0; margin:0;}/* 二級菜單的菜單項 */#menubar ul.children li { float:none; /* 垂直排列 */ margin:0; padding:0;}/* 二級菜單的當前菜單項鏈接 */#menubar ul.children li a { width:100px; /* 對 IE6 來說十分很重要 */}

打印首頁菜單項的語句是:

<li class="<?php echo($home_menu_class); ?>"> <a title="Home" href="<?php echo get_settings('home'); ?>/">Home</a></li>

3. 二級菜單的效果
全部使用 JavaScript 實現, 為便于理解, 使用面向對象方式編寫代碼, 借鑒了部分 Prototype 框架的代碼. 因為代碼比較多, 不適合逐句解說, 所以我已標上了大量注釋. 代碼不是很復雜, 有 JS 基礎的話應該不會存在障礙.
另外為了迎合個別人的口味, 加上透明效果. Enjoy!

/* Author: mg12Feature: MenuList with second-level menusUpdate: 2008/08/30Tutorial URL: http://www.neoease.com/wordpress-menubar-2/ */ /** 類 */var Class = { create: function() { return function() {  this.initialize.apply(this, arguments); } }} /** 菜單列表 */var MenuList = Class.create();MenuList.prototype = {  /** * 構造方法 * id: 菜單列表 * opacity: 透明度 (0.0 - 1.0, 0.0 為全透明, 1.0 為不透明) */ initialize: function(id, opacity) { // 獲取菜單列表 this.obj = document.getElementById(id); if (!this.obj) { return; }  // 對菜單列表內的所有菜單進行處理 var menus = this.obj.childNodes; for (var i = 0; i < menus.length; i++) {  var menu = menus[i];  if (menu.tagName == 'LI') {  // 構建菜單  new Menu(menu, opacity);  } } }} /** 菜單 */var Menu = Class.create();Menu.prototype = {  /** * 構造方法 * target: 目標菜單 * opacity: 透明度 (0.0 - 1.0, 0.0 為全透明, 1.0 為不透明) */ initialize: function(target, opacity) { this.util = new MenuUtil();  // 獲取目標菜單 (沒多余元素) this.obj = this.util.cleanWhitespace(target); // 定義透明度, 默認為不透明 this.opacity = opacity || 1;  // 獲取菜單 this.menu = this.obj.childNodes  // 重要! 如果菜單不包含菜單項, 則不進行處理 if (this.menu.length < 2) { return; }  // 菜單標題和菜單體 this.title = this.menu[0]; this.body = this.menu[1];   // 定義初始樣式 this.util.setStyle(this.body, 'visibility', 'hidden'); this.util.setStyle(this.body, 'position', 'absolute'); this.util.setStyle(this.body, 'overflow', 'hidden'); this.util.setStyle(this.body, 'display', 'block');  // 添加監聽器 this.addListener(this.obj, 'mouseover', this.util.bind(this, this.activate), false); this.addListener(this.obj, 'mouseout', this.util.bind(this, this.deactivate), false); },  /** * 激活方法 * 當鼠標移動到菜單標題是激活 */ activate: function() { // 獲取當前菜單體的位置 var pos = this.util.cumulativeOffset(this.title); var left = pos[0]; var top = pos[1] + this.util.getHeight(this.title);  // 定義激活時樣式 this.util.setStyle(this.body, 'left', left + 'px'); this.util.setStyle(this.body, 'top', top + 'px'); this.util.setStyle(this.body, 'visibility', 'visible'); this.util.setStyle(this.body, 'opacity', this.opacity); this.util.setStyle(this.body, 'filter', 'alpha(opacity=' + this.opacity * 100 + ')'); },  /** * 解除方法 * 當鼠標移動出菜單標題是激活 */ deactivate: function(){ // 定義解除時樣式 this.util.setStyle(this.body, 'visibility', 'hidden'); },  /** * 監聽方法 * element: 監聽對象 * name: 監聽方法 * observer: 執行的方法 * useCapture: 瀏覽器調用事件的方式 (true 為 Capture 方式, false 為 Bubbling 方式) */ addListener: function(element, name, observer, useCapture) { if(element.addEventListener) {  element.addEventListener(name, observer, useCapture); } else if(element.attachEvent) {  element.attachEvent('on' + name, observer); } }} /** 一些實用的方法 */var MenuUtil = Class.create();MenuUtil.prototype = { initialize: function() { },  $: function(id) { return document.getElementById(id); },  $A: function(iterable) { if(!iterable) {  return []; } if(iterable.toArray) {  return iterable.toArray(); } else {  var results = [];  for(var i = 0; i < iterable.length; i++) {  results.push(iterable[i]);  }  return results; } },  bind: function() { var array = this.$A(arguments); var func = array[array.length - 1]; var _method = func, args = array, object = args.shift(); return function() {  return _method.apply(object, args.concat(array)); } },  getHeight: function(element) { return element.offsetHeight; },  setStyle: function(element, key, value) { element.style[key] = value; },  getStyle: function(element, key) { return element.style[key]; },  cleanWhitespace: function(list) { var node = list.firstChild; while (node) {  var nextNode = node.nextSibling;  if(node.nodeType == 3 && !//S/.test(node.nodeValue)) {  list.removeChild(node);  }  node = nextNode; } return list; },  cumulativeOffset: function(element) { var valueT = 0, valueL = 0; do {  valueT += element.offsetTop || 0;  valueL += element.offsetLeft || 0;  element = element.offsetParent; } while (element); return [valueL, valueT]; }} /** 添加到頁面加載事件 */window.onload = function(e) { new MenuList('menus', 0.9);}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩av最新在线| 欧洲亚洲妇女av| 在线播放国产一区二区三区| 精品国产一区二区三区久久狼黑人| 亚洲老头同性xxxxx| 欧美制服第一页| 国产成人精品免费视频| 亚洲欧美一区二区三区久久| 国产一区二区日韩精品欧美精品| 亚洲人成电影网站色| 色偷偷av一区二区三区乱| 亚洲国产日韩欧美在线99| 国产啪精品视频网站| 久久九九有精品国产23| 久久综合久久美利坚合众国| 国模gogo一区二区大胆私拍| 久久琪琪电影院| 日韩高清电影好看的电视剧电影| 日本一欧美一欧美一亚洲视频| 久久久免费精品视频| 免费不卡欧美自拍视频| 日韩精品在线观看一区二区| 91av网站在线播放| 色妞一区二区三区| 日韩黄在线观看| 精品国偷自产在线视频99| 国产99久久久欧美黑人| 波霸ol色综合久久| 国产亚洲精品成人av久久ww| 成人黄色在线免费| 日韩中文字幕精品视频| 欧美日韩第一页| 亚洲男人天堂2024| 久久在线免费观看视频| 久久亚洲国产精品成人av秋霞| 亚洲色图狂野欧美| 91免费视频国产| 亚洲人精选亚洲人成在线| 久久色精品视频| 欧美日韩亚洲视频一区| 最近2019年中文视频免费在线观看| 亚洲综合一区二区不卡| 亚洲在线免费视频| 亚洲欧美国产日韩中文字幕| 午夜精品一区二区三区在线视| 欧美激情在线狂野欧美精品| 午夜欧美不卡精品aaaaa| 久久国产精品久久精品| 久久91亚洲精品中文字幕奶水| 一区二区三区视频免费在线观看| 欧美大片在线免费观看| 欧美成人久久久| 国产精品一区二区久久久久| 夜夜躁日日躁狠狠久久88av| 国产欧美va欧美va香蕉在线| 播播国产欧美激情| 黄色成人在线免费| 欧美刺激性大交免费视频| 欧美午夜激情视频| 这里只有精品视频在线| 国产精品草莓在线免费观看| 日韩欧美国产网站| 亚洲精品免费一区二区三区| 亚洲qvod图片区电影| 国产精品www| 不卡av电影院| 麻豆一区二区在线观看| 91成人性视频| 欧美日本国产在线| 久久精品成人欧美大片| 韩国日本不卡在线| 久久精品视频网站| 国产一区欧美二区三区| 国产有码一区二区| 97人人做人人爱| 色香阁99久久精品久久久| 色婷婷av一区二区三区在线观看| 国产精品免费视频久久久| 欧美成年人视频网站欧美| 国产精品永久在线| 奇米成人av国产一区二区三区| 欧美又大又硬又粗bbbbb| 国产精品一二三在线| 911国产网站尤物在线观看| 色噜噜狠狠狠综合曰曰曰88av| 久久人人爽国产| 欧美黄色小视频| 中文字幕国产日韩| 午夜免费在线观看精品视频| 国产精品网站入口| 欧日韩不卡在线视频| 91精品国产电影| 成人激情视频网| 久久av资源网站| 国产精品丝袜一区二区三区| 国内精品久久久久影院 日本资源| 久久久久国产精品免费网站| 亚洲一级一级97网| 国产精品91久久久久久| 亚洲精品中文字幕av| 亚洲а∨天堂久久精品9966| 欧美中文在线视频| 欧美精品在线免费| 国产精品wwwwww| 日本久久久久亚洲中字幕| 久久99久久99精品中文字幕| 国产精品久久97| 亚洲精品视频中文字幕| 91久久在线视频| 久久精品成人动漫| 久久黄色av网站| 欧美激情一区二区三级高清视频| 精品国产一区二区三区久久久狼| 国产精品成人一区| 亚洲变态欧美另类捆绑| 久久久久久久久久久久久久久久久久av| 欧美精品性视频| 国产视频久久久久久久| 中文字幕日韩欧美| 国产成人综合久久| 日韩精品免费一线在线观看| 亚洲一区二区三区777| 欧美在线精品免播放器视频| 海角国产乱辈乱精品视频| 欧美日韩国产精品| 午夜精品久久久久久久99热浪潮| 亚洲欧美国产精品va在线观看| 国产精品一区二区3区| 国产98色在线| 精品国内产的精品视频在线观看| 国产91热爆ts人妖在线| 国产精品久久中文| 欧美成人高清视频| 国产精品∨欧美精品v日韩精品| 欧美xxxx综合视频| 日韩欧美精品免费在线| 亚洲品质视频自拍网| 日本高清视频一区| 亚洲理论在线a中文字幕| 国产精品国产三级国产专播精品人| 欧美日韩在线观看视频| 伦理中文字幕亚洲| 国产精品自拍视频| 欧美亚洲激情在线| 在线一区二区日韩| 欧美又大粗又爽又黄大片视频| 精品一区二区三区四区在线| 尤物九九久久国产精品的分类| 日韩精品中文字幕在线观看| 国产精品私拍pans大尺度在线| 在线电影欧美日韩一区二区私密| 久久精品美女视频网站| 亚洲成人黄色在线观看| 欧美裸体xxxx极品少妇| 亚洲成人久久网| 中文字幕日韩电影| 伊人青青综合网站| 亚洲黄色在线观看| 91精品国产91久久久久久不卡| 久久九九热免费视频| 欧美亚洲国产精品| 欧美主播福利视频| 欧美激情久久久| 久久香蕉国产线看观看av|