Маров Николай

Полное собрание образцов моих работ

Кроссбраузерное присваивание значения для атрибута style

Всем конечно известно, что в ИЕ до восьмой версии не работает присваивание значения атрибуту style через element.setAttribute();.

Однако присваивание атрибутов по отдельности через запись вида: element.style.name = "value" совершенно отлично работает в любом браузере. Стоит только учитывать, что имена свойств, которые пишутся через дефис, надо конвертировать в «верблюжий стиль» с малой буквы. Так свойство margin-left следует записывать как marginLeft. Однако правило работает не всегда. Так свойство float, хоть и не содержит дефиса и состоит из одного слова, следует писать как cssFloat или styleFloat.

В общем виде, функцию для присваивания значения атрибуту style можно написать следующим образом:

// создаём елемент
var wrap = document.createElement('div');

// вызываем функцию присваивания значения
setStyle(wrap, "position:fixed;top:50%;left:50%;display:block;");

// собственно функция
function setStyle(el, style) {
	style = style.split(';'); // разбиваем на массив значений

	for (var i in style) {
		if (style[i] !== "") { // если значение нет (конец строки)
			var attr = style[i].split(':'); // конкретное значение

			// если есть дефис в значении свойства, преобразуем значение
			if (attr[0].indexOf('-') != -1) {
				attr[0] = attr[0].replace(/-\D/g, attr[0].charAt(attr[0].indexOf('-') + 1).toUpperCase());
			}

			// задаём значение
			el.style[attr[0]] = attr[1];
		}
	}
}

С присваиванием float пока не знаю что делать. Стараюсь его избегать.

Дополнение: конструкция element.setAttribute(); очень замечательно заменяется конструкцией element.style.cssText = 'css prop';.

Настройка PHPStorm для html-вёрстки

Для настройки работы Zen Coding в php (раскрытия сокращений) необходимо в настройках плагина (Settings -> Live Templates -> ZenHTML) у каждого пункта отметить требуемый формат файлов, нажав на ссылку «Change».

Настройка работы Zen Coding в Storm

Ещё я долго мучился с распознаванием php-файлов (PHPStorm открывал их как простой текст). Идём в настройки типов файлов (Settings -> File Types), в колонке Recognized File Types находим PHPfiles и добавляем нужное расширение (в моём случае *.php) в колонку Registered Patterns. Аналогичные действия надо выполнить при работе с php-файлами, имеющими иные расширения (например при работе с Drupal).

Отображение номера строки по умолчанию:
Settings (Ctrl+Alt+S) -> Editor -> Appearance -> Show Line Numbers
Далее плюшки:

Настройка jQuery API документации в PHPStorm и WebStorm

Поддержка Symfony Command Line
Установка полного русского словаря для проверки орфографии
Как подключить JetBrains PhpStorm к Redmine

Дополнительно
Карта «горячих» клавиш в PHPStorm

Субъективные мысли о БЭМ

Все, сказанное ниже, мои мысли о методе БЭМ, разработанном ребятами из Яндекса.

БЭМ — технология для большого количества больших страниц. Но не используйте её для простых проектов. Воздержитесь от БЭМ если вы фрилансер. Хорошенько разберитесь в сути метода, перед его применением.

Неграмотное использование метода приведёт только лишь к захламлению. Работать с «псевдо БЭМ» документами очень тяжело.

В кратце, суть БЭМ в обращении к элементам только по имени класса и полный отказ от доступа по цепочке элементов.

// правильно
<div class="name-block">
  <div class="name-block-inner">
    <b class="name-block-inner-b"></b>
  </div>
</div>

// неправильно
<div class="name-block">
  <div>
    <b></b>
  </div>
</div>
// правильно
.name-block {}
.name-block-inner {}
.name-block-inner-b {}

// неправильно
.name-block {}
.name-block div {}
.name-block div b {}

Что можно почерпнуть из БЭМ:

  • Именование классов: например, имеем родительский класс с именем form, тогда все имена классов вложенных в него и логически связанных с ним элементов удобно начинать с префикса f_.
  • Отказ от вложенных селекторов в CSS (доступ по имени класса): это делает проект более гибким, позволяя быстро перемещать, компоновать или видоизменять элементы страницы.
  • Модификаторы: позволяют менять внешний вид элементов, подстраивая его под конкретную ситуацию.

