По ту сторону Веб-страницы

Что модно и что можно

Во всех областях человеческой деятельности всегда есть так назы­ваемые мэйнстримные, андэграундные и ретроградные направления. Даже наука, которая, казалось бы, не должна зависеть ни от чего, кроме фактов, не обходится без религиозных споров и модных веяний.

Абсолютно такая же ситуация и с веб-дизайном. Есть некоторое количество технологий, которые на данный момент считаются модны­ми (мэйнстрим), и есть технологии, которые уже считаются устареваю­щими. Наконец, есть веб-разработчики, которые изобретают собствен­ные решения, которые либо заимствуются народом и переходят в разряд мэйнстримных, либо остаются безвестными.

На момент написания книги модным оказался целый букет тех­нологий: динамические страницы в целом, динамические сайты на Ajax, технология Ruby on Rails, блоги, аккаунты, RSS, стиль Web 2.0 (вклю­чающий неотъемлемую и очень «важную» часть — «гелевые кнопки», имитацию стиля Aqua и полупрозрачность), облака, XHTML, Find As You Type, плавные трансформации и веб-сервисы, а также Wiki.

Признаны немодными или выходящими из моды: фреймы, бегу­щая строка, Java, всплывающие окна, гостевые книги и порталы. Рассмотрим модные веяния подробнее.

О динамических страницах, генерирующихся на сервере, еще не­однократно пойдет речь в этой части, поэтому тут стоит только отме­тить, что это не только модное веяние, но и оправдавшая себя и весь­ма полезная практика. Построение сайтов на динамической основе не только упрощает разработку и (при необходимости) последующий ре­дизайн, но и позволяет оперировать данными более гибко, чем в случае

Со статическими сайтами: многократно использовать в разных местах сайта, использовать фрагменты существующих данных, автоматически генерировать списки ссылок, галереи иллюстраций, разнообразные от­четы и ссылки на последние обновления сайта.

Популярность технологии AJAX, известной и ранее, вспыхнула, пожалуй, после открытия проекта Gmail (Www.Gmail.Com), когда выясни­лось, что почтовый интерфейс может быть гораздо более динамическим, чем принято думать. Практически все действия (кроме входа в почту и выхода) осуществляются без перезагрузки страницы. Суть метода в том, что страница включает JavaScript-код, позволяющий отсылать данные на сервер и получать оттуда другие данные, в том числе на сервере обрабо­танные. В этом случае скорость работы как объективно, так и субъектив­но существенно возрастает: все действия происходят почти мгновенно. В большинстве случаев используется объект XMLHttpRequest, с помо­щью которого и происходит взаимодействие клиента и сервера в язы­ке JavaScript. Поскольку в разных браузерах обращение к этому объек­ту производится по-разному, целесообразно прибегнуть к ветвлению, в результате которого однозначно определяется переменная, содержащая обращение к объекту, пригодное для разных браузеров:

Function getXMLHttp() { var XMLHttp = null; if (window. XMLHttpRequest) { try {

XMLHttp = new XMLHttpRequest();

} catch (e) { }

} else if (window. ActiveXObject) { try {

XMLHttp = new ActiveXObject("Msxml2.

XMLHTTP”);

} catch (e) {

Try {

XMLHttp = new ActiveXObject("Microsoft.

XMLHTTP”);

} catch (e) { }

}

}

Return XMLHttp;

}

После такого определения можно обращаться к серверу и запра­шивать с него данные. В нижеприведенном примере (в котором допус­кается, что переменная XMLHttp уже определена в файле XMLHttp.Js) с сервера запрашивается текстовый файл file. txt и его содержимое запи­сывается в блок <div>, расположенный на странице, содержащей этот сценарий:

<script language="JavaScript" type="text/ javascript" src="XMLHttp. js"></script>

<script language="JavaScript" type="text/ javascript">

Window. onload = function() { var XMLHttp = getXMLHttp();

XMLHttp. open("GET", "file. txt", false); XMLHttp. send(null);

Document. getElementById("content").innerHTML = "Returned data: " + XMLHttp. responseText;

}

</script>

<div id="content">Ждем ответа cepBepa...</div>

Естественно, сценарий можно изменить дополнить, передавая в функцию имя файла, содержимое которого будет выводиться в блок. Альтернативное (и более компактное) решение (предложенное мною) можно найти в этой части книги далее, в главе «Весь сайт на одной странице».

Это один из примеров использования метода. С его помощью также можно передавать данные формы, делать запросы к базе данных и выполнять другие операции. Несомненно, использование метода XMLHttpRequest в качестве механизма для онлайнового почтового при­ложения является удачным решением. Однако новый, модный и не­обычный инструмент совсем не предполагает его использования везде, где можно. Если человек постоянно пользуется почтовым сервисом Gmail, он, разумеется, не будет отключать в браузере поддержку языков активных сценариев, потому что иначе он не сможет работать с новой почтой. Однако представим, что определенное количество сайтов, сде­ланных с помощью AJAX, посещается в основном благодаря поиско­вым системам, и посещается людьми, которые не слышали про Google и AJAX. В этом случае посетители вместо ожидаемого результата полу­чают сообщения об ошибке или пустые страницы, если разработчики не позаботились о том, чтобы информация была доступна и более при­вычным способом. Но нужна ли такая двойная работа? Пример еще раз иллюстрирует правило, что все должно быть к месту.

Ruby on Rails совмещает сразу две технологии: язык Ruby и тех­нологию Rails. Ruby — это объектно-ориентированный язык програм­мирования с прозрачным синтаксисом; он был разработан в Японии в 1990 годах и за последние несколько лет стал популярен по всему

4

Программирование

Миру. А Rails — платформа с открытым исходным кодом для разработки веб-приложений, имеющих базу данных, ориентированная специаль­но на Ruby. Сочетание этих двух технологий позволяет разрабатывать код в несколько раз быстрее, чем с помощью других языков активных сценариев, поскольку многие рутинные операции, требующие в дру­гих языках десятков строк кода, в Ruby on Rails сведены к 1-2 строкам. По сравнению с другими языками для разработки веб-страниц тут есть свои особенности. Например, есть понятие контроллера и действия, на которых основано добавление новых функциональных страниц. Чтобы изменить вывод содержимого, нужно редактировать шаблоны, храня­щиеся в файлах с расширением. rhtml.

Специфика Ruby on Rails для российского веб-дизайна состоит в том, что очень небольшое количество хостинг-площадок поддержи­вает эту технологию. Кроме того, облегчая работу, технология изна­чально заключает разработчика в рамки: например, использование БД и не иначе, уже готовые шаблоны (известно, что часто написать код с нуля удобнее, чем редактировать чужой).

Феномен блогов, или интернет-дневников, возник как лави­нообразное явление сравнительно недавно, хотя, например, сайт livejournal. com, популярнейший в мире блогов, открыт еще в марте 1999 года, а diary. ru (по моему скромному мнению, являющийся лучшим блоговым сервисом с точки зрения удобства использования) существу­ет с 2002 года. Сейчас говорится о том, что блоги способны заменить некоторые средства массовой информации. Рассмотрим основные осо­бенности блогов и попытаемся выяснить, насколько они удобны. Дело в том, что иногда удобство использования блога владельцем от удобства использования его посетителями отделяет всего один шаг — об этом бу­дет рассказано чуть позже.

