Краткая история HTML

HTML объединяющий язык World Wide Web, с помощью его простых тегов человечество создало фантастически разнообразную сеть, от крупнейших Amazon, eBay и Wikipedia до личных блогов и сайтов, посвященных котам похожим на Гитлера. Как и сам веб, HyperText Markup Language детище Тима Бернерс-Ли. В 1991 году он создал документ названный «HTML Tags», в котором предложил около двух дюжин элементов для создания веб-страниц. Идея использовать теги, заключенные между угловыми скобками, не его, такие теги уже были в формате SGML (Standard Generalized Markup Language). Тим понимал, что создавать новые стандарты нужно на базе существующих, а разработчики HTML5 и сейчас в полной мере следуют этому принципу. От IETF до W3C: Путь к HTML 4 Стандарта HTML 1 никогда не было, первой официальной спецификацией стал HTML 2.0, опубликованный IETF (Internet Engineering Task Force). Многие элементы в этой спецификации были заимствованы из существующих реализаций, например, тег уже поддерживался, лидировавшим тогда браузером Mosaic. Позже на смену IETF пришел W3C (World Wide Web Consortium) и следующие версии стандарта HTML публиковались на www.w3c.org. Во второй половине девяностых HTML претерпел множество изменений и ревизий, последней в череде которых стала спецификация HTML 4.01. В начале двухтысячных HTML ожидала первая серьезная реформа. XHTML 1: HTML как XML Следующая после HTML 4.01, версия языка стал XHTML 1.0, X значит eXtensible (расширяемый). Содержание спецификации XHTML 1.0 не сильно отличалось от HTML 4.01. Не было добавлено ни одного нового элемента или атрибута. Но отличался синтаксис языка. HTML дает авторам значительную свободу в написании элементов и атрибутов, XHTML требует следовать правилам XML, более строгого языка разметки, на котором основаны многие технологии W3C. У строгих правил есть свои преимущества, они заставляют разработчиков использовать единый стиль кодирования, если прежде теги и атрибуты могли быть в верхнем регистре, нижнем регистре и любой их комбинации, то в XHTML 1.0 все теги и атрибуты должны быть в нижнем регистре. Выход XHTML 1.0 совпал со значительным улучшением поддержки CSS в браузерах. Веб-разработчики, вдохновленные появлением стандартов, считали строгий синтаксис XHTML лучшим способом создания разметки. Следующий версией стандарта разметки стал XHTML 1.1. XHTML 1.0 был простым HTML переформулированным на XML, XHTML 1.1 стал настоящим XML, он больше не мог подаваться клиенту как text/html. Но если разработчик использует для документа медиа тип XML, то самый популярный веб-браузер, Internet Explorer, не сможет отобразить документ. Стало заметно, что W3C теряет связь с современной реальностью веб. XHTML 2: О, мы не будем это терпеть! В W3C решили, что историю HTML нужно закончить на четвертой версии и начали работу над XHTML 2, стандартом призванным вести нас в новое будущее основанное на XML. Несмотря на то, что название стандарта XHTML 2 не сильно отличается от XHTML 1, они совершенно не похожи. В отличии от XHTML 1, в XHTML 2 нет обратной совместимости с существующим веб-контентом и предыдущими версиями HTML, это должен был быть чистый язык, не обремененный нестройной историей предыдущих спецификаций. Это была катастрофа. Раскол: WHATWG TF? Внутри W3C назревало восстание. Консорциум формулировал теоретически чистые стандарты, игнорируя потребности веб-разработчиков. Представителей Opera, Apple и Mozilla это не удовлетворяло, они хотели больше вниманию форматам которые позволяют создавать веб-приложения. Ситуация достигла апогея на рабочей встрече в 2004 году. Ян Хиксон, работавший тогда в Opera Software, предложил расширить возможности HTML в области создания веб-приложений. Предложение было отвергнуто. Недовольные такой политикой Opera, Apple и Mozilla сформировали свою собственную рабочую группу WHATWG (Web Hypertext Application Technology Working Group). От Web Apps 1.0 до HTML5 Работа WHATWG, отличается от работы W3C. W3C использует подход основанный на консенсусе: вопрос поднимается, обсуждается и проводится голосование. В WHATWG вопрос также поднимается и обсуждается, но окончательное решение остается за редактором. Редактор Ян Хиксон. На первый взгляд, подход W3C выглядит более демократичным и объективным, на практике политика и внутренние распри способствуют затягиванию принятия решений. В WHATWG все могут принимать участие в работе, но последнее слово остается за редактором, благодаря чему решения принимаются быстро. Конечно, редактор не имеет абсолютной власти и может быть отстранен решением комитета приглашенных экспертов. С самого начала WHATWG начал работу над двумя расширениями HTML: Web Forms 2.0 и Web Apps 1.0, позже они были объединены в одну спецификацию названную HTML5. Воссоединение В то время как WHATWG начала разработку HTML5, W3C продолжал работу на XHTML 2. Нельзя сказать, что работа шла не достаточно быстро, она шла очень очень медленно. В октябре 2006, Тим Бернерс-Ли признал в своем блоге, что попытка перевести веб с HTML на XML не удалась. Через несколько месяцев была создана новая рабочая группа по HTML, вместо того чтобы начать с нуля решили использовать наработки WHATWG как базу будущей версии HTML. Все эти начала и окончания разработки сильно запутали ситуацию. W3C работает одновременно над двумя различными, несовместимыми типами разметки XHTML 2 и HTML 5 (обратите внимание на пробел перед цифрой пять). В то же время отдельная организация WHATWG, работает над спецификацией HTML5 (без пробела) которая используется как базис одной из спецификаций W3C. XHTML мертв: да здравствует XHTML синтаксис Ситуация начала проясняться в 2009 году, W3C объявило, что работа над XHTML 2 не будет продолжена. На самом деле формат уже давно был мертв, и это заявление только официально подтвердило факт смерти. Смерть XHTML 2 не прошла незамеченной, XML скептики использовали этот факт как возможность лишний раз высмеять тех кто использовал XHTML 1, несмотря на то, что XHTML 1 и XHTML 2 не имеют между собой ничего общего. В то же время, разработчики, которым XHTML 1 нравился за более строгий стиль кодирования, опасались, что HTML5 приведет к возвращению небрежного кода. На самом деле это не обязательно, HTML5 может быть строгим или свободным настолько, насколько этого хочет разработчик. Перспективы HTML5 Сегодняшнее положение HTML5 не столь запутано как раньше, но все еще не простое. Над стандартом работают две группы, с различной политикой и порядком работы, очевидно, что это не простой союз. Похоже намечается консенсус и по вопросу «С пробелом или без?» (это HTML5 без пробела, если вам интересно). Возможно самый неясный вопрос для разработчиков желающих использовать HTML5 «Когда он будет готов?» В одном из интервью, Ян Хиксон сказал, что HTML5 может получить статус «proposed recommendation» к 2022 году. Это вызвало волну недовольства среди веб-разработчиков, не понимающих, что значит «proposed recommendation», но знающих, что им не хватит пальцев на руках, чтобы посчитать сколько лет пройдет до 2022 года. Это возмущение не обосновано. Статус «proposed recommendation» предполагает наличие двух полных реализаций HTML5 и, учитывая объем спецификации, эта дата выглядит даже оптимистичной. В конце концов, и сейчас браузеры не могут похвастаться безупречной поддержкой существующих стандартов. Разработчикам Internet Explorer потребовалось почти десять лет только для того чтобы добавить поддержку элемента abbr. Действительно важной датой для HTML5 можно считать 2012 год, к этому времени он должен получить статус «candidate recommendation». Но даже эта дата не особенно важна для веб-разработчиков, самое большое значение имеет то, когда браузеры начнут поддерживать новые возможности. Мы начинали использовать части стандарта CSS 2.1 как только браузеры начинали их поддерживать, если бы мы ждали пока все браузеры будут полностью поддерживать CSS 2.1, мы бы все еще ждали. То же самое с HTML5, не будет такой даты, чтобы можно было сказать, да сегодня язык готов к использованию. Мы можем начинать использовать части спецификации как только появиться их поддержка в браузерах. HTML5 это не совершенно новый стандарт, созданный с нуля, это эволюционное, а не революционное изменение языка разметки, если сейчас вы используете HTML, то вы уже используете HTML5. Translated with the permission of A List Apart Magazine7 and the author[s].Похожие статьиHTML5, XHTML2, и будущее Web

