先日までこのブログでは右側のサイドバーを常に残すような設定にしてましたが、 スマホで見ると結構邪魔くさい感じになってました。 まあ、内容上あまりスマホから見るものでもないかもしれませんが、 Googleの Mobile-Friendly Test なるものを見つけて試したらダメだと言われたので せっかくなのでこれに合格するよう設定変更してみました。
Octopressでのレスポンシブな設定
そもそもOctopressでのデフォルトclassic
テーマではレスポンシブな設定になっています。
横幅が短くなるとサイドバーが下に行ったり、
サイドバーにボタンが付いていて大きな画面でも下に持って行けたり。
なんとなく、表示が変わるのが嫌だな、と思ったりして、 これをわざわざ変更して残すようにしていました。
ですが、心変わりでやっぱりそうなってた方が楽しいな、ということで
classic
なテーマを参考に同じような動きを再現してみます。
Octograyの中での設定
classic
を参考にしながら再導入した部分が殆どですが、いくつか
苦労したところや変更点等。
残すか残さないかの設定
サイドバーを常に残す以前の状態もとっておきたかったので、
sass/custom/_layout.scssの中で$sidebar-remain
という値を設定し、
これがtrue
なら常に残す、false
ならレスポンシブなものにするようにしました。
以降で
@if $sidebar-remain == true {
...
} @else {
...
}
みたいな設定が出来る様になります。
幅などのデフォルト値の設定
上の様に@if ...
で幅を設定するにあたって、これらの中で
$sidebar-width-medium: 300px !default;
みたいにして、
一旦if
文を終えてから後でこれらの値を使おうとすると、
Undefined variable: $sidebar-width-medium:
と怒られてしまいます。
当然と言えば当然なんですが、先にこの変数を宣言して@if
文の中で値を設定する必要
があります。
1 2 3 4 5 6 |
|
みたいにします。ここで!default
を使うことが出来ないのが悩み。
最初の宣言のところでは使えますが、その値は意味なし。
下の実際に設定している所で使いたいわけですが、
先に宣言してしまってるので、!default
を使うと上書きできずに
宣言の時の値になってしまいます。
仕方が無いのでこれらを直接変更する値として、 sass/base/_layout.scssからsass/custom/_layout.scssに 移しています。
片方だけを固定にしてしまって良いのなら、
1 2 3 4 |
|
みたいにする方が正しいのかな?とも。
collapse-sidebar
sass/base/_layout.scssには@mixin collapse-sideba
が設定されています。
classic
テーマの場合
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
|
こんな感じになっています。
source/javascripts/octopress.jsの中で、addSidebarToggler
という関数があって、
この中でサイドバーのセクションに一つ置きにodd
、even
クラスを与え、
更に、三つ置きに、first
というクラスを与えています。
また、サイドバーをボタンで閉じた時にはcollapse-sidebar
というクラスを
body
に追加しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
上のcollapse-sidebar
のmixinは、
@media only screen and (min-width: 750px) {
aside.sidebar{ @include collapse-sidebar; }
}
な感じで読み込まれる様になっているので、横幅が長い時かつ ボタンで閉じた時に上のクラスの内容が適用されます。
ここで、3つ以上ある場合、750px
程度の大きさでもcollapse
した時、
それぞれの幅が全体の1/3の幅にされてしまいます。
これがちょっと嫌なので(それぞれ356px
程度に設定しているので)、
&.thirds section {
の部分は除いて
Octograyに追加しました。
これで、ある程度幅があるときは、ボタンを押して下にやった場合に 2列組になり、幅が短くなって下に降りてきた時には1列になります。
また、section
のeven
、odd
の設定がeven
の時だけ左に4%
のマージンを取るように
なってましたが、
縦が短いものと長いものが混同してると、
2つ連続で縦に入ってeven
、odd
の左右がずれることもあるので、
1 2 3 4 5 |
|
な感じで両方左に2%
のマージンに変更しました。
(この時点でeven
もodd
も同じなのでわざわざ分けなくても良い状態ですが、
あとで比べるのになるべくclassic
に近いほうが便利なので残しておきます。
JavaScriptの関数のところとともに後で統一するかもしれませんが。)
後はbackground-color: lighten($sidebar-bg, 2);
を消してバックグラウンドを同じ色に残したり等好みで。
後、色関係ではサイドバーとの間の線を以前は消してましたが、 下に書くボタンを配置したりする関係上、 合ったほうがいい感じなので区切り線を出すようにしました。
ボタンが現れない
画面が広い時に、サイドバーを閉じたり広げたりするボタンは
sass/partials/sidebar/_base.scssの.toggle-sidebar
で定義されていて、
このクラスは上のaddSidebarToggler
で加えられてる事が分かります。
空け閉じのボタンは
content: "\00BB";
と定義されていて>>
みたいな記号です。
これが最初表れなくて困ってましたが、悪さをしていたのは footnote-inline プラグインの中の source/javascripts/footnote.jsの中で、
jQuery.noConflict();
を使っているところでした。
これはjQueryで$()
の関数定義が他のライブラリとコンフリクトを避けるため、
これを使用不可にするものですが(もしくは上の関数の返り値が代替関数として使用可能)、
source/javascripts/octopress.jsの中で$()
をjQueryとして使ってるのと、
他のライブラリを使用してコンフリクトするような状況には今のところなっていないので、
この部分をfootnote-inline側でコメントアウトして使う様にしました。
jQueryと他のライブラリのコンフリクトを避ける方法: http://www.halawata.net/2011/10/jquery-noconflict/
scroll fixをやめた
以前は
jquery.ex-flex-fixed: https://github.com/cyokodog/jquery.ex-flex-fixed
にあるJavaScriptを使って、サイドバーの下2個ほどをスクロールと同時に着いて来る
様な状態にしていましたが、これが上手くはめられなかったので辞めました。
まず、これを使うために、plugins/include_array.rbのなかで、
着いて行かせたい個数だけscroll-fixed
というクラスを持つdiv
要素で囲う様にしていました
1。
これによって、上のaddSidebarToggler
と言う関数の中で
与えているeven
、odd
、first
が正しく与えられていませんでした。
これを回避するため、
それらのクラスを与える所で、もう一段階深くに行ったsection
も調べて
even
とかを与える様にしました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
|
もしくは、他のdiv
要素とかで囲う可能性もあり、かつ、
section
の子section
、見たいのは無い、と言う状態なら、
単に最初の所で、
var sections = $('aside.sidebar section');
とするだけでも出来ます。
ここまでは良かったものの、
着いて来る様にするためにscroll-fixed
を持つ要素に与えている関数のON/OFFが
上手く出来ずに断念。
ボタンを押して下に追いやった時にまだ有効で、他のSectionにかぶるような状態に
なってしまいました。
やってることは、source/javascrips/utils.jsの中で、
1 2 3 4 5 6 7 8 9 10 |
|
として、collapse-sidebar
が無いとき(サイドバーがボタンで下に行って無い時)、
scroll-fixed
があればそれにexFlexFixed
関数を加える、ということ。
これを、上のaddsidebartoggler
の中のtoggle-sidebar
ボタンの所で
1 2 3 4 5 6 7 8 9 10 11 12 |
|
みたいな雰囲気でON/OFFしたかったわけですが、 多分、この辺理解が間違ってるので上手く行きませんでした。
まあ、どうしても必要なものでもないし、無ければ無いで軽くなるわけで、 そのうちまた気が向いたら見てみよう、という状態で現在はOFFにしてあります。
下に来た時だけ表示する設定
サイドバーにあるときと下にある時で表示を少し変えたい場合があります。
例えば、サイドバーに在るときは表示したくないけど 下に来た時には表示したいものがある場合、 その要素を
<div class="only-footer">
...
</div>
で囲って(要素自体にクラスを与えられるならそれでもOK)、 まず、
1 2 3 4 5 6 7 8 9 10 |
|
の様に、何もない場合にはdisplay: block
で表示する様にしておきます。
次に、表示が大きい場合には表示しないようdisplay: none
に設定。
さらに、.collapse-sidebar
がある場合には
display: block
で再び見せる様に設定。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
これで、幅が短くてサイドバーが下に来ている場合と、 ボタンを押して下に持っていった場合には表示され、 右側に表示されてる状態では表示されないものが作れます。
逆にサイドに有るときだけ表示させたいものがあれば、上の
display
のnone
とblock
を入れ替えてあげれば出来ます。
結果
Awesome! This page is mobile-friendly.
ということでOKをもらうことが出来たみたいです。
多分、幅さえ収まる様になればOKを貰えるだけな感じもしますが、 これでスマホでも少しは見やすくなったかな、と。 (とは言ってもやっぱりコードとか横長のが多いのでPCのが断然見やすいわけですが。)