Итак, в первую очередь блог — это популярный вид сайта, особен­ность которого заключается в хронологическом расположении записей (иногда — с возможностью менять порядок вывода «с конца в начало» на «с начала в конец» — первый из них более логичен, если рассмат­ривать блоги как своеобразные новостные ленты, второй логичен, если посты — записи в блоге — образуют логическую последовательность). К каждому посту, как правило (если владелец не запретил), можно ос­тавлять комментарии, зарегистрировавшись или анонимно. Записи - посты могут быть любого характера: дневникового, информационного и т. п. Часто вместо текста записи авторы блогов помещают фотографии, изображения, видеоролики и иные включения.

Блоги бывают персональными, многопользовательскими и кол­лективными (последние чаще называются сообществами). Встречают­ся также корпоративные блоги, которые по типу изначально являются либо сообществами, либо многопользовательскими.

236

Для персонального блога не требуется регистрация: «движок» для блога можно скачать бесплатно с сайта разработчика или написать са­мому. Такой дневник ведет один человек, он там полный хозяин. Часто блог или включается на сайт, или является основным (или единствен­ным) разделом на сайте владельца.

Многопользовательские блоги и сообщества группы разработ­чиков помещают на каком-либо сервере. Для использования таких дневников требуется либо регистрация, либо (в случае корпоративных блогов) специальный допуск администратора. Зарегистрировавшись на многопользовательском сервере, пользователь получает в распоря­жение учетную запись, дисковое пространство под хранение файлов (обычно изображений) и — самое главное — возможность оставлять за­писи в отдельном дневнике. В случае с сообществами блог на всех один, но оставлять в нем записи могут все зарегистрированные пользователи. Разница большая: в первом случае пользователь получает индивидуаль­ное пространство виртуальной реальности, во втором — вынужден де­лить ручку и карандаш с соседями по коммуналке и не чувствует себя полноправным хозяином.

Оформление блогов, несмотря на разные цветовые гаммы и рас­положение навигационного блока относительно основного, в основном является стандартным. Основное место на главной странице блога обыч­но занимают записи (посты) или их заголовки и начальные слова, рас­положенные один над другим в порядке убывания в глубь времен. Каж­дый пост снабжается дополнительной информацией, из которой чаще всего присутствуют: дата создания; ключевые слова; ссылка на страницу или сценарий, позволяющие комментировать запись, и указание коли­чества уже оставленных комментариев; вспомогательные метки (место, из которого делалась запись, настроение, музыка и т. п.); ссылка на воз­можность занести запись в избранное. Посты располагаются один над другим, потому что сложно придумать иное расположение для большого количества однотипных фрагментов данных, кроме как последователь­ное (сложно, но, как обычно, возможно). Естественно, что довольно глупо размещать все существующие посты дневника на одной странице (некоторые пользователи делают по два десятка записей за день: мож­но посчитать, сколько постов средней длины в 3-4 строки накопится за год), поэтому в большинстве случаев количество записей, последова­тельно выводимых на одну страницу, ограничивается десятью или двад­цатью, а остальные скрываются за ссылкой (или рядом ссылок, указы­вающих на отдельные страницы блога). Навигационный блок, который обычно располагается слева, справа или сверху от основного (а иногда разбит на несколько фрагментов, которые располагаются в разных мес­тах; полноценного навигационного блока под основной частью я еще ни разу не встречал), включает в себя логотип или название дневника, ссылки на архив, на список ключевых слов, поисковый блок и ссылки

4

Программирование

На другие возможности, специфические для каждого блога. Остальные блоки являются необязательными: ссылки по теме, последние коммен­тируемые записи, популярные ключевые слова («тэги», «метки» или «темы» в терминологии некоторых блогов).

Администраторская часть блога включает три основных типа воз­можностей. Во-первых, добавление новой записи (это действие из все­го интерфейса одно из наиболее часто запрашиваемых), часто позво­ляющее также параллельно загрузить на сервер и отобразить в записи изображение или видеофайл, пометить ключевыми словами и опреде­лить степень доступности поста. Во-вторых, должны быть доступны операции над уже созданными записями: редактирование, удаление, временное скрытие, помещение в другую группу ключевых слов или в архив, перемещение по хронологии (чтобы запись, сделанная месяц назад, снова появилась в начале списка постов). В-третьих, есть группа действий, различных от блога к блогу: настройки дневника (внешний вид, выводимые блоки, количество выводимых на странице записей), настройки доступа (все записи видны только владельцу, всем посети­телям или только зарегистрированным посетителям, возможность ком­ментирования, возможность отправки электронной почты владельцу дневника), списки избранных дневников (друзей) и постоянных чи­тателей (в многопользовательских блогах), использование внутренней почты, экспорт постов для других сайтов, импорт постов с других бло­гов и большое количество других возможностей.

Общение с другими — наиболее активно развивающаяся часть сайтов. В связи этим возможность оставлять перекрестные ссылки, комментарии, импортировать чужие блоки информации и экспортиро­вать для других свои приобретает особую важность. Наиболее удобный формат экспорта — XML, а точнее, RSS, о котором речь пойдет даль­ше — в силу того, что этот формат стандартизирован и для совмести­мости почти всеми используется одинаково.

Структура блогов достаточно предсказуема: записи хранятся в базе данных либо в текстовых файлах (заметим, что для многополь­зовательских блогов первое не просто предпочтительнее, а намного логичнее). Сценарии, во-первых, служат для вывода записей на экран (часть для посетителей), а во-вторых, позволяют изменять состав днев­ника тем или иным способом (новые записи, редактирование, удаление, изменение дизайна — администраторская часть). Необходимо проду­мывать резервное копирование, потому что появление тысяч записей в единицу времени от разных пользователей чревато большими нагрузка­ми, а значит, и возможными сбоями.

Итак, мы подошли к пониманию удобства блогов. Блог — это уже продуманная структура собственного сайта. Достаточно настро­ить некоторые параметры, и сайтом уже можно пользоваться. У многих бесплатно предоставляемых сервисом поражающая воображение фун-

238

Кциональность, а это значит, что не надо ничего придумывать самому. Блог может служить как хранилищем личной информации, так и быть местом паломничества посетителей — в зависимости от целей создания и популярности блоггера. Можно использовать блог как новостную ленту, как сборник статей, как место публикации информации любого рода. Поэтому все больше сайтов сейчас разрабатываются уже напря­мую в формате блога, с хронологическим упорядочиванием материала и возможностью комментирования. Например, сайт Www.Coffeesponge.Ru является интересным ресурсом про кофе, про способы его приготовле­ния, но вместо семантического разделения на разделы сайт построен на бесплатном «движке» WordPress.

Но в хронологической организации материала кроется и глав­ное неудобство блогов. Посты выкладываются в блоги не только затем, чтобы их прочитать и забыть, но и затем, чтобы получить информацию. Многие блоги являются настоящими сокровищницами информации по технологиям, истории, искусству, лингвистике, боди-арту, регуляр­ным выражениям, литературе и другим областям человеческого знания. Естественно, что к этим блогам обращаются достаточно часто, но там не всегда можно найти нужную информацию. В качестве вспомогательных средств существуют поисковые системы (есть далеко не на всех блогах) и поиск по ключевым словам. Ни то ни другое не дает полноценной рубрикации материала, потому что ключевые слова присваиваются час­то произвольно, а поисковые системы выдают результаты не структури­рованно, да и не всегда индексируют нужные фрагменты.

