-
CSS Framework
своими руками. Практика
Виталий Харисов
Руководитель группы HTML-вёрстки
Субботник, Москва, 31 января 2009 года
-
Как делаем
-
#nojs / #js
-
#nojs / #js
- используем JavaScript для оживления
- что будет, если скрипта нет?
- есть очень простое решение
-
#nojs / #js
Подготовка
<html id="nojs">
-
#nojs / #js
CSS «без скрипта»
#nojs .b-blah
{
display: none;
}
-
#nojs / #js
Заменяем nojs на js
document.documentElement.id = "js"
-
#nojs / #js
CSS «со скриптом»
#js .b-blah
{
display: block;
}
-
.quirks
-
.quirks
- Компоненты делаем в Standards Mode
- Подправляем для Quirks Mode
-
.quirks
Подготовка
if (document.compatMode != "CSS1Compat")
document.documentElement.className +=
" quirks"
-
.quirks
Использование
.quirks .b-blah
{
width: 96%;
}
-
CSS Expressions
-
CSS Expressions
Что это?
- Есть только в Internet Explorer 7 и ниже
- JavaScript внутри CSS
- Плохие expressions влияют на производительность
- Плохая репутация, все слышали, но боятся использовать
-
CSS Expressions
Для чего мы их используем
- добавление экстра-разметки
- эмуляция :before / :after
- динамический пересчёт ширины / высоты
-
CSS Expressions
Код
Ширина 100% - 50px.
Не можем так
.b-blah
{
width: 100% - 50px;
}
-
CSS Expressions
Код
Но можем так
.b-blah
{
width: expression(
parentNode.offsetWidth - 50 + 'px')
}
-
CSS Expressions
Проблема
- Expression вычисляется постоянно
- Сильно снижается производительность браузера
-
CSS Expressions
Одноразовый expression
- Вычисляется один раз
- Перекрывается статическим значением
- Безопасны по производительности
- Можно использовать для добавления элементов в DOM
-
CSS Expressions
Одноразовый expression. Код
* html .b-blah {
width: expression(
runtimeStyle.width = "auto",
appendChild(createElement("blah")));
}
* html .b-blah blah {
background: red;
}
-
CSS Expressions
Кешируемый expression
- Выполняется постоянно
- Но меняет значение, только когда надо
-
CSS Expressions
Кешируемый expression. Код
* html .b-blah {
height: 100%;
h: expression(
(this.h != parentNode.offsetHeight) ?
(this.h = parentNode.offsetHeight,
style.height = this.h + "px") :
0 );
}
-
CSS Expressions
Кешируемый expression. Код
* html .b-blah {
h: expression( function (t) {
var h = t.parentNode.offsetHeight;
if (t.h != h) {
t.h = h;
t.style.height = h + "px";
}
} (this) );
}
-
Реализация блоков
-
g-png: поддержка PNG-24 в <img>
-
g-png: поддержка PNG-24
Проблема
- Верстальщикам сильно мешает жить MSIE6
- Не поддерживает отображение PNG-24 с полупрозрачностью
- Решений множество
- У нас есть своё решение
-
g-png: поддержка PNG-24
Классическое решение
- Замена адреса картинки на пустой GIF
- Применение к этой картинке фильтра
Недостатки
- Используется ещё одна картинка,
лишний HTTP-запрос
- Полупрозрачные области в ссылке не кликабельны
-
g-png: поддержка PNG-24
Наше решение
- Глобальный модификатор g-png
- Можно добавлять любому элементу внутри которого есть <img>
-
g-png: поддержка PNG-24
HTML
Код такой
<i class="g-png"><img src="…"/></i>
Или такой
<a class="g-png" href="…"><img src="…"/></a>
-
g-png: поддержка PNG-24
HTML. Объяснение
Введя дополнительный элемент получили:
- Фильтр навешивается не на картинку,
а на элемент .g-png
- Картинка скрывается через visibility: hidden
- Проблему кликабельности картинки
решим просто
-
g-png: поддержка PNG-24
CSS. Накладываем фильтр
* html*.g-png { /* Скрываем от MSIE5 */
zoom: expression(
runtimeStyle.zoom = 1,
runtimeStyle.filter +=
"progid:DXImageTransform." +
"Microsoft.AlphaImageLoader(src=" +
getElementsByTagName("img")[0].src + ")"
);
}
-
g-png: поддержка PNG-24
CSS. Скрываем картинку
* html*.g-png img {
visibility: expression(
runtimeStyle.visibility="hidden",
parentNode.insertBefore(
createElement("png"), this)
);
}
-
g-png: поддержка PNG-24
CSS. Поддержка кликабельности
* html*.g-png png {
font-size: 0;
position: absolute;
width: expression(runtimeStyle.width =
parentNode.offsetWidth + "px");
height: expression(runtimeStyle.height =
parentNode.offsetHeight + "px");
}
-
g-png: поддержка PNG-24
CSS. Финальный штрих
* html a.g-png,
* html a .g-png,
* html .g-png a {
cursor: hand;
}
-
Реализация блоков
Примеры можно скачать
vitaly.harisov.name/article/css-framework-examples.zip
-
Спасибо за внимание!
-
Виталий Харисов
Руководитель группы HTML-вёрстки
vitaly@yandex-team.ru