<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>jQuery и другое... &#187; список</title>
	<atom:link href="http://www.linkexchanger.su/tag/spisok/feed" rel="self" type="application/rss+xml" />
	<link>http://www.linkexchanger.su</link>
	<description>css, html, php, javascript, jQuery, ajax ... - решения, примеры, рецепты</description>
	<lastBuildDate>Tue, 25 May 2010 08:13:42 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Каскад раскрывающихся списков</title>
		<link>http://www.linkexchanger.su/2009/82.html</link>
		<comments>http://www.linkexchanger.su/2009/82.html#comments</comments>
		<pubDate>Fri, 06 Feb 2009 09:00:42 +0000</pubDate>
		<dc:creator>Gennady</dc:creator>
				<category><![CDATA[ajax]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[json]]></category>
		<category><![CDATA[список]]></category>

		<guid isPermaLink="false">http://www.linkexchanger.su/2009/82.html</guid>
		<description><![CDATA[При создании приложений для Web часто бывает необходимо установить в элементе select варианты выбора, значения которых зависят от параметров другого элемента select. Простой пример &#8211; выбор страны в одном раскрывающемся списке приводит к загрузке в следующий такой список перечня автомобилей, производимых в этой стране. А при выборе марки автомобиля, в следующий список загружаются модели этого [...]]]></description>
			<content:encoded><![CDATA[<p>При создании приложений для Web часто бывает необходимо установить в элементе <strong>select</strong> варианты выбора, значения которых зависят от параметров другого элемента <strong>select</strong>. Простой пример &#8211; выбор страны в одном раскрывающемся списке приводит к загрузке в следующий такой список перечня автомобилей, производимых в этой стране. А при выборе марки автомобиля, в следующий список загружаются модели этого авто. Вот и давайте попробуем вместе решить эту задачу, создав <strong>каскад раскрывающихся списков</strong>.<span id="more-82"></span></p>
<p>Для начала определим задачу: первый список будет содержать предварительно загруженные названия стран и всегда находиться в активном состоянии. Два оставшихся списка &#8211; выбора авто и выбора модели, пустые и находятся в неактивном состоянии. После того, как в первом списке будет выбрана страна необходимо заполнить второй список названиями автомобилей и перевести его в активное состояние. А после выбора названия автомобиля &#8211; заполнить список названиями моделей именно этого автомобиля и тоже активировать список. Кроме того, мы должны гарантировать, что пользователь никогда не сможет выбрать автомобиль &laquo;HONDA Vectra произведеный в Ю.Корее&raquo;. Для обмена данными с сервером будем использовать популярный нынче формат JSON.</p>
<p>Итак, задача определена. Поехали?</p>
<p>Начнем с чего-нибудь очень простого. Например с подключения библиотеки jQuery и создания HTML-разметки:</p>
<p>В HEAD страницы подключаем библиотеку:</p>
<pre class="brush: xml;">&lt;script src=&quot;js/jquery-1.3.1.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;</pre>
<p>В BODY создаем HTML-разметку:</p>
<pre class="brush: xml;">
&lt;div class=&quot;border&quot;&gt;
  &lt;label&gt;Страна&lt;/label&gt;&lt;br /&gt;
  &lt;select id=&quot;country&quot;&gt;
    &lt;option value=&quot;&quot;&gt;Выбрать страну&lt;/option&gt;
    &lt;option value=&quot;1&quot;&gt;Германия&lt;/option&gt;
    &lt;option value=&quot;2&quot;&gt;Ю.Корея&lt;/option&gt;
    &lt;option value=&quot;3&quot;&gt;Япония&lt;/option&gt;
  &lt;/select&gt;
&lt;/div&gt;
&lt;div class=&quot;border&quot;&gt;
  &lt;label&gt;Автомобиль&lt;/label&gt;&lt;br /&gt;
  &lt;select id=&quot;auto&quot; disabled=&quot;disabled&quot;&gt;&lt;/select&gt;
&lt;/div&gt;
&lt;div class=&quot;border&quot;&gt;
  &lt;label&gt;Модель&lt;/label&gt;&lt;br /&gt;
  &lt;select id=&quot;model&quot; disabled=&quot;disabled&quot;&gt;&lt;/select&gt;
&lt;/div&gt;
</pre>
<p>Легко и просто! Каждому списку &#8211; по id. Первый раскрывающийся список заполняем названиями стран. Два других ничем не заполняем и мало того, устанавливаем в неактивное состояние с помощью атрибута disabled. Описания стилей я приводить не буду &#8211; это дело вкуса каждого и не в тему этой статьи.</p>
<p>Что дальше? Задача оказалась не так уж и проста, как казалось в начале. Поэтому предлагаю пораскинуть мозгами и решить, какие  общие действия мы будем производить над всеми списками. Я придумал два &#8211; заполнение списка и очистка списка. Давайте оформим  эти операции в виде методов jQuery, чтобы иметь возможность в любой момент вызвать этот метод в цепочке команд jQuery.</p>
<blockquote><p>Расширение для jQUery может быть либо методом, оперирующим с набором элементов, либо вспомогательной функцией, которая определяется непосредственно в $. Простой пример: в составе библиотеки есть метод <strong>each(callback)</strong>, который работает как раз с набором элементов, выполняя функцию, определенную в параметре callback в контексте каждого элемента набора и вспомогательная функция <strong>$.each(object,callback)</strong>, которая применяется для обхода массива или объекта, переданного в первом параметре с выполнением функции callback для каждого элемента массива(объекта). Почувствовали разницу?</p></blockquote>
<pre class="brush: jscript;">(function($){
  // очищаем select
  $.fn.clearSelect = function() {
    return this.each(function(){
      if(this.tagName=='SELECT') {
        this.options.length = 0;
        $(this).attr('disabled','disabled');
      }
    });
  }
  // заполняем select
  $.fn.fillSelect = function(dataArray) {
    return this.clearSelect().each(function(){
      if(this.tagName=='SELECT') {
        var currentSelect = this;
        $.each(dataArray,function(index,data){
          var option = new Option(data.text,data.value);
          if($.support.cssFloat) {
            currentSelect.add(option,null);
          } else {
            currentSelect.add(option);
          }
        });
      }
    });
  }
})(jQuery);</pre>
<p>Итак, что мы тут написали?</p>
<p>При написании метода <strong>clearSelect()</strong> мы воспользовались методом <strong>each(callback)</strong> для того, чтобы произвести необходимые операции над каждым элементом, переданным в наборе jQuery. Сначала производим проверку &#8211; если <strong>tagName</strong> переданного элемента действительно SELECT, то удаляем все элементы option и устанавливаем атрибуту disabled значение disabled.</p>
<p>Метод <strong>fillSelect(dataArray)</strong> несколько сложнее. Он получает в качестве параметра массив dataArray, содержащий данные, которыми необходимо заполнить выпадающий список. Правда перед тем, как заполнять список, мы вызовем метод <strong>clearSelect</strong>, чтобы очистить список от возможно оставшихся там данных. С помощью метода <strong>each(callback)</strong> мы перебираем все элементы, переданные в наборе jQuery, проверяем, действительно ли это элемент select и, если да, то сначала запоминаем его в переменной currentSelect. Затем воспользуемся вспомогательной функцией <strong>$.each(object,callback)</strong> для обхода массива dataArray. В каждой итерации создаем элемент options, заполняем его соответствующими данными и добавляем в select.</p>
<p>При добавлении option мы вынуждены учитывать различия между браузерами. К счастью и тут поможет jQuery. Здесь используем новую вспомогательную функцию <strong>$.support</strong>, которая появилась в jQuery с версии 1.3 взамен <strong>$.browser</strong>. Проверим значение свойства <strong>cssFloat</strong> &#8211; false укажет нам на IE, а true на FF, Opera, Safari. Вы можете применить свой способ проверки.</p>
<blockquote><p>Обратите внимание: при написании метода <strong>fillSelect(dataArray)</strong> мы использовали метод <strong><a href="http://docs.jquery.com/Core/each#callback">each(callback)</a></strong> и вспомогательную функцию <strong><a href="http://docs.jquery.com/Utilities/jQuery.each#objectcallback">$.each(object,callback)</a></strong> &#8211; это разные вещи.</p></blockquote>
<p>Теперь оба наших новых метода могут работать с набором элементов jQuery, который им будет передан. Этот код можно было бы вынести в отдельный файл &#8211; к тому же эти методы могут пригодиться и в других приложениях, а использовать их можно проще простого:</p>
<pre class="brush: jscript;">
// очищаем select
$('select').clearSelect();
// заполняем select
$('select').fillSelect(dataArray);</pre>
<p>Двигаемся дальше. Теперь мы напишем пару функций, которые будут обслуживать списки выбора автомобиля и выбора модели.</p>
<pre class="brush: jscript;">
// выбор автомобиля
function adjustAuto(){
  var countryValue = $('#country').val();
  var tmpSelect = $('#auto');
  if(countryValue.length == 0) {
    tmpSelect.attr('disabled','disabled');
    tmpSelect.clearSelect();
    adjustModel();
  } else {
    $.getJSON(
      'cascadeSelectAuto.php',
      {country:countryValue},
      function(data) {
        tmpSelect.fillSelect(data).attr('disabled','');
        adjustModel();
    });
  }
};</pre>
<p>Здесь мы сначала запоминаем в переменной <strong>countryValue</strong> значение, выбранное в списке стран <strong>#country</strong>. В переменной <strong>tmpSelect</strong> будем хранить ссылку на элемент select с идентификатором <strong>#auto</strong> &#8211; список выбора автомобиля. Далее следует проверка:</p>
<p>Если страна не выбрана, то мы устанавливаем атрибуту disabled элемента select с идентификатором <strong>#auto</strong> значение &#8216;disabled&#8217; и вызываем метод <strong>clearSelect()</strong> для очистки этого списка от возможно находящихся там значений. Также мы вызовем функцию <strong>adjustModel()</strong> (про нее чуть позже).</p>
<p>Иначе, мы отправляем с помощью вспомогательной функции <strong>$.getJSON</strong> запрос к файлу <strong>cascadeSelectAuto.php</strong>, передавая в качестве данных значение, сохраненное в переменной <strong>countryValue</strong>. При получении ответа сервера вызываем функцию, в которой определена нужная нам последовательность действий. А именно &#8211; к переменной <strong>tmpSelect</strong> (не забыли &#8211; это список с идентификатором <strong>#auto</strong>) применяем нами же написанный метод <strong>fillSelect(data)</strong>, который заполнит список данными, которые получены от сервера и наконец переводим элемент в активное состояние с помощью атрибута disabled. Остается не забыть вызвать функцию <strong>adjustModel()</strong>, чтобы обработать выпадающий список моделей.</p>
<p>Функция <strong>adjustModel()</strong>, которая обрабатывает список моделей, очень похожа на <strong>adjustAuto()</strong>, поэтому нет смысла ее детально рассматривать. Обратите внимание разве на то, что теперь мы запоминаем значение из списка не только выбранной страны, но и выбранного автомобиля. И еще в <strong>if &#8211; else</strong> не вызываем что-то похожее на <strong>adjustModel()</strong>, поскольку список выбора модели у нас последний &#8211; дальше обрабатывать просто нечего.</p>
<pre class="brush: jscript;">
// выбор модели
function adjustModel(){
  var countryValue = $('#country').val();
  var autoValue = $('#auto').val();
  var tmpSelect = $('#model');
  if(countryValue.length == 0||autoValue.length == 0) {
    tmpSelect.attr('disabled','disabled');
    tmpSelect.clearSelect();
  } else {
    $.getJSON(
      'cascadeSelectModel.php',
      {country:countryValue,auto:autoValue},
      function(data) {
        tmpSelect.fillSelect(data).attr('disabled','');
    });
  }
};</pre>
<p>Поздравляю! Самая сложная часть пути уже позади! Остались сущие пустяки.</p>
<pre class="brush: jscript;">$('#country').change(function(){
  adjustAuto();
}).change();</pre>
<p>Связываем с выпадающим списком стран событие <strong>change(fn)</strong>, при наступлении которого вызываем <strong>adjustAuto()</strong> &#8211; функцию, которая заполнит выпадающий список автомобилей. В цепочке команд вызываем <strong>change()</strong>, чтобы вызвать событие при начальной загрузке страницы.</p>
<pre class="brush: jscript;">$('#auto').change(adjustModel);</pre>
<p>С выпадающим списком автомобилей связываем событие <strong>change(fn)</strong>, при наступлении которого будет выполнена функция <strong>adjustModel()</strong>, которая заполнит список моделей.</p>
<pre class="brush: jscript;">$('#model').change(function(){
  if($(this).val().length != 0) {
    alert('Выбор сделан!');
  }
});</pre>
<p>И наконец, при изменении списка моделей выполним небольшую проверку &#8211; если действительно выбрана какая-либо модель, выведем в <strong>alert</strong> сообщение. Ну а в действительности тут можно придумать все, что угодно. Например вывести подробную информацию о технических характеристиках, красивую фотографию авто, чтобы его захотелось купить и конечно цену&#8230;</p>
<p>Ах, да! Совсем забыл &#8211; работающий пример:<br />
<iframe src="http://www.linkexchanger.su/jquery_articles/cascadeSelect.html" style="border: medium none " width="420" height="100"></iframe></p>
<blockquote><p>Вы можете открыть <strong><a href="http://www.linkexchanger.su/jquery_articles/cascadeSelect.html" target="_blank">пример</a></strong> в новом окне, чтобы посмотреть исходный код. Вы можете <strong><a href="http://www.linkexchanger.su/jquery_articles/cascadeSelect.zip">скачать</a></strong> архив, который содержит файлы примера (в том числе cascadeSelectAuto.php и cascadeSelectModel.php).</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.linkexchanger.su/2009/82.html/feed</wfw:commentRss>
		<slash:comments>104</slash:comments>
		</item>
		<item>
		<title>CSS: создание горизонтального текстового меню на основе списка.</title>
		<link>http://www.linkexchanger.su/2008/28.html</link>
		<comments>http://www.linkexchanger.su/2008/28.html#comments</comments>
		<pubDate>Mon, 04 Feb 2008 21:11:43 +0000</pubDate>
		<dc:creator>Gennady</dc:creator>
				<category><![CDATA[css]]></category>
		<category><![CDATA[li]]></category>
		<category><![CDATA[ul]]></category>
		<category><![CDATA[меню]]></category>
		<category><![CDATA[список]]></category>

		<guid isPermaLink="false">http://www.linkexchanger.su/2008/28.html</guid>
		<description><![CDATA[Мы уже пробовали создавать вертикальное текстовое меню на основе списка. Попробуем теперь использовать список для создания горизонтального текстового меню.
Как всегда первый шаг &#8211; это создание HTML-разметки.

&#60;ul&#62;
  &#60;li&#62;&#60;a href=&#34;/&#34;&#62;Главная&#60;/a&#62;&#60;/li&#62;
  &#60;li&#62;&#60;a href=&#34;products.html&#34; id=&#34;current&#34;&#62;Продукция&#60;/a&#62;&#60;/li&#62;
  &#60;li&#62;&#60;a href=&#34;gallery.html&#34;&#62;Фото&#60;/a&#62;&#60;/li&#62;
  &#60;li&#62;&#60;a href=&#34;responses.html&#34;&#62;Отзывы&#60;/a&#62;&#60;/li&#62;
  &#60;li&#62;&#60;a href=&#34;feedback.html&#34;&#62;Контакты&#60;/a&#62;&#60;/li&#62;
&#60;/ul&#62;

Здесь необходимо обратить внимание на пункт, где встречается id=&#187;current&#187;. В реально работающем меню необходимо [...]]]></description>
			<content:encoded><![CDATA[<p>Мы уже пробовали создавать вертикальное текстовое меню на основе списка. Попробуем теперь использовать список для создания горизонтального текстового меню.<span id="more-28"></span></p>
<p>Как всегда первый шаг &#8211; это создание HTML-разметки.</p>
<pre class="brush: xml;">
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;/&quot;&gt;Главная&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;products.html&quot; id=&quot;current&quot;&gt;Продукция&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;gallery.html&quot;&gt;Фото&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;responses.html&quot;&gt;Отзывы&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;feedback.html&quot;&gt;Контакты&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</pre>
<blockquote><p>Здесь необходимо обратить внимание на пункт, где встречается <strong>id=&raquo;current&raquo;</strong>. В реально работающем меню необходимо определять текущую страницу при ее загрузке и присваивать этот <strong>id</strong> соответствующему пункту.</p></blockquote>
<p>А теперь приведу таблицу стилей для организации этого списка в горизонтальное меню.</p>
<pre class="brush: css;">ul {
  padding:3px 0;
  margin-left:0;
  border-bottom:1px solid #003;
  font:bold 8pt Verdana, sans-serif;
}
ul li {
  list-style:none;
  margin:0;
  display:inline;
}
ul li a {
  padding:3px 0.5em;
  margin-left:3px;
  border:1px solid #003;
  border-bottom:none;
  background-color:#FFA6BD;
  text-decoration:none;
  color:#AD2039;
}
ul li a:hover {
  background-color:#AD2039;
  color:#FFA6BD;
}
ul li a#current {
  background-color:#fff;
  border-bottom:1px solid #fff;
}</pre>
<p>Ничего особенно хитрого тут нет. Сначала зададим отступы и левое поле для элемента <strong>ul</strong>, там же определяем нижнюю рамку для всего элемента и шрифт, а вот затем начинается более интересное правило. Для <strong>ul li</strong> мы скрываем стандартные маркеры, полям задаем значение 0 и наконец <strong>display:inline;</strong> &#8211; вот что заставляет наш список &laquo;вытянуться&raquo; в строку.</p>
<p>Дальше описываем элемент <strong>a</strong>, задавая ему отступы, поля, рамки, определяя цвет фона и шрифта. Обращу внимание разве что на определения свойства <strong>border</strong>. Сначала заданы значения свойства <strong>border</strong> для всех четырех сторон, а в следующей строке мы пишем <strong>border-bottom:none;</strong>, т.е. отменили рамку снизу. Такой вариант написания вполне имеет право на существование.</p>
<p>Далее определяем стили элемента <strong>а</strong> при наведении на него указателя мыши &#8211; тут мы изменим только цвет фона и цвет текста.</p>
<p>И самое последнее &#8211; стили для элемента имеющего <strong>id=&raquo;current&raquo;</strong>. Цвет фона задаем совпадающим с цветом основного фона страницы, как впрочем и цвет нижней рамки.</p>
<p>Вот, что у нас получилось в итоге.<br />
<iframe src="http://www.linkexchanger.su/example_css/ul-menu-horizontal.html" style="border: medium none " height="70" width="420"></iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://www.linkexchanger.su/2008/28.html/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>CSS: создание текстового меню с визуальными эффектами на основе списка.</title>
		<link>http://www.linkexchanger.su/2008/27.html</link>
		<comments>http://www.linkexchanger.su/2008/27.html#comments</comments>
		<pubDate>Sun, 03 Feb 2008 21:12:05 +0000</pubDate>
		<dc:creator>Gennady</dc:creator>
				<category><![CDATA[css]]></category>
		<category><![CDATA[li]]></category>
		<category><![CDATA[ul]]></category>
		<category><![CDATA[меню]]></category>
		<category><![CDATA[список]]></category>

		<guid isPermaLink="false">http://www.linkexchanger.su/2008/27.html</guid>
		<description><![CDATA[Попробуем создать навигационное меню для сайта, но при его создании будем учитывать некоторые ограничения. Например, что это меню не должно использовать JavaScript, но в то же время иметь визуальные эффекты. Это меню должно оставаться работоспособным даже в случае, если в браузере пользователя отключено отображение стилей.
Итак, приступим. Меню будет представлять собой список, так как и теоретически [...]]]></description>
			<content:encoded><![CDATA[<p>Попробуем создать навигационное меню для сайта, но при его создании будем учитывать некоторые ограничения. Например, что это меню не должно использовать JavaScript, но в то же время иметь визуальные эффекты. Это меню должно оставаться работоспособным даже в случае, если в браузере пользователя отключено отображение стилей.<span id="more-27"></span></p>
<p>Итак, приступим. Меню будет представлять собой список, так как и теоретически и практически это наилучший способ структурирования меню.  Прежде всего создадим HTML-разметку.</p>
<pre class="brush: xml;">
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;/&quot;&gt;Главная&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;about.html&quot;&gt;О компании&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;products.html&quot;&gt;Каталог продукции&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;gallery.html&quot;&gt;Фото объектов&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;responses.html&quot;&gt;Отзывы клиентов&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;scheme.html&quot;&gt;Схема проезда&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;feedback.html&quot;&gt;Форма для связи&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</pre>
<p>Далее приведу файл стилей, который будет подробно прокомментирован.</p>
<pre class="brush: css;">ul {
  list-style:none;
  margin:0;
  padding:0;
  font-family:Arial, Helvetica, sans-serif;
  font-size:0.9em;
  font-weight:bold;
  width:20em;
  border-bottom:1px solid #003;
  border-right:1px solid #003;
  border-left:1px solid #003;
}
ul li {
  border-top:1px solid #003;
}
ul li a {
  display:block;
  padding:2px 2px 2px 0.5em;
  border-left:15px solid #AD2039;
  background-color:#FFA6BD;
  color:#AD2039;
  text-decoration:none;
  width:100%;
}
html &gt; body ul li a {
  width:auto;
}
ul li a:hover {
  border-left:15px solid #FFA6BD;
  background-color:#AD2039;
  color:#FFA6BD;
}</pre>
<p>Рассмотрим подробнее стилевое оформление элемента <strong>ul</strong>. Сначал скроем стандартные маркеры списка, затем установим значения свойств <strong>margin</strong> и <strong>padding</strong> (почему мы устанавливаем именно оба свойства можно прочитать в статье &laquo;CSS: задание отступов и изменение стилей маркера в списках.&raquo;). Свойства <strong>font</strong> установят нужные шрифты и размер. Свойство <strong>width</strong> ясное дело будет отвечать за ширину списка. Следующие три строки устанавливают рамку шириной в 1px справа, снизу и слева для элемента <strong>ul</strong>.</p>
<p>Почему не сверху? Потому, что неплохо иметь такую же тонкую рамку, которая будет отделять каждый элемент списка. Это мы проделаем, написав правило <strong>border-top:1px solid #003;</strong> для <strong>ul li</strong> (для всех элементов li, являющихся дочерними по отношению к элементу ul).</p>
<p>В следующем правиле <strong>ul li a</strong> мы зададим стили ссылок. Поскольку элемент <strong>a</strong> по умолчанию &#8211; это строчный элемент, нам необходимо изменить его отображение, чтобы элементы <strong>a</strong> отображались как блочные. Это необходимо для того, чтобы можно было использовать меню щелкая мышью на всем выбираемом элементе, а не только на тексте ссылки. Делаем это, задавая свойству <strong>display</strong> значение <strong>block</strong>.</p>
<p>Определяем отступы со всех сторон в свойстве <strong>padding</strong>, задаем рамку слева толщиной в 15px в свойстве <strong>border-left</strong>, определяем свойства <strong>background-color</strong> (цвет фона) и <strong>color</strong> (цвет текста), а также удаляем подчеркивание ссылок, воспользовавшись свойством <strong>text-decoration</strong>.</p>
<p>Последняя строчка задает теперь уже блочному элементу ширину <strong>width</strong> в 100%. Это сделано специально для IE, но может создать проблемы в Netscape Navigator и IE для Mac и поэтому следующее правило <strong>html&gt;body ul li a</strong> написано специально для решения этой проблемы. IE не сможет его прочесть, поскольку не умеет обрабатывать правила для селектора потомка.</p>
<p>И наконец последнее правило будет задавать стили использующиеся при наведении указателя мыши на ссылку. Здесь мы просто задаем другие цвета в свойствах <strong>border-left</strong>, <strong>background-color</strong> и <strong>color</strong>.</p>
<p>Вот как это будет выглядеть. По моему неплохо. Такое меню будет вполне работоспособно и при отключенной поддержке стилевого оформления.<br />
<iframe src="http://www.linkexchanger.su/example_css/ul-menu-vertical.html" style="border: medium none " height="200" width="420"></iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://www.linkexchanger.su/2008/27.html/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>CSS: как создать графический или текстовый маркер в списке.</title>
		<link>http://www.linkexchanger.su/2008/26.html</link>
		<comments>http://www.linkexchanger.su/2008/26.html#comments</comments>
		<pubDate>Fri, 01 Feb 2008 06:00:16 +0000</pubDate>
		<dc:creator>Gennady</dc:creator>
				<category><![CDATA[css]]></category>
		<category><![CDATA[li]]></category>
		<category><![CDATA[ol]]></category>
		<category><![CDATA[ul]]></category>
		<category><![CDATA[маркер]]></category>
		<category><![CDATA[список]]></category>

		<guid isPermaLink="false">http://www.linkexchanger.su/2008/26.html</guid>
		<description><![CDATA[Выбор стандартных маркеров в списках в общем невелик, особенно если вести речь о ненумерованных списках. Как быть, если стоит задача создать и использовать свои собственные маркеры, текстовые или графические? Задача эта вполне решаема&#8230;.
Правда сразу оговорюсь, что для начала мы разберем скорее теоретические основы, поскольку существует браузер названИЕкоторого все знают. Нормальное решение основано на использовании автоматически [...]]]></description>
			<content:encoded><![CDATA[<p>Выбор стандартных маркеров в списках в общем невелик, особенно если вести речь о ненумерованных списках. Как быть, если стоит задача создать и использовать свои собственные маркеры, текстовые или графические? Задача эта вполне решаема&#8230;.<span id="more-26"></span></p>
<p>Правда сразу оговорюсь, что для начала мы разберем скорее теоретические основы, поскольку существует браузер названИЕкоторого все знают. Нормальное решение основано на использовании автоматически генерируемого контента, а вышеупомянутый браузер (будем честными до конца &#8211; не только он один) не поддерживает эту возможность. Зато это прекрасно работает в Mozilla, FireFox, Netscape 6+, Opera и Safari. А затем разберем и универсальное решение. К сожалению не такое изящное.</p>
<p>Посмотрите на этот CSS-код:</p>
<pre class="brush: css;">ul {
  list-style:none;
  margin:0;
  padding:0 0 0 1em;
  text-indent:-1em;
}
li {
  width:20%;
  padding:0;
  margin:0 0 0.25em 0;
}
li:before {
  content:&quot;&#92;&#48;0BB &#92;&#48;020&quot;;
}</pre>
<p>Для начала скрываем маркер списка, который имеется по умолчанию с помощью <strong>list-style:none;</strong> затем устанавливаем левый отступ 1em, но при этом сдвигаем текст влево на ту же величину, т.е. -1em для того, чтобы &laquo;вытолкнуть&raquo; стандартный маркер из блока элемента списка. С помощью псевдоэлемента <strong>:before</strong> генерируем текстовый маркер. В свойстве <strong>content</strong> нужные символы указаны с помощью шестнадцатеричного escape-эквивалента Unicode, как того требует спецификация CSS2.1. В примере сгенерирована последовательность символов из двойной стрелки-ёлочки и пробела. Изящно, просто и красиво, но не для IE &#8230;</p>
<p>&#8230; и решение, которое подойдет для всех браузеров. К сожалению, уже не такое красивое. Текстовый маркер придется просто вставлять перед каждым элементом списка. Как показано ниже:</p>
<pre class="brush: xml;">
&lt;ul&gt;
  &lt;li&gt;» Первый пункт списка&lt;/li&gt;
  &lt;li&gt;» Второй пункт списка&lt;/li&gt;
  &lt;li&gt;» Третий пункт списка&lt;/li&gt;
  &lt;li&gt;» Четвертый пункт списка&lt;/li&gt;
  &lt;li&gt;» Пятый пункт списка&lt;/li&gt;
&lt;/ul&gt;
</pre>
<p>а таблицу стилей для этого варианта надо немного изменить. Вот так:</p>
<pre class="brush: css;">ul {
  list-style:none;
  margin:0;
  padding:0 0 0 1em;
}
li {
  width:20%;
  padding:0;
  margin:0 0 0.25em 0;
}</pre>
<p>Однако и в этом способе есть недостаток, правда не очень критический. Если в браузере пользователя отключена поддержка CSS, он увидит два маркера для каждого элемента списка &#8211; маркер, генерируемый браузером и маркер, который мы добавили вручную.</p>
<p>Разберем другой вопрос: как сделать маркер, используя картинку?</p>
<p>Для того, чтобы применить графический маркер используется свойство <strong>list-style-image</strong>, как показано в примере ниже</p>
<pre class="brush: css;">ul {
  list-style-type: disc;
  list-style-image: url(marker.png);
}</pre>
<p>Свойство <strong>list-style-type</strong> используется здесь на всякий случай, если браузер пользователя не имеет возможности использовать изображение. А в свойстве <strong>list-style-image</strong> задается путь к нужной картинке. Управлять размером картинки, которая используется как маркер списка, из таблицы CSS мы не сможем и поэтому надо убедиться в том, что картинка имеет подходящие размеры. Еще один нюанс состоит в том, что значения графических маркеров наследуются и если Вы создаете вложенные списки и хотите отказаться от маркера изображения в них, надо опять использовать свойство <strong>list-style-image</strong>. Вот таким образом:</p>
<pre class="brush: css;">ul ul {
  list-style-image:none;
}</pre>
<p>А вот если хочется в качестве маркера списка иметь довольно большую картинку, такой способ уже не подойдет, поскольку часть картинки может быть просто &laquo;обрезана&raquo;. Чтобы обойти это ограничение нужно поступить несколько иначе:</p>
<pre class="brush: css;">ul {
  margin-left:10px;
  padding-left:0px;
  list-style:none;
}
li {
  padding:0.5em 0 0.5em 54px;
  font: 1.3em/1.6 Verdana, Arial, sans-serif;
  background:url(bigMarker.png) no-repeat;
}</pre>
<p>Сначала задаем значения и для левого поля и для левого отступа списка (почему именно так, я объяснял в одной из предыдущих статей). Потом удаляем маркер, используемый по умолчанию. Теперь главное: <strong>padding:0.5em 0 0.5em 54px;</strong> &#8211; мы освобождаем место слева от элемента списка, для того, чтобы вставить туда нашу большую картинку (например 54х54 пиксела), затем задаем свойство <strong>font</strong> таким образом, чтобы текст элемента списка не диссонировал с размером картинки-маркера и наконец используем свойство <strong>background</strong>, чтобы эту картинку вставить в качестве маркера списка.</p>
<p>Надеюсь, что это статья поможет кому-нибудь&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.linkexchanger.su/2008/26.html/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Пользовательские интерфейсы jQuery: drag-and-drop сортируемый список.</title>
		<link>http://www.linkexchanger.su/2008/23.html</link>
		<comments>http://www.linkexchanger.su/2008/23.html#comments</comments>
		<pubDate>Mon, 28 Jan 2008 10:25:02 +0000</pubDate>
		<dc:creator>Gennady</dc:creator>
				<category><![CDATA[jQuery]]></category>
		<category><![CDATA[drag-and-drop]]></category>
		<category><![CDATA[draggable]]></category>
		<category><![CDATA[droppable]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[li]]></category>
		<category><![CDATA[ol]]></category>
		<category><![CDATA[ul]]></category>
		<category><![CDATA[интерфейс]]></category>
		<category><![CDATA[меню]]></category>
		<category><![CDATA[список]]></category>

		<guid isPermaLink="false">http://www.linkexchanger.su/2008/23.html</guid>
		<description><![CDATA[Внимание! Эта статья устарела. Новая статья по этой теме: &#171;jQuery UI &#8211; плагин Sortable&#187;. Давайте используем возможности jQuery для создания сортируемого с помощью drag-and-drop списка. Возможность сортировать список с помощью простого перетаскивания мышкой  его пунктов, наверняка сможет произвести впечатление на Ваших пользователей. Только не забывайте одну важную вещь: применение всех этих &#171;фишек&#187; должно быть [...]]]></description>
			<content:encoded><![CDATA[<p><font color="#ff0000">Внимание! Эта статья устарела. Новая статья по этой теме: <a href="http://www.linkexchanger.su/2009/111.html">&laquo;jQuery UI &#8211; плагин Sortable&raquo;</a>.</font> Давайте используем возможности jQuery для создания сортируемого с помощью drag-and-drop списка. Возможность сортировать список с помощью простого перетаскивания мышкой  его пунктов, наверняка сможет произвести впечатление на Ваших пользователей. Только не забывайте одну важную вещь: применение всех этих &laquo;фишек&raquo; должно быть целесообразным и соответствовать ожиданиям пользователя. Не стоит применять такие эффекты сплошь и рядом  &#8211; можно  получить совсем не тот результат, на который Вы рассчитывали. Это было небольшое лирическое отступление, а теперь &#8211; к делу.<span id="more-23"></span><br />
Как обычно, первым делом рассмотрим работу пары примеров.<br />
Меню слева работает с опциями, установленными по умолчанию. Все, что нужно для создания такого меню (разумеется, кроме библиотеки jQuery и своего HTML-кода), это написать следующее:</p>
<pre class="brush: jscript;">$(&quot;#menuList&quot;).sortable();</pre>
<p>где <strong>#menuList</strong> &#8211; это идентификатор списка.<br />
В меню справа использованы некоторые дополнительно установленные опции. Код конечно немного посложнее, но и в нем нет абсолютно ничего страшного.<br />
<iframe src="http://www.linkexchanger.su/example_jquery/sortable.html" style="border: medium none " width="420" height="250"></iframe></p>
<blockquote><p>Вы можете скачать <a href="http://www.linkexchanger.su/example_jquery/sortable.zip">исходный код</a> примера, и при наличии библиотеки jQuery воспроизвести это пример на своем сайте.</p></blockquote>
<p>А теперь разберем примеры более подробно. Этот пример для своей корректной работы требует подключения достаточно большого количества различных вспомогательных файлов.</p>
<pre class="brush: xml;">
&lt;script src=&quot;js/jquery-1.2.1.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
&lt;script src=&quot;js/jquery.dimensions.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
&lt;script src=&quot;js/ui.mouse.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
&lt;script src=&quot;js/ui.draggable.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
&lt;script src=&quot;js/ui.draggable.ext.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
&lt;script src=&quot;js/ui.droppable.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
&lt;script src=&quot;js/ui.droppable.ext.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
&lt;script src=&quot;js/ui.sortable.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;</pre>
<p>Все файлы уже знакомы по предыдущим примерам. Добавился только один файл <strong>ui.sortable.js</strong>, который (как и все остальные) мы подключаем в разделе <strong>HEAD</strong> нашей страницы.<br />
Из таблицы стилей остановлюсь только на небольшом моменте, поскольку это по большому счету дело вкуса.</p>
<pre class="brush: css;">.dragStyle {
  background:#CFD4E6;
  border:1px solid #727EA3;
}</pre>
<p>Класс <strong>dragStyle</strong> используется во втором примере и применяется в момент перемещения элемента, отображая то место, на которое перемещаемый элемент будет &laquo;сброшен&raquo;.</p>
<p>Далее полностью приведен кусок кода, который и отвечает за работу обоих списков.</p>
<pre class="brush: jscript;">&lt;script type=&quot;text/javascript&quot;&gt;
$(document).ready(function(){
  $(&quot;#menuList&quot;).sortable(); // 1-ый спискок

  $(&quot;#menuList2&quot;).sortable({ // 2-ой список
	hoverClass: &quot;dragStyle&quot;,
	start: function(ev, ui) {
	  var text = $(ui.draggable.element).text();
	  $(&quot;#result&quot;).text(&quot;Перемещаем &quot; + text);
	},
	stop: function(ev, ui) {
	  $(&quot;#result&quot;).text(&quot;Перемещение окончено!&quot;);
	}
  });
});
&lt;/script&gt;</pre>
<p>Вот так просто. За работу первого списка отвечает всего-навсего одна строка кода. Для второго списка мы используем некоторые дополнительные опции.<br />
<strong>hoverClass</strong> &#8211; опция содержит название класса, который будет применен в процессе перемещения одного из пунктов списка, чтобы указать место, куда перемещаемый пункт будет &laquo;сброшен&raquo;.<br />
<strong>start</strong> &#8211; здесь указываем функцию, которая выполнится в момент старта перемещения элемента списка. В этой функции мы обращаемся к перемещаемому элементу, получаем его содержимое в виде текста и записываем в переменную <strong>text</strong>. Затем отыскиваем элемент <strong>#result</strong> и вставляем текст туда.<br />
<strong>stop</strong> &#8211; указываем функцию, которая выполнится в момент, когда произошел &laquo;сброс&raquo; элемента на нужную позицию (независимо от того изменилась ли фактическая позиция элемента). Тут тоже все предельно просто &#8211; вставляем текст сообщения в элемент <strong>#result</strong>.</p>
<p>Я использовал для примера всего несколько опций, а их полный список опций можно найти на сайте разработчиков библиотеки.</p>
<p>Буду рад, если найдете возможность оставить свой комментарий или задать вопросы.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.linkexchanger.su/2008/23.html/feed</wfw:commentRss>
		<slash:comments>63</slash:comments>
		</item>
		<item>
		<title>CSS: задание отступов и изменение стилей маркера в списках</title>
		<link>http://www.linkexchanger.su/2008/20.html</link>
		<comments>http://www.linkexchanger.su/2008/20.html#comments</comments>
		<pubDate>Tue, 22 Jan 2008 19:59:57 +0000</pubDate>
		<dc:creator>Gennady</dc:creator>
				<category><![CDATA[css]]></category>
		<category><![CDATA[li]]></category>
		<category><![CDATA[ol]]></category>
		<category><![CDATA[ul]]></category>
		<category><![CDATA[маркер]]></category>
		<category><![CDATA[список]]></category>
		<category><![CDATA[стиль]]></category>

		<guid isPermaLink="false">http://www.linkexchanger.su/2008/20.html</guid>
		<description><![CDATA[Знаете ли Вы, что разные браузеры используют различные методы для формирования отступов в нумерованных и ненумерованных списках? Это действительно так. Браузеры IE и Opera создают отступы руководствуясь свойством margin, а Mozilla и Netscape &#8211; используют для этого же свойство padding. Для того, что бы страница выглядела одинаково во всех браузерах надо что-то предпринимать. Так что [...]]]></description>
			<content:encoded><![CDATA[<p>Знаете ли Вы, что разные браузеры используют различные методы для формирования отступов в нумерованных и ненумерованных списках? Это действительно так. Браузеры IE и Opera создают отступы руководствуясь свойством margin, а Mozilla и Netscape &#8211; используют для этого же свойство padding. Для того, что бы страница выглядела одинаково во всех браузерах надо что-то предпринимать. Так что же?<span id="more-20"></span></p>
<p>Решение в этом случае достаточно простое. При создании стилевого оформления списка надо просто учесть этот факт и задать оба свойства, например вот так:</p>
<pre class="brush: css;">
ul {
  margin-left: 50px;
  padding-left: 0px;
}</pre>
<p>Если же Вы попытаетесь разделить эти 50px между свойствами margin и padding, то отображение страницы в разных браузерах будет уже неодинаковым.<br />
С одним вопросом немного разобрались. Теперь во всех браузерах отступы одинаковые, но вот как-то бедно выглядят эти списки. У одного в качестве маркера &#8211; закрашенный кружочек, у другого &#8211; ничем не примечательные цифры.</p>
<blockquote><p>Возможно также создавать и свои собственные маркеры для списков, причем как текстовые, так и графические, но эти возможности мы рассмотрим отдельно.</p></blockquote>
<p>Для того, чтобы поменять стандартный стиль списка, воспользуйтесь свойством <strong>list-style-type</strong> и Вы сможете изменить маркер или тип счетчика.  Приведу возможные значения для ненумерованного списка.<br />
<strong>disc</strong> &#8211; обычно по умолчанию. Закрашенный кружок.<br />
<strong>circle</strong> &#8211; незакрашенный кружок.<br />
<strong>square</strong> &#8211; закрашенный квадратик.<br />
Т.е., если мы хотим вместо появляющегося по умолчанию закрашенного кружочка увидеть квадратик, пишем:</p>
<pre class="brush: css;">
li {
  list-style-type: square;
}</pre>
<p>Точно так же для нумерованного списка по умолчанию применяется значение <strong>decimal</strong>, т.е. начинается с 1, затем 2, 3 и так далее&#8230;<br />
Приведу еще несколько возможных значений:<br />
<strong>decimal-leading-zero</strong> &#8211; начинается с 01, потом идет 02, 03 и так далее. Количеству ведущих нулей может равняться числу значащих цифр. Например 0001 будет показан в списке из например 9999 элементов.<br />
<strong>lower-roman</strong> &#8211; строчные римские цифры.<br />
<strong>upper-roman</strong> &#8211; заглавные римские цифры.<br />
<strong>lower-greek</strong> &#8211; начинается с букв греческого алфавита: альфа, бета, гамма и т.д. (не поддерживается в IE).<br />
<strong>hebrew</strong> &#8211; начинается с традиционного иврита (не поддерживается в IE).<br />
<strong>none</strong> &#8211; как же без этого &#8211; маркеры не отображаются.</p>
<p>Ну и еще один маленький совет: браузеры в большинстве случаев изменяют тип маркера при переходе с одного уровня списка на другой. Для того, чтобы этого избежать необходимо менять значение свойства list-style-type в каждом списке-потомке.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.linkexchanger.su/2008/20.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