Тот самый единственный шаг, который отделяет удобство вла­дельца от удобства посетителей — грамотное структурирование ин­формации в блоге, пусть даже и способом ключевых слов. Древовидное и логичное оглавление существенно упростит поиск нужной информа­ции. Вывод такой: блоги можно и нужно использовать, поскольку они очень удобны; главное — не забывать о том, что есть другие типы сайтов, где информация структурирована удобнее для посетителя. При разра­ботке позволяйте структурировать навигационное меню, и блог станет гораздо удобнее.

А еще в блогообразном сайте можно позволить посетителю са­мому навести порядок. Это является частным проявлением понятия «аккаунт».

Аккаунт (учетная запись) дает возможность входить на сайт пер- сонализированно. Это значит, что сайт можно некоторым образом на­страивать под себя, правда, настройки эти вступают в силу только после регистрации и по факту входа на сайт с паролем.

В частности, на многопользовательских блогах вход в свой ак­каунт дает возможность создавать новые записи и редактировать со­держимое дневника. Без входа сайт представляет собой просто набор

Постов, которые можно комментировать от лица «гостя» или владельца другого аккаунта.

Вход в аккаунт представляет собой заполнение одного-двух по­лей (реже больше): для ввода имени пользователя (по этому имени часто называется аккаунт) и пароля. После чего нажимается кноп­ка «Войти» («Зайти», «Входите», «Пустите», «Открыть», «ОК», «Отво­рить», «Enter», «Поехали», «Да!» и другие варианты) или просто кла­виша Enter на клавиатуре, и посетитель оказывается на огороженной территории, где только он хозяин (на самом деле он снимает комнату, а хозяев просто не всегда видно). Технологически это осуществляет­ся не так уж сложно: поля ввода имени и пароля — это тэги <input type="text" пате="название поля" /> для ввода имени и <input type="password" пате="название поля" /> для ввода пароля в пределах формы <form> ... </form>. По нажатию кнопки входа (<input type="submit" value="Войти" />) данные формы от­правляются в распоряжение той страницы, которая указана в качестве значения параметра action тэга <form>. Страница отправки и приема данных формы может быть одна и та же — так часто поступают для эко­номии количества страниц и кода.

Страница, принимающая данные формы, проводит на сервере проверку, соответствуют ли логин (имя пользователя) и пароль одному аккаунту. Следует всегда обрабатывать ошибки: при неправильном па­роле следует сообщить это пользователю.

После принятия логина и пароля сервер выдает посетителю пер­сонализированную страницу. Однако, как можно предположить, при следующем переходе по ссылке персонализация теряется: поскольку обычные ссылки не передают те же данные о логине и пароле на сервер, то выход — либо все возможности оформлять кнопками форм, чтобы персонализация подтверждалась каждый раз, либо хранить информа­цию о входе в аккаунт на компьютере пользователя, чтобы не запраши­вать ее каждый раз с сервера. Для последнего случая подходит механизм Cookies.

Cookies — это фрагменты текстовой информации, хранящиеся в особых директориях браузера. Записывать их умеет почти каждый язык сценариев, серверных или активных. В Cookies можно хранить пары «поле (переменная) — значение», чтобы каждый раз не передавать их серверу.

Например, обеспечить взаимодействие Cookies и серверных сце­нариев можно следующим образом (примеры на PHP).

Сначала идет проверка, заполнены ли нужные поля. Если они за­полнены, выполняется сценарий, в противном случае выводится сооб­щение об ошибке:

If(isset($username) && isset($userpass))