Юзабилити сайта Почты России

История: где-то задержалось заказное письмо, решил посмотреть нельзя ли проверить статус доставки. Набираю в гугле "почта россии", и вижу, что да, можно, сразу две ссылки "Почта России: Отслеживание почтовых отправлений". Возрадовался. Рано. Жму на ссылку и... Ошибка 404. Страница не найдена. Жму вторую... 404. Гомерический хохот. Они потеряли даже страницу поиска отправлений — это уже политика компании. Ну политика, политикой, а письмо искать нужно, иду на главную, а куда еще все остальные ссылки на 404-й ведут на 404-ю. Главная страница Почты России радует морем полезной информации:атмосферное давление и температура в Москве и Санкт-Петербурге, курс доллара и евро, индекс ММВБ, индекс РТС и отраслевые индексы РТС, ссылки на Аэрофлот, РЖД, Внешэкономбанк, Мин связи, различные почтовые союзы, как раз то, что нужно людям на почтовом сайте. [как это выглядело] Поиска отправлений пока не видно, но гугл помнит, а значит где-то оно здесь было. Пройдя по всем станицам главного меню, обращаю внимание на баннер "Вход для клиентов". "Вход для клиентов" у меня ассоциируется с закрытой авторизацией частью сайта, но больше пойти некуда, решаюсь. Не зря. За баннером страница которую следовало сделать главной, информация об услугах и долгожданный поиск отправлений, который удивил тем, что работает. Оказывается письмо никак не может преодолеть последнюю милю от почтового отделения. Месяц уже не может. Придется пойти помочь. Прочие достоинства Микрополе поиска. Потерявшиеся сертификаты соответствия системы менеджмента качества требованиям стандарта ИСО 9001:2000, выглядят просто символично. Кстати, кликабельные, ведут на 404-ю. В фотогалерее есть обои рабочего стола. Им тут самое место. Отличные примеры, демонстрирующие почему не нужно использовать justify. Кстати, нужно отметить, что над сайтом уже начали работать, как минимум "Вход для клиентов" переименовали в "Услуги и сервисы", что уже намного лучше.

MVC в JavaScript

