如何DIY有个性的博客园主题(一)

契机

看到很多人的博客园用了自己的主题,很是羡慕,但是又不想用跟别人一样的主题,就想着能不能DIY博客园的主题呢?

想法

已知如下几个条件:

  • 博客园侧边栏申请JS权限后可以写JS代码
  • JS技术允许浏览器修改页面元素的样式
  • 博客园侧边栏支持HTML代码
那是否可以通过js来修改博客园原本的样式呢?

前置条件

  • 侧边栏申请了js权限
  • 谷歌或火狐浏览器
  • 对前端技术有些了解

实验

首先尝试利用js修改博客园的顶端导航栏的css属性display为none来隐藏博客园自带的顶端导航栏。
但是js获取dom元素太麻烦了。如果有jquery就好了。如果博客园本身已经引入了jquery,我就可以使用jquery来操作页面元素了。

博客园引入jquery了吗?

进入博客园。F12打开浏览器开发者工具,查看博客园网页源码。发现如下:

博客园的源码中已经引入了jquery。看来可以直接使用jquery来控制页面元素了。

在侧边栏里写的js代码能对侧边栏以外的页面元素生效吗?

首先F12打开浏览器开发者工具,寻找博客园自带的导航栏元素

找到了顶部导航栏元素,对应的页面部分是包含头像和搜索框的部分

在博客园后台编辑侧边栏代码,使用jquery隐藏顶部导航栏

保存后回到前台查看效果

可以看到顶部导航栏被隐藏了。

做法

对于自己想要替代的组件,利用jquery将其隐藏。之后利用jquery直接生成页面元素,新元素的内容利用jquery从博客园对应的元素中获取。
而样式文件决定使用bootstrap框架的样式进行控制。

示例

首先引入bootstrap4框架,这部分需要放在最前方
然后利用id获取原本导航栏的jquery对象,并将其隐藏
使用jquery按序创建自己需要的组件
使用循环获取原本博客园导航栏的内容和链接
在循环中加入筛选,只添加自己想要的内容
按父子顺序插入元素

代码

<link href="https://v4.bootcss.com/docs/dist/css/bootstrap.min.css" rel="stylesheet">
<script src="https://v4.bootcss.com/docs/dist/js/bootstrap.bundle.min.js"></script>
<script>
function addNavChild(parent,title,href){
	var nav_label = $('<li class="nav-item"><a class="nav-link" href="#"></a></li>');
	var nav_link = nav_label.find('a');
	nav_link.text(title);
	nav_link.attr({'href':href});
	parent.append(nav_label);
}

$('#top_nav').removeClass();
$('#top_nav').css('display','none');
var def_head = $('<nav></nav>');
def_head.addClass('navbar navbar-expand-lg navbar-dark bg-dark fixed-top');

var def_head_null = $('<nav></nav>');
def_head_null.addClass('navbar navbar-expand-lg navbar-dark bg-dark');
var def_nav_brand_null = $('<a class="navbar-brand">博客园</a>');
var def_nav_brand = $('<a>博客园</a>');
var def_navbar_button = $('<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation"><span class="navbar-toggler-icon"></span></button>');

var def_navbar = $('<div class="collapse navbar-collapse" id="navbarNav"><ul class="navbar-nav"></ul></div>');
var def_search = $('<form class="form-inline my-2 my-lg-0" id="navSearch" action="https://zzk.cnblogs.com/s"><input name="w" class="form-control mr-sm-2" type="search" placeholder="Search" aria-label="Search"><button class="btn btn-outline-success my-2 my-sm-0" type="submit">Search</button></form>');
def_nav_brand.addClass('navbar-brand');
def_head.append(def_nav_brand);
def_nav_brand.after(def_navbar_button);
def_navbar_button.after(def_navbar);
$('#top_nav').after(def_head);
def_head_null.append(def_nav_brand_null);
$('#top_nav').after(def_head_null);


for(var i=0;i<$($('#top_nav nav').children('ul').get(0)).children('li').length;i++){
	if(i<2){
		continue;
	}
	var href = $($($($('#top_nav nav').children('ul').get(0)).children('li').get(i) ).children('a').get(0)).attr('href');
	var title = $( $($('#top_nav nav').children('ul').get(0)).children('li').get(i) ).text();
	var parent = $( def_navbar.children('ul').get(0) );
	addNavChild(parent,title,href);
}

for(var i=0;i<$($('#navigator').children('ul').get(0)).children('li').length;i++){
	if(i<3){
		continue;
	}
	var href = $($($($('#navigator').children('ul').get(0)).children('li').get(i) ).children('a').get(0)).attr('href');
	var title = $( $($('#navigator').children('ul').get(0)).children('li').get(i) ).text();
	var parent = $( def_navbar.children('ul').get(0) );
	addNavChild(parent,title,href);
}
def_navbar.append(def_search );
$('#navigator').css('display','none');
</script>
原文地址:https://www.cnblogs.com/Heretic-Pangan/p/13836381.html