Список стран в формате HTML с флагами

Ищу способ выбрать и отобразить список стран, желательно с флагами. Какие-либо предложения?

Я начал с того, что попробовал этот плагин jQuery http://www.graphicpush.com/website-language-dropdown-with-jquery, но поскольку список стран, которые у меня есть, довольно велик, оказалось, что производительность была очень плохой (слишком много HTTP-запросов к изображениям). Также список становится громоздким, если он превышает 50 элементов.


person Mr.B    schedule 23.03.2011    source источник
comment
ты это погуглил? или сначала попробовать что-нибудь? мы не собираемся делать всю работу за u :-p   -  person Naftali aka Neal    schedule 23.03.2011
comment
См. Написание идеального вопроса   -  person gideon    schedule 23.03.2011
comment
Может, попробовать скачать все флаги и использовать пакетный конвертер изображений, чтобы уменьшить их размер?   -  person Pepe    schedule 23.03.2011
comment
Попробуйте заполнить элемент выбора названиями стран, а затем отобразить небольшой значок флажка при запуске события onchange. Вы также можете использовать спрайт флага (подумайте о нескольких изображениях в одном) и вместо этого манипулируйте background-position.   -  person    schedule 23.03.2011
comment
Я изучил решение для спрайтов, но преобразование ~ 80 изображений в спрайт было бы утомительной работой.   -  person Mr.B    schedule 23.03.2011
comment
Также в сети есть несколько генераторов спрайтов CSS. Возможно, вы захотите попробовать их.   -  person    schedule 23.03.2011
comment
Вот суть, которая использует плагин select2 для заполнения поля со списком с указанием страны и флага gist.github.com/ starx / eed701c8c84e0a475ce5   -  person Starx    schedule 14.10.2015


Ответы (5)


Примечание из будущего: автозаполнение пользовательского интерфейса jQuery теперь по умолчанию поддерживает настраиваемую визуализацию, см. http://api.jqueryui.com/autocomplete/#method-_renderItem.

Это довольно просто. Вещи, которые нужно:

  1. автозаполнение пользовательского интерфейса jQuery
  2. HTML-расширение для автозаполнения пользовательского интерфейса < / а>
  3. список названия / коды стран
  4. 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
});

Вот этот код в действии

person Ricardo Tomasi    schedule 23.03.2011
comment
Большой! Спрайт с флагами не искал. Теперь у меня есть все, что мне нужно. Большое спасибо, Рикардо! - person Mr.B; 24.03.2011
comment
Мне очень нравится этот ответ, я проголосовал за него, но jsbin не работает для меня - person Sam Saffron; 19.08.2011
comment
исправил это для вас :) он, вероятно, снова сломается в будущем, так как он напрямую ссылается на сторонние источники. - person Ricardo Tomasi; 21.08.2011
comment
@RicardoTomasi, код jsbin не отображает флаг точно. Например, флаг Бангладеш показан рядом с Бельгией. - person Istiaque Ahmed; 15.09.2012
comment
@IstiaqueAhmed этому вопросу больше 1,5 лет. Как я сказал выше, он сломается, потому что все он построен на сторонних ресурсах. На этот раз кажется, что изображение спрайта было изменено (github.com/lafeber / world-flags-sprite / tree / master / images). - person Ricardo Tomasi; 17.09.2012
comment
ОБНОВЛЕННАЯ ССЫЛКА на список имен / кодов: iso.org/obp/ui/#search - person alnafie; 09.02.2014
comment
ссылки №2 и №3 мертвы - person MattCochrane; 27.05.2015

Просто хотел предложить (имхо) более умный способ создания спрайта флагов.

Идея состоит в том, чтобы сохранить флаги в сетке в соответствии с кодом страны iso2.

1-я буква -> вертикальное положение
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/

А вот и спрайт моего флага:

введите описание изображения здесь

person roberkules    schedule 20.06.2012
comment
Элегантно! Очень элегантно!! Хотел бы я иметь это решение около года назад :) - person Mr.B; 20.06.2012
comment
+1 за очень элегантное решение. - person Doodloo; 07.08.2014
comment
Это очень изящное решение - person Alexander Holsgrove; 14.01.2016

Как упоминалось комментаторами, спрайт 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, которые я сделал, касались вопросов и ответов; вы, вероятно, захотите потратить некоторое время на их полировку. Я удалил все специфичные для флагов вещи из languageswitcher.css, поскольку мы используем flag16.css.

Кроме того, если код страны не существует в спрайте CSS, показанный флаг будет по умолчанию установлен на флаг Африканского Союза, поскольку он первое изображение в спрайте. В демонстрации некоторые страны в моем списке примеров не имеют изображения спрайта. Остерегайтесь этого.

person josh3736    schedule 23.03.2011
comment
Спасибо за продуманное решение! Сначала я был немного напуган, глядя на код здесь, но когда я увидел живую демонстрацию, я понял, что это не так сложно, как мысль. На этот раз я выбрал решение для автозаполнения. Но я буду помнить об этом решении на будущее. Еще раз спасибо, Джош! - person Mr.B; 24.03.2011
comment
@ Mr.B: приведенный выше код - это просто udiff, который упрощает точно посмотрите, какие изменения я внес в исходный код, по вашей ссылке. - person josh3736; 24.03.2011

Вот файл со списком стран и ссылками на их флаги (хотя некоторые ссылки могут не работать, но большинство из них работают) Файл Excel

person Pepe    schedule 23.03.2011

Вы также можете использовать флаги из 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;
}

person Anil    schedule 10.11.2013
comment
Было бы полезно добавить пример. - person Manolo; 10.11.2013
comment
Хорошо, я добавил четкий пример с тегом html (тег span), который показывает карту Непала с помощью сопоставления CSS, которое все определено выше. - person Anil; 17.11.2013