ã¨ããããã§ã¯ã¦ãªããã°ã«ç§»è¡ãããã¨æã£ããã ããã©ããã©ããæ°ã«å ¥ã£ããã¶ã¤ã³ããªããã¯ã¦ãªãã¤ã¢ãªã¼ã§ããããªãã«ã«ã¹ã¿ãã¤ãºãã¦ä½ã£ã¦ãã®ã ãããã®ã¾ã¾ä½¿ããããããªãããã¶ã¤ã³èªä½ãå¤ããªã£ã¦ãã¾ã£ã¦ãããã¨ãã£ã¦ã¼ããããã¶ã¤ã³ãèµ·ããæãªã©â¦â¦ã£ã¦ããã俺éã«ã¯ Bootstrap ããããããªãã!
Bootstrap ã£ã¦ãªã«?
ãããã CSS ãã¬ã¼ã ã¯ã¼ã¯ã§ããTwitter ãä½ã£ã¦èªåãã¡ã§ä½¿ã£ã¦ããã¤ã§ãã
ãªã«ãã§ããã®?
HTMLã«ã¯ã©ã¹å±æ§ãããããè¶³ãã¦ããã ãã§ããæãã«è¦ãç®ãæ´ãã¦ããããã奴ãªãã§ãã
example
ä¾ãã°ãããªæãã
ãã¿ã³ã¨ã
<button type="button" class="btn btn-default">btn-default</button> <button type="button" class="btn btn-primary">btn-primary</button> <button type="button" class="btn btn-success">btn-success</button> <button type="button" class="btn btn-info">btn-info</button> <button type="button" class="btn btn-warning">btn-warning</button> <button type="button" class="btn btn-danger">btn-danger</button>
ãããªæãã«æ¸ãã ãã§ã
ãããªæãã«ãªã£ã¡ãããã§ã!
ããã¯ã¦ãªããã°ã§ä½¿ããã®?
ãã£ã¨ããããåé¡ã¯ããã¾ããä¸å¿ä½¿ãã¾ããã¨ããã使ãã¾ããã
ä½äºãå 人ã¨ããã®ã¯ãããã®ã§ã以ä¸ã®ãµã¤ããåèã«ãã¾ãã(æè¬)ã
ãã£ãããªã®ã§ã©ããã£ã¦ä½¿ããã¨ããã®ãããã§å ±æãã¦ããã
ã«ã©ã ã®è¨å®
ä¸è¨ãµã¤ãã«ããããã«ãã«ã©ã ãä½ãã«ã¯ less ã§æ¸ãå¿ è¦ããããBootstrap èªä½ã less ã§æ¸ããã¦ããããªã®ã ãããã®ãã¡ sass ã«ç§»è¡ããã¨ããªãã¨ããã¨ããããç¾æç¹ã®ææ°çã§ãã 3.3.6 㯠less ã§æ¸ããã¦ãã®ã§ less ã§æ¸ãã¦ãããã©ãããã¨ãã sass ã«å¤æãã§ããã¯ãã
Bootstrap ã®ãµã¤ãããã½ã¼ã¹ã³ã¼ãã zip ã§ãã¦ã³ãã¼ããã¦ãã¦ãé©å½ãªãã£ã¬ã¯ããªã«å±éã
$ wget https://github.com/twbs/bootstrap/archive/v3.3.6.zip $ unzip v3.3.6.zip $ touch hatenablog.less $ ls bootstrap-3.3.6 hatenablog.less
bootstrap-3.3.6 ã¨ãããã£ã¬ã¯ããªä»¥ä¸ã«å±éãããã½ã¼ã¹ã³ã¼ãã¨ãhatenablog.less(ååã¯ä½ã§ããã)ãè¦ãã¾ãã ãã® hatenablog.less ãç·¨éãã¦ããã
@import "bootstrap-3.3.6/less/bootstrap.less"; #main { .make-md-column(9); } #box2 { .make-md-column(3); } #footer, #bottom-editarea { .make-md-column(12); }
ããã§2ã«ã©ã ã§ãµã¤ããã¼ãæ¬æã®1/3ãããã¿ã¯å ¨ä½å¹ ã®æ§æã«ãªãã
@import "bootstrap-3.3.6/less/bootstrap.less"; #main { .make-md-column(9); background-color: blue; } #box2 { .make-md-column(3); background-color: yellow; } #footer, #bottom-editarea { .make-md-column(12); background-color: green; }
ã¨ã§ããã¦è²åãããã¦ããã¨ã確èªããã¨ããã
ãã㦠less ãã¡ã¤ã«ã css ãã¡ã¤ã«ã«ã³ã³ãã¤ã«ããã
$ gem install less $ lessc hatenablog.less > hatenablog.css
åä½ç¢ºèª
ãã¦ä¾¿å©ãª Bootstrap ãªã®ã ããã©ããã¯ã¦ãªããã°ã® CSS è²¼ãä»ãã¯å®¹éå¶éãããããã§ãBootstrap ãå«ãã CSS ãã¢ãããã¼ããããã¨ã¯é£ããããã ã
ã¨ããããã§ä»¥ä¸ã®ãµã¤ããåèã« Google Drive ãå©ç¨ããã
ã¢ãããã¼ãããããã¯ã¦ãªããã°ã®ãã¶ã¤ã³CSSã«ã¯ã
/* Responsive: yes */ @import url('https://www.googledrive.com/host/0Bxp6_1slWwEfNlhPY1N5MmpPZGM/hatenablog.css');
ã¨ã ãæ¸ãã¦ããã URL ã®éä¸ã«ããè¬ã®æååã¯äººããããéãã®ã§ä¸è¨ãµã¤ããåèã«ãã¦æ¬²ããã
ããã«ä¸é¨ã®æ©è½ã¯ JavaScript ã使ãã®ã§ãCDN ã§é å¸ããã¦ã bootstrap.js ã使ããBootstrap 㯠jQuery å¿ é ãªã®ã§ãããã CDN ã®ãã®ã使ãã
ã¯ã¦ãªããã°ã®ããã¿ãããã«ã§ãã
<script src="https://code.jquery.com/jquery-2.1.4.min.js"></script> <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js" integrity="sha256-KXn5puMvxCw+dAYznun+drMdG1IFl3agK0p/pqT9KAo= sha512-2e8qq0ETcfWRI4HJBzQiA3UoyFk6tbNyG+qSaIBZLyW9Xf3sWZHN/lxe9fTh1U45DpPf07yj94KsUHHWe4Yk1A==" crossorigin="anonymous"></script>
ã¨å ¥ãã¦ããã
ã¤ãã§ã« Bootstrap ã§ä½¿ãã¢ã¤ã³ã³ãã©ã³ãã CDN ãã import ãã¦ãã¾ããã
@import "bootstrap-3.3.6/less/bootstrap.less"; @icon-font-path: 'https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/fonts/';
ã¨ãã¦ããã°ãã¹ãã§ãæ¬çªã§ããã®ã¾ã¾ãã©ã³ããã¡ã¤ã«ãèªãã§ãããã
ãã¶ã¤ã³è¨å®ç»é¢ã«ããã¹ãã¼ããã©ã³åãã®ã¿ãã«ãã¬ã¹ãã³ã·ããã¶ã¤ã³ãã®ãã§ãã¯ããã¯ã¹ãããã®ã§ãããããªã³ã«ãã¦ããã¨ã¹ããåãã«ãåããã¶ã¤ã³ã§è¡¨ç¤ºãããã
ã¡ãªã¿ã« markdown ã使ãããã®ã§ã¯ã¦ãªããã°ã®ãµã³ãã«ã¨ã³ããªã¼ãmarkdownã«æ¸ãç´ãã¦ã¡ãã£ã¨ä»ãå ãããã®ãç½®ãã¦ãããã
ãã¶ã¤ã³éçºç¨ã®tips
ã㦠less ã¯ä»¥ä¸ã®ããã«ã³ã³ãã¤ã«ããªãã¨ãããªãã®ã§åä½ç¢ºèªãé¢åããããã ããå®ã¯ less ã³ã³ãã¤ã©ã¯ JavaScript ã§æ¸ããã¦ãããè¥å¹²é ããå åå®ç¨çã ã
ã¨ããããã§ä¸ã®ãµã³ãã«ã¨ã³ããªã¼ãæ¾ãè¾¼ãã è¨äºããã®ã¾ã¾ wget ã curl ã§ãã¦ã³ãã¼ããã¦ã
<link rel="stylesheet" type="text/css" href="http://blog.hatena.ne.jp/-/blog_style/13208692334729909600/2cf1108ea98e4d24edaf9abdb60ae1d97e804f1d"/> <script> </script>
ã¨ãããããªã¨ãããã
<link rel="stylesheet" type="text/less" href="hatenablog.less"/> <script src="https://cdnjs.cloudflare.com/ajax/libs/less.js/2.5.3/less.min.js"> </script>
ã¨æ¸ãæãããããã§ãã®ãã¡ã¤ã«ããã©ã¦ã¶ã«èªã¾ããã°è¡¨ç¤ºãããã¯ãããã¨ã¯ã¨ãã£ã¿ã§ä¿åãããèªåã§ãã©ã¦ã¶ããªãã¼ãããè¨å®ã§ããã¦ããã°éå¸¸ã«æãã ä½ãå§ããé ã¯è¨äºãå°ãªãã¦ãµã¤ããã¼ã®ãã¶ã¤ã³ãªã©ããã¾ããããªãã®ã§ãä»äººã®è¨äºããã¦ã³ãã¼ããã¦ãã¶ã¤ã³ã«ä½¿ããªã©ããã¨ããã«æãã
ããã²ã¼ã·ã§ã³ãã¼
ãã¦ãã£ãããããã«ãããã追å ã§ããã®ã§ãããã²ã¼ã·ã§ã³ãã¼ã追å ãããã¨ã«ãããã
ã¯ã¦ãªããã°ã®ãã¶ã¤ã³è¨å®ãããããã®ã¨ãããéãããã¡ã§ã¯ä»¥ä¸ã®ããã«å ¥åãã¦ã¿ãã
<nav class="navbar navbar-default" style="border-radius: 0px;"> <div class="container-fluid"> <div class="navbar-header"> <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar-collapse-1" aria-expanded="false"> <span class="sr-only">Toggle navigation</span> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span> </button> <a class="navbar-brand" href="http://www.foxking.org/"><span class="glyphicon glyphicon-king"></span> çã®çå½</a> </div> <div class="collapse navbar-collapse" id="navbar-collapse-1"> <ul class="nav navbar-nav"> <li><a href="http://koshian.hateblo.jp/"><span class="glyphicon glyphicon-link"></span> Blog</a></li> <li><a target="_blank" href="http://koshian.hatenablog.com/"><span class="glyphicon glyphicon-link"></span> Tech Log</a></li> </ul> <ul class="nav navbar-nav navbar-right"> <li role="separator" class="divider"></li> <li><a target="_blank" href="http://tumblr.foxking.org"><i class="fa fa-tumblr"></i> Tumblr</a></li> <li><a target="_blank" href="http://twitter.com/koshian"><i class="fa fa-twitter"></i> Twitter</a></li> </ul> </div> </div> </nav>
Twitter/Tumblr ã®ã¢ã¤ã³ã³ã¯ font awesome ã使ç¨ãã¦ãããããã less ãã¡ã¤ã«ã«ã
@import url('https://maxcdn.bootstrapcdn.com/font-awesome/4.5.0/css/font-awesome.min.css');
㨠CDN ãã import ãã¦ããã
é è²
Bootstrap ã®ããã²ã¼ã·ã§ã³ãã¼ãé è²ãããã¼ã«ã«ãªã£ã¦ã TWBSColor ã¨ãããµã¤ããããã®ã§ãããã使ãã¨ç°¡åã
ãã¼ãã«ã Bootstrap ããã
ãã¦ç´°ãããã¶ã¤ã³ã¯èªåã§ããã¨ãã¦ããtable ãªããã®è¡¨ç¤ºã¯ Bootstrap ã使ã£ã¦ã©ã¯ããããã
.entry-content { table { &:extend(.table all); &:extend(.table-striped all); &:extend(.table-hover all); width: auto; } }
ãããªæãã§ table ã¯ã©ã¹ã table ã¿ã°ã«ç¶æ¿ãã¦ããã°ãã¾ãè¡ãããã®ã¾ã¾ã 㨠width ã 100% ã«ãªã£ã¦ã¦ã¦ã§ãã¢ããªãªãã¨ãããããã°ã«ã¯åããªããã ã£ãã®ã§ width ã auto ã«ä¸æ¸ãè¨å®ããã
é è²ã¯å¤æ°ãããã®ã§ããã使ãã
@table-bg: transparent; @table-bg-accent: @accent-bg; @table-bg-hover: @accent-color; @table-bg-active: @table-bg-hover; @table-border-color: @heading-color;
ä»ã«ã bootsrap-3.3.6/less/variables.less ãè¦ãã¨ãããããªå¤æ°ãããã®ã§ãboottrap æ¬ä½ã import ããå¾ã«ãããã®å¤æ°ãæ¸ãæãã¦ããã¨ããããã¨ã«ã©ã¼ãå¤ããããã
æ¤ç´¢ãã©ã¼ã
ãã¦ããã§ã ãã¶ Bootstrap ãæ´»ç¨ã§ãã¦ãæãã«ãªã£ã¦ããã®ã ããæ¤ç´¢ãã©ã¼ã ã®ãã¿ã³ã« Bootstrap ã®ã¹ã¿ã¤ã«ããã¾ãé©ç¨ã§ããªãã
#box2 { .search-module-input { &:extend(.form-control); } .search-module-button { &:extend(.btn); &:extend(.btn-default); } }
ã¨ãã¦ãã¾ãã°ä¸å¿é©ç¨ãããã®ã ãããã©ã¼ã ã®æ¨ªã«æ¤ç´¢ãã¿ã³ãè¡ããªãã ãããããªãã®ã§æä¾ããã¦ãæ¤ç´¢ãã©ã¼ã ã使ãã®ãããã¦ããµã¤ããã¼ã« HTML ãç´æ¥æ¾ãè¾¼ããã¨ã«ããã
<form class="search-form" role="search" action="/search" method="get"> <div class="input-group"> <input name="q" class="search-module-input form-control" value="" placeholder="ããã°å æ¤ç´¢" required="" type="text"> <span class="input-group-btn"> <input value="æ¤ç´¢" class="search-module-button btn btn-default" type="submit"> </span> </div> </form>
ãããªæãã§ input-group ãã¾ã¨ãã¦ããã°ç¶ºéºã«é ç½®ãããã
ãµã¤ããã¼ã®ãªã¹ã
ã¢ã¼ã«ã¤ããããªã«ããã¯ããã¯ã Bootstrap ã® list-group ã使ã£ã¦ãã¾ãå¦çãããã
#box2 { .hatena-urllist, .urllist-with-thumbnails { &:extend(.list-group all); li, .urllist-item { &:extend(.list-group-item all); } } }
ãããªæãã§ç¶ºéºã«è¡¨ç¤ºãããã
ã ãããã§åé¡ããã¯ã¦ãªããã°ã®ã¢ã¼ã«ã¤ãã®ãªã¹ã表示ã¯ããã®å¹´ãæã«æ¸ããè¨äºã®æ°ãåºãã®ã ãããããæ¬å¼§ã§ãã¿æ¸ãããã¦ã¦ Bootsrap ããããªã表示ã«ãªã£ã¦ãã¾ã£ã¦ããæ°åã badge ã¯ã©ã¹ã® span ã§å²ãã§ãããã°ç¶ºéºã«è¡¨ç¤ºãããã®ã ãâ¦â¦ã
ãããããªãããã㯠JavaScript ã®åºçªã¨ãããã
ããããã©ãããã®ã¢ã¼ã«ã¤ã㯠JavaScript ã§èªã¿è¾¼ã¾ããããã«ãªã£ã¦ãããã§ããã®å¦çã®å¾ã«ãã£ã¦ããããªãã¨ãããªãããããããªãã®ã§ load ã¤ãã³ãã§å®è¡ããããã«ãã¦ã¿ãã
window.addEventListener("load", function(){ $('.hatena-urllist li').each(function() { var r = $(this).html().replace(/(\()(\d+)(\))(.*)/g, "<span class=\"badge\">$2</span></li>"); $(this).html(r); }); }, false);
ã¨ãããã㪠JavaScript ãæ¸ã㦠css ã¨åãããã« Google Drive ã«ç½®ãã¦ã¿ããããã¿ã® jquery ã®å¾ãã« script ã¿ã°ãé ç½®ã