JavaScript занимает все более важное место ввеб, азначит все больше времени вграфиках разработки. Приходится задуматься над тем, как сделать его пригодным для повторного использования ипростым вподдержке. Вэтом нам может помочь MVC. Термин MVC давно стал привычным вконтексте разработки бэкэнда сиспользованием фреймворков, таких как Struts, Ruby on Rails, иCakePHP — истоки MVC лежат вобласти структурирования клиентских приложений. Давайте посмотрим, что такое MVC, как мыможем использовать его, икакие есть готовые MVC фреймворки. Что такое MVC? Если вынезнаете, что это такое, топосле четырех упоминаний этого акронима вам наверняка нетерпится узнать. MVC (сокращение от Model-View-Controller) — это шаблон проектирования, который разделяет приложение натри части: данные (Model), представление этих данных пользователю (View) идействие выполняемые вответ наактивность пользователя (Controller). В 1978 году висследовательском центре Xerox, Trygve Reenskau сформулировал основы концепции MVC (PDF): Объект, играющий роль модели, это компьютерное внутреннее представление этой информации. Компьютер отображает различные аспекты этой информации спомощью объекта View, несколько объектов View ассоциированных содной итой жемоделью могут быть видимы одновременно. Объект Controller транслирует команды пользователя всообщения для объектов View иModel. Другими словами, когда пользователь что-то делает, это «что-то» передается контроллеру, который решает, что должно произойти дальше. Контроллер запрашивает данные модели иотсылает ихвиду, который показывает данные пользователю. Что жеэто разделение может дать веб-разработчику. Истоки Статический документ это основа веб-страницы. Такая страница отображает состояние информации насервере вмомент еесоздания. Раньше, чтобы модифицировать данные насервере мысоздавали форму, вкоторую пользователь вводил новые данные, потом эта форма отправлялась насервер, апользователь получал уведомление, что действие выполнено. Нопостоянные перезагрузки всей страницы быстро утомляют пользователя, особенно если ондопускает ошибку инужно заново внести все изменения. Прорыв Но темные времена веб закончились. JavaScript иAjax, пришли нам напомощь, теперь мыможем изменять отдельные элементы страницы исообщать обэтом серверу. Особенно важно то, что теперь мыможем реагировать надействия пользователя, недожидаясь ответа сервера. На современном уровне сложности JavaScript приложений мыприходим кнеобходимости разделять компоненты приложения встиле MVC. Конечно, такое разделение необходимо невсегда — иногда оно делает код излишне объемным. Нокогда приложение становиться достаточно сложным, требующим взаимодействия сразличными частями сайта, использование паттерна MVC, позволяет создавать более модульный ипригодный кповторному использованию код. Структурирование кода Обычно, если нужно проверять данные формы, мыустанавливаем обработчик события отправки формы, который проверяет заданные поля исообщает пользователю онайденный ошибках. Выглядит это примерно так: function validateForm(){ var errorMessage = 'The following errors were found:'; if (document.getElementById('email').value.length == 0) { errorMessage += 'You must supply an email address'; } document.getElementById('message').innerHTML = errorMessage; } Этот подход работает, нонеотличается гибкостью. Если понадобиться добавить поля или проверять другую форму надругой странице, топридется дублировать функциональность для каждого нового поля. Вперед кмодульности Сделаем первый шаг кмодульности иразделению, добавив дополнительную семантику вформу. Для обязательного поля содержащего адрес электронной почты код будет примерно такой: Теперь скрипт может перебрать все поля формы ивзависимости отатрибутов, сохраненных вклассе, проверить поле подходящим способом. Еще один плюс таких классов втом, что ихможно использовать вCSS. Мы внедрили метаданные, наоснове которых скрипт решает, как работать ссоответствующими данными. Нопри таком подходе данные иметаданные сильно связаны сразметкой. Ктому жесам подход несколько ограничен, трудно описать условия спомощью HTML, например, что делать, если необходимость или допустимые значения одного поля, зависят отзаполненности или значения другого поля. Конечно, простейший случай можно закодировать вHTML, ноэто будет неочень красивое решение, асусложнением зависимости оно будет просто ужасным: Other В предыдущем примере префикс dependson указывает нато, что обязательность textarea зависит отзаполненности поля other. Чтобы исключить такие конструкции, давайте попробуем определить всю бизнес логику вJavaScript. Используем JavaScript для описания сущностей Несмотря нато, что мыможем внедрить некоторую семантику иметаданные вHTML, вконце концов, нам придется, как топредставлять эту информацию науровне JavaScript. Например: var fields = { 'other': { required:true }, 'additional': { 'required': { 'other':{checked:true}, 'total':{between:[1,5]} }, 'only-show-if': { 'other': {checked:true} } } }; В данном случае поле additional зависит отдвух других полей, иотображается только если пользователь активировал чекбокс other. Несмотря нато, что мыдостигли некоторого разделения, лишних зависимостей все еще много. Проверка данных все еще связана сотображением выявленных ошибок, афункция выполняющая проверку данных все еще связана собработкой события иотвечает зато, чтобы форма небыла отправлена, пока данные невведены корректно. Давайте посмотрим, как мыможем структурировать код спомощью паттерна MVC, апотом вернемся кнашему примеру спроверкой данных формы. Модель Поскольку паттерн MVC состоит изтрех компонент, мыдолжны попытаться разделить наше приложение как минимум натри главных объекта. Выделить модель вотдельный объект достаточно просто, как мывидели впредыдущем примере, это происходит естественным образом. Давайте посмотрим надругой пример, унас есть календарь событий, данные каждого события сохранены вотдельном объекте. Методы объекта предоставляют абстрактный способ взаимодействия сданными. Часто эти методы называют CRUD tasks (create, read, update, delete). var Events = { get: function (id) { return this.data[id]; }, del: function (id) { delete this.data[id]; AjaxRequest.send('/events/delete/' + id); }, data:{ '112': { 'name': 'Party time!', 'date': '2009-10-31' }, '113': { 'name': 'Pressies!', 'date': '2009-12-25' } } metadata: { 'name': { 'type':'text', 'maxlength':20 }, 'date': { 'type':'date', 'between':['2008-01-01','2009-01-01'] } } } Модель содержит метаданные, определяющие допустимые значений полей события. Кроме того CRUD методы сохраняют состояние объекта насервере, например, функция delete удаляет запись локально иотсылает запрос наудаление записи насервер. Вид В паттерне MVC, вид получает данные иопределяет, как ихотобразить. Для этого онможет использовать существующий HTML, запрашивать HTML блок усервера, или создавать его спомощью DOM. Вид небеспокоится отом, откуда икак получить данные, онтолько отображает теданные, которые ему передали. View.EventsDialog = function(CalendarEvent) { var html = '{name}' + '{date}'; html = html.replace(/\{[^\}]*\}/g, function(key){ return CalendarEvent[key.slice(1,-1)] || ''; }); var el = document.getElementById('eventshell'); el.innerHTML = html; } Events.data = { '112': { 'name': 'Party time!', 'date': '2009-10-31' }, '113': { 'name': 'Pressies!', 'date': '2009-12-25' } } View.EventsDialog(Events.data['112']); // edits item 112 Чтобы контроллер мог управлять видом, небеспокоясь оего внутренней реализации, добавим методы open иclose. View.EventsDialog = function(CalendarEvent){ ... } View.EventsDialog.prototype.open = function(){ document.getElementById('eventshell').style.display = 'block'; } View.EventsDialog.prototype.close = function(){ document.getElementById('eventshell').style.display = 'none'; } var dialog = new View.EventsDialog(eventObject); dialog.open(); dialog.close(); Обобщение Вида Легко поддаться наискушение сделать вид зависимым отмодели данных испособа ихполучения. Но, разделяя эти функции, мыделаем вид пригодным для повторного использования. Если мыразделим данные события идиалог внашем примере, тодиалог можно будет использовать для любых данных, анетолько для событий. View.Dialog = function(data) { var html = '' + data.name + ''; delete data.name; for(var key in data) { html += '' + data[key] + ''; } var el = document.getElementById('eventshell'); el.innerHTML = html; } Теперь унас есть общий способ просмотра любых элементов, анетолько событий, иесли вследующем проекте понадобиться диалог, можно будет использовать этот код без изменений. Многие JavaScript фреймворки разработаны сучетом независимости отданных. YUI controls, jQuery UI, ExtJS, иDojo Dijit создавались сминимальными предположениями оданных, скоторыми импридется работать. Врезультате эти контрольные элементы можно легко использовать влюбых приложениях. Работа сметодами вида Главное правило: вид недолжен вызывать свои методы, например, диалог недолжен открывать или закрывать себя, это работа контроллера. Когда пользователь кликает кнопку Сохранить, это событие передается методу контроллера, который должен решить, что дальше делать виду, онможет сразу закрыть диалог, или сказать виду отобразить индикатор загрузки пока сохраняются данные, акогда данные сохраняться, событие завершения Ajax вызова запустит другой метод контроллера, который скажет виду что нужно скрыть индикатор изакрыть диалог. Тем неменее, есть ситуации, когда вид должен сам обрабатывать события ивызывать свои методы. Например, если диалог содержит слайдер, ненужно перекладывать наконтроллер, обработку взаимодействия пользователя сослайдером иотображение его значения. Контроллер Как жеданные Модели попадают вВид? Это задача Контроллера. Онактивируется, каким либо событием, это может быть загрузка страницы или действие пользователя, для этого обработчик события связывается сметодом Контроллера. Controllers.EventsEdit = function(event) { /* здесь event это событие js, а не календарное событие */ // event.target.id, содержит идентификатор соответствующего календарного события var id = event.target.id.replace(/[^d]/g, ''); var dialog = new View.Dialog( Events.get(id) ); dialog.open(); } Этот паттерн особенно удобен, когда данные используются вразных контекстах. Например, мыредактируем событие вкалендаре, кликаем накнопку Удалить итеперь нам нужно убрать диалог, удалить событие вкалендаре инасервере. Controller.EventsDelete = function(event) { var id = event.target.id.replace(/[^d]/g, ''); View.Calendar.remove(id); Events.del(id); dialog.close(); } Экшены контроллера получаются простыми ипонятными, аэто ключ ксозданию удобных вподдержке приложений. Внедряем MVC напримере проверки данных формы Теперь, когда мызнаем как разделить код насоставные части, вернемся кпримеру проверки полей формы скоторого начинали. Как мыможем сделать его максимально гибким спомощью паттерна MVC? Проверка данных модели Модель определяет, корректны данные или нет, небеспокоясь отом, как это будет представлено, ейпросто нужно определить какие поля несоответствуют требованиям. У нас уже есть переменная fields содержащая некоторые метаданные Модели. Теперь мыдобавим кэтому объекту метод, который может понимать ипроверять передаваемые ему данные. Метод validate перебирает поля переданного ему объекта данных ипроверяет соответствуют лионтребованиям определенным внутренними метаданными. var MyModel = { validate: function(data) { var invalidFields = []; for (var key in data) { if (this.metadata[key].required && !data[key]) { invalidFields[invalidFields.length] = { field: key, message: key + ' is required.' }; } } return invalidFields; }, metadata: { 'other': {required: true} } } Для проверки мыпередаем массив пар ключ/значение, где ключ это имя поля, азначение то, что пользователь ввел вполе. var data = { 'other': false }; var invalid = MyModel.validate(data); Теперь переменная invalid содержит список полей, которые непрошли проверку, эти данные можно передать ввид для отображения сообщения обошибках. Отображение полей сошибками Теперь нам нужно отобразить ошибки. Отображение это работа для Вида, аданные обошибках ондолжен получить отКонтроллера. View.Message = function(messageData, type){ var el = document.getElementById('message'); el.className = type; var message = 'We have something to bring to your attention' + ''; for (var i=0; i < messageData.length; i++) { message += '' + messageData[i] + ''; } message += ''; el.innerHTML = message; } View.Message.prototype.show() { /* provide a slide-in animation */ } Дополнительный параметр type позволяет указать класс элемента, чтобы применить кнему нужные стили. Связываем все вместе спомощью контроллера У нас есть модель, которая сохраняет данные ипроверяет ихнакорректность, ивид, который может отображать сообщения обошибке или успешном выполнении операции, теперь нам нужно связать их,чтобы проверка данных выполнялась, когда пользователь пытается отправить форму. addEvent(document.getElementById('myform'), 'submit', MyController.validateForm); Метод контроллера, получает данные, проверяет ихкорректность иотображает ошибки. MyController.validateForm = function(event){ var data = []; data['other'] = document.getElementById('other').checked; var invalidFields = MyModel.validate(data); if (invalid.length) { event.preventDefault(); // создает вид и отображает сообщение var message = new View.Message(invalidFields, 'error'); message.show(); } } Массив данных содержит значения полей. Модель проверяет ихкорректность ивозвращает список полей содержащих ошибки. Если одно изполей содержит ошибку, сохранение данных отменяется, исообщение обошибке передается Виду, после чего онего отображает. Готово! Теперь унас есть пригодные кповторному использованию Вид иметоды проверки данных Модели. Прогрессивное улучшение В нашем примере, MVC отлично сочетается спрогрессивным улучшением. JavaScript просто дополняет страницу. Благодаря разделению, меньшему числу компонентов нужно понимать, что происходит настранице, аэто упрощает использование прогрессивного улучшения. Часто втаких приложениях сначала загружается веб страница, апотом отдельным Ajax запросом отображаемые наней данные. Это может создать упользователя впечатление медленного интерфейса, поскольку прежде чем онсможет работать состраницей должны выполниться два запроса. Чтобы избежать задержек, сразу отображайте все данные статически, это должно быть начальное состояние. Данные представленные вначальном состоянии, можно продублировать ввиде JavaScript внизу страницы икак только страница загрузиться JavaScript часть вашего приложения будет готова кработе. Можно предварительно загрузить инекоторые дополнительные данные. Например, внашем примере изначально отображаются только события текущего месяца, ноJavaScript данные могут содержать еще исобытия предыдущего иследующего месяца, навремени загрузки это скажется незначительно, зато пользователь сможет перейти кследующему ипредыдущему месяцу, незапрашивая данные ссервера. Фреймворки Многие JavaScript MVC фреймворки предоставляют намного более структурированный имощный чем представленный встатье подход кMVC разработке, нопонимание паттерна MVC итого как онможет быть применен, важно ивслучае разработки своего ивслучае использования существующего фреймворка. Вот несколько примеров таких фреймворков: JavaScriptMVC SproutCore TrimJunction Нужно лииспользовать фреймворк вконкретном случае или нет, зависит отсложности приложения, если приложение очень простое, тофреймворк будет только лишней нагрузкой. В заключение Как ивсегда вразработке, вам нужно решать стоит лииспользовать MVC вконкретном проекте. Для небольших приложений сограниченным функционалом, это может быть нецелесообразно, ночем больше ваше приложение, тем больше преимуществ выполучаете отразделения кода намодель, вид иконтроллер.