Минусы:

  • Захламлённость HTML-файла: имена классов получаются внушительной длины плюс такие же модификаторы. В итоге код превращается в кашу.

Плюсы:

  • Высокая скорость рендеринга страницы.
  • Гибкость клиентской части проекта

Призыв к действию: вы нужны Открытому Вебу *сейчас*!

Не так давно, IE6 был сверхдоминирующим браузером в Вебе. Веб был переполнен сайтами, работающими только в IE6, и другие браузеры, их пользователи, были в отчаянии. IE6 мертв, те времена ушли, все производители браузеров, включая саму MS, ликуют. Прошли? Не совсем… IE6 ушел, проблема осталась.

WebKit, движок рендеринга «в сердце» Сафари и Хрома, живущий на «айфонах», «айпадах» и устройствах с Андроидом, сегодня сверхдоминирует в мобильном вебе и мобильный веб полон сайтов, работающих только в WebKit, а другие браузеры и их пользователи рыдают. Многие сайты «вынюхивают» строчку User-Agent браузера и отсеивают всех «невебкитных». Как в прошлом с IE6, это не спор нового со старым, а вопрос доминирования в рыночной доле и софта, поставляемого вместе с «железом». Но у проблемы есть один аспект, которого не было во времена IE6: эти сайты «заточены» под WebKit еще и потому, что они используют только «экспериментальные» CSS-свойства с префиксом «-webkit-», без их «партнеров» для Мозиллы, MS и Оперы. Так что даже если убрать «вынюхивание» браузеров, сайты останутся «сломаны» в браузерах с отличным от WebKit движком…

Во многих случаях, если не в большинстве их, у -webkit-свойств, используемых этими «заточенными под WebKit» сайтами, есть эквиваленты с префиксами -moz-*, -ms-* и -o-*. Их авторам требуется лишь пара минут, чтобы сделать сайты совместимыми с Мозиллой, IE и Оперой. Но они этого не делают.

Без вашей помощи, без твердого ответа, это может привести лишь к одному, и мы уже в опасной близости от этого: другие браузеры сами начнут поддерживать/реализовывать префикс -webkit-*, превращая одну-единственную реализацию в новый мировой стандарт. Это превратит долю рынка в стандарт де-факто, одну из реализаций — в мировую монополию. Опять. Это убьет наш процесс стандартизации. Это уже не вопрос «если», это вопрос «когда».

Хочу быть предельно ясным: это НЕ гипотетическая ситуация и я обсуждаю не что-то, что «может случиться когда-нибудь». Все производители браузеров официально дали нам знать, что рано или поздно это СЛУЧИТСЯ, и скорее рано, чем поздно, потому что, у них, цитирую, «нет иного выбора». Столь же ясно заявляю, что это НЕ вопрос «отсталости» других производителей браузеров, в особенности когда у них ЕСТЬ поддержка соотв. «фич», но со своим собственным префиксом — в чем они соблюдают правила рабочей группы CSS.

Полная версия статьи и полная версия перевода.

Простая отправка формы по ENTER

Любая форма в любом браузере отправляется по нажатию кнопки enter если в этой форме есть кнопка типа submit или image:

<form name="#" action="#" method="post">
    <input type="text" name="text" />
    <input type="submit" />
</form>

При этом кнопка submit может быть не видима для пользователя (display: none;).

Пример.

Самый лучший jQuery-плагин :)

Создал самый лучший в мире плагин для jQuery — theBestPlugin.

Очень легко подключается. Имеет множество настроек и очень сильно расширяем. Есть некоторые проблемы с кастомизацией, но в README.txt всё подробно описано.
Совместим с любой версией jQuery. Работает во всех браузерах. На 100% подходит любому проекту.

Подробности на гитхабе.

Вещи, которые надо помнить о GIT на Windows 7

1. Создавай алиасы:

git config alias.ci commit
git config alias.co checkout
git config alias.br branch

Это в разы упрощает и ускоряет работу.

2. Устанавливай git для работы с консолью
Зачастую, работа с консолью удобнее работы через графический интерфейс.