ããããããã表示ããã¦ã!
ãããã©ãããªãâ¦â¦ãæ¬æ¥ãã® badge ã¯å³ç«¯ã«è¡¨ç¤ºãããã¯ããªã®ã ãããããããããæ°åã a è¦ç´ ã®å å´ã«ããããããããã¯å å¼è¦ç´ ã«ãã¦ãããªãã¦ã¯ãªããªãã
ãããä¸è§ãã¼ã¯ã§å å´ã®è¦ç´ ã表示é表示ãåãæ¿ããããç¾å¨éãã¦ãè¨äºã®å¹´æã®ã¨ããã¯éããªã©ç´°ããå¦çããããè¦ç´ ãç§»åããå¾ã§ããä¸åº¦ãã®è¨å®ããã¦ãããªãã¦ã¯åä½ããªãã®ã ããç¾å¨ã®æ¥æãªã©ãææ¡ããã®ãããã©ãããã
ã¨ããããã§ã¯ã¦ãªããã°ãããã©ã«ãã§èªãã§ã hatenablog.js ãããã®ã¸ãã®é¨åãããã£ã¦ãã¦ä»¥ä¸ã®ããã«ã
window.addEventListener("load", function(){ /* from hatenablog.js (official) */ function detectDate() { // archiveã®ã¨ã, ä¸çªä¸ã®æ¥ä»ããå¹´ãèªã var page = window.location.pathname.split('/')[1]; if (page === 'archive') { var $entry = $('section.archive-entry:first'); if ($entry.length > 0) { var year_month_day = $entry.find('div.date > a > time').attr('datetime'); var year_str = year_month_day.split('-')[0]; var month_str = year_month_day.split('-')[1]; return { year: year_str, month: month_str }; } return null; } } function setupCalendar($archive) { var $selector = $archive.find('.js-archive-module-calendar-selector'); var updateCalendar = function updateCalendar() { var $date = $selector.find('option:selected'); var year = $date.data('year'); var month = $date.data('month'); $.ajax({ type: 'get', url: URLGenerator.user_blog_url('/archive_module_calendar'), data: { month: month, year: year } }).done(function (res) { // days object $archive.find('.js-archive-module-calendar-container').html(res); }); }; $selector.change(function () { updateCalendar(); }); // 表示ãã¼ã¸ã«åããã¦ã«ã¬ã³ãã¼ãåæå var date = detectDate(); if (date) { $selector.val(date['year'] + ' ' + date['month']); } updateCalendar(); }; function setupDefault($archive) { var $open_year; var date = detectDate(); if (date) { var year = date['year']; if (year) { var $year = $archive.find('li.archive-module-year[data-year="' + year + '"]'); $open_year = $year.length > 0 ? $year : null; } } $open_year = $open_year || $('li.archive-module-year:first'); $open_year.removeClass('archive-module-year-hidden'); $archive.find('.archive-module-button').click(function (e) { e.preventDefault(); var $year = $(this).parent('.archive-module-year'); $year.toggleClass('archive-module-year-hidden'); }); } /* end hatenablog.js ( official ) */ $('.hatena-urllist li').each(function() { var r = $(this).html().replace(/(\()(\d+)(\))(.*)/g, "<span class=\"badge\">$2</span></li>"); $(this).html(r); }); $('a .badge').each(function(){ var p = $(this).parent() $(this).insertAfter(p); }); $('.hatena-module-archive').each(function(){ var archive = $(this); if (archive.data('archiveType') == 'calendar') { setupCalendar(archive); } else { setupDefault(archive); } }); }, false);
detectDateãsetupCalendarãsetupDefault ã®ä¸ã¤ã®é¢æ°ãã³ãã¼ããã¦ããããæ°åã badge ã¯ã©ã¹ã® span è¦ç´ ã«æ¸ãæããbadge ã¯ã©ã¹ã¯åç´ã«è¦ªã¯ã©ã¹ã®å å¼è¦ç´ ã«ãããã¦ã¢ã¼ã«ã¤ãã®è¡¨ç¤ºé表示ãåãæ¿ããè¨å®ãæ½ã setupDefault ãå®è¡ãç´ããã¨ããæãã

ããã§è¦äºã«å³å´ã«ãã£ã¦ãããã
ãããªæãã§ã§ãããã£ããã¡ã®ã¯ã¦ãªããã°ç¨ãã¶ã¤ã³ã¯ãgithub ã«ç½®ãã¦ããã®ã§ãããããã°åèã«ãã¦ããããããã³ãå ¥ãã¦ããããããã¨ããããã
ã? åºæ¥ä¸ãã£ããã¶ã¤ã³ãã¿ã¤ãã«ã¨éã£ã¦å ¨ç¶ãªã·ã£ã¬ãããªããã£ã¦? ãã¼ã¨ãããã®ããã¿ã¾ããâ¦â¦ã
enjoy!
2016-11-25 追è¨
hatenablog.js ã minify ãããããã«ãªã£ãããã§ hatenablog.js ãåä½ããªããªã£ã¦ããã
if (Hatena.Diary.data('page') === 'archive') {
ã®é¨åã
var page = window.location.pathname.split('/')[1]; if (page === 'archive') {
ã¨æ¸ãæãã¦åä½ããããã«ãªã£ããä¸ã®ã³ã¼ãã¯ä¿®æ£æ¸ã¿ã