{

// Выполнение сценария }

Разумеется, имена переменных произвольные.

Сценарий подразумевает:

1. Чтение списков логинов и паролей из базы данных или секрет­ных файлов на сервере. Если логин и пароль принадлежат одному посетителю, сценарий продолжается, если же нет — прерывается и выводит сообщение об ошибке.

2. Установку Cookies. Допустим, нам нужно сохранять не имя и па­роль, а идентификационную запись (для простоты). Делается это просто:

SetCookie("uid",$uid);

Имя переменной тоже произвольное. Первый элемент, в кавыч­ках, является именем будущей переменной, которую сценарий считыва­ет, когда страница запрашивается с сервера (данные Cookies посылают­ся вместе с той страницей, к которой они оказались привязаны). Второй элемент, на данный момент передаваемый в функцию установки Cookies в виде переменной, содержит в себе значение, которое и запишется в файл Cookies. То есть если в данный момент идентификационный но­мер пользователя — 17, то в Cookies запишется информация о том, что «uid» равен 17. И каждая следующая страница тоже будет обладать этой информацией. В функцию не передана информация о сроке действия Cookies, поэтому данные потеряются при закрытии окна браузера.

Чтобы удалить данные Cookies, например, при нажатии кнопки «Выход», многие веб-мастера применяют такой трюк: ставят в качестве даты уже прошедшее время.

SetCookie("uid","",time()-10*365*24*60*60);

Кроме того, нужно не забыть разрегистрировать значение пере­менной $uid:

Unset($uid);

В этом случае запись «забывается» сценарием.

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

Регистрация и авторизованный доступ полезны не только на бло­гах. На некоторых сайтах поисковых систем можно зарегистрироваться и получить возможность настроить результаты поиска под себя.

4

Программирование

RSS

А классические примеры использования аккаунтов — почто­вые серверы и службы хостинга. Электронные почтовые ящики часто бесплатны (в самом деле, если есть возможность зарегистрироваться на www. mail. ru,Www.Yandex.Ru или Www.Gmail.Com и бесплатно получить почтовые ящики гигантского объема, борьбу со спамом и множество дополнительных сервисов, трудно представить, зачем нужен платный почтовый ящик). Достаточно зарегистрироваться с главной странице, получить данные учетной записи и пользоваться в свое удовольствие. Сложно представить себе почтовые сервисы без использования акка­унтов: почта — очень личное информационное пространство. Хостинг, платный или бесплатный, также предполагает использование про­странства в личных целях. Представьте, что ваш сайт (если это не Wiki) стали редактировать совершенно случайные люди?

И, разумеется, совершенно необходимы аккаунты в электрон­ных магазинах и на любых сайтах, где производятся сделки в режиме онлайн.

Технология RSS (и близкая к ней, но менее популярная техноло­гия Atom) получила широкое распространение вместе с блогами.

Представим такую ситуацию. Человек по роду деятельности или убеждениям постоянно черпает информацию на блогах или блогообраз­ных сайтах. Посты на каждом из них появляются в среднем от нуля до десяти раз в день. Самих блогов за все время человек открыл для себя уже не менее тридцати. Пополняется каждый из них достаточно нерав­номерно: то весь день каждый час по записи, то молчание круглые сут­ки. Тем не менее, новости нужны, и приходится постоянно проверять эти сайты на предмет обновления.

В этом случае как нельзя кстати оказываются каналы новостей, частным проявлением которой является технология RSS.

Суть технологии заключается в следующем. На сайте, поддержи­вающем каналы новостей, хранится текстовый файл с расширением. rdf, .rss или. xml (опыт показывает, что и другие варианты возможны). В нем в строго определенном формате, о котором речь пойдет чуть ниже, хра­нится информация, размеченная тэгами. Файл структурирован в фор­мате XML, о чем говорится в его DTD (см. словарь в конце книги). Кро­ме обязательной «технической» информации в файле хранится то, ради чего такие файлы и используются: новости. Каждая новость — это эле­мент общего массива новостей. В свою очередь, каждый из элементов подразделяется еще на несколько элементов: заголовок новости, опи­сание, адрес ссылки, дата опубликования (без этих элементов не обой­тись) и некоторые другие параметры. Каждый из этих элементов также оформляется тэгами.

Файл текстовый, а значит, его можно обновлять как вручную, так и динамически. Вручную — это значит, что его можно открыть в тексто-

242

Вом редакторе «блокнотного» типа (подойдут любые текстовые редак­торы, которые вы используете для написания кода), изменить там дан­ные и загрузить файл на сервер. Динамическое обновление RSS-файлов удобнее: вы загружаете новость на сайт через определенную форму, а сценарий записывает те же данные, но в другом формате, в RSS-файл, так что последний оказывается обновленным.

Итак, в сети оказывается обновленный файл. Дальше на аре­ну выходят агрегаторы. Строго говоря, они и не уходили, а постоянно посылали запросы на сервера, чтобы проверить обновления RSS-фай­лов. При наличии изменений в RSS-файлах по сравнению с прошлой проверкой эти изменения форматируются в соответствии с правилами агрегатора и выводятся на экран. Если файл не менялся, в агрегаторе ничего не происходит. В качестве агрегаторов могут выступать: браузе­ры, плагины к различным программам, специальные программы и сер­верные сценарии. Среди современных популярных браузеров RSS-по­токи поддерживают Opera, Firefox и Safari, а Internet Explorer — только с седьмой версии. (К слову, загрузка каналов новостей поддерживается в операционной системе Windows версии Vista, технология позволяет просматривать свежие новости не уходя с «рабочего стала»). Во мно­гих программах, связанных с интернетом (например, в ICQ-клиен­те Miranda свежих версий), также есть поддержка потоков: для этого обычно нужно установить расширение (плагин) для программы. Бра­узер Firefox имеет не такой удобный «фидридер» (агрегатор новостей), как, например, Opera, и для него написано несколько расширений, выполняющих ту же задачу, но элегантнее, например, Sage. Встроен­ная поддержка чтения RSS-лент есть в почтовой программе Mozilla Thunderbird. Для чтения новостей с помощью TheBat!, нужен плагин RSS2Mail. Из самостоятельных агрегаторов-приложений можно отме­тить бесплатные Omea Reader, Abilon и платный FeedDemon. Наконец, для использования RSS-лент на своем сайте можно использовать сце­нарии на любом языке серверных сценариев: для этого файл с новостя­ми импортируется с другого сервера (функции включения файлов есть везде), с помощью XML-агрегаторов или собственного сценария файл разбирается по тэгам, трансформируется в нужный HTML-код, и лен­та оказывается на страницах сайта. Есть также масса сайтов, которые позволяют импортировать ленты RSS: из отечественных один из самых популярных — Http://Lenta.Yandex.Ru. Используя одно из этих средств, можно читать сколь угодно RSS-потоков в одном месте, значительно экономя трафик и время. Все тридцать блогов, на которых появляется до трех сотен сообщений в день, собираются в одном месте.

Побочная польза от формата RSS — это возможность использо­вать информацию, предоставляемую другими узлами, у себя на сайте. Допустим, вы считаете, что на сайте жизненно важно колонка новостей центральных каналов; или вы решили использовать свои же каналы,

Но расположенные на другом сервере. Вы делаете включение, формати­руете новости как душе угодно, при этом для импорта новостей в боль­шинстве случаев вам важно знать только адрес RSS-файла на другом сервере: поскольку структура тэгов примерно одинакова у всех, в эти файлы можно даже не заглядывать.

Рассмотрим простой пример.

На моем сайте расположен подобный файл, содержимое которо­го в определенный момент времени было таково:

<?xml version="1.0" encoding="windows-1251"?>

<rss version="2.0">

<channel>

<title>Erlang: свежее</title> <link>Http://www. erlang. com. ru/</link> <description></description> <language>ru</language>

<generator></generator>

<item>

<title>Devanagari, внутренняя логика</^^е> <link>Http://www. erlang. com. ru/devanagari/</

Link>

<description>Произошли очередные изменения в коде &lt;a href="Http://www. erlang. com. ru/devanagari/ "&gt;Devanagari&lt;/a&gt;: исправлены ошибки, связанные с клавиатурным управлением, добавлен новый стиль разметки, стили разделены на группы.

&lt;br /&gt;Портфолио теперь также доступно по адресу &lt;a href="Http://www. erlang. com. ru/portfolio/ "&gt;www. erlang. com. ru/portfolio&lt;/a&gt;. </description>

<pubDate>Thu, 21 Jun 2007 11:22:48</pubDate> </item>

</channel>

</rss>

Проанализируем файл подробно.

Первая строчка указывает, что данные передаются в формате XML (версия языка — 1.0, кодировка документа — windows-1251, но мо­жет быть и любая другая).

Далее следуют только парные тэги (для краткости указаны толь­ко открывающие). <rss> с указанием версии говорит агрегаторам, что данные записаны именно в формате RSS. Внутри него открывается канал (как нетрудно догадаться, тэгом <channel>). До начала собс­твенно новостей располагаются тэги с технической информацией.

Название RSS-потока заключатся в тэг <title>, ссылка на основ­ную страницу сайта, где расположен этот поток — в тэг <link>. Тэг <description> оформляет описание потока; язык потока указывается в тэге <language>, а название программы или сценария, генерирую­щего файл, — в тэге <generator>. Все достаточно логично.

За «технической» информацией, полезной чаще агрегаторам, чем пользователям, следуют собственно новости. Каждое сообщение (каж­дая новость) заключается в тэг <item> («элемент»). Он, в свою очередь, имеет свою структуру: внутри этого элемента есть вложенные тэги и нет «голого» текста, потому что сообщение разбито на логические час­ти. Структура элемента частично повторяет начало документа: каждая новость включает заголовок (<title>), ссылку на статью, к которой отсылает новость (<link>), описание (<description>) представляет собой сжатое изложение текста новости; дата публикации заключается в тэг <pubDate>. Все тэги закрываются с соблюдением вложенности.

Следует обратить внимание, что при необходимости использовать внутри описания новости (а точнее, самого тела новости, заключенного в парный тэг <description>) обычные XHTML-тэги их нельзя заклю­чать в обычные угловые скобки, как в тексте кода. Вместо скобок нужно использовать их мнемонические замены, такие, которые используются для вывода угловых скобок на экран: &lt; вместо < и &gt; вместо >. В этом случае тэги (например, &lt;br /&gt;) будут интерпретирова­ны верно: на экран будет выведен не <br />, а перевод строки.

Наконец, обратите внимание на дату: ее формат тоже регламен­тирован. Впрочем, в любом языке серверных сценариев добиться тако­го формата записи даты можно без труда. Например, в PHP для этого нужно записать: date("D, d M Y H:i:s") — а уже дальнейшую запись текста, который получится в результате такого вызова функции, несложно записать в файл.

Проходит какое-то время, вы обновляете новости и заод­но RSS-файл (у меня на сервере он называется rss. rdf и распо­лагается в каталоге /system, а чтобы подключить его к сайту, на страницах сайта в пространстве между тэгами <head> и </head> я на­писал: <link rel="alternate" type="application/rss+xml" title="HoBoc™: RSS" href="/system/rss. rdf" />), и он уже принимает следующий вид:

<?xml version="1.0" encoding="windows-1251"?>

<rss version="2.0">

<channel>

<title>Erlang: свежее</^^е> <link>Http://www. erlang. com. ru/</link> <description></description> <language>ru</language>

<депега^г></депега^г>

<^ет>

<^^е>Шаблоны для сайта 90-летия гуманитарного образования в Поволжье</^^е>

<link>Http://www. erlang. com. ru/portfolio/

</link>

<description>Разработаны шаблоны оформления страниц для сайта, посвященного 90-летию гуманитарного образования в Поволжье. Сайт будет наполняться заказчиками</description>

<pubDate>Thu, 28 Jun 2007 13:11:02</pubDate> </item>

<^ет>

<title>Devanagari, внутренняя логика</title> <link>Http://www. erlang. com. ru/devanagari/</

Ипк>

<description>Произошли очередные изменения в коде &lt;a href="Http://www. erlang. com. ru/devanagari/ "&gt;Devanagari&lt;/a&gt;: исправлены ошибки, связанные с клавиатурным управлением, добавлен новый стиль разметки, стили разделены на группы.

&1^Ьг /&д^Портфолио теперь также доступно по адресу &1^а href="Http://www. erlang. com. ru/portfolio/ "&gt;www. erlang. com. ru/portfolio&lt;/a&gt;. </description>

<pubDate>Thu, 21 Jun 2007 11:22:48</pubDate> </item>

</^аппе1>

</rss>

Как видим, более свежая новость находится ближе к началу фай­ла. В RSS-файлах, как и в блогах, принят порядок записей, противопо­ложный хронологическому, благодаря чему в поле зрения людей и агре­гаторов все время оказываются обновления. Удалять ли старые записи из RSS-файла или оставлять — дело вкуса, внутреннее правило разра­ботчика. Естественно, для ускорения анализа файла агрегатором этот файл не должен быть слишком длинным. Можно сформулировать для компоновщика этого файла задание оставлять не более пяти (или двад­цати пяти) новостей, чтобы по достижении этого предела более старые новости автоматически удалялись. Нужно думать и о тех посетителях, которые заглядывают в «фидридер» раза два или три в неделю: не стоит чистить файл каждый вечер.

Если вам достаточно коротких сводок новостей, вы вполне мо­жете воспользоваться приведенным примером, отредактировав файл

Под собственные нужды. Но возможности RSS этим не ограничиваются. Рассмотрим более сложный пример — фрагмент канала новостей с сай­та FashionTime. ru (портал о моде и модельном бизнесе):

<?xml version="1.0" encoding="windows-1251"?>

<rss version="2.0" xmlns:content="Http://purl. org/rss/1.0/modules/content/">

<channel>

<title>FashionTime. ru - информационный портал

О моде и модельном бизнесе.</^^е>

<link>http://www. fashiontime. ru</link> <description>FashionTime. ru - информационный портал о моде и модельном бизнесе. Он ежедневно освещает события, произошедшие, как в России, так и за рубежом, знакомит читателей с современными тенденциями моды, анонсирует предстоящие мероприятия. Здесь Вы можете почерпнуть информацию о модных брендах, магазинах модной одежды, модельерах, а также найти фоторепортажи с места событий.</description> <image>

<title>FashionTime. ru - информационный портал о моде и модельном бизнесе.</^^е>

<url>Http://www. fashiontime. ru/banners/ yandex logo. gif</url>

<link>Http://www. fashiontime. ru/</link>

</image>

<item>

<title>Kiehl's теперь и в России</

Title>

<link>Http://www. fashiontime. ru/ news/5 972.html</link>

<content:encoded><![CDATA[<img src="Http://www. fashiontime. ru/images/news/1/5972.jpg" border="0" width="90" height="120" align="left">Теперь мы тоже можем наслаждаться натуральной американской косметикой старинной марки Kiehl's.]]></content: encoded>

<pubDate>04 Jul 2007 22:16:49 GMT</

PubDate>

</item>

<item>

<title>Джоди Кидд создала сумку

Сезона<^^^>

<link>Http://www. fashiontime. ru/ news/5 971.html</link>

<content:encoded><![CDATA[<img src="Http://www. fashiontime. ru/images/news/1/5 971. jpg" border="0" width="90" height="120" align="left">Фотомодель приняла участие в создании новой линии одежды для каталога.

]]></content:encoded>

<pubDate>04 Jul 2007 20:56:44 GMT</

PubDate>

</item>

(Пропускаем часть новостей)

</channel>

</rss>

Часть тэгов уже знакома, но появилось кое-что новое. Например, в тэге <rss> есть фрагмент xmlns:content="Http://purl. org/ rss/1.0/modules/content/". Параметр XMLNS — это сокращение от XML Name Spaces, «пространства имен XML». По адресу, указанному в качестве значения, располагается подробная спецификация с приме­рами, описывающая, что может быть в файле этой версии RSS. Заме­тен тэг <image>, состоящий из элементов <title> (текстовая под­пись к изображению-логотипу), <url> (адрес изображения) и <link> (ссылка, оформляющая изображение). Наконец, есть тэг <content: encoded>, в который при помощи блока <![CDATA[...]]> можно за­писывать текст, оформленный тэгами с обычными угловыми скобками, а не заменяющими их мнемоническими последовательностями.

Примеры можно умножить, но, поняв основной принцип, лег­ко разобраться и в более сложных образцах. Советую изучить RSS - файлы на сайтах, у которых в адресной строке встречается значок канала новостей. Новостной файл привязывается к сайту стандарт­но, способом, который был указан выше: <link rel = "alternate" type="application/rss+xml" title="Название канала" href="адрес к файлу" />.

В заключение нужно отметить, что, несмотря на популяр­ность версии RSS 2.0, есть и другие версии. Небольшой, но емкий об­зор версий, их возможностей и особенностей можно найти по адресу Http://Webmascon.Com/Topics/Technologies/9A.Asp (электронный журнал «Webmascon»).

RSS — очень полезная и удобная технология, но ее имеет смысл использовать лишь тогда, когда на сайте периодически появляется но­вая информация, которую вы хотите анонсировать: колонки новостей, свежие обзоры, посты в блогах, новые темы на форуме. Любое обнов­ление можно отслеживать с помощью сценариев и доступным языком излагать в формате RSS-новостей.

Технология Atom очень близка к RSS, хотя и используется намно­го реже. В качестве примера приведем содержимое одного из файлов в формате, отвечающем спецификации Atom:

<?xml version="1.0" encoding="utf-8"?>

<feed xmlns="Http://www. w3.org/2 0 05/Atom">

<title> Feed Title </title>

<link href=" Http://yourwebsite. com/"/> <updated>2 003-12-13T18:30:02Z</updated> <author>

<name>Your Name</name>

</author>

<id>urn:uuid:60a7 6c8 0-d3 9 9-11d9-b93C - 0003939e0af6</id>

<entry>

<title>Article Title</title>

<link href=" Http://yourwebsite. com/ articlelink. html "/>

<id>urn:uuid:122 5c695-cfb8-4ebb-aaaa - 80da344efa6a</id>

<updated>2 003-12-13T18:30:02Z</

Updated>

<summary>Some text.</summary>

</entry>

<entry>

<title>Sports</title>

<link href=" Http://yourwebsite. com/ sportslink. html "/>

<id>urn:uuid:122 5c695-cfb8-4ebb-aaaa - 8 0da34 4e4 5ab9 0</id>

<updated>2 003-12-14T13:30:55Z</

Updated>

<summary>Some text.</summary>

</entry>

</feed>

Отличия минимальны и касаются в основном синтаксиса, то есть основных тэгов. Вместо <rss> используется <feed>, а вместо <item> — <entry>. Вместо <pubDate> употребляется тэг <updated> (сама дата записывается в несколько ином формате), а вместо <description> —

4

Программирование

<summary> или <content>. Тэг <link> непарный и требует параметра href. Наконец, у каждой записи должен быть идентификатор, заклю­чаемый в тэг <id>.

Прикреплять новости в формате Atom следует тэгом <link rel="alternate"type="application/atom+xml"title="Atom" href="адрес файла" />.

Форматы RSS и Atom получили признание не так давно, в 2004 году файлами в таких форматах начали обзаводиться огромное количес­тво сайтов. В очередной раз стало модным ставить иконки на новую тех­нологию. Потом бум прошел, и теперь факт наличия альтернативного формата новостей подсказывает интерфейс браузера.

Но появилась новая мода, которая называется Web 2.0. В русском языке сочетание прижилось: пишут «Веб 2.0», говорят в одно слово «вебдваноль», а апологетов новой «религии» кто-то нейтрально, а кто-то иронически называют «вебдванольщиками».

Главные внешние признаки сайтов в стиле Web 2.0 — характер­ные «гелевые» кнопки (псевдообъемные, с отсветом в верхней части, с имитацией полупрозрачности, отражениями под объектами и округ­лыми формами — стиль, генетически восходящий к интерфейсным эле­ментам операционной системы MacOS X), «облака» тэгов (в значении «ключевых слов»), динамическое управление деревом документа, плав­ные скольжения объектов по странице и плавная подсветка (без исполь­зования флэша), эффекты полупрозрачности, блогообразная структура и комментарии к любому кусочку текста, достаточно шаблонная верс­тка в виде длинной вертикальной колонки посреди страницы, а также веб-сервисы.

Несомненно, стандартизация дизайнерских решений — это дань моде. «Гелевые» кнопки и пиктограммы действительно выглядят кра­сиво, хотя и мало соотносятся с объектами реального мира. «Лакиро­ванный» дизайн, по идее, намекает на объекты и интерфейсы будущего, где на первое место выходит не просто функциональность, а изящная функциональность. (Интерфейсы Windows от версии 1.0 до 98 включи­тельно, но особенно по версию 3.11 были аскетичными в силу низких аппаратных способностей компьютеров. Было неслыханной роскошью тратить силы процессора и видеокарты на отрисовку псевдотрехмер - ных объектов и плавных преобразований. В начале 2000-х, когда поль­зователи статистически стали использовать более мощные компьюте­ры, появилась возможность реализации более изящных интерфейсов: с тенями, трехмерными эффектами. До абсолюта это было доведено в системе Windows Vista в конце 2006 года с интерфейсом Aero и чуть ранее — в графической подсистеме Beryl для операционных систем Linux.) Однако очень часто дизайнеры, делая такой изящный дизайн, повторяют находки друг друга.

250

На вооружение методы дизайнеров приняли также кодеры и программисты. Сейчас уже не удивишь реализацией прозрачности на веб-страницах. Однако если прикладные программы для эффекта прозрачности используют стандартные библиотеки графической среды операционной системы, то применительно к объектам на веб-страни­цах все происходит не так гладко. В современной реализации CSS есть свойство opacity, которое отвечает за непрозрачность (это важно: то есть нулевое значение отвечает за полную прозрачность и невидимость, а единица — за отсутствие эффекта прозрачности):

Div { opacity:0.5;

}

В этом случае любой блок <div> будет полупрозрачным в полном понимании этого слова. Прозрачность может применяться к большинс­тву элементов веб-страниц. Чтобы установить полную непрозрачность (обычный вид) для отдельно взятого блока, ему в классе или в самом тэге придется прописать значение opacity, равное единице. Чтобы объект отображался едва видимым, значение должно составлять 0 .1 или 0.2.

Однако такое правило работает не во всех версиях браузеров, а только в седьмой версии Internet Explorer, девятой версии Opera, в Safari начиная с версии 1.2 и в большинстве современных браузеров семейства Gecko. В них можно не только устанавливать это свойство, но и динамически изменять его с помощью JavaScript:

Document. getElementById("идентификатор блока"). style. opacity="0.7"

Вместо обращения к объекту по идентификатору блока можно использовать и любые другие методы: обращение в цикле, указатель this в самом блоке и другие методы. Например, чтобы при наведении на абзац его текст из бледного (полупрозрачного) становился четким и непрозрачным, следует написать:

<p style="opacity:0.2" onMouseOver="this. style. opacity='1'" onMouse0ut="this. style. opacity='0.2'"> Динамическое изменение прозрачности</р>

Несомненно, эффект будет более впечатляющим, если текст будет наложен на изображение с разными цветами, чтобы полупрозрачность не выглядела просто другим цветом текста. Однако, повторюсь, эффект работает только в последних версиях браузеров, которые установлены далеко не у всех. В популярном Internet Explorer до версии 7 это не ра-

Ботает: приходится прибегать к фильтрам (чтобы установить прозрач­ность в Internet Explorer для версий 5 и 6, испольуется фильтр progid: DXImageTransform. Microsoft. Alpha(opacity=50) , адля вер­сии 4 — alpha(opacity=5 0). Заметно, что по сравнению со свойс­твом opacity значение для фильтра IE нужно умножать на 100. И еще одна особенность: чтобы фильтр заработал, для объекта, к которому он применяется, следует также указать высоту или ширину также средс­твами CSS). В некоторых версиях браузеров на «движке» Gecko вместо свойства opacity используется свойство - moz-opacity (обращение к которому средствами сценария производится как object. style. MozOpacity, где object — это перечисленные выше способы обра­щения к объекту, включая this), а для браузеров Safari 1.1 и Konqueror 3.1 годится свойство - khtml-opacity и обращение object. style. KhtmlOpacity. Таким образом, чтобы установить полупрозрачность для изображения определенного класса (например, «transparent» — «прозрачные»), в CSS-таблице следует написать:

Img. transparent {

Filter:progid:DXImageTransform. Microsoft.

Alpha(opacity=50);

Filter:progid:alpha(opacity=50);

-moz-opacity: 0.5;

-khtml-opacity: 0.5;

Opacity: 0.5;

}

В этом случае мы пожертвовали браузерами Konqueror 3.3, стары­ми версиями Opera и некоторыми другими, менее распространенными, поскольку в них вообще нет возможности установить прозрачность.

Скорее всего, разрабатывая современные сайты, вы уже вряд ли будете ориентироваться на устаревшие и устаревающие браузеры. В этом случае из стилевых описаний можно удалить поддержку Internet Explorer 4 и старых браузеров на движках Gecko и KHTML, в результате чего останутся только первая и последняя строка кода.

Img. transparent {

Filter:progid:DXImageTransform. Microsoft.

Alpha(opacity=50);

Opacity: 0.5;

}

Это, помимо всего прочего, упростит динамическое изменение прозрачности средствами сценариев.

Для полноценного примера поставим перед собой задачу.

Допустим, у нас есть ряд ссылок на главной странице, достаточно важных, но названия их непонятны на первый взгляд. А помещать ря­дом пояснительную информацию и дополнительные ссылки — слиш­ком большая роскошь для композиции и дизайна страницы.

Ищем выход. Вариант первый: по щелчку на ссылке будет откры­ваться нужная страница, а просто при наведении будет всплывать под­сказка. Но в этом случае мы скованы интерфейсными возможностями системы, да и в каждом браузере всплывающие подсказки выглядят не­много по-разному: например, в Opera и многих версиях Gecko-браузе­ров большие подсказки разъезжаются на очень большую ширину. В об­щем, до элегантного вида далеко.

Вариант второй: при наведении будет появляться какая-то ин­формация, заключенная в тэг <div>, для которого мы средствами CSS сообщим свойство невидимости. Пользуясь полученной информацией, мы можем изначально сделать слои с подсказками не только невидимы­ми, но и полностью прозрачными, а при наведении на ссылку запускать скрипт, который сначала сделает нужный слой видимым (хотя и про­зрачным), а потом будет убирать прозрачность, увеличивая значение параметра. Выглядит уже элегантнее, потому что блоку <div> можно придать произвольный вид и произвольно позиционировать его. Одна­ко возникает вопрос: что делать, чтобы убрать слои-подсказки? Два раза щелкнуть вне слоя — неочевидно (это очевидно только для выпадаю­щего меню, потому что привычно). Убирать слой при уведении мыши со ссылки — нефункционально: если нам потребуется поместить в под­сказку ссылки, то ими воспользоваться не удастся. Кроме того, при слу­чайном проведении мышкой над ссылками эти подсказки будут возни­кать, раздражая пользователя.

Вариант третий: рядом с каждой ссылкой стоит ненавязчивый знак вопроса, который всегда ассоциируется с помощью и подсказкой. По щелчку на знаке вопроса плавно возникает подсказка, которая мо­жет содержать что угодно (в том числе вспомогательные ссылки, изоб­ражения и даже формы), и если информация оказывается посетителю нужной, он переходит по ссылке. При возникновении блоков-подска­зок также возникает вспомогательная ссылка, которая позволяет очис­тить поле подсказок. Важно также, чтобы, если одна подсказка уже есть на экране, при вызове другой подсказки первая исчезала. То есть изна­чально у нас есть список ссылок:

TOC o "1-5" h z Деванагари [?]

Мхедрули [?]

Огами [?]

При щелчке на втором знаке вопроса возникает подсказка и ссыл­ка для очистки подсказок:

Деванагари [?] Мхедрули — грузинский

Мхедрули [?] алфавит. Первые памятники

Огами [?] письменности, записанные с

Помощью его прототипа, были [Очистить] зафиксированы в V веке нашей

Эры. Источник

Еще одно уточнение: возникновение ссылки « Очистить» не долж­но быть подвержено общему правилу, чтобы не отвлекать от эффекта появления подсказки.

А теперь обратимся к коду.

Скрытые подсказки описываются общим классом, описанном в таблице стилей:

<style type="text/css">

.inouted {

Display:none;

Width:100%;

Filter:progid:DXImageTransform. Microsoft.

Alpha(opacity=0);

Opacity:0;

}

</style>

Структуру таблицы можно не приводить: она тривиальна. Но ссыл­ка, которой является знак вопроса, должна иметь следующий вид: <a href="/mhedruli/" class="help" onClick="inout('mhedr'); return false">[?]</a>. Отдельный класс для «системных» ссылок нужен для того, чтобы их вид отличался от обычных, ссылающихся на страницы: сделайте первые, например, без подчеркивания. Ссылка в параметре href имеет адрес на тот случай, если посетитель отключил у себя JavaScript (и помощь ему не нужна). Главное в ней, что по со­бытию «щелчок» (onClick) вызывается функция (условно названная inout()), в качестве аргумента которой передается параметр — иден­тификационное название (значение параметра id) того блока <div>, который нужно открыть. Блоки имеют стандартный вид:

<div id="mhedr" class="inouted"> Мхедрули — грузинский алфавит. Первые памятники письменности, записанные с помощью его прототипа, были зафиксированы в V веке нашей эры. <а href="внешняя ссылка">Источник</а> </div>

Ссылка «Очистить» также должна вызывать функцию, но откры­вать она будет пустой блок, который тоже нужно написать отдельно.

Сама же ссылка находится внутри какого-то блока, который изначально скрыт (в сценарии ниже этот блок назван «invistr»).

Наконец, самое важное — это сценарий, производящий плавное открытие слоя-помощника:

<script language="JavaScript"> transp = 0; transpl = 0;

Function inout(divid)

{

Document. getElementById("invistr").style. display = (divid == "cleaner") ? "none" : "block";

Dividio = document. getElementByld(divid); divscollect = document. getElementsByTagName ('div');

Transp = 0; transp1 = 0;

For(i=0; i<divscollect. length; i++)

{

If(divscollect[i].className=="inouted")

{

Divscollect[i].style. display="none"

}

}

Dividio. style. display="block";

Fade(divid);

}

Function fade(divid)

{

If(transp<100)

{

Transp=transp+5;

Document. getElementById(divid).style.

Filter="progid:DXImageTransform. Microsoft. Alpha(opacit

Y="+transp+")";

Transp1=transp/100;

Document. getElementById(divid).style.

Opacity=transp1;

}

Else

{

ClearTimeout(timer)

}

Timer = setTimeout(function(){fade(divid)},1);

}

</script>

Переменные transp и transpl — начальные значения, кото­рые будут увеличиваться сценарием; они отвечают за полную прозрач­ность элементов. Функция inout() получает в свое распоряжение имя скрытого блока, присваивает это значение переменной divid. Потом, на тот случай если какой-то блок уже был открыт, обнуляет перемен­ные transp и transpl и проходится циклом по всем блокам с именем класса inouted, сообщая им невидимость. После этого из невидимос­ти вызволяется нужный прозрачный блок, а затем вызывается функция fade(), которая и осуществляет плавное наращивание непрозрачнос­ти. Этой функции передается тот же параметр — идентификационное имя блока. Функция проверяет условие: если значение переменной transp меньше ста, идет увеличение этого значения. Значение перемен­ной transpl вычисляется из transp делением на 100 — эти значения нужны для разных браузеров. Функция повторяется благодаря тому, что установлен таймер: setTimeout с указанием функции, которую нужно повторить (в качестве интервала указана единица, что составляет одну тысячную секунды; если бы значением была 1000, то плавного появле­ния не получилось бы: надписи стали бы проявляться «скачками», так как задержка между каждой фазой проявления составляла бы секунду. На самом деле указание единицы в качестве значения рассчитано ско­рее на мониторы будущего, поскольку 1000 раз в секунду изображение на экране не обновляется). Чаще всего таймер записывается в формате setTimeout("функция()",1) , но, поскольку в функции нужно пе­редать и параметр (а ему нельзя оказываться в кавычках), то прибегают к нестандартному синтаксису: setTimeout(function(){fade(div id)},1) — название самой функции с параметром записывается после ключевого слова «function() » в фигурных скобках.

Плавные трансформации получили большое распространение в последнее время. Это касается смены уровня прозрачности, плав­ных преобразований цвета, движений по веб-странице и других вещей. Обычно плавные трансформации — это заданные повторения одних и тех же действий с разными параметрами. Для повтора задействуются функции setTimeout() и setInterval(). Первая из них выполняет повтор один раз и производит задержку перед повтором, но, поскольку эта функция включается в тело основной функции, то каждый после­дующий вызов еще раз вызывает задержку, пока условие выполняется. Если не написать никаких условий, то вечное повторение функции
приведет к зависанию браузера. Вторая функция выполняет итерацию (повторение) с заданным интервалом бесконечно, если во время этих повторов выполняется заданное условие. Главное в этом случае — чет­ко представлять структуру документа, потому что к каждому элементу структуры можно обращаться.

Помимо визуальных эффектов, не несущих сильной функцио­нальной нагрузки и скорее выполняющих эстетические функции, рас­пространение получают визуально ориентированные методы представ­ления информации. Частный случай — «облака».

Популярные метки

Wallpaper авто архитектура весна вода германия город города

Горы Греция дача девушки ДеТИ друзья европа египет животные

Закат зима израиль испания италия июнь КОШКИ лес лето люди май макро метки море москва небо обои отдых отпуск пейзаж

ПИТер портрет прага

Природа

Путешествие

Путешествия

Санкт-Петербург собаки улицы франция цветы эротика Я

подпись: популярные метки
wallpaper авто архитектура весна вода германия город города
горы греция дача девушки дети друзья европа египет животные
закат зима израиль испания италия июнь кошки лес лето люди май макро метки море москва небо обои отдых отпуск пейзаж
питер портрет прага
природа
путешествие
путешествия
санкт-петербург собаки улицы франция цветы эротика я
Скорее всего, вы встречали на самых разных сайтах (но преиму­щественно на тех, что связаны с компьютерными технологиями) разно­цветные (преимущественно почему-то серые) ссылки, набран­ные разным кеглем и шрифтом разной насыщенности, при этом ссылки не образуют стройных рядов, а идут друг за дру­гом, визуально образуя неправильную структуру. Но в этой неправильной структуре, на самом деле немного похожей на облако, отчетливо выделяются «лидеры» — крупные ссыл­ки, средние, еще поменьше и совсем мелкие. Без особых объ­яснений понятно, что крупные ссылки важнее мелких. Только необходимо уточнить, что важность выясняется статистичес­ки. Чаще всего такие «облачные меню» используют на блогах или сайтах, где подсчитываются рейтинги тем. Например, на сайте fotki. yandex. ru так оформляются ссылки на самые по­пулярные метки к фотографиям. Каждый фотограф, размещая свои снимки на сайте, снабжает их «метками» — ключевыми словами, позволяющими отнести фотографию в какую-либо категорию. Естественно, что в какие-то категории помеща­ется больше фотографий, а в какие-то меньше. Популярные категории в «облаке» выглядят внушительнее.

Темы, которые пользуются на форумах и коллективных блогах популярностью, тоже удобно оформлять в виде облаков. Только не сто­ит отказываться и от привычного алфавитного порядка: посетителю не всегда интересно узнать, что пользуется наибольшей популярностью. Иногда ему хочется найти нужную тему, которая, хоть и набрана мелким шрифтом, но стоит на своем месте по алфавиту.

Создавать такие «облака» достаточно просто. Все ключевые слова (темы, метки), которые составят основу «облака», хранятся в таблице БД или в текстовом файле. Количество записей или фотографий, подпада­ющих под одну из тем, либо вычисляется сценарием, либо записывается в базе, обновляясь при добавлении новой записи на эту тему. Получают­ся пары «тема — количество записей на эту тему». Само же количество ключевых слов ограничено, пусть и составляет две сотни (обычно мень­ше). Общее количество записей приравнивается к ста процентам, а ко­личество записей на каждую отдельную тему высчитывается сценарием

Как процентное отношение к общему количеству. Для ссылок, которые будут составлять «облако», назначается несколько классов: от самого мелкого (допустим, им будут оформляться темы, которые содержат ме­нее одного процента от общего количества записей) до самого большого (более 20%). Далее идет обычная проверка условий с помощью услов­ных операторов: если количество записей на тему менее 1%, назначаем первый класс — и так далее. Особое значение могут приобретать курсив, полужирное начертание и выделение другим цветом. После создания набора ссылок определенного размера они просто выстраиваются по алфавиту, но не выстраиваются в виде обычных меню — разными стро­ками, а собираются в один абзац, как обычный текст. Это дает строки разной высоты (чередование интерлиньяжа), псевдослучайное соседс­тво слов, набранных разным кеглем и иногда разного цвета.

Мода — странное явление. С одной стороны, это обновление, создание чего-то, что позволит выделиться, что будет радовать глаз свежестью. С другой стороны — это психология толпы: если все носят остроносые туфли, почему бы и мне их не надеть? («Все побежали, и я побежал».) Мода существует не только в одежде и косметике, но и в еде, и в науке (что печально), и было бы странно, если бы моды не было в веб-дизайне. Но разработчик в силах бороться с оборотной стороной моды: желанием, чтобы было, как у всех. Главное — понимать, что дейс­твительно необходимо, а что является «рюшечками». Подумайте, не скажет ли пользователь, придя на ваш сайт: «Боже, и здесь облака и ге­левые иконки, пойду-ка я отсюда».

По ту сторону Веб-страницы

Словарь

Ботки. Обычно расширения состоят из трех букв (exe, gif, php, mov, bmp, eps, swf, asp, m3u, avi, rtf, txt, zip, cpp), но встречаются также двухбуквенные (js, ai) и четырехбуквенные (html, …

Справочник для внутреннего использования

Навигация есть признание того, что твоя страница далека от иде­ала. Ибо если бы она была близка к нему, зачем бы потребовалось покидать ее? А если ее не требуется покидать, зачем …

Алфавит от Google

Есть такая тестирующаяся поисковая подсистема от Google (Http://Www.Google.Com/Webhp?Complete=1&Hl=En), в которой по введенным первым буквам предлагаются наиболее часто за­прашиваемые слова. Я собрал все первые (наиболее рейтинговые) слова на каждую букву русского …

Как с нами связаться:

Украина:
г.Александрия
тел./факс +38 05235  77193 Бухгалтерия

+38 050 457 13 30 — Рашид - продажи новинок
e-mail: msd@msd.com.ua
Схема проезда к производственному офису:
Схема проезда к МСД

Партнеры МСД

Контакты для заказов оборудования:

Внимание! На этом сайте большинство материалов - техническая литература в помощь предпринимателю. Так же большинство производственного оборудования сегодня не актуально. Уточнить можно по почте: Эл. почта: msd@msd.com.ua

+38 050 512 1194 Александр
- телефон для консультаций и заказов спец.оборудования, дробилок, уловителей, дражираторов, гереторных насосов и инженерных решений.