5 полезных утилит

Еще одна пятерка, наэтот раз некошмаров, аочень даже полезных утилит делающих ежедневную работу закомпьютером удобнее. Alax.Info NTFS Links Упрощает создание жестких исимволических NTFS ссылок, которые вомногих случаях предпочтительней ярлыков. К сожалению, использовать символические ссылки вWin XP неочень безопасно, так как при удалении ссылки Explorer удалит исодержимое папки, вVista такой проблемы нет. KeePass Если вынеобладаете феноменальной памятью, позволяющей запомнить сотню логинов ипаролей наразличных ресурсах, тоэта программа для вас, тоесть для большинства читателей. KeePass хранит данные учетных записей водном зашифрованном файле, чтобы получить кним доступ нужно ввести главный пароль. Встроенный генератор паролей избавляет отоднообразия ипростоты паролей. Taskbar Shuffle Позволяет менять порядок приложений напанели задач изначков втрее, нонеэто главное, главное она позволяет закрывать задачи кликом средней кнопки мышки, точно так жекак табы вбраузере. Tray It Может свернуть втрей любое приложение, это полезно для постоянно запущенных приложений вкоторых такой режим непредусмотрен, например, для виртуальной машины стестовым сервером. WinDirStat Очень помогает разгрести хлам надиске. Награфике хорошо видны объемные файлы идиректории, аэто значит, что вместо экономии наспичках иудаления множества мелочей, можно освободить место максимально эффективно. Обнаружен забытый бекап виртуальной машины. caps-min.exe Переключает раскладку при нажатии CapsLock. Немного погуглив, янашел способ обойтись только настройками вреестре [Remap keys, Switch input language by Caps Lock], нопока непроверял работает лиэто инет ликаких нибудь недостатков, если кто-то попробует, отпишитесь вкомментариях орезультатах. Punto Switcher непредлагать, последний раз когда яего пробовал, онневсегда переключал раскладку.Похожие статьи5 программ для веб-разработчика

