カテゴリー: CSS

  • sass 3.3.0.rc.3 から、インターポレーションなしで、「&」を含んだセレクタが作れる!!!!

    先日、LessでBEMってみたらかなりさくさくコーディングできた!という話という記事で、Sassを全力でDisったような気がしますが、

    いい加減にsass3.3を導入しようとついに一念発起して、sass3.3.0.rc.3を突っ込んでみました。

    Compassも1.0.0の開発版にアップデートし、いざ、SassでBEMるぞ!!!と、かの有名なBEM用Mix-in

    @mixin e($name) {
      @at-root   #{&}__#{$name} {
        @content;
      }
    }
    
    
    @mixin m($name) {
      @at-root   #{&}--#{$name} {
        @content;
      }
    }

    を突っ込んでみたんですが、このMix-inでコンパイルエラー。これはrc.2にしてみたらうまくいったのですが、Compassのバージョンを落としたりが面倒くさくて挫折。rc.3のバグなのかな?と思っていました。

    そして、本日、rc.4が出ていたので、改めて再トライ。しかし同じエラーが出現。これはいくら何でも。。。と思い、Sassどうした!って思っていたのですが、試しに、

    @mixin e($name) {
      @at-root   &__#{$name} {
        @content;
      }
    }
    
    
    @mixin m($name) {
      @at-root   &--#{$name} {
        @content;
      }
    }

    としてみたら、コンパイルが通ってしまいました。

    ちゃんとMix-inも無事動きます!
    rc.3でも動きました。Oh…

    もちろん、これも動きます!しかも、@at-root書かなくても大丈夫。Lessとかと全く同じ挙動です。
    BEM用Mix-inなんていらんかったんや・・・・・

    .foo {
    	&__bar {
    		
    	}
    }

    SassのRC版は、

    gem install sass --pre

    Compassは、

    gem install compass --pre

    でインストールできます。

    やっぱりSassは最強でした。

  • LessでBEMってみたらかなりさくさくコーディングできた!という話

    BEMを使ったCSSのクラス設計(MindBEMding)ですが、これをSassでやろうとすると、結構泣けてきます。

    たとえばこんな感じになるんでしょうかね。

    $block: ".block";
    #{$block} {
    	display: block;
    }
    #{$block}__element {	
    	border: 1px solid #CCC;
    }
    
    #{$block}__element_modifier {
    	border-color: #FFF;
    }
    
    

    また、Sass 3.3以降だと、

    .block {
    	display: block;
    	@at-root {
    		#{&}__element {
    			border: 1px solid #CCC;
    			@at-root {
    				#{&}--modifier {
    					border-color: #FFF;
    				}
    			}
    		}
    	}
    	
    	//もしくはこんな感じ
    	@at-root {
    		#{&}__element {
    			border: 1px solid #CCC;
    		}
    
    		#{&}__element--modifier {
    			border-color: #FFF;
    		}
    	}
    }

    こんな感じで、BEMれるようです。
    参考: BEMという命名規則とSass 3.3の新しい記法 – アインシュタインの電話番号

    ただ、@at-rootなどを乱発したり、いちいちshiftをおしながら#{&}って入力していくのは、ちょっと大変すぎるなと個人的には感じます。というかめんどくさい。せっかくネストして楽にかけるはずのCSSが、より大変になっている気がしてしまいまして。

    LESSでやってみる

    Lessだと、こんな感じに書けて、

    .block {
    	display: block;
    	&__element {
    		border: 1px solid #CCC;
    		&--modifier {
    			border-color: #FFF;
    		}
    	}
    }
    

    このソースを、lessをcssに変換(less2css) | Magonote-toolsにコピペするなり、普通にlessで走らせるなりすると、

    .block {
      display: block;
    }
    .block__element {
      border: 1px solid #CCC;
    }
    .block__element--modifier {
      border-color: #FFF;
    }
     

    こうなります。こんな感じでLessはネストしつつ、しっかりBEMなCSSが出力されます。非常に直感的です!

    留意点

    SassとLessの大きな違いとなっていたextendがLess1.4から実装されましたが、&を含むセレクタのextendはできないようです。また、実際に出力されるセレクタを指定してもextendはできないようです。

    なので、.block__element–modifierに.block__elementのスタイルを継承するようなことはできず、html側で両方のclassを指定する必要があります。

    BEMという命名規則とSass 3.3の新しい記法 – アインシュタインの電話番号でも言及されていた、HTMLが冗長になってしまうと言う問題に対処することは難しいです。

    まとめ

    Windowsでも導入が簡単・JavaScriptとの相性が良いなどのSassには無いメリットもあるし、Compassでよく使うMixin等の移植もそこまで難しくないです。CssSpriteもCompass以外のツールで対応できますしね。

    Sassに比べるとCompassのようなフレームワークが無かったり、extendもSassのほうが若干協力だとかで
    なかなかLessを使おうという場面は少ないとは思いますが、それでもBEMとの相性がよいというのはなかなか見逃せない部分じゃないかなと思います。

    LessのextendもSassには無い書き方があったりしておもしろいですし、用途によって使い分けるとなかなか楽しいんじゃないですかね。

  • AndroidのChromeでiPhone&SafariみたいにCSSのデバッグをする。

    iPhone + SafariでCSSのデバッグなんかをよくやったりしますが、Androidにもあるよなぁー。いちいちエミュレータとかいろいろ立ち上げてやるが嫌だなぁー。とか思っていたら、

    SDK不要Android端末のリモートデバッグChrome拡張機能「ADB」

    こんなものがあるようです。

    adb

    こんな感じで、PCのChromeからデベロッパーツールを開いたり、AndroidのChromeを操作することもできます。

    詳細な紹介は元記事を参照してください。

    Chrome Web Store – ADB

    をChromeにインストールするとPC側の準備完了。

    Android側端末の設定

    これで使える!と思いきや、端末側も設定がいるようです。

    まず、設定 -> 端末情報 -> ビルド番号を7回タップ。
    すると、「デベロッパーになりました」というメッセージが表示されますので、設定のトップページに戻ると、
    「開発者向けオプション」という項目が追加されています。その中の「USBデバッグ」を有効にします。

    これで、AndroidをUSBでPCにつないでADBを起動すると、ブラウザからCSSいじったり、JSいじったりできちゃいます!!

    Androidのケーブルの抜き差しが多発するので、ケーブルがだめになったりコネクタを傷めたりしないよう、優しく取り扱ってあげましょう。

  • inline-blockの隙間を、IEでもChromeでもOperaでもfirefoxでも消す。

    この間コーディングでfloatとheightでやるのも嫌だなぁと思い、inline-blockを活用したのですが、隙間を消すのに意外に苦労したので、メモ。
    letter-spacingで隙間を消すのが有名だと思いますが、それだとOperaでチェックした時に隙間が消えない!という問題に先日の案件で直面しました。

    [html]
    <div class="columns">
    <div class="column"></div>
    <div class="column"></div>
    <div class="column"></div>
    </div>
    [/html]

    [css]
    .columns {
    letter-spacing: -0.4em;
    word-spacing: -1em;

    }

    .column {
    display: inline-block;
    letter-spacing: normal;
    word-spacing: normal;
    /display: inline;
    /zoom: 1;
    }
    [/css]

    word-spacingを指定すると、Operaでも隙間が消えるみたいです。ただ、Webkit系のブラウザはword-spacingだと効かないみたいです。
    inline-blockって意外にブラウザ間で実装が違うみたいですね。ie8以上案件ならdisplay:table-cellを使う方が無難かも知れないですね。

  • LESSでCSSを書いてみた

    CSSのメンテナンス性の悪さは広く知られて居るとは思いますが、その解決策として、SASSとかSCSSなどがあります。今回はその仲間のLESSの導入記録です。

    公式サイト:LESS « The Dynamic Stylesheet language

    LESSというのは、CSSのメタ言語で、コレをコンパイルすると、CSSが出力されます。
    LESSを使うとこんなことが出来ます。

    LESSを使うと出来ること

    • ルールのネスト
    • 変数
    • Mixin
    • 四則演算などちょっとした関数

    また、普通のCSSの記法も使えますので、リセット用のCSS等そのままコピペも可能です。

    ルールのネスト(階層化)

    CSSのルールをネスト出来ます。いちいちセレクタをコピペしなくていいし、コードの視認性や、構造が非常にわかりやすくなります。親のセレクタを再利用するには、”&”を用います。

    less
    [css]
    #header {
    h1 {
    font-size: 26px;
    font-weight: bold;
    }
    p { font-size: 12px;
    a { text-decoration: none;
    &:hover { border-width: 1px }
    }
    }
    }
    [/css]

    css
    [css]
    #header h1 {
    font-size: 26px;
    font-weight: bold;
    }
    #header p {
    font-size: 12px;
    }
    #header p a {
    text-decoration: none;
    }
    #header p a:hover {
    border-width: 1px;
    }

    [/css]

    変数

    css内で変数が使えます。色などの一括管理などにはかなり便利です。

    less
    [css]
    @color: #4D926F;

    #header {
    color: @color;
    }
    h2 {
    color: @color;
    }
    [/css]

    css
    [css]
    #header {
    color: #4D926F;
    }
    h2 {
    color: #4D926F;
    }
    [/css]

    Mixin

    Mixinっていうと難しく聞こえますが、他のプロパティ内で、読み込んで使えるプロパティのまとまりを作る事ができるということです。

    [css]
    .hoge(){
    color: #FFF;
    background-color: #000;
    }
    [/css]
    でMixin用のプロパティを作成できます。このプロパティ自体はCSSに出力されません。また変数なども入れることも出来ます。

    less
    [css]
    .rounded-corners (@radius: 5px) {
    border-radius: @radius;
    -webkit-border-radius: @radius;
    -moz-border-radius: @radius;
    }

    #header {
    .rounded-corners;
    }
    #footer {
    .rounded-corners(10px);
    }
    [/css]

    css
    [css]
    #header {
    border-radius: 5px;
    -webkit-border-radius: 5px;
    -moz-border-radius: 5px;
    }
    #footer {
    border-radius: 10px;
    -webkit-border-radius: 10px;
    -moz-border-radius: 10px;
    }
    [/css]

    clearfixとかをMixinすると便利だったりします。

    ちょっとした計算など

    四則演算や、色を10%明るくするだとか、地味に便利な関数が用意されています。

    less
    [css]
    @the-border: 1px;
    @base-color: #111;
    @red: #842210;

    #header {
    color: @base-color * 3;
    border-left: @the-border;
    border-right: @the-border * 2;
    }
    #footer {
    color: @base-color + #003300;
    border-color: desaturate(@red, 10%);
    }
    [/css]

    css
    [css]
    #header {
    color: #333;
    border-left: 1px;
    border-right: 2px;
    }
    #footer {
    color: #114411;
    border-color: #7d2717;
    }
    [/css]

    他のLESSファイルのインポート

    [css]
    @import "reset.less";
    @import "reset";
    [/css]
    とすることで、reset.lessが展開されます。lessファイルの場合、拡張子を省いても大丈夫です。

    結構ざっくりとした説明ですので、詳細は:lesscss.orgの方を参照して下さい。英語ですがコードを眺めていればだいたいつかめると思います。

    導入について

    公式サイトでは、less.jsで、ブラウザでコンパイルをさせています。
    [html]
    <link rel="stylesheet/less" type="text/css" href="styles.less">
    <script src="less.js" type="text/javascript"></script>
    [/html]
    こんな感じです。ソースのhead内にcssを展開します。
    簡単にできますが、かなりブラウザに負荷がかかるので、おススメできません。制作中等限定で使用したほうが良いかと思います。

    なので、Macの場合、公式アプリのless.appを活用しましょう。コレは、登録されたlessファイルが更新されたときに自動的にcssファイルを作成してくれるソフトです。特定のディレクトリ内lessファイルを検索もしてくれるので、開発用のディレクトリを指定しておくとかなり簡単です。自分の場合はコレをログイン時に起動するようにしています。

    windowsの場合はmach3さんがlessniumというアプリケーションを作成していますので、それが便利だと思います。>>TitaniumデスクトップでLESS.jsのフロントエンドをこさえてみた
    なお、Lessniumには、Titaniumが必須です。

    また、Node.jsなどでも動作しますので、そちらは公式サイトを参照して下さい。

    LESSを使うと、CSSの管理等が、非常に楽になりますし、効率良くCSSを書いていく事ができます。SASSとかSCSSとか多機能なものもありますが、LESSは学習コストが低いのとコンパイルの手間が少ないので、試してみてはどうでしょうか。

    LESS « The Dynamic Stylesheet language

  • ie9.jsを使うと出来ること、出来なくなること。

    最近ie9.jsを活用することが少々あるので、
    いまさらながらまとめです。

    配布場所

    ie7-js
    http://code.google.com/p/ie7-js/で配布されています。

    デモはhttp://ie7-js.googlecode.com/svn/test/index.htmlで見れます。

    使い方

    head内に
    [html]
    <!–[if lt IE 9]>
    <script src="http://ie7-js.googlecode.com/svn/version/2.1(beta4)/IE9.js"></script>
    <![endif]–>
    [/html]
    と貼り付けるだけです。フッターに貼ると誤作動起こす場合がたまに合ったような気がします。

    できるようになること

    E > F
    子セレクタ。直下の子要素にのみ適応するやつ。
    E + F
    隣接兄弟セレクタ。Eのすぐ下隣に居る弟要素。
    E ~ F
    間接セレクタ。E以降の弟要素全て。
    .class1.class2
    クラスの重複指定
    :hoverの修正
    a以外にも効くようになります。
    [attr],[attr=”value”],[attr~=”value”],[attr|=”value”],[attr^=”value”][attr$=”value”],[attr*=”value”]
    属性セレクタ全般
    :before,:after
    擬似要素。
    :checked,:disabled,:empty,:enabled,:indeterminate,:first-of-type,:last-child,:last-of-type,:not(),:nth-child(),:nth-last-child(),:nth-last-of-type(),:nth-of-type(),:only-child,:only-of-type,:root,:target
    CSS3の擬似クラス
    opacity
    透明度がfilter要らずで効くようになります。もちろん内部的にはfilterを使っているのですが。
    article, aside, audio, canvas, details, figcaption, figure, footer, header, hgroup, mark, menu, meter, nav, output, progress, section, summary, time, video
    HTML5で追加された要素にCSSが当たるようになる。html5.jsとかhtml5shiv.jsを同時に読み込む必要はありません。
    透過PNGへの対応
    ファイル名をhoge-trans.pngにすると動作します。
    もしくは、
    [js]
    var IE7_PNG_SUFFIX = ".png";
    [/js]
    とすると全てのPNGに対して有効になります。

    出来なくなること。注意すべきこと。

    まぁ便利なのですが、そうそう美味いだけの話というのはなかなか無いもので。

    CSSハックが一部使えなくなる。

    個人的にはこれが一番大きいような気がします。

    • * html
    • *:first-child+html

    等のセレクタを使うようなハックは動作しなくなりました。まぁセレクタの挙動とかをFixするものなので当然なのでしょうけれど。。。
    なので、ただ読み込んだだけで全てがうまくいくようなものではないようです。

    重くなる

    ただでさえ、IE6等は重いのに、さらに重くなります。いまどきIE6が動いてるPCは古いですしね。
    特に、
    [js]
    var IE7_PNG_SUFFIX = ".png";
    [/js]
    等は全てのPNGが対象になるので、PNGをたくさん使うような場合はこの記述は避けたほうが懸命かと思います。

    :before,:after

    擬似要素を使うとき、どうやらここに1行分の高さを持った要素が生成されるようです。
    なのでclearfix等を擦るときはしっかりheight:0にしないとデザインがおかしくなることがあります。
    また、擬似要素を生成するとき、
    [html]
    <! class="ie7_class1">
    [/html]
    のような要素を生成するので、このクラスを指定してスタイルを当てることもたまには使えるかもしれません。

    新たに生成された要素にHTML5のタグがある場合

    Ajaxなどを使っている場合に起こるのですが、
    新しく生成されたHTML5要素には、やっぱりCSSが当たりません。
    この場合は、
    HTML 5 innerShiv
    http://jdbartlett.github.com/innershiv/
    などでやっつけるか、html5要素にcssを当てないだとか、html5要素をそこだけ避けるといったことが必要です。

    ザーッと書き並べてみましたけど、どうでしょう。
    自分が痛い目に合った記録みたいになってますね。

    Google AppsもIE7のサポート打ち切りを決めたようなので、早くIE8,IE9等に移行して頂ければ幸いです。切に願っています。
    Internet Explorer 8
    http://www.microsoft.com/ja-jp/windows/products/winfamily/ie/function/default.aspx

    Internet Explorer 9 のダウンロード
    http://windows.microsoft.com/ja-JP/internet-explorer/downloads/ie-9/worldwide-languages

  • CSS3で”Fizz Buzz”やってみた。

    ウェブルのsoraiyさんがCSS3 で3の倍数の要素にスタイルを適用するなんてエントリーを書いていたので、つい出来心でやってしまいました。

    今更なネタな気もしないでも無いですがそこはスルーで。
    せっかくなので、nth-of-typeでやります。

    デモはこちら

    [css]
    li {
    list-style: none;
    counter-increment: n;
    display: inline;
    }

    li:after {
    content: " , " counter(n);
    }

    li:first-of-type:after {
    content: counter(n);
    }

    li:nth-of-type(3n):after {
    content:" , Fizz";
    }

    li:nth-of-type(5n):after {
    content:" , Buzz";
    }

    li:nth-of-type(15n):after {
    content:" , FizzBuzz";
    }

    [/css]

    [html]
    <ol>
    <li></li>
    <li></li>
    ~略~
    <li></li>
    </ol>
    [/html]

    ちゃんとFizzBuzzになってるでしょう・・・?
    別にliでやる必要性は無いんですが、同じものがたくさん並ぶときってついliでやっちゃいますよね。

  • border-radiusとoverflow:hiddenをしたときの各ブラウザの挙動の違い

    最新のブラウザだとベンダープレフィックス無しでborder-radiusが使えるようになりました。
    そんなわけで仕事で使おうと思いましたが、ちょっとしたトラブルが。

    border-radiusを掛けた要素にoverflow:hiddenを掛けたときの挙動が各ブラウザでちょっと違います。
    そんなわけでそのまとめです。

    (さらに…)

  • 今更聞けない:before :afterの使い方

    CSS2.1で定義された疑似要素、:before,:after。
    しかし以外に使い方を知らないって人が多いはず。

    clearfixとかで色々お世話になっているはずのbefore,afterの使い方を改めてまとめて行ければと思います。

    (さらに…)

  • ie9.jsが便利すぎる。

    ie7-js – Project Hosting on Google Code
    に有る、ie9.jsがとても便利です。

    js非表示のクライアントはどうするって話もあるので、それはCase by Caseってことで。。。。

    (さらに…)

  • inline-blockの均等配置

    inline-blockを均等配置するためのCSS。
    現状firefox3.6,ie8で対応確認しました。たぶんその他モダンブラウザでも効く思われます。

    ie7はimgかa要素以外inline-blockが効かないので、非対応。aとimgには効きそうだけれど、未確認です。。。

    (さらに…)

  • floatさせた要素、inline-blockの高さをそろえる。

    display:boxはまだまだ実装が微妙だし、display:inline-blockやfloatだと、要素の高さ自体は変わらなくてborderとかbackgroundを使ったときいまいち困ったり。

    というわけでそんなとき用のjs。相変わらずjQueryです。

    (さらに…)