현재 사용중인 beadutiful-jekyll theme에서 tags들로 정리된 카테고리가 하나있으면 좋겠다 싶어서 시도.
참고 자료
접근 방법
Site variable 정의 파악
- site.pages, site.posts, site.tags.TAG, site.<custom_value_name> 과 같이 정의하고 싶은 변수를 config.yml (yml : 데이터 저장 포맷) 에 저장
원하는 위치에 코드를 가져 옴
- tags는 tags 페이지에서 힌트를 얻음.
1
2
3
4
5
6
7
8
9
10
11
12
13
{%- capture site_tags -%}
{%- for tag in site.tags -%}
{{- tag | first -}}{%- unless forloop.last -%},{%- endunless -%}
{%- endfor -%}
{%- endcapture -%}
{%- assign tags_list = site_tags | split:',' | sort -%}
{%- for tag in tags_list -%}
<a href="#{{- tag -}}" class="btn btn-primary tag-btn"><i class="fa fa-tag" aria-hidden="true"></i> {{- tag -}} ({{site.tags[tag].size}})</a>
{%- endfor -%}
해당 코드를 nav에 적용 (nav.html)
- html 필요한 부분 custom 후 입력
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<!-- 태그 카테고리 -->
{%- capture site_tags -%}
{%- for tag in site.tags -%}
{{- tag | first -}}{%- unless forloop.last -%},{%- endunless -%}
{%- endfor -%}
{%- endcapture -%}
{%- assign tags_list = site_tags | split:',' | sort -%}
{% if tags_list.size > 0 %}
<li class="navlinks-container">
<a class="navlinks-parent text-uppercase" href="javascript:void(0)">Tags</a>
<div class="navlinks-children abs-right-align">
{%- for tag in tags_list -%}
<a class="text-capitalize" href="/tags/#{{- tag -}}">{{- tag -}} ({{site.tags[tag].size}})</a>
{%- endfor -%}
</div>
</li>
{% endif %}
main.js에서 해당부분 조정
- 필자는 부모 element의 min-width에 맞춰서 자식 element width 까지 일렬로 맞추는 게 불만이라 (보통 위쪽 제목이 더 간결한 경우가 많으니) 자식 element width를 찾아 min-width를 계산해 적용.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
// Ensure nested navbar menus are not longer than the menu header
var menus = $(".navlinks-container");
if (menus.length > 0) {
var navbar = $("#main-navbar ul");
var fakeMenuHtml = "<li class='fake-menu' style='display:none;'><a></a></li>";
navbar.append(fakeMenuHtml);
var fakeMenu = $(".fake-menu");
$.each(menus, function(i) {
var parent = $(menus[i]).find(".navlinks-parent");
var children = $(menus[i]).find(".navlinks-children a");
var words = [];
// 태그 갯수 세는 html에 space가 하나 있어서 해당 split 생략
// $.each(children, function(idx, el) { words = words.concat($(el).text().trim().split(/\s+/)); });
$.each(children, function(idx, el) { words = words.concat($(el).text().trim()); });
var maxwidth = 0;
$.each(words, function(id, word) {
console.log(word);
fakeMenu.html("<a>" + word + "</a>");
var width = fakeMenu.width();
if (width > maxwidth) {
maxwidth = width;
}
});
// 자식 element 를 찾아 min-width 적용.
$(menus[i]).find(".navlinks-children").css('min-width', maxwidth + 'px')
});
fakeMenu.remove();
}
나머지 미세한 css들 조정(main.css & custom bootstrap에서 조정)
1
2
3
4
5
6
7
.navbar-custom .nav li a {
/* 일괄 대문자 적용이 마음에 들지 않아 생략하고 각 a tag 성격 마다 다르게 적용되도록 함.*/
/* text-transform: uppercase; */
font-size: 12px;
letter-spacing: 1px;
}
적용하고나니 여전히 수정할 점이 많지만 사이트가 한결 낫다.