Html Список стран с флагами
Я ищу способ выбора и отображения списка стран, предпочтительно с флагами. Любые предложения?
Я начал с этого плагина jQuery http://www.graphicpush.com/website-language-dropdown-with-jquery, но поскольку список стран у меня довольно большой, оказалось, что производительность была очень плохой ( слишком много http-запросов к изображениям). Также список громоздкий, когда он больше 50 элементов.
Ответы
Ответ 1
Примечание в будущем: автозаполнение jQuery UI теперь поддерживает пользовательские рендеринг по умолчанию, см. http://api.jqueryui.com/autocomplete/#method-_renderItem.
Это довольно легко. Что вам нужно:
Помните, что 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
});
Здесь этот код в действии
Ответ 2
Просто хотел предложить (imho) более умный способ справиться с флагом.
Идея состоит в том, чтобы сохранить флаги в сетке в соответствии с кодом страны 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);
Использование Demo:
$('.country i').setFlagPosition('es');
http://jsfiddle.net/roberkules/TxAhb/
И вот мой флаг спрайта:
![enter image description here]()
Ответ 3
Как упоминалось комментаторами, спрайт 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 hacks; вы, вероятно, захотите потратить некоторое время на их полировку. Я удалил все специфичные для флага вещи из languageswitcher.css, так как мы используем flag16.css.
Кроме того, если код страны не существует в CSS-спрайте, указанный флаг будет по умолчанию равен http://www.veryicon.com/icon/16/Flag/Country%20Flags/African%20Union%20Flag.png Африканский союз флаг, поскольку это первое изображение в спрайте. В демонстрации некоторые из стран в моем списке примеров не имеют спрайта. Следите за этим.
Ответ 4
Вот файл со списком стран и ссылками на их флаги (некоторые из ссылок могут не работать, но большинство из них)
Файл Excel
Ответ 5
Вы также можете использовать флаги http://www.famfamfam.com/lab/icons/flags/ и просто использовать CSS для размещения соответствующего флага.
---- EDITED ----
Если мне нужно показать флаг моей страны, тогда я бы сделал отображение из CSS как
<span class='np'></span>
.np {
background: url(./flags_preview_large.png) -172px -397px no-repeat;
width: 14px;
height: 20px;
}