5 юзабилити кошмаров на каждый день

Некоторые изприведенных встатье проблем встречаются практически каждый день, другие реже, новсе равно успевают запомниться. Этот список — продолжение статей 10 отборных юзабилити кошмаров и15 раздражающих читателя особенностей сайта, ноуже насобственных впечатлениях. 1. Прозрачный фон дозагрузки картинки Пример тут несамый подходящий, носпециально искать нехотелось. Такая верстка встречается достаточно часто, самый распространенный пример: внешний фон сайта темный, афон колонки стекстом светлый исделан картинкой, врезультате пока она загружается, пользователь видит абсолютно нечитабельный темный текст натемном фоне. Решение: проверяйте отображение сайта при отключенных изображениях, текст должен оставаться читабельным. 2. Подмена кнопки вплеере youtube После запуска ролика, ячасто выключаю звук, действие доведено доавтоматизма: клик наPlay исразу клик назвук, ксожалению, после того как появилась возможность переключиться наHQ, этот порядок уже неработает, потому что наместе кнопки выключающей звук успевает появиться кнопка HQ, накоторую иприходится второй клик. Решение: избегайте неожиданных перемещений элементов интерфейса ипоявления новых элементов наместе старых. 3. Неисчезающие пояснения вполях Когда место для формы ограничено, метки кполям выводят внутри самих полей, при этом важно незабыть очистить поле при получении имфокуса, иначе эту работу придется делать пользователю. Реализовать это несложно, ночасто оказывается, что вскрипте ошибка, аразработчик даже непытался проверить его работу. http://onegadget.ru/ http://zt9.ru/ http://coolidea.ru/ Решение: чтобы полностью исключить такую проблему, никогда невводите текст приглашения непосредственно вполе, используйте технику описанную встатье окомпактных формах. 4. Загрузка программ ссайта Adobe Решение несуществующих проблем создает реальные проблемы, хороший пример, менеджер загрузки насайте Adobe, создает сразу несколько проблем: непривычность такого способа загрузки, дополнительные вопросы отом куда сохранять загружаемый файл (менеджер загрузок ибраузер наверняка знают куда пользователь предпочитает сохранять файлы), недоработанность (так инесправился сзагрузкой 1Гб сдвух попыток). В большинстве браузеров есть встроенный менеджер загрузок, умногих пользователей установлен отдельный менеджер загрузок, который хорошо знает свое дело, даже если такового нет проще его поставить чем бороться ссомнительной поделкой, как минимум пользователь должен иметь возможность выполнить действие стандартными средствами. Решение: нерешайте проблемы которых нет, конечно, это касается нетолько загрузки файлов, ноитаких популярных впрошлом элементов как кнопка «Добавить визбранное», «Сделать стартовой», переопределения горячих клавиш, например, Ctrl+Home для перехода наглавную (проблема втом, что многие привыкли использовать это сочетание чтобы перематывать документ кначалу). 5. Ввод даты рождения вLiveJournal Поле ввода даты рождения, влучшем случае неочень привычно для русского человека, авхудшем случае заставляет призадуматься, вариантов тут нетак ужмного иправильное решение быстро найдут даже текто совсем незнаком стаким форматом даты, тем неменее, непривычных пользователю форматов данных следует избегать. Решение: при локализации приложений нужно помнить нетолько опереводетекста, ноиолокальных форматах.Похожие статьиЮзабилити: Правила, психология, термины

Разгоняем jQuery. Часть 1

