web-dev-qa-db-ja.com

フラグ付きのHTML国リスト

国のリストを選択して表示する方法を探しています。できればフラグを付けてください。助言がありますか?

私はこのjQueryプラグインを試すことから始めました http://www.graphicpush.com/website-language-dropdown-with-jquery ですが、私が持っている国のリストは非常に大きいため、パフォーマンスは本当に悪かった(画像へのHTTPリクエストが多すぎる)。また、リストが50要素よりも大きい場合、リストは大きくなります。

22
Mr.B

今後の注意:jQuery UIオートコンプリートはデフォルトでカスタムレンダリングをサポートするようになりました。 http://api.jqueryui.com/autocomplete/#method-_renderItem を参照してください。

とても簡単です。必要なもの:

  1. jQuery UIオートコンプリート
  2. Iオートコンプリートhtml拡張
  3. A 国名/コードのリスト
  4. A すべてのフラグを持つCSSスプライト

Googleはあなたの友達です。成分をうまくブレンドし、慎重にいくつかのjavascriptを泡立てます。これは7行のコードで完了しました。

var countries = [["Argentina", "ar"], ...];

var countryNames = countries.map(function(country){
  return {
      label: '<div class="flag '+country[1].toLowerCase()+'">'+country[0]+'</div>',
      value: country[0]
  }
});

$('#country').autocomplete({
  source: countryNames,
  html: true
});

これが動作中のこのコードです

30
Ricardo Tomasi

フラグSpriteを(賢明に)よりスマートに行う方法を提案したかっただけです。

アイデアは、国のiso2コードに従って、フラグをグリッドに保存することです。

最初の文字->垂直位置
2文字目->水平位置

例(16x11pxフラグ+ 4x4px間隔の場合):

Austria = AT
A = 1   => vertically 1st row       => y = (1-1)*(11+4)  = 0
T = 20  => horizontally 20th column => x = (20-1)*(16+4) = 380

United States = US
U = 21  => vertically 21st row      => y = (21-1)*(11+4) = 300
S = 19  => horizontally 19th column => x = (19-1)*(16+4) = 360

このようにして、クライアント側で非常に簡単な機能を使用して、200以上の追加のスタイル定義を必要とせずに、フラグの位置を計算できます。

サンプルjQueryプラグイン:

(function($) {
    // size = flag size + spacing
    var default_size = {
        w: 20,
        h: 15
    };

    function calcPos(letter, size) {
        return -(letter.toLowerCase().charCodeAt(0) - 97) * size;
    }

    $.fn.setFlagPosition = function(iso, size) {
        size || (size = default_size);

        return $(this).css('background-position',
            [calcPos(iso[1], size.w), 'px ', calcPos(iso[0], size.h), 'px'].join(''));
    };
})(jQuery);

デモの使用法:

$('.country i').setFlagPosition('es');

http://jsfiddle.net/roberkules/TxAhb/

そして、ここに私の旗スプライト:

enter image description here

33
roberkules

コメント者が述べたように、ここではCSSスプライトが適切なソリューションです。幸いなことに、 自由に利用できるフラグのCSSスプライトがたくさんありますこれ かなり良さそうです。

ドロップダウンコードを微調整して、事前に作成されたCSSスプライトに対応する必要があります。私はあなたのために先に進みました。 ライブデモです

languageswitcher.js

@@ -44,10 +44,11 @@
        source.removeAttr("autocomplete");
        var selected = source.find("option:selected");
        var options = $("option", source);
-       $("#country-select").append('<dl id="target" class="dropdown"></dl>')
-       $("#target").append('<dt class="' + selected.val() + '"><a href="#"><span class="flag"></span><em>' + selected.text() + '</em></a></dt>')
-       $("#target").append('<dd><ul></ul></dd>')
+        $("#country-select").append('<dl id="target" class="dropdown f16"></dl>')
+        $("#target").append('<dt><a href="#"><em class="flag ' + selected.val().toLowerCase() + '">' + selected.text() + '</em></a></dt>');
+        $("#target").append('<dd><ul></ul></dd>');
+        var $drop = $("#target dd ul");
        options.each(function(){
-           $("#target dd ul").append('<li class="' + $(this).val() + '"><a href="' + $(this).attr("title") + '"><span class="flag"></span><em>' + $(this).text() + '</em></a></li>');
+            $drop.append('<li><a href="' + $(this).attr("title") + '"><em class="flag ' + $(this).val().toLowerCase() + '">' + $(this).text() + '</em></a></li>');
            });
    }

languageswitcher.css

@@ -45,6 +45,8 @@

 .dropdown dd { position: relative; }

+.dropdown ul { max-height:350px; overflow-y:auto; overflow-x:hidden; }
+
 .dropdown a {
    text-decoration: none;
    outline: 0;
@@ -52,6 +54,7 @@
    display: block;
    width: 130px;
    overflow: hidden;
+    white-space:nowrap;
    }

 .dropdown dt a {
@@ -107,23 +110,6 @@
        padding: 2px 10px;
        }

-   .dropdown dd ul li a span,
-   .dropdown dt a span {
-       float: left;
-       width: 16px;
-       height: 11px;
-       margin: 2px 6px 0 0;
-       background-image: url(flags.png);
-       background-repeat: no-repeat;
-       cursor: pointer;
-       }
-
-       .us a span { background-position: 0 0 }
-       .uk a span { background-position: -16px 0 }
-       .fr a span { background-position: -32px 0 }
-       .de a span { background-position: -48px 0 }
-       .nl a span { background-position: -64px 0 }
-
    .dropdown dd ul li a em,
    .dropdown dt a em {
        font-style: normal;
@@ -138,3 +124,5 @@

        .dropdown dd ul li a:hover { background-color: rgba(255,255,255,.1); }
        .dropdown dd ul li a:hover em { color: #fff; }
+
+.flag { padding-left:18px; }

私が行ったCSSの変更はQ&Dハックでした。あなたはおそらくそれらを磨くのに時間を費やすことになるでしょう。 flag16.css を使用しているため、languageswitcher.cssからフラグ固有のものをすべて削除しました。

また、国コードがCSSスプライトに存在しない場合、表示されるフラグはデフォルトで  アフリカ連合の旗。スプライトの最初の画像です。デモでは、私の例のリストにある国のいくつかにスプライト画像がありません。気をつけて。

1
josh3736

国のリストと国旗へのリンクを含むファイルを次に示します(リンクの一部は機能していませんが、ほとんどは機能しています) Excel File

0
Pepe

http://www.famfamfam.com/lab/icons/flags/ のフラグを使用し、CSSを使用して適切なフラグを配置することもできます。

----編集済み----

私の国の国旗を表示する必要がある場合は、CSSからのマッピングを行います

_<span class='np'></span>_

_.np {_
background: url(./flags_preview_large.png) -172px -397px no-repeat;
_width: 14px;_
_height: 20px;_
_}_

0
Anil