SlideShare a Scribd company logo
Систематизация экспрешнов в IE
          Комаров Роман
Экспрешны

— Насколько они нужны? А нужно ли вообще что-то править под IE?

— За что разработчики не любят экспрешны (не умеют готовить?)

— Объективные недостатки имеющихся подходов к экспрешнам.
Важно!

Экспрешны — не универсальное решение всех проблем, но при
правильном применении способны существенно сократить время
разработки.

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

— Перезаписываемые («одноразовые») экспрешны.

— Постоянно выполняющиеся экспрешны с условиями («кешируемые»)


                             А кроме того:

— Автоматическое получение эмулируемых свойств.

— Отделение экспрешнов от таблиц стилей во внешний .js файл.

— Гибкость вариантов применения экспрешнов.
Одноразовые и кешируемые экспрешны

  Про самые основы уже есть достаточно материалов:

— «Тонкий CSS для Internet Explorer», Павел Корнилов (ClientSide 2007)
                                              (примерно 40-й слайд)
— «CSS Framework своими руками. Практика»                             ,
  Виталий Харисов (Я.Субботник в январе 2009)


                                  Вкратце:

— Всё что можно выполнить только один раз раз — нужно выполнить
  только один раз.

— А для всего остального, перед вычислением всех значений, узнавать
  нужно ли это делать.
Автоматическое получение эмулируемых свойств

  Почти всё, что нам нужно, мы можем получить из свойства
  currentStyle.


  Например:

— parseInt(t.currentStyle['max-width'],   10);


— t.currentStyle.opacity   * 100;


— t.currentStyle['content'];   // хотя тут ещё надо парсить…




  Таким образом, любые правки в проекте мы будем вносить только в
  оригинальные таблицы стилей, забыв про хаки IE.
Отделение экспрешнов от таблиц стилей во внешний .js файл

1. Разделение поведения (behavior!) и представления.

2. Повторное использование кода.

3. Отсутствие проблем с подсветкой кода в редакторах.

4. Предотвращение ошибок браузеров, связанных с неверной
   интерпретацией содержимого экспрешнов (привет, Safari!)

5. Ну и все прелести яваскрипта *доступные IE.
Отделение экспрешнов от таблиц стилей во внешний .js файл


ie.js
   var IExpr = {
       fix: function(t) {…},
       target: function(t) {…},
       hover: function(t) {…},
       …
   }



ie.css
   .example1 {
       zzz:expression(IExpr.positioning(this));
       }
   .example2 {
       behavior:expression(IExpr.fix(this,'hover'));
       }
Гибкость вариантов применения экспрешнов

— Чаще всего все исправления применяются к одному свойству.

— Самый простой способ для одноразовых экспрешнов:
  zoom:expression(IExpr.iframeShim(this),this.runtimeStyle.zoom=1);


— И для постоянно выполняющихся:
  zzz:expression(IExpr.positioning(this));




  Ну и, кроме того, удобно применить сразу много исправлений в одном
  экспрешне:

  .example {
      behavior:expression(IExpr.fix(this,'before','after','target'));
      }
Различные варианты применения эскпрешнов

Вариант со вспомогательной функцией fix уменьшает количество кода
в CSS, кроме того он позволяет «отключать» постоянно
выполняющиеся функции.

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

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

1. max-width

2. :hover

3. :before
max-width

maxWidthPx: function(t)
{
    if (t.parentNode.scrollWidth != t.w) {
        t.w = t.parentNode.scrollWidth;
        var max = parseInt(t.currentStyle["max-width"], 10);
        t.style.width = 'auto';
        if (t.scrollWidth > max) {
            t.style.width = max;
        }
    }
    return 1;
},
:hover

hover: function(t)
{
     var hoverClass = t.className ?
t.className.replace(/([^s]+)/g,'$1_hover') : 'hover';
     t.attachEvent('onmouseover',function() {
         t.className += (' ' + hoverClass);
     });
     t.attachEvent('onmouseout',function() {
         t.className = t.className.replace(new RegExp(' ' + hoverClass,'g'),
'');
     });
},
:before

