DDR爱好者之家 Design By 杰米
实现原理很简单,就是循环文章模块,并抽取其中的h2、h3标签,将其中的内容赋予给新建的title树。
代码如下:
HTML代码:
<div class="contextBox"> <div id="article"> <h2>二级标题</h2> <h3>三级标题</h3> <p>hello hello hello hello hello hello hello hello hello hello hello hello</p> <h3>三级标题</h3> <h3>三级标题</h3> <h3>三级标题</h3> <h3>三级标题</h3> <p>hello hello hello hello hello hello hello hello hello hello hello</p> <h2>二级标题</h2> <h3>三级标题</h3> <h3>三级标题</h3> <p>world world world world world world world world world world world world world world world world world world world world world world world world world world world world world world world </p> <h3>三级标题</h3> <h3>三级标题</h3> <h2>二级标题</h2> <h3>三级标题</h3> <h3>三级标题</h3> <h2>二级标题</h2> <h3>三级标题</h3> <h3>三级标题</h3> <h2>二级标题</h2> <h3>三级标题</h3> <h3>三级标题</h3> </div> <div class="articleMenu-box" id="articleMenu_box"> <span class="articleMenu-open" id="articleMenu_open"></span> <ul class="articleMenu hello" id="articleMenu"> <span class="articleMenu-close" id="articleMenu_close"></span> </ul> </div> </div>
CSS代码:
* { margin: 0; padding: 0; border: 0; } body { font: 16px/1.5; } ul li, ol li { list-style: none; } .contextBox { position: relative; width: 960px; margin: 0 auto; } #article { margin-left: 200px; border: 1px #eee solid; padding: 15px; } .articleMenu a { text-decoration: none; color: #333; } .articleMenu a:hover { color: #f85455; } .articleMenu-box { width: 170px; position: absolute; left: 10px; top: 10px; } .articleMenu { padding: 10px; border: 1px solid #ccc; box-shadow: 2px 2px 2px #eee; } .titleH2, .titleH3 { line-height: 1.5em; } .titleH2 { font-weight: bold; } .titleH3 { margin-left: 20px; } .articleMenu .articleMenu-close, .articleMenu-open { display: inline-block; position: absolute; right: 0; top: 0; height: 44px; width: 44px; cursor: pointer; } .articleMenu-open { background: url("http://www.dengzhr.com/wp-content/themes/dengzhr/images/icon_articleMenu_open.png") no-repeat 50% 50%; display: none; } .articleMenu .articleMenu-close { background: url("http://www.dengzhr.com/wp-content/themes/dengzhr/images/icon_articleMenu_close.png") no-repeat 50% 50%; }
JavaScript代码:
var article = document.getElementById("article"); var articleHgroupMenu = document.getElementById("articleMenu"); // 关闭和展开文档树 var articleMenu_open = document.getElementById("articleMenu_open"); var articleMenu_close = document.getElementById("articleMenu_close"); articleMenu_close.onclick = function() { articleHgroupMenu.style.display = "none"; articleMenu_open.style.display = "block"; }; articleMenu_open.onclick = function() { articleHgroupMenu.style.display = "block"; articleMenu_open.style.display = "none"; }; // titleHgroup(article, articleHgroupMenu, "titleH2", "titleH3"); // 获得obj下的直接子元素中为标题h2~h3的标题元素 // 参数说明:hgroupParent为包含h2和h3的直接父元素;MenuList为承载新建文章列表的ul元素; // h2ClassName、h3ClassName分别为新建文章列表中对应h2、h3的li自列表的Class属性; function titleHgroup(hgroupParent, MenuList, h2ClassName, h3ClassName) { var hgroup = hgroupParent.children; // 创建文档片段,来包裹自动生成的h2、h3对应生成的li列表 var fragment = document.createDocumentFragment(); for(i = 0; i < hgroup.length && hgroup[i].nodeType === 1; i++) { // 为对应类型的标题生成li列表 // 参数说明:hType为标题的类型如h1~h6;className为标题对应的li列表的class属性值; function titleToList(hType, className) { var li = document.createElement("li"); li.className = className; // 为li标签内部添加a标签,用锚点进行定位; hgroup[i].id= hType + i; li.innerHTML = ("<a href='#" + hType + i + "'>" + hgroup[i].innerHTML +"</a>"); fragment.appendChild(li); } // 当遍历中标题元素为h2时,调用titleToList(hType, className)新增对应的li列表; if(hgroup[i].nodeName.toLowerCase() == "h2") { titleToList("h2", h2ClassName); } // 当遍历中标题元素为h3时,调用titleToList(hType, className)新增对应的li列表; if(hgroup[i].nodeName.toLowerCase() == "h3") { titleToList("h3", h3ClassName); } } // 将承载好对应li元素集合的文档片段fragment添加到DOM(即在DOM中包裹li列表的父元素)中去; MenuList.appendChild(fragment); }
完整实例代码
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <title>原生JS实现自动生成文章标题树</title> <style type="text/css"> * { margin: 0; padding: 0; border: 0; } body { font: 16px/1.5; } ul li, ol li { list-style: none; } .contextBox { position: relative; width: 960px; margin: 0 auto; } #article { margin-left: 200px; border: 1px #eee solid; padding: 15px; } .articleMenu a { text-decoration: none; color: #333; } .articleMenu a:hover { color: #f85455; } .articleMenu-box { width: 170px; position: absolute; left: 10px; top: 10px; } .articleMenu { padding: 10px; border: 1px solid #ccc; box-shadow: 2px 2px 2px #eee; } .titleH2, .titleH3 { line-height: 1.5em; } .titleH2 { font-weight: bold; } .titleH3 { margin-left: 20px; } .articleMenu .articleMenu-close, .articleMenu-open { display: inline-block; position: absolute; right: 0; top: 0; height: 44px; width: 44px; cursor: pointer; } .articleMenu-open { background: url("http://www.dengzhr.com/wp-content/themes/dengzhr/images/icon_articleMenu_open.png") no-repeat 50% 50%; display: none; } .articleMenu .articleMenu-close { background: url("http://www.dengzhr.com/wp-content/themes/dengzhr/images/icon_articleMenu_close.png") no-repeat 50% 50%; } </style> </head> <body> <div class="contextBox"> <div id="article"> <h2>二级标题</h2> <h3>三级标题</h3> <p>hello<br /> hello<br /> hello<br /> hello<br /> hello<br /> hello<br /><br /> hello<br /> hell<br />o hel<br />lo hell<br />o he<br />llo hello</p> <h3>三级标题</h3> <h3>三级标题</h3> <h3>三级标题</h3> <h3>三级标题</h3> <p>hello hello hello hello hello hello hello hello hello hello hello</p> <h2>二级标题</h2> <h3>三级标题</h3> <h3>三级标题</h3> <p>world w<br />orld <br />world world wo<br />rld world wo<br />rld world world wor<br />ld world world <br />world <br />worl<br />d world<br /> w<br />orld <br />world wo<br />rld wor<br />ld world wor<br />ld world worl<br />d w<br />or<br />ld<br /> <br />world <br />world <br />world<br /> <br />wo<br />rld wo<br />rld w<br />orld w<br />orld </p> <h3>三级标题</h3> <h3>三级标题</h3> <h2>二级标题</h2> <h3>三级标题</h3> <h3>三级标题</h3> <h2>二级标题</h2> <h3>三级标题</h3> <h3>三级标题</h3> <h2>二级标题</h2> <h3>三级标题</h3> <h3>三级标题</h3> </div> <div class="articleMenu-box" id="articleMenu_box"> <span class="articleMenu-open" id="articleMenu_open"></span> <ul class="articleMenu hello" id="articleMenu"> <span class="articleMenu-close" id="articleMenu_close"></span> </ul> </div> </div> <script type="text/javascript"> var article = document.getElementById("article"); var articleHgroupMenu = document.getElementById("articleMenu"); // 关闭和展开文档树 var articleMenu_open = document.getElementById("articleMenu_open"); var articleMenu_close = document.getElementById("articleMenu_close"); articleMenu_close.onclick = function() { articleHgroupMenu.style.display = "none"; articleMenu_open.style.display = "block"; }; articleMenu_open.onclick = function() { articleHgroupMenu.style.display = "block"; articleMenu_open.style.display = "none"; }; // titleHgroup(article, articleHgroupMenu, "titleH2", "titleH3"); // 获得obj下的直接子元素中为标题h2~h3的标题元素 // 参数说明:hgroupParent为包含h2和h3的直接父元素;MenuList为承载新建文章列表的ul元素; // h2ClassName、h3ClassName分别为新建文章列表中对应h2、h3的li自列表的Class属性; function titleHgroup(hgroupParent, MenuList, h2ClassName, h3ClassName) { var hgroup = hgroupParent.children; // 创建文档片段,来包裹自动生成的h2、h3对应生成的li列表 var fragment = document.createDocumentFragment(); for(i = 0; i < hgroup.length && hgroup[i].nodeType === 1; i++) { // 为对应类型的标题生成li列表 // 参数说明:hType为标题的类型如h1~h6;className为标题对应的li列表的class属性值; function titleToList(hType, className) { var li = document.createElement("li"); li.className = className; // 为li标签内部添加a标签,用锚点进行定位; hgroup[i].id= hType + i; li.innerHTML = ("<a href='#" + hType + i + "'>" + hgroup[i].innerHTML +"</a>"); fragment.appendChild(li); } // 当遍历中标题元素为h2时,调用titleToList(hType, className)新增对应的li列表; if(hgroup[i].nodeName.toLowerCase() == "h2") { titleToList("h2", h2ClassName); } // 当遍历中标题元素为h3时,调用titleToList(hType, className)新增对应的li列表; if(hgroup[i].nodeName.toLowerCase() == "h3") { titleToList("h3", h3ClassName); } } // 将承载好对应li元素集合的文档片段fragment添加到DOM(即在DOM中包裹li列表的父元素)中去; MenuList.appendChild(fragment); } </script> </body> </html>
总结
以上就是利用原生JS自动生成文章标题树的全部内容,希望本文的内容对大家能有所帮助,如果有疑问可以留言讨论。
DDR爱好者之家 Design By 杰米
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
DDR爱好者之家 Design By 杰米
暂无评论...
P70系列延期,华为新旗舰将在下月发布
3月20日消息,近期博主@数码闲聊站 透露,原定三月份发布的华为新旗舰P70系列延期发布,预计4月份上市。
而博主@定焦数码 爆料,华为的P70系列在定位上已经超过了Mate60,成为了重要的旗舰系列之一。它肩负着重返影像领域顶尖的使命。那么这次P70会带来哪些令人惊艳的创新呢?
根据目前爆料的消息来看,华为P70系列将推出三个版本,其中P70和P70 Pro采用了三角形的摄像头模组设计,而P70 Art则采用了与上一代P60 Art相似的不规则形状设计。这样的外观是否好看见仁见智,但辨识度绝对拉满。
更新日志
2024年11月28日
2024年11月28日
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]