jQueryでCSSの値を短縮

このQ&Aのポイント
  • jQueryを使用してCSSの値を短縮する方法を教えてください。
  • jQueryコードを最適化してCSSの値を短くする方法を教えてください。
  • for/while文を使用してCSSの値を短縮する方法を教えてください。
回答を見る
  • ベストアンサー

jQueryで指定するCSSの値を出来るだけ短縮

こんにちは。 以下のjQueryコードを出来るだけ短縮・最適化したいです。 for/while文でどうにかできそうな気がしますが、思いつきませんでした。 var icoPos = ($(window).width() / 4); var pos01 = '-'+icoPos+'px'; var pos02 = '-'+(icoPos*2)+'px'; var pos03 = '-'+(icoPos*3)+'px'; $('li.icon01').css('background-position', '0 0'); $('li.icon02').css('background-position', pos01+' 0'); $('li.icon03').css('background-position', pos02+' 0'); $('li.icon04').css('background-position', pos03+' 0'); $('li.icon05').css('background-position', '0 '+pos01); $('li.icon06').css('background-position', pos01+' '+pos01); $('li.icon07').css('background-position', pos02+' '+pos01); $('li.icon08').css('background-position', pos03+' '+pos01); $('li.icon09').css('background-position', '0 '+pos02); $('li.icon10').css('background-position', pos01+' '+pos02); $('li.icon11').css('background-position', pos02+' '+pos02); $('li.icon12').css('background-position', pos03+' '+pos02); $('li.icon13').css('background-position', '0 '+pos03); $('li.icon14').css('background-position', pos01+' '+pos03); $('li.icon15').css('background-position', pos02+' '+pos03); $('li.icon16').css('background-position', pos03+' '+pos03);

  • ongaq
  • お礼率100% (5/5)

質問者が選んだベストアンサー

  • ベストアンサー
  • fujillin
  • ベストアンサー率61% (1594/2576)
回答No.2

ほとんど同じなのと、ループ内で同じ計算をしてしまっていますが・・・ var icoPos = ($(window).width() / 4); for(var i=0; i<16; i++){  var selector = "li.icon" + (i<9?"0"+(i+1):i+1);  var position = (-icoPos * (i%4)) + "px ";    position += (icoPos * (i/4|0)) + "px";  $(selector).css("background-position", position); } ところで、background-positionの指定ってこれでいいんでしたっけ? (キャメルケースだったかも…)

ongaq
質問者

お礼

position += (-icoPos * (i/4|0)) + "px"; で完璧でした!ちょっと紐解かないと理解できない箇所もあるので(i%4とか…)、勉強させてもらいます。ありがとうございます。 >ところで、background-positionの指定ってこれでいいんでしたっけ? クォーテーションを付与しない場合は、キャメルケースですね。

その他の回答 (1)

回答No.1

なにやら複雑ですねぇ 可読性無視で単純にループ化するとこんな感じかなぁ var icoPos = ($(window).width() / 4); var pos01 = '-'+icoPos+'px'; var pos02 = '-'+(icoPos*2)+'px'; var pos03 = '-'+(icoPos*3)+'px'; var basePos = [ '0', pos01, pos02, pos03 ]; for ( var i = 0; i < 16; i+=4 ) { $('li.icon0' + (i + 1)).css('background-position', '0 ' + basePos[i%4]); $('li.icon0' + (i + 2)).css('background-position', pos01+' ' + basePos[i%4]); $('li.icon0' + (i + 3)).css('background-position', pos02+' ' + basePos[i%4]); $('li.icon0' + (i + 4)).css('background-position', pos03+' ' + basePos[i%4]); }

ongaq
質問者

お礼

回答ありがとうございます! この状態だとicon01~icon09までしかbackground-positionが付与されないため、改修が必要でした。for(i++)ばかり使ってるので、for(i+=4)とかはちょっとパッと出てこなかったです…勉強になります。ありがとうございます。 ちなみに関係ないどうでもいい情報ですが、俺も12/6生まれですのでなんとなく嬉しかったです。