before: function(t)
{
    t.insertAdjacentHTML('afterBegin','<span class="' + (t.className ?
t.className.replace(/([^s]+)/g,'$1_before') : 'before') + '"
style="behavior:expression(IExpr.fix(this,'renderContent'))"></span>');
},
renderContent: function(t)
{
    var content = t.currentStyle['content'];
    if (content && content.length > 2) {
        if (content == 'none' || content == 'normal') {
            t.removeNode(true);
        } else {
            t.insertAdjacentText('afterBegin', content.slice(1,-1));
        }
    }
},
Спасибо!

— http://kizu.ru/lib/ie/

— kizu@kizu.ru

More Related Content

What's hot

Web осень 2013 лекция 2
Web осень 2013 лекция 2Web осень 2013 лекция 2
Web осень 2013 лекция 2Technopark
 
Authentication security
Authentication securityAuthentication security
Authentication security
Olga Lavrentieva
 
Курсы по мобильной разработке. 1 лекция. Знакомство с iOS
Курсы по мобильной разработке. 1 лекция. Знакомство с iOSКурсы по мобильной разработке. 1 лекция. Знакомство с iOS
Курсы по мобильной разработке. 1 лекция. Знакомство с iOSГлеб Тарасов
 
Эффективный AJAX
Эффективный AJAXЭффективный AJAX
Эффективный AJAX
Alexander Shurkayev
 
7 убийц производительности WordPress
7 убийц производительности WordPress7 убийц производительности WordPress
7 убийц производительности WordPress
Konstantin Kovshenin
 
Оптимизация производительности Python
Оптимизация производительности PythonОптимизация производительности Python
Оптимизация производительности Python
PyNSK
 
Web весна 2013 лекция 9
Web весна 2013 лекция 9Web весна 2013 лекция 9
Web весна 2013 лекция 9Technopark
 
Funny JS #2
Funny JS #2Funny JS #2
Funny JS #2
Alexander Konovalov
 
Javascript 1
Javascript 1Javascript 1
Javascript 1
Andrey Dolinin
 
Ruby - или зачем мне еще один язык программирования?
Ruby - или зачем мне еще один язык программирования?Ruby - или зачем мне еще один язык программирования?
Ruby - или зачем мне еще один язык программирования?
Pavel Tsukanov
 
"Рекомендации по проектированию API" — Марина Степанова, Яндекс
"Рекомендации по проектированию API" — Марина Степанова, Яндекс"Рекомендации по проектированию API" — Марина Степанова, Яндекс
"Рекомендации по проектированию API" — Марина Степанова, Яндекс
Yandex
 
Decorators' recipes
Decorators' recipesDecorators' recipes
Decorators' recipes
Yury Yurevich
 
Сергей Константинов — Что интересного готовит нам W3C
Сергей Константинов — Что интересного готовит нам W3CСергей Константинов — Что интересного готовит нам W3C
Сергей Константинов — Что интересного готовит нам W3C
Yandex
 
Почему Mojolicious?
Почему Mojolicious?Почему Mojolicious?
Почему Mojolicious?
Anatoly Sharifulin
 
Декораторы в Python и их практическое использование
Декораторы в Python и их практическое использование Декораторы в Python и их практическое использование
Декораторы в Python и их практическое использование
Sergey Schetinin
 
Не бойся, это всего лишь данные... просто их много
Не бойся, это всего лишь данные... просто их многоНе бойся, это всего лишь данные... просто их много
Не бойся, это всего лишь данные... просто их много
Roman Dvornov
 
Производительность в Django
Производительность в DjangoПроизводительность в Django
Производительность в Django
MoscowDjango
 
sphinx Hlpp2008
sphinx Hlpp2008sphinx Hlpp2008
sphinx Hlpp2008Ontico
 
12 - Web-технологии. Django модели
12 - Web-технологии. Django модели12 - Web-технологии. Django модели
12 - Web-технологии. Django модели
Roman Brovko
 

What's hot (20)

Web осень 2013 лекция 2
Web осень 2013 лекция 2Web осень 2013 лекция 2
Web осень 2013 лекция 2
 
Authentication security
Authentication securityAuthentication security
Authentication security
 
Курсы по мобильной разработке. 1 лекция. Знакомство с iOS
Курсы по мобильной разработке. 1 лекция. Знакомство с iOSКурсы по мобильной разработке. 1 лекция. Знакомство с iOS
Курсы по мобильной разработке. 1 лекция. Знакомство с iOS
 
Эффективный AJAX
Эффективный AJAXЭффективный AJAX
Эффективный AJAX
 
7 убийц производительности WordPress
7 убийц производительности WordPress7 убийц производительности WordPress
7 убийц производительности WordPress
 
Оптимизация производительности Python
Оптимизация производительности PythonОптимизация производительности Python
Оптимизация производительности Python
 
Web весна 2013 лекция 9
Web весна 2013 лекция 9Web весна 2013 лекция 9
Web весна 2013 лекция 9
 
Funny JS #2
Funny JS #2Funny JS #2
Funny JS #2
 
Javascript 1
Javascript 1Javascript 1
Javascript 1
 
Ruby - или зачем мне еще один язык программирования?
Ruby - или зачем мне еще один язык программирования?Ruby - или зачем мне еще один язык программирования?
Ruby - или зачем мне еще один язык программирования?
 
"Рекомендации по проектированию API" — Марина Степанова, Яндекс
"Рекомендации по проектированию API" — Марина Степанова, Яндекс"Рекомендации по проектированию API" — Марина Степанова, Яндекс
"Рекомендации по проектированию API" — Марина Степанова, Яндекс
 
Kranonit s16 (python). dmitry furzenko
Kranonit s16 (python). dmitry furzenkoKranonit s16 (python). dmitry furzenko
Kranonit s16 (python). dmitry furzenko
 
Decorators' recipes
Decorators' recipesDecorators' recipes
Decorators' recipes
 
Сергей Константинов — Что интересного готовит нам W3C
Сергей Константинов — Что интересного готовит нам W3CСергей Константинов — Что интересного готовит нам W3C
Сергей Константинов — Что интересного готовит нам W3C
 
Почему Mojolicious?
Почему Mojolicious?Почему Mojolicious?
Почему Mojolicious?
 
Декораторы в Python и их практическое использование
Декораторы в Python и их практическое использование Декораторы в Python и их практическое использование
Декораторы в Python и их практическое использование
 
Не бойся, это всего лишь данные... просто их много
Не бойся, это всего лишь данные... просто их многоНе бойся, это всего лишь данные... просто их много
Не бойся, это всего лишь данные... просто их много
 
Производительность в Django
Производительность в DjangoПроизводительность в Django
Производительность в Django
 
sphinx Hlpp2008
sphinx Hlpp2008sphinx Hlpp2008
sphinx Hlpp2008
 
12 - Web-технологии. Django модели
12 - Web-технологии. Django модели12 - Web-технологии. Django модели
12 - Web-технологии. Django модели
 

Viewers also liked

Nth Power Point Ghg Regulation 2009
Nth Power Point Ghg Regulation 2009Nth Power Point Ghg Regulation 2009
Nth Power Point Ghg Regulation 2009
PNortz
 
Allochtone Leerlingen In Het Voortgezet Onderwijs
Allochtone Leerlingen In Het Voortgezet OnderwijsAllochtone Leerlingen In Het Voortgezet Onderwijs
Allochtone Leerlingen In Het Voortgezet Onderwijsguestd41aec
 
GPK
GPKGPK
La Pintura Flamenca
La Pintura FlamencaLa Pintura Flamenca
La Pintura Flamenca
nuriasoldra
 
Geometry In The Real World
Geometry In The Real WorldGeometry In The Real World
Geometry In The Real World
Daxdim Xemphamir
 
Coqui Visited Us!
Coqui Visited Us!Coqui Visited Us!
Coqui Visited Us!
coqui1810
 
Webquest
WebquestWebquest
La Pintura Flamenca
La Pintura FlamencaLa Pintura Flamenca
La Pintura Flamenca
nuriasoldra
 
Kenny Fine Concert
Kenny Fine ConcertKenny Fine Concert
Kenny Fine Concert
kristievento
 
Linear Park Meganhenry Sykes Block1
Linear Park Meganhenry Sykes Block1Linear Park Meganhenry Sykes Block1
Linear Park Meganhenry Sykes Block1
meganhenry3
 
Gpk
GpkGpk
Trabajo De Ingles Mariana 2
Trabajo De Ingles Mariana 2Trabajo De Ingles Mariana 2
Trabajo De Ingles Mariana 2
laija
 
Numero de oxidacion 2012
Numero de oxidacion 2012Numero de oxidacion 2012
Numero de oxidacion 2012
perage1959
 
Realization Of Energy Harvesting Wireless Sensor Network (Eh Wsn) With Spec...
Realization Of Energy Harvesting Wireless Sensor Network (Eh Wsn)   With Spec...Realization Of Energy Harvesting Wireless Sensor Network (Eh Wsn)   With Spec...
Realization Of Energy Harvesting Wireless Sensor Network (Eh Wsn) With Spec...
Yen Kheng Tan (PhD, SrMIEEE)
 
TABLA PERIÓDICA
TABLA PERIÓDICA TABLA PERIÓDICA
TABLA PERIÓDICA
perage1959
 

Viewers also liked (15)

Nth Power Point Ghg Regulation 2009
Nth Power Point Ghg Regulation 2009Nth Power Point Ghg Regulation 2009
Nth Power Point Ghg Regulation 2009
 
Allochtone Leerlingen In Het Voortgezet Onderwijs
Allochtone Leerlingen In Het Voortgezet OnderwijsAllochtone Leerlingen In Het Voortgezet Onderwijs
Allochtone Leerlingen In Het Voortgezet Onderwijs
 
GPK
GPKGPK
GPK
 
La Pintura Flamenca
La Pintura FlamencaLa Pintura Flamenca
La Pintura Flamenca
 
Geometry In The Real World
Geometry In The Real WorldGeometry In The Real World
Geometry In The Real World
 
Coqui Visited Us!
Coqui Visited Us!Coqui Visited Us!
Coqui Visited Us!
 
Webquest
WebquestWebquest
Webquest
 
La Pintura Flamenca
La Pintura FlamencaLa Pintura Flamenca
La Pintura Flamenca
 
Kenny Fine Concert
Kenny Fine ConcertKenny Fine Concert
Kenny Fine Concert
 
Linear Park Meganhenry Sykes Block1
Linear Park Meganhenry Sykes Block1Linear Park Meganhenry Sykes Block1
Linear Park Meganhenry Sykes Block1
 
Gpk
GpkGpk
Gpk
 
Trabajo De Ingles Mariana 2
Trabajo De Ingles Mariana 2Trabajo De Ingles Mariana 2
Trabajo De Ingles Mariana 2
 
Numero de oxidacion 2012
Numero de oxidacion 2012Numero de oxidacion 2012
Numero de oxidacion 2012
 
Realization Of Energy Harvesting Wireless Sensor Network (Eh Wsn) With Spec...
Realization Of Energy Harvesting Wireless Sensor Network (Eh Wsn)   With Spec...Realization Of Energy Harvesting Wireless Sensor Network (Eh Wsn)   With Spec...
Realization Of Energy Harvesting Wireless Sensor Network (Eh Wsn) With Spec...
 
TABLA PERIÓDICA
TABLA PERIÓDICA TABLA PERIÓDICA
TABLA PERIÓDICA
 

Similar to Систематизация экспрешнов в IE

DUMP-2012 - Только хардкор! - "Расширяем PHP" Сергей Горшков (index.art)
DUMP-2012 - Только хардкор! - "Расширяем PHP" Сергей Горшков (index.art) DUMP-2012 - Только хардкор! - "Расширяем PHP" Сергей Горшков (index.art)
DUMP-2012 - Только хардкор! - "Расширяем PHP" Сергей Горшков (index.art) it-people
 
Фундаментальные основы разработки под iOS. Павел Тайкало
Фундаментальные основы разработки под iOS. Павел ТайкалоФундаментальные основы разработки под iOS. Павел Тайкало
Фундаментальные основы разработки под iOS. Павел ТайкалоStanfy
 
Javascript
JavascriptJavascript
Javascript
Vasya Petrov
 
PowerShell
PowerShellPowerShell
PowerShell
GetDev.NET
 
Зачем нужна Scala?
Зачем нужна Scala?Зачем нужна Scala?
Зачем нужна Scala?
Vasil Remeniuk
 
Парсим CSS
Парсим CSSПарсим CSS
Парсим CSS
Roman Dvornov
 
Типичный стек технологий для использования с Node.js
Типичный стек технологий для использования с Node.jsТипичный стек технологий для использования с Node.js
Типичный стек технологий для использования с Node.jsSerge Shirokov
 
TARS: Сделай уровень frontend-рутины 0% — Артём Малко, 2ГИС
TARS: Сделай уровень frontend-рутины 0% — Артём Малко, 2ГИСTARS: Сделай уровень frontend-рутины 0% — Артём Малко, 2ГИС
TARS: Сделай уровень frontend-рутины 0% — Артём Малко, 2ГИС2ГИС Технологии
 
Технологии анализа бинарного кода приложений: требования, проблемы, инструменты
Технологии анализа бинарного кода приложений: требования, проблемы, инструментыТехнологии анализа бинарного кода приложений: требования, проблемы, инструменты
Технологии анализа бинарного кода приложений: требования, проблемы, инструменты
Positive Development User Group
 
QA Fest 2015. Иван Пашко. XPath yourself. Tips & Tricks
QA Fest 2015. Иван Пашко. XPath yourself. Tips & TricksQA Fest 2015. Иван Пашко. XPath yourself. Tips & Tricks
QA Fest 2015. Иван Пашко. XPath yourself. Tips & Tricks
QAFest
 
Scala and LiftWeb presentation (Russian)
Scala and LiftWeb presentation (Russian)Scala and LiftWeb presentation (Russian)
Scala and LiftWeb presentation (Russian)Dmitry Stropalov
 
Clojure #2 (2014)
Clojure #2 (2014)Clojure #2 (2014)
Clojure #2 (2014)
Alexander Podkhalyuzin
 
Adymo Barcamp Presentation Faster Higher Sql
Adymo Barcamp Presentation Faster Higher SqlAdymo Barcamp Presentation Faster Higher Sql
Adymo Barcamp Presentation Faster Higher SqlOleksandr Petrov
 
Alexander Dymo - Barcamp 2009 - Faster Higher Sql
Alexander Dymo - Barcamp 2009 - Faster Higher SqlAlexander Dymo - Barcamp 2009 - Faster Higher Sql
Alexander Dymo - Barcamp 2009 - Faster Higher SqlAlexander Dymo
 
Что нового в Visual Studio 2010 и .Net 4.0
Что нового в Visual Studio 2010 и .Net 4.0Что нового в Visual Studio 2010 и .Net 4.0
Что нового в Visual Studio 2010 и .Net 4.0
akrakovetsky
 
Haskell
HaskellHaskell
Haskell
DevDay
 
Haskell Lite - presentation for DevDay about Haskell language
Haskell Lite - presentation for DevDay about Haskell languageHaskell Lite - presentation for DevDay about Haskell language
Haskell Lite - presentation for DevDay about Haskell language
Alexander Granin
 
презентация 4. введение в css
презентация 4. введение в cssпрезентация 4. введение в css
презентация 4. введение в css
Rusov1
 
Denys Samoylenko ''JS learning lifehacks: common programmer's mistake''
Denys Samoylenko ''JS learning lifehacks: common programmer's mistake''Denys Samoylenko ''JS learning lifehacks: common programmer's mistake''
Denys Samoylenko ''JS learning lifehacks: common programmer's mistake''
OdessaJS Conf
 

Similar to Систематизация экспрешнов в IE (20)

DUMP-2012 - Только хардкор! - "Расширяем PHP" Сергей Горшков (index.art)
DUMP-2012 - Только хардкор! - "Расширяем PHP" Сергей Горшков (index.art) DUMP-2012 - Только хардкор! - "Расширяем PHP" Сергей Горшков (index.art)
DUMP-2012 - Только хардкор! - "Расширяем PHP" Сергей Горшков (index.art)
 
Js fuckworks
Js fuckworksJs fuckworks
Js fuckworks
 
Фундаментальные основы разработки под iOS. Павел Тайкало
Фундаментальные основы разработки под iOS. Павел ТайкалоФундаментальные основы разработки под iOS. Павел Тайкало
Фундаментальные основы разработки под iOS. Павел Тайкало
 
Javascript
JavascriptJavascript
Javascript
 
PowerShell
PowerShellPowerShell
PowerShell
 
Зачем нужна Scala?
Зачем нужна Scala?Зачем нужна Scala?
Зачем нужна Scala?
 
Парсим CSS
Парсим CSSПарсим CSS
Парсим CSS
 
Типичный стек технологий для использования с Node.js
Типичный стек технологий для использования с Node.jsТипичный стек технологий для использования с Node.js
Типичный стек технологий для использования с Node.js
 
TARS: Сделай уровень frontend-рутины 0% — Артём Малко, 2ГИС
TARS: Сделай уровень frontend-рутины 0% — Артём Малко, 2ГИСTARS: Сделай уровень frontend-рутины 0% — Артём Малко, 2ГИС
TARS: Сделай уровень frontend-рутины 0% — Артём Малко, 2ГИС
 
Технологии анализа бинарного кода приложений: требования, проблемы, инструменты
Технологии анализа бинарного кода приложений: требования, проблемы, инструментыТехнологии анализа бинарного кода приложений: требования, проблемы, инструменты
Технологии анализа бинарного кода приложений: требования, проблемы, инструменты
 
QA Fest 2015. Иван Пашко. XPath yourself. Tips & Tricks
QA Fest 2015. Иван Пашко. XPath yourself. Tips & TricksQA Fest 2015. Иван Пашко. XPath yourself. Tips & Tricks
QA Fest 2015. Иван Пашко. XPath yourself. Tips & Tricks
 
Scala and LiftWeb presentation (Russian)
Scala and LiftWeb presentation (Russian)Scala and LiftWeb presentation (Russian)
Scala and LiftWeb presentation (Russian)
 
Clojure #2 (2014)
Clojure #2 (2014)Clojure #2 (2014)
Clojure #2 (2014)
 
Adymo Barcamp Presentation Faster Higher Sql
Adymo Barcamp Presentation Faster Higher SqlAdymo Barcamp Presentation Faster Higher Sql
Adymo Barcamp Presentation Faster Higher Sql
 
Alexander Dymo - Barcamp 2009 - Faster Higher Sql
Alexander Dymo - Barcamp 2009 - Faster Higher SqlAlexander Dymo - Barcamp 2009 - Faster Higher Sql
Alexander Dymo - Barcamp 2009 - Faster Higher Sql
 
Что нового в Visual Studio 2010 и .Net 4.0
Что нового в Visual Studio 2010 и .Net 4.0Что нового в Visual Studio 2010 и .Net 4.0
Что нового в Visual Studio 2010 и .Net 4.0
 
Haskell
HaskellHaskell
Haskell
 
Haskell Lite - presentation for DevDay about Haskell language
Haskell Lite - presentation for DevDay about Haskell languageHaskell Lite - presentation for DevDay about Haskell language
Haskell Lite - presentation for DevDay about Haskell language
 
презентация 4. введение в css
презентация 4. введение в cssпрезентация 4. введение в css
презентация 4. введение в css
 
Denys Samoylenko ''JS learning lifehacks: common programmer's mistake''
Denys Samoylenko ''JS learning lifehacks: common programmer's mistake''Denys Samoylenko ''JS learning lifehacks: common programmer's mistake''
Denys Samoylenko ''JS learning lifehacks: common programmer's mistake''
 

Систематизация экспрешнов в IE

  • 2. Экспрешны — Насколько они нужны? А нужно ли вообще что-то править под IE? — За что разработчики не любят экспрешны (не умеют готовить?) — Объективные недостатки имеющихся подходов к экспрешнам.
  • 3. Важно! Экспрешны — не универсальное решение всех проблем, но при правильном применении способны существенно сократить время разработки. Предлагаемая система не является универсальным комбайном а ля печально известная библиотека IE7, это набор точных инструментов, при применении которых необходимо думать.
  • 4. Правильный рецепт приготовления экспрешнов — Перезаписываемые («одноразовые») экспрешны. — Постоянно выполняющиеся экспрешны с условиями («кешируемые») А кроме того: — Автоматическое получение эмулируемых свойств. — Отделение экспрешнов от таблиц стилей во внешний .js файл. — Гибкость вариантов применения экспрешнов.
  • 5. Одноразовые и кешируемые экспрешны Про самые основы уже есть достаточно материалов: — «Тонкий CSS для Internet Explorer», Павел Корнилов (ClientSide 2007) (примерно 40-й слайд) — «CSS Framework своими руками. Практика» , Виталий Харисов (Я.Субботник в январе 2009) Вкратце: — Всё что можно выполнить только один раз раз — нужно выполнить только один раз. — А для всего остального, перед вычислением всех значений, узнавать нужно ли это делать.
  • 6. Автоматическое получение эмулируемых свойств Почти всё, что нам нужно, мы можем получить из свойства currentStyle. Например: — parseInt(t.currentStyle['max-width'], 10); — t.currentStyle.opacity * 100; — t.currentStyle['content']; // хотя тут ещё надо парсить… Таким образом, любые правки в проекте мы будем вносить только в оригинальные таблицы стилей, забыв про хаки IE.
  • 7. Отделение экспрешнов от таблиц стилей во внешний .js файл 1. Разделение поведения (behavior!) и представления. 2. Повторное использование кода. 3. Отсутствие проблем с подсветкой кода в редакторах. 4. Предотвращение ошибок браузеров, связанных с неверной интерпретацией содержимого экспрешнов (привет, Safari!) 5. Ну и все прелести яваскрипта *доступные IE.
  • 8. Отделение экспрешнов от таблиц стилей во внешний .js файл ie.js var IExpr = { fix: function(t) {…}, target: function(t) {…}, hover: function(t) {…}, … } ie.css .example1 { zzz:expression(IExpr.positioning(this)); } .example2 { behavior:expression(IExpr.fix(this,'hover')); }
  • 9. Гибкость вариантов применения экспрешнов — Чаще всего все исправления применяются к одному свойству. — Самый простой способ для одноразовых экспрешнов: zoom:expression(IExpr.iframeShim(this),this.runtimeStyle.zoom=1); — И для постоянно выполняющихся: zzz:expression(IExpr.positioning(this)); Ну и, кроме того, удобно применить сразу много исправлений в одном экспрешне: .example { behavior:expression(IExpr.fix(this,'before','after','target')); }
  • 10. Различные варианты применения эскпрешнов Вариант со вспомогательной функцией fix уменьшает количество кода в CSS, кроме того он позволяет «отключать» постоянно выполняющиеся функции. Однако, в случае, когда необходимо применять к одному элементу несколько экспрешнов по разным селекторам, этот вариант не подходит, т.к. нельзя дополнять свойство behavior, можно только переопределять его. На самом деле, я сейчас тестирую одну штуку, которая позволит добавлять любые экспрешны из любого селектора без конфликтов, но пока про неё ничего не скажу ;)
  • 12. max-width maxWidthPx: function(t) { if (t.parentNode.scrollWidth != t.w) { t.w = t.parentNode.scrollWidth; var max = parseInt(t.currentStyle["max-width"], 10); t.style.width = 'auto'; if (t.scrollWidth > max) { t.style.width = max; } } return 1; },
  • 13. :hover hover: function(t) { var hoverClass = t.className ? t.className.replace(/([^s]+)/g,'$1_hover') : 'hover'; t.attachEvent('onmouseover',function() { t.className += (' ' + hoverClass); }); t.attachEvent('onmouseout',function() { t.className = t.className.replace(new RegExp(' ' + hoverClass,'g'), ''); }); },
  • 14. :before before: function(t) { t.insertAdjacentHTML('afterBegin','<span class="' + (t.className ? t.className.replace(/([^s]+)/g,'$1_before') : 'before') + '" style="behavior:expression(IExpr.fix(this,'renderContent'))"></span>'); }, renderContent: function(t) { var content = t.currentStyle['content']; if (content && content.length > 2) { if (content == 'none' || content == 'normal') { t.removeNode(true); } else { t.insertAdjacentText('afterBegin', content.slice(1,-1)); } } },