Статей поускорению jQuery достаточно много, нообычно они неотличаются наглядностью иподробностью, поэтому ярешил провести несколько тестов ивыделить, тесоветы поускорению jQuery, которые действительно работают. Кеширование Кеширование результатов выборки заложено втиповую конструкцию применения jQuery. Цепочка вызовов: $('#id-of-element').attr('data-value', 'data-for-element') .css('color', 'red') .html('html code'); эквивалентна, следующему коду: var element = $('#id-of-element'); element.attr('data-value', 'data-for-element'); element.css('color', 'red'); element.html('html code'); Уже здесь наодну выборку приходится несколько вызовов методов, инам остается только расширить эту практику дальше одной цепочки, например, для выноса выборки запределы цикла: var el = $('#el-999-9'); for (var i = 0; i < runCount; i++) { el.addClass('el-class') .css('background-color', 'blue') .html(i); } или обработчика события: var el = $('#el-999-9'); $('#button').click(function(){ el.empty() .html('html code'); }); Кеширование эффективно даже напримере самого быстрого селектора #id: Код тестов: var runCount = 100; function testIdLoopNoCache() { for (var i = 0; i < runCount; i++) { $('#el-999-9').html(i); } } function testIdLoopCache() { var el = $('#el-999-9'); for (var i = 0; i < runCount; i++) { el.html(i); } } Хороший результат, нодавайте проверим селектор посложнее, например, .class1.class2: Разница впроизводительности браузеров настолько велика, что трудно показать ихрезультаты наодном графике, поэтому выделим еще один график для самых быстрых (по крайней мере вэтом тесте): Очевидно, что чем медлительней селектор тем эффективнее кеширование, особенно актуально кеширование выборок вбраузерах, неподдерживающих querySelectorAll. Минимизируйте работу сDOM Работа сDOM повозможности должна сводиться кминимуму, например, при добавлении нескольких элементов нужно сначала объединить ихкод, апотом вставить одним вызовом html. Начнем стестов: Код тестов: function testAppendLi() { $('#cnt').append(''); for (var i = 0; i < runCount; i++) { $('#list').append('' + i + ''); } } function testAppendLiCacheSelection() { $('#cnt').append(''); var list = $('#list'); for (var i = 0; i < runCount; i++) { list.append('' + i + ''); } } function testAppendAllLi() { $('#cnt').append(''); var list = ''; for (var i = 0; i < runCount; i++) { list += '' + i + ''; } $('#list').append(list); } function testAppendAllUlLi() { var list = ''; for (var i = 0; i < runCount; i++) { list += '' + i + ''; } $('#cnt').append('' + list + ''); } Тест testAppendLiCacheSelection попал наэтот график стой лишь целью, чтобы показать эффект откеширования (пусть даже очень быстрого селектора #id). Собирайте водин элемент Чтобы ускорить вставку большого количества элементов, ихнужно обернуть водин элемент. Обратите внимание, что тест testAppendAllUlLi работает быстрее, чем тест начистом DOM ипрактически так жебыстро как innerHTML, тожесамое касается методов html, after идругих методов стаким функционалом. Значительное ускорение при обертывании кода водин элемент связано соспособом которым jQuery внедряет html код вдокумент. После предварительной обработки кода, создается элемент div икод присваивается его свойству innerHTML, потом поэлементно клонируется вдокумент, обертывание вкода водин элемент позволяет минимизировать клонирования. Функция $.each Не используйте $.each там где важна скорость работы смассивом. $.each — это вызов функции вконтексте объекта ипоследующая проверка необходимости досрочного выхода изперебора (зависит отвозвращаемого функцией значения), очевидно, что простой for без лишних вызвов функций ипроверок значительно быстрее $.each. Результаты тестов это подтверждают: Разница впроизводительности $.each иfor in применительно кобъектам нестоль значительна, вероятно это связано стем, что for in нестоль быстр как for идополнительные расходы навызов функции иif наего фоне нестоль заметны. Не используйте for in для массивов Ну иеще раз подтверждение известного факта омедлительности цикла for in вприменении кмассивам: Конкатенация строк Конкатенация неотносится кjQuery, ноэто одна изчасто используемых операций, причем сподводным камнем, она фантастически медленно выполняется вIE6 иIE7. Если быстрая конкатенация нужна здесь исейчас, можно использовать Array.push(string) иArray.join(''), ноиспользовать ихповсеместно нерекомендуется, так как конкатенация хорошо поддается оптимизации ибыстрее join почти вовсех современных браузерах (а если небыстрее, значит разработчики использовали невсе возможности для ееоптимизации иона может ускориться вбудущем). Тот жесамый график без IE6 иIE7: Код тестов: function testConcatenationOperator() { var str = ''; for (var i = 0; i < count; i++) { str += words[i]; } // для оптимизации браузер может не собирать строку // пока она не потребуется в целом виде var forceConcat = str.toString(); } function testJoin() { var str = ''; var tmpArray = []; for (var i = 0; i < count; i++) { tmpArray.push(words[i]); } var str = tmpArray.join(''); } Проблема конкатенации вIE6/7 втом, что она выполняется тривиально, для каждых двух операндов создается буфер вкоторый они последовательно копируются, рассмотрим пример: var s = 'str1' + 'str12' + 'str123' В IE6/7 при выполнении первой конкатенации выделяется память под временную строку ивнее копируются строки 'str1' и'str12', при выполнении второй конкатенации выделяется память под еще одну строку ивнее копируется строки 'str1str12' и'str123', ит.д. При каждой конкатенации происходит выделение памяти икопирование строк. В эффективной реализации при выполнении первой конкатенация создается вспомогательный объект, содержащий ссылки настроки 'str1' и'str12', при выполнении второй конкатенации добавляется ссылка на'str123' итолько когда потребуется значение строки, выделяется память вкоторую копируются строки 'str1', 'str12', 'str123'. Подробнее обэтом можно почитать встатьях: Performance issues with "String Concatenation" in JScript Insight into String Concatenation in JScript Ускорение доступа кпеременным Еще один прием которому можно научиться уjQuery это ускорение глобальных переменных созданием соответствующей локальной. Метод прост, создаются локальная переменная, равная соответствующей глобальной, адоступ клокальным переменным вомногих браузерах быстрее доступа кглобальным переменным, иногда более чем в10 раз, вхудшем случае разницы нет. Код теста: var runCount = 1000000; var globalVariable = 1; function testGlobalVariable() { for (var i = 0; i < runCount; i++) { globalVariable++; } } function testLocalVariable() { var localVariable = 1; for (var i = 0; i < runCount; i++) { localVariable++; } } Пример использования оптимизации undefined вприближенных креальным условиях: function testArrayLocalUndefined() { var array = globalArray; //массив в котором каждый 5-й элемент определен var summ = 0; var undefined; //ускоритель for (var i = 0, l = array.length; i < l; i++) { if (array[i] !== undefined) { summ += array[i]; } } } jQuery использует эту технику для ускорения window иundefined. Статьи Improve your jQuery - 25 excellent tips jQuery Performance Rules 10 Ways to Instantly Increase Your jQuery Performance Ускоряем селекторы вjQuery Закрепляем jQuery — 25 отличных советов jQuery Internals

Обзор блога Алика Кирилловича