関連するQ&A

  • グローバルナビゲーションのcssが、上手く動きません…

    下記、E部分のactive「のみ」変化がありません。 なお、F部分をactiveさせると背景がズレて表示されます。 そのため、寸法が誤っているのかと思い、E部分のpxを一時的に変化させてみても、全くE部分のみactiveになりません。。。 背景の寸法がおかしいのか?と思い、変えてみてもどうしてみE部分のみ activeにならず、行き詰ってしまいました。 初心者的な質問で恐れ入りますが、詳しい方がいらっしゃいましたらご助力頂けますと助かります 以下、CSSです ------------------------------------------------------------------ #globalnav li#A a{background-position:-20px -15px; width:180px; } #globalnav li#B a{background-position:-200px -15px; width:180px; } #globalnav li#C a{background-position:-380px -15px; width:162px; } #globalnav li#D a{background-position:-542px -15px; width:80px; } #globalnav li#E a{background-position:-622px -15px; width:80px; } #globalnav li#F a{background-position:-702px -15px; width:78px; } #globalnav li#A a:hover{background-position:-20px -95px; } #globalnav li#B a:hover{background-position:-200px -95px; } #globalnav li#C a:hover{background-position:-380px -95px; } #globalnav li#D a:hover{background-position:-542px -95px; } #globalnav li#E a:hover{background-position:-622px -95px; } #globalnav li#F a:hover{background-position:-702px -95px; } #globalnav li#A a:active{background-position:-20px -175px; } #globalnav li#B a:active{background-position:-200px -175px; } #globalnav li#C a:active{background-position:-380px -175px; } #globalnav li#D a:active{background-position:-542px -175px; } #globalnav li#E a:active{background-position:-622px -175px; } #globalnav li#F a:active{background-position:-702px -175px; } ------------------------------------------------------------------

  • CSSリストタグ

    <div class="test_box_1"> <ul> <li>テキスト <img src="img/icon.gif" width="20" height="20"></li> <li>テキスト</li> <li>テキスト</li> <li>テキスト</li> <li>テキスト</li> <li>テキスト</li> <li>テキスト</li> <li>テキスト</li> </ul> </div> こういった記述をして、リストの横にアイコン画像を出そうとしたのですが、 アイコンを入れると、バランスが崩れます。 (アイコンを入れた下に余白ができてしまったり。) アイコンの高さを小さくしてみたりといろいろやってみたのですが できません。 制御する方法はあるのでしょうか? ちなみに、CSSはこのように記述しています。 .test_box_1 ul { list-style-type: none; width: 100%; margin: 10px 0px 0px 10px; } .test_box_1 li { display: block; width: 30%; background-image: url(../images/list_arrow2.gif); background-repeat: no-repeat; background-position: 0px 3px; padding-left: 10px; float: left; } よろしくお願いします!

    • ベストアンサー
    • HTML
  • jqueryのCSSについてお聞きしたいのですが、

    本体にCSSを書くと正常に動きます .defaultlist,.defaultlist li{ padding:0px; margin:0px; } 外部リンクのjQueryだと下記だと正常に動きません $(".defaultlist,.defaultlist li").css({ "padding":"0px", "margin":"0px" }); 下記のサイト(設計力を学ぶデザインドリル)をみても書き方が問題ないと思います。 http://www.jquerystudy.info/reference/selectors/multiple2.html 外部リンクのjQueryで正常に動作させるにはどうしたらよろしいでしょうか。

    • 締切済み
    • CSS
  • jquery?css?IEで表示されません。

    現在HPを作成していて、ページ内リンクに、jQueryを入れてカレントページにナビゲーションを固定するようにしています。バックに白背景がカレントページのページ内リンクにしています。クロームで確認しても動くのにIEではバックが白にならず困っています。 jQueryとcss、どちらに原因があるのかすら分かりません。 ご回答いただけると幸いです。 jQuery // JavaScript Document $(function(){ var set = 300;//ウインドウ上部からどれぐらいの位置で変化させるか var boxTop = new Array; var current = -1; //各要素の位置 $('.box').each(function(i) { boxTop[i] = $(this).offset().top; }); //最初の要素にclass="on"をつける changeBox(0); //スクロールした時の処理 $(window).scroll(function(){ scrollPosition = $(window).scrollTop(); for (var i = boxTop.length - 1 ; i >= 0; i--) { if ($(window).scrollTop() > boxTop[i] - set) { changeBox(i); break; } }; }); //ナビの処理 function changeBox(secNum) { if (secNum != current) { current = secNum; secNum2 = secNum + 1;//HTML順序用 $('#nav li').removeClass('on'); $('#nav li:nth-child(' + secNum2 +')').addClass('on'); /* 位置によって個別に処理をしたい場合 if (current == 0) { // 現在地がsection1の場合の処理 } else if (current == 1) { // 現在地がsection2の場合の処理 } else if (current == 2) { // 現在地がsection3の場合の処理 }*/ } }; }); css div#nav ul li.on { box-shadow: 0 0 1px rgba(0, 0, 0, 0.3), 0 3px 7px rgba(0, 0, 0, 0.3),0 -3px 2px rgba(0, 0, 0, 0.25) inset; cursor:pointer; background-color:#FFF; color:#ffffff; }

    • ベストアンサー
    • CSS
  • jqueryでのプルダウンメニューについて

    jqueryでのプルダウンメニューについて こんにちは。 現在私はWEBサイトを製作中です。 メインメニューにプルダウンをつけたいのですが、うまくいきません。 メニューはロールオーバーでの表示(CSSでやってます)です。 slideDownを使用しているのですが、 マウスオーバー時にslidDownで表示された、 サブメニューの背景が、上の要素の背景になってしまいます。 つまり、下のコードでいくとid="sub"の背景がそのまま clas="sub"の"li"要素の背景になってしまうということです。 何か対策はありますでしょうか? html <div id="head"> <ul id="globalnavi"> <li id="gh"><a href=".">メニュー</a> <ul class="sub"> <li><a href="">サブメニュー</a></li> </ul> </li> </ul> </div> <div id="main"> </div> jquery $(function(){ $("ul.sub").hide(); $("ul#globalnavi>li").hover(function(){ $("ul:not(:animated)", this).slideDown();}, function(){$("ul.sub",this).slideUp();}); }); CSS #globalnavi a{ background-image : url(../img/navi.png); background-repeat : no-repeat; display : block; width : 160px; height : 36px; color : #333333; text-decoration : none; line-height : 36px; } #header #globalnavi li { list-style-type : none; float : left; width : 160px; position : relativ; } #header #globalnavi { clear : both; width : 960px; line-height : 36px; overflow : hidden; position : relative; text-align : center; display : block; } ul,li{ margin:0; padding:0; } .sub li{ float : none; background-color : #FFF; } #gh a{ background-position :0 0; } #gh a:hover{ background-position :0 -36px; } ロールオーバー自体はうまくいっています。 他にプルダウンの方法あるよ、などありましたら教えてください。 よろしくお願いします。

  • cssスプライト positionが効かない

    現在サイトを制作中で、グローバルナビのcssスプライトでつまずいてしまいました。 background-positionがなぜか効きません、、、、。 htmlとcssのチェックをしていただけないでしょうか?? どなたか親切なかた宜しくお願い致します!! <div id="gnav"> <ul> <li class="gnav_1"><a href="#"><img src="images/gnav_home.png" width="164" height="60" alt="ホーム" /></a></li> <li class="gnav_2"><a href="#"><img src="images/gnav_intro.png" width="164" height="60" alt="初めての方へ" /></a></li> <li class="gnav_3"><a href="#"><img src="images/gnav_staff.png" width="164" height="60" alt="スタッフ紹介" /></a></li> <li class="gnav_4"><a href="#"><img src="images/gnav_price.png" width="164" height="60" alt="料金" /></a></li> <li class="gnav_5"><a href="#"><img src="images/gnav_access.png" width="164" height="60" alt="アクセス" /></a></li> <li class="gnav_6"><a href="#"><img src="images/gnav_q&a.png" width="164" height="60" alt="よくあるご質問" /></a></li> </ul> </div><!--gnav--> --------------------------------css------------------------------ #gnav { overflow: hidden; } #gnav ul { margin: 24px 0 0 7px ; } #gnav ul li { float: left; width: 164px; height:60px; background: url(images/gnav_on.png) 0 0 no-repeat; } #gnav ul li a { display:block; } .gnav_2 { background-position: -164px 0; } .gnav_3 { background-position: -328px 0; } .gnav_4 { background-position: -492px 0; } .gnav_5 { background-position: -656px 0; } .gnav_6 { background-position: -820px 0 ; } #gnav ul li a:hover img{ visibility:hidden; }

    • ベストアンサー
    • CSS
  • 【CSS】list要素の画像メニュー

    CSSのlist要素で画像を横並べのロールオーバーにしたいので、本に載っているようにしてみましたが、 このようなCSSにしてしまうと、ページ全体のA要素に背景画像が付いてしまいます。 ul { width: 772px; list-style: none; } li,a { display: block; width: 193px; height: 38px; } li { float: left; textindent: -9999px; } a { text-decoration:none; background: url(画像URL) no-repeat; overflow: hidden; } #navi1 a { background-position: 0px 0px; } #navi2 a { background-position: -193px 0px; } #navi3 a { background-position: -386px 0px; } #navi4 a { background-position: -579px 0px; } #navi1 a:hover { background-position: 0px -38px; } #navi2 a:hover { background-position: -193px -38px; } #navi3 a:hover { background-position: -386px -38px; } #navi3 a:hover { background-position: -579px -38px; } 全体のA要素は普通にしたいのですが、どのように改善すればよろしいでしょうか? 初歩的な質問で申し訳ありませんが、よろしくお願いいたします。

    • ベストアンサー
    • HTML
  • jQueryのCSSで値に変数を使う方法

    jQueryでCSSを設定する際、 $("div").css("プロパティ","値"); とすると思いますが、この値の部分に変数を利用することはできないのでしょうか。 何がしたいかというと、for文の中で乱数を発生させ、それを値として使いたいのです。 for(i=0; i<10; i++){ var num = Math.floor(Math.random()*100); $("div:eq(i)").css("width",num); } このように書いてみましたが駄目でした。 値に変数を使う方法はありませんでしょうか。 できない場合、このような方法(CSSの値に乱数を使う)を実現できる方法はありませんでしょうか。

  • jqueryでHTMLを変える

    jquery初心者です。 色々検索してみましたが、見つからないのでここで質問させてください。 jqueryでHTMLソースの変更方法を教えてください。 <a id="link"> <div id="back-img" style="background-image:a.jpg; background-position:0px 100px;" ></div> </a> -------------CSS------------- a{position:absolute;} イメージの上にposition指定のリンクが重なり、 aをマウスhoverで <div style="background-image:a.jpg; background-position:0px 100px;" > ↓ <div style="background-image:a.jpg; background-position:100px 0px;" > に変更したいです。 どうぞよろしくお願いします。

  • CSSで横並びのロールオーバーの表示がおかしいです

    知人に頼まれて、ホームページを作成中なのですが、一枚の組み合わせた画像を使い、横に5つの内容を表示してbackground-positionで表示を指定して、ロールオーバーの横並びのナビを作っています。 当方はあまり知識がないなりに、様々なサイト様を参考にしたのですが、うまく表示されませんのでご助力をお願いいたします。 症状としては、画像が横並びに5つ表示はされるものの、position: 0 0; の値の画像が5つ並んで表示されます。 オンマウスも効いていません。 使用ソフトは、HeTeMULU Creator 確認ブラウザは、FireFox5 表示したい画像は、width 190px height 60pxを5つ横に繋げた950pxの画像とそれの色違いをもう一つ用意して、加工して上下に繋げた、950px 120pxの画像です。 以下ソースです。 /*---HTML*/ <?xml version="1.0" encoding="shift_jis "?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja"><head> <meta http-equiv="Content-Type" content="text/html; charset=shift_jis"> <meta http-equiv="Content-Style-Type" content="text/css"> <link rel="stylesheet" href="css/style.css" type="text/css" media="all"> <title>###</title> </head> <body> <div id="main"> <div id="menu"> <ul> <li class="menu1"><a href="#">sample</a></li> <li class="menu2"><a href="#">sample</a></li> <li class="menu3"><a href="#">sample</a></li> <li class="menu4"><a href="#">sample</a></li> <li class="menu5"><a href="#">sample</a></li> </ul> </div> </div> </body> </html> /*---CSS*/ #menu{ width: 950px; height: 60px; margin-top: 20px; margin-bottom: 20px; padding: 0px; } #menu ul{ margin: 0px; padding: 0px; } #menu li{ width: 190px; margin: 0px; padding: 0px; float: left; text-indent: -9999px; } #menu a{ display: block; width: 100%; height: 60px; background-image: url(../img/menu001.png); background-repeat: no-repeat; .menu1 a{ background-position: 0px 0px;} .menu2 a{ background-position: -190px 0px;} .menu3 a{ background-position: -380px 0px;} .menu4 a{ background-position: -570px 0px;} .menu5 a{ background-position: -760px 0px;} #menu a:hover{ background-image: url(../img/menu001.png); background-repeat: no-repeat; .menu1 a:hover{ background-position: 0px -60px;} .menu2 a:hover{ background-position: -190px -60px;} .menu3 a:hover{ background-position: -380px -60px;} .menu4 a:hover{ background-position: -570px -60px;} .menu5 a:hover{ background-position: -760px -60px;} ご指摘を宜しくお願いいたします。