3. Добавляй свой логин к url репозитория: user@host/repo
Чтобы не вводить его каждый раз при обращении к серверу (fetch, pull).

4. Создай переменные окружения HOME = %USERPROFILE%\ и GIT_SSH = {TortoiseGit install dir}\TortoisePlink.exe
Чтобы работать через консоль.

5. Имя домашней директории пользователя должно быть на английском
Опять же важно для работы с консолью.

6. Проверь наличие директории .ssh в домашней директории. Если её нет — создай и положи туда публичный ключ

7. Укажи настройки в конфигах:

git config --global user.name "ваше имя"
git config --global user.email "ваша почта"
git config --global core.autocrlf true
git config --global core.safecrlf true

UPD: кто бы мог подумать, но последние две записи лучше делать ложными

autocrlf = false
symlinks = false

Подробнее: http://jenyay.net/Git/Autocrlf

8. Почитай литературу:
http://dbanck.de/2009/10/08/github-windows-and-tortoisegit-part-1-installing-pulling/
http://habrahabr.ru/blogs/Git/125799/
http://githowto.com/

Кроссбраузерный поиск в select list

Ниже я хочу рассказать о своём методе поиска по списку.
Для этого требуется поле ввода текста и собственно сам список.

<input class="type-search" type="text" />
<select size="10" id="list">
	<option value="val">Text</option>
	...
	<option value="val*n">Text</option>
</select>

Добавим к этому немного css:

input, select {
	width: 300px;
	margin: 10px auto;
	display: block;
}

При этом всё, что не совпадает со строкой поиска — будем скрывать, оставляя в списке только нужные результаты.
Читать остальную часть записи »

Мысли об универсальном селекторе

Интересные мысли постигли меня касаемо универсального селектора (он же селектор «звёздочка»).

Большинство верстальщиков свято верят, что использование оного селектора в разы затормаживает скорость отображения страницы. А, например, в Internet Explorer страница вообще не сможет загрузится, намертво «подвесив» браузер.

Однако же будем хладнокровны и обратимся к фактам.

Читать остальную часть записи »

Метод html-верстки кнопок с применением псевдоэлементов

Появлению этой методики способствовала воистину монстрообразная вёрстка элементов страницы на нашем проекте. Подумать только, для отображения одной кнопки требовалось до семи тегов на один элемент.

Выглядело это примерно так:

html

    <div class="large_button">
      <span class="buttons submit_v2-button clickable">
        <i class="left left2"></i>
        <i class="body">
          <b>В архив</b>
          <i class="end">
            <i></i>
          </i>
        </i>
      </span>
    </div>

Видно, что запутаться в таком коде проще простого, тем паче, что вариантов кнопок на проекте накопилось не менее 30. Попытка создать такую кнопку на серверной стороне вызывала негодование у коллег «пехапистов».

Поэтому моей негласной задачей стало максимальное упрощение кода.
Читать остальную часть записи »

Резиновый блок со скруглёнными углами, градиентом и тенью

Блок со скруглёнными углами, градиентом и тенью

Ещё не так давно это была настоящая головная боль верстальщика. Теперь это решаемо одним тегом:

HTML

<div class="gray-block">
	<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit</p>
</div>

CSS

.gray-block{
	border: 1px solid #CBD3DB;
	-moz-border-radius: 10px;
	-webkit-border-radius: 10px;
	border-radius: 10px;
	background-image: -webkit-gradient(linear,left top, left bottom,from(#EEF2F5),to(#CBD3DB));
	background-image: -webkit-linear-gradient(top,#EEF2F5,#CBD3DB);
	background-image: -moz-linear-gradient(top,#EEF2F5,#CBD3DB);
	background-image: -o-linear-gradient(top,#EEF2F5,#CBD3DB);
	background-image: linear-gradient(top,#EEF2F5,#CBD3DB);
	-moz-box-shadow: 4px 4px 10px #838383;
	-webkit-box-shadow: 4px 4px 10px #838383;
	box-shadow: 4px 4px 10px #838383;
}

Как видно из приведённого кода, всё это будет замечательно работать везде, кроме Internet Explorer. Шестую версию этого браузера поддерживает только убогий, а для последующих версий есть совершенно замечательная библиотека на JavaScript — PIE.js

Читать остальную часть записи »