Хочу представить вашему вниманию блог Алика Кирилловича. Блог посвящен разработке веб-приложений ивыделяется качественными материалами, ксожалению, обновляется довольно редко. Работает блог насобственном движке AlikPress, укоторого есть две особенности: во-первых оннаписан наJavaScript (серверный JavaScript), аво-вторых генерирует хорошо отформатированный иполностью соответствующий стандарту XHTML Strict код, который приятно читать. Достаточно активно используются достижения Semantic Web: есть RDF-описание вFOAF формате, все статьи снабжены метаданными Дублинского ядра, незабыты имикроформаты. Автор внимательно относится коформлению материалов, нежалеет времени насоздание иллюстраций икачественное оформление статей, мне кажется, внекоторых статьях даже слишком. Воформление сайта несколько напрягают неравномерные разрывы втексте из-за justify, ноАлик обещал решить эту проблему. Вот несколько примеров статей изблога Алика: Закат веба? Отличная статья онастоящем ибудущем веб, проблемах развития ипричинах ихвозникновения, атакже оновой надежде, напрорыв втехнологиях создания веб-приложений. Статья написана год назад исегодня можно уверенно сказать, что предсказанное сбывается. Появляются первые крупные проекты, использующие HTML5, достаточно сказать, тоGoogle использует его вновой мобильной версии gMail имногообещающем проекте Google Wave. Десять приёмов программирования, разрушающих красоту кода Хорошая статья наактуальную тему красоты кода, будет полезна новичкам ипослужит напоминанием профессионалам. Рассмотрены такие темы как объявление переменных, возврат результата функции через параметр, хранение размера массива вотдельной переменной, использование рекурсии, именованные параметры функций инекоторые другие. Статья породила много споров, нояхочу напомнить, что улюбого правила есть свои границы применимости, иизихналичия отнюдь неследует ошибочность правила. Совершенный Ajax Новый подход кпостроению веб-приложений, при котором веб-сервер взаимодействует свнешним миром только посредством веб-служб, аклиентский интерфейс реализуется наоснове клиентских HTML, CSS, JavaScript. Сравнение языков встиле XML иязыков встиле YAML Кроме непосредственно сравнения XML иYAML, статья наводит намысль отом, что нужно шире использовать Wiki разметку которая удобнее, чем HTML иBBCode, для конечного пользователя. Например * Пункт 1 * Пункт 2 * Пункт 3 vs Пункт 1 Пункт 2 Пункт 3 или [http://designformasters.info/ Design For Masters] vs Design For Masters Есть иинтересные планы набудущие публикации: Мир JavaScript запределами браузера, будет одной изключевых тем блога. Алик считает, что JavaScript — удивительно мощный, гибкий икрасивый язык, превосходящий вряде случаев погибкости ифункциональным возможностям таких монстров, как Java или C#. Однако, многие особенности JavaScript, придающие ему мощь игибкость такие как: ООП наоснове прототипов, объекты-как-хеши, функциональное программирование или замыкания, оказались недопоняты разработчиками, привыкшими кклассическим языкам, вроде C++, Java, Delphi или VB. Кроме привычного многим использования этого языка ввеб, будут рассмотрены менее распространенные применения, такие как создание десктопных приложений (HTA, Air, XUL, Windows Sidebar gadgets ит.п.), сервер-сайд JS (ASP, Apache + mod_js ит.п.), скриптование (Adobe Creative Suite, PDF, OpenOffice, HD DVD), атакже основные JS-движки икомпиляторы (Mozilla Rhino, Google V8, MS ActiveScripting идр). Вторая часть статьи «Совершенный Ajax» посвященная деталям реализации.HTML — самый недооценённый язык построения интерфейсов вмире.Прототипно-ориентированная ORM — система объектно-реляционных отображений для прототипно-ориентированных (неклассовых) языков программирования (например, JavaScript). Три уровня семантики: семантическая вёрстка → микроформаты → Semantic Web. Механизмы функционирования сообществ: люди (Википедия) vs софт (Хабр). Подписывайтесь наRSS: Блог Алика Кирилловича

Подготовка ссылок к печати 2

Ксожалению, далеко ненавсе сайты готовы кпечати, вомногих случаях вместе снужной информацией печатается 5 листов меню ибаннеров, аесли особо повезет можно получить почти настоящий пазл. Конечно, печать несамая востребованная функция, ноподготовка страницы кпечати инетребует больших затрат времени итруда. Приятным дополнением кпечатной версии страницы могут стать сноски для ссылок, предложенные Аароном Густафносоном. Примерно так выглядит распечатанная страница DFM. Скрипт подготовки ссылок кпечати, который предложил Аарон, прекрасно работает, нотри экрана кода только для того, чтобы сделать концевые сноски ссылок это слишком. Яуверен, что многие сразу жеоткажутся отсамой идеи сносок, ивчем-то будут правы — печатаются страницы редко, атут еще искрипт огромный. Чтобы отбросить хотя быэту часть сомнений, япереписал скрипт под jQuery снебольшим сокращением совсем ужредко используемого функционала, получилось наэкран с комментариями, и450 символов в сжатом виде. /** * Создает концевые сноски для ссылок. * @param container селектор элемента содержащего ссылки * @param target селектор элемента в который нужно добавить список ссылок * @param title заголовок списка ссылок * @param printClass класс элементов добавляемых функцией */ function footnoteLinks(container, target, title, printClass) { if(!printClass) printClass = 'printOnly'; var linksArray = []; // ссылки по порядку var linksHash = {}; // индексы по href, для поиска дубликатов // перебор всех ссылок с атрибутом href // в пределах контейнера $(container + ' a[href]').each(function(elementIndex) { var index = elementIndex; if(!linksHash[this.href]) { // ссылка встречается впервые linksHash[this.href] = index; linksArray.push(this); } else { // такая ссылка уже была и ей присвоен индекс index = linksHash[this.href]; } // добавляем номер сноски после ссылки $(this).after('' + (index + 1) + ''); }); // создание списка с концевыми сносками, если ссылки былы var linksFound = linksArray.length; if(linksFound > 0) { var links = ''; for(var i = 0; i < linksFound; i++) links += '' + linksArray[i].href + ''; links = '' + title + '' + '' + links + ''; $(target).append(links); // задаем класс для элемента html // может быть полезно при написании CSS для печати $(document.documentElement).addClass('print-footnote-links'); } } // пример использования $(document).ready(function() { footnoteLinks('.single .post-content', '.post-content', 'Ссылки'); }); Пример страницы (сноски нескрыты) Теперь скроем сноски. Если стили для всех устройств водном файле томожно использовать следующее правило: // лишние устройства можно удалить @media aural, braille, embossed, handheld, projection, tty, screen, tv { .printOnly { display: none; } } Если для каждого устройства подключается свой файл стилей, товсе еще проще, добавьте .printOnly { display: none; } вовсе файлы кроме файла стилей для печати. Чтобы посмотреть еще одни пример используйте «Предварительный просмотр...»Похожие статьиПодготовка ссылок к печати15 минут на подготовку к печати

Пользовательские поля в WordPress

В продолжение статьи Custom Fields Hacks For WordPress хочу поделиться своим опытом использования пользовательских полей поста. Автор иоригинал поста Не секрет, что насайте восновном опубликованы переводы статей, чтобы удобно указать автора идать ссылку наоригинал яиспользую дополнительные поля author иoriginal. Работа сэтими полями выделена вплагин dfmAuthorOriginal.php Автора подменяем спомощью фильтра: add_filter('the_author', 'dfm_author_filter'); function dfm_author_filter($author) { global $post; $custom_author = get_post_meta($post->ID, 'author', true); if($custom_author) { if(is_feed()) { $custom_author = strip_tags($custom_author); } return $custom_author; } else { return $author; } } Для оригинала вводим функцию dfm_original: function dfm_original($before = '', $after = '') { global $post; $original = get_post_meta($post->ID, 'original', true); if($original) { echo $before . $original . $after; } } и вставляем еевнужном месте шаблона: Краткие заголовки постов Для списка «Последние статьи» всайдбаре используются краткие заголовки изполя short_title. Вобщем случае код должен выглядеть так: function dfm_recent_posts($before='', $after='') { $posts = get_posts(array('numberposts' => 10)); echo dfm_posts_list($posts, $before, $after); } function dfm_posts_list($posts, $before='', $after='') { $result = array(); foreach($posts as $post) { $permalink = get_permalink($post); $title = get_post_meta($post->ID, 'short_title', true); $title = empty($title) ? $post->post_title : $title; $result[] = sprintf('%s%s%s', $before, $permalink, $title, $after); } return implode("\n", $result); } К сожалению, get_posts это 4 запроса кБДиесли таким способом выводить блоки «Последние статьи», «Лучшие статьи» и«Похожие статьи» токоличество запросов насборку страницы будет более чем удвоено (22 вместо 10), благодаря чему хостер отключит сайт как раз втот момент, когда нанего появиться ссылка напопулярном ресурсе, поэтому яиспользую менее универсальный, нобыстрый метод: function dfm_recent_posts($before='', $after='') { global $wpdb; $posts = $wpdb->get_results( "SELECT COALESCE({$wpdb->postmeta}.meta_value, post_title) AS post_title, post_name " . "FROM {$wpdb->posts} " . "LEFT JOIN {$wpdb->postmeta} ON post_id = ID AND {$wpdb->postmeta}.meta_key = 'short_title' " . "WHERE post_status='publish' ORDER BY post_date DESC LIMIT 10" ); echo dfm_posts_list($posts, $before, $after); } function dfm_posts_list($posts, $before='', $after='') { $siteurl = get_bloginfo('siteurl'); $result = array(); foreach($posts as $post) { $permalink = $siteurl . '/posts/' . $post->post_name; $result[] = sprintf('%s%s%s', $before, $permalink, $post->post_title, $after); } return implode("\n", $result); } Функцию dfm_recent_posts вставляем вшаблоне sidebar.php: Последние статьи Похожие статьи Для похожих статей используется поле related сосписком идентификаторов похожих постов: add_filter('the_content', 'dfm_related_articles_filter'); function dfm_related_articles_filter($content) { global $post, $wpdb; $result = ''; if(is_single() || is_feed()) { $related_IDs = get_post_meta($post->ID, 'related', true); if(!empty($related_IDs)) { $related_posts = $wpdb->get_results( "SELECT post_title,post_name FROM {$wpdb->posts} " . "WHERE post_status='publish' AND ID IN ($related_IDs) " . "ORDER BY post_date DESC;" ); if(!empty($related_posts)) { $result = 'Похожие статьи'; foreach($related_posts as $p) { $href = get_bloginfo('siteurl') . '/posts/'. $p->post_name; $result .= sprintf('%s', $href, $p->post_title); } $result .= ''; } } } return $content . $result; } Идентификаторы смотрю накарте сайта спомощью FireBug, конечно, хорошо быавтоматизировать этот процесс, новсе руки недоходят, даинетак ужчасто приходится этим заниматься. Форум Web 2.0 иблоггинг Дружелюбный форум осоздании сайтов иведении блогов. Присоединяйтесь.

Путеводитель для новых читателей

Некоторые полезные статьи были опубликованы, когда количество читателей недостигало идесятой части сегодняшнего, поэтому япозволил себе немного вернуться кстарым статьям. Код Тестирование накроссбраузерность, сервисы иутилиты Кроссбраузерность одна изсамых сложных проблем ввеб-разработке, хоть следование веб-стандартам идает достаточно высокий уровень совместимости, ноневсе браузеры совершенны, старые браузеры часто удивляют разработчиков своим творческим подходом кобработке (X)HTML/CSS кода. Внедрение Flash спомощью SWFObject 2 SWFObject 2 позволяет внедрять Flash нетолько динамически, спомощью JavaScript, ноистатически, спомощью стандартной разметки, аJavaScript только исправляет неразрешимые спомощью разметки проблемы. Искусство разметки Разметка это основа представления сайта, втой или иной степени она взаимосвязана сдизайном, контентом, аксессибилити, CSS иJavaScript, качество разметки влияет накачество связанного сней кода, следуя советам этой статьи, высможете подняться нановый уровень мастерстве разметки. 70 идей экспертов для улучшения CSS кода Множество полезных советов поCSS. Микроформаты: Что это икак ими пользоваться? Обзор который даст вам представление отом, что такое микроформаты, какие они могут дать вам преимущества икак ихиспользовать, чтобы сделать контент более заметным ипонятным для поисковых машин. Свойство background Подробное описание свойства background исвязанных сним багов иразличий вбраузерах. Переключатель стилей Часто новички задают вопрос, как подключить разный css, для разного разрешения экрана, времени суток, времени года, фазы луны. Насамом деле в99% случаев, хватит одного css файла ииспользования техники описанной вэтой статье. Адаптивная разметка Отличный пример использования переключателя стилей иинтересная идея адаптации разметки квозможностям устройства. CSS Float втеории инапрактике Float одно изсамых проблемоемких свойств CSS, взначительной степени благодаря браузерам. Псевдоколонки Один изпростейших способов сделать колонки равной высоты. Визуализация данных наHTML иCSS Техника визуализации данных спомощью HTML иCSS позволяет тесно интегрировать визуализацию инавигацию насайте. Создание гаджетов для Windows Sidebar Гаджет — это небольшая веб-страница, поэтому его создание нетребует отвеб-разработчика значительных усилий или освоения новых технологий. Дизайн Юзабилити: Правила, психология, термины Профессиональный веб-разработчик должен быть адвокатом посетителя сайта, защищать его интересы игарантировать, что независимо отсложности сайта, пользователь всегда сможет найти то, что ему нужно. Чтобы успешно выполнять эти задачи, выдолжны уметь эффективно защищать свои идеи ирешения вдискуссиях склиентами иколлегами, ваша работа втом, чтобы корректировать плохие идеи иневерные концепции, анеслепо следовать им. Креативное использование полупрозрачных PNG ввеб-дизайне Суходом сосцены IE6 полупрозрачные PNG будут все шире применяться ввеб-дизайне, ксожалению времена когда можно будет использовать полупрозрачность инебеспокоиться окостыле для старичка IE6 наступят еще нескоро. Читабельность Если текст сайта будет удобочитаемым выиграют все, пользователям непридется щуриться, иони еще нераз квам вернуться, выбудете рады растущей аудитории, алюди спониженным зрением будут вам особенно благодарны. Оформление гиперссылок Чтобы посетители могли легко ориентироваться насайте, ссылки должны хорошо выделяться, быть абсолютно ясными иинформативными, несмотря наочевидность этих советов все еще можно встретить сайты снеудачным оформлением ссылок. Дизайн встиле Web 2.0 Некоторые элементы, распространенные всовременном web дизайне, собъяснением, почему они работают, икак когда игде выможете использовать эти элементы вваших работах. 23 важных вывода изрезультатов eye-tracking исследований Eye-tracking исследования горячая тема вмире веб-дизайна, ноуних есть одна проблема, невсегда очевидно как применить результаты при разработке реального сайта. Вэтой статье автор пытается дать несколько, основанных нарезультатах таких исследований, советов позволяющих увеличить эффективность вашего сайта. Юзабилити интернет приложений Помере усложнения интернет приложений все труднее сохранить простору взаимодействия спользователей. Роль пространства вдизайне Когда вынаучитесь, использовать пространство, выупростите жизнь вашим читателям, сможете точнее позиционировать продукты, и, возможно, начнете видеть свои работы вновом свете. SEO Все оGoogle PageRank Все его используют, номало кто знает, как онработает. Google PageRank, это один изважнейших для веб-разработчиков параметров. На карте сайта можно посмотреть все опубликованные статьи.

Реклама