2012-03-21 10 views
2

私はそこにCSSの達人がいることを期待しています... 私は、水平ナビゲーションバーを含むサイトのレスポンシブなレイアウトを構築しています一番上にあります。このバーには同じ幅の5つのボタンがあります(ただし、この幅は柔軟にする必要があります)。小さなビューポート幅のデバイスでメニューを表示するときのボタンのテキストの代わりにアイコンを使用したいと思います。私は、ビューポートの幅が適切なサイズに達したと感じたら、メディアクエリを使用してテキストを使用するようにレイアウトを調整します。アイコン自体のサイズを変更する必要があるとは予想していないため、これは重要です。私はそれらがボタンの中心に固定サイズであることができてうれしく、ボタンのサイズ自体が変更されると、中心のアイコンの周りに単に「パディング」があります。 通常は、1つのイメージにすべてのアイコンを使用し、イメージの正しい部分だけを表示するためにスプライト技法を使用しますが、問題が発生しました。アンカー要素が親リスト要素を埋めるようにしたい場合、どうすればスプライトを中心に置くことができますか?ここでレスポンシブデザイン内のCSSスプライトの使い方

は、いくつかの例のマークアップです: 最初のHTML(スニペット)

<nav> 
    <ul class="top_nav"> 
    <li><a class="link_1" href="#">link 1</a></li> 
    <li><a class="link_2" href="#">link 2</a></li> 
    <li><a class="link_3" href="#">link 3</a></li> 
    <li><a class="link_4" href="#">link 4</a></li> 
    <li><a class="link_5" href="#">link 5</a></li> 
    </ul> 
</nav> 

そして、私はこのようにそれをスタイルかもしれません:

nav ul { 
      width: 100%; 
      overflow: auto; 
     } 

nav li { 
      float: left; 
      width: 20%; 
      background: #2c2c2c; /* dark background for light icons */ 
     } 

nav li a { 
      display: block; 
      border: 1px solid #e7e7e7; 
      background-image: url(path/to/sprite.png); 
      background-repeat: no-repeat; 
      text-indent: -15000px; 
      width: 48px; 
      height: 48px; 
      margin: 0 auto; 
      } 

nav li a.link_1 { 
        background-position: 0 0; 
       } 

nav li a.link_2 { 
        background-position: 0 -49px; 
       } 

など....

しかし、この親要素のサイズに応じて幅を変更できるボタン内で48px x 48pxのクリック可能な領域しか得られません。アンカー要素を親リスト要素に塗りつぶした場合、マージンルールを使用してアイコンを中央揃えすることはできません。 私が空だったが、それはこのような背景だとアイコンを持っていたアンカー要素内の別の要素を追加することができます。と

<li><a href="#"><div class="link_1">Link 1</div></a></li> 

とスタイルそれ:

nav li a { 
      display: block; 
      border: 1px solid #e7e7e7; 
      width: 100%; 
      } 

nav li a div { 
       background-image: url(path/to/sprite.png); 
       background-repeat: no-repeat; 
       text-indent: -15000px; 
       width: 48px; 
       height: 48px; 
       margin: 0 auto; 
       } 

nav li a div.link_1 { 
        background-position: 0 0; 
       } 

しかし、これは非常にセマンティックではありませんまたはエレガントなソリューション。誰もが何か良いと思うことができますか?

答えて

4

あなたは使用することができます。

    代わりにクリーンなコードを維持するために、実際の要素の
  • 生成されたコンテンツ(:before/:after)。
  • background-size背景画像をズームするプロパティ。
  • Data URIsスプライトの代わりに。データURIは現在のすべてのブラウザでサポートされています(IE8はデータURIとして表される各ファイルの最大サイズの32KBの制限があります)。
+0

パーフェクト。 :: after擬似要素は完璧な仕掛けをします – musoNic80

+1

あなたのソリューションのコードを投稿できますか?私も同様の問題があります。ありがとうございました! –

+0

最初のオプション ':before /:after'は、レスポンシブcssスプライト(別名スケーリングバックグラウンド)の問題をどのように解決しますか?コードを提供できますか? –

2

私は実際には、偉大なクロスブラウザをサポートしているソリューションを持っている素敵なきれいなコードを持っており、ここにも私のブログで少し超えるCSSのマークアップで背景画像としてスプライトを使用するための文書化されていますhttp://pagecrafter.com/responsive-background-image-sprites-css-tutorial/

本質的には、要素のアスペクト比を維持するための巧妙なトリックに依存する一方、背景画像は前記要素のフルサイズを維持することができます。それでは、バックグラウンドスプライトの位置をパーセントで指定するだけです!このメソッドもうまくいきます。なぜなら、CSSを準備したら、クラスにクラスを適用するだけでよいからです。

+0

リンクが壊れています、それは[this one](http://blog.brianjohnsondesign.com/responsive-background-image-sprites-css-tutorial/)ですか? –

+0

ありがとうございます。私のパーマリンクに何が起こったのか分かりません... –

3

私はresponsive CSS sprite generatorを作成しました。

アスペクト比を維持するためにデータURIの透明なPNG、適切な画像を表示するためのバックグラウンド位置、およびバックグラウンドサイジング:100%を使用してスケーリングします。

他のいくつかのテクニックとは異なり、これは単一のスプライトで異なるサイズとアスペクト比の画像で動作します。

+0

これは本当に素晴らしいです –

関連する問題