Архив за Февраль 2009

  • Смотрим в браузер клиента

    Нереально крутой сервис: http://www.wizhelp.com.

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

    Все что нужно — поддержка Java. Протестировал на маке и винде, все работает замечательно.

  • rocon — подробности

    Рассмотрим, как работает библиотека rocon.

    rocon дожидается загрузки DOM-дерева документа и ищет все элементы с классом rcN, где N — радиус скругления, и добавляет им скругленные уголки.

    Safari

    Создается новая новая таблица стилей в документе, в которой классам rcN указываются CSS-свойства -webkit-border-radius и -khtml-border-radius.

    Firefox

    По аналогии с Safari указывается CSS-свойство -moz-border-radius.

    Opera

    Через <canvas> рисуется звездочка, которая затем преобразуется в data: URL картинку. Затем для каждого уголка создается по отдельному элементу и каждому указывается эта картинка в качестве фона. Все CSS-свойства указываются в таблице стилей, а не в самих элементах (это значит, что их можно легко перекрывать).

    Internet Explorer

    Такой же способ, как и у Opera, только используется VML. Соответственно, уголок вставляется как элемент, а не как фоновая картинка.

    С первыми двумя случаями все довольно просто: используем внутренние возможности браузера для рисования скругленных уголков. Для двух последних все намного сложнее. После инициализации основному блоку указывается класс rocon-init — это значит, что элемент был инициализирован. Также добавляется класс rocon__N, где N — некий порядковый номер, характеризующий набор уникальных свойств блока: радиус скругления, цвет фона, толщина бордюра и так далее. Соответственно, если попадаются элементы с одинаковым набором этих характеристик, новые уголки не рисуются, а достаются из кэша. Для каждого создаваемого элемента с уголком присваиваются классы rocon-tl, rocon-tr, rocon-bl, rocon-br, что означает, соответственно, левый верхний, правый верхний, левый нижний и правый нижний. Все стили записываются в новую таблицу стилей, а не в сам элемент. Тем самым вы можете менять некоторые свойства уголка через CSS, что будет особенно полезно в IE6. Дело в том, что в этом браузере неправильно работают CSS-свойства right и bottom. И если первое свойство я смог эмулировать с помощью margin-left: 100%, то со вторым проблема: я пока не знаю, как это можно исправить. Поэтому вам придется указывать вручную его позицию. Так как уголок добавляется в самый конец блока, вы можете воспользоваться тем, что его сместит контент блока в самый низ и подкорректировать его позицию с помощью свойства margin-top (на забудьте поставить bottom: auto).

    Можно в любой момент добавить любому блоку скругление или поменять его свойства (радиус, цвет фона и так далее). Чтобы изменения вступили в силу, нужно вызвать метод rocon.update(elem), где elem — указатель на элемент, который нужно обновить.

    Все пожелания и комментарии просьба указывать в багтрекере.

    Метки: , ,
  • rocon — экспериментальная библиотека для создания скругленных уголков

    Устав каждый раз создавать новые картинки для блоков с разным радиусом скругления и цветом фона, решил создать библиотеку, которая сама будет рисовать необходимые картинки и размещать их на странице.

    Библиотека называется rocon. Работает она довольно просто: подключаете файл rounded-corners.js на страницу и нужным блокам указываете класс rcN, где N — радиус скругления:

    <script type="text/javascript" src="rounded-corners.js"></script>
    <div class="rc10" style="background: red; padding: 5px;">Rounded block</div>
    

    Получим блок с радиусом скругления в 10 пикселей.

    Метод создания скруглений основан на моей лекции в Техногрете. Так же, как и в лекции, можно создавать скругления двух типов: формы и контр-формы. По умолчанию создается контр-форма, для создания формы нужно указать класс rc-shape:

    <script type="text/javascript" src="rounded-corners.js"></script>
    <div class="rc10 rc-shape" style="background: red; padding: 5px;">Rounded block</div>
    

    Вот основные достоинства библиотеки:

    • Работает во всех современных браузерах: IE6+, Safari 3+, Firefox 2+, Opera 9.25+.
    • Позволяет без проблем с производительностью создавать десятки скругленных блоков на странице (в моих тестах 100 блоков создавалось около 1 секунды).
    • Можно динамически менять цвет фона блока и радиус скругления с помощью метода rocon.update(elem).
    • Уголками можно управлять через CSS.
    • В IE6 этот способ будет работать намного быстрее, чем использование полупрозрачных PNG через AlphaImageLoader.

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

    Скачать с Google.Code

  • Opacity и AlphaImageLoader в IE

    Как известно, для отображения полупрозрачных PNG в IE6 нужно использовать CSS-фильтр AlphaImageLoader. Однако при использовании нескольких фильтров на одном элементе (например, Opacity и AlphaImageLoader) начинаются неприятности: у картинки появляются мерзкие артефакты:

    ie

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

    Посмотреть пример

    Метки: , ,
  • Загрузка картинок по требованию

    К своему стыду я был постоянно уверен, что если картинке указать
    display: none, то она не загрузится. На одном из последних проектов убедился, что это совсем не так: почти во всех браузерах картинка загрузится.

    Перепробовав кучу комбинаций HTML и CSS, остановился на таком решении:

    <div style="display: none">
    	<img src="empty.png" style="background-image: url(image1.jpg);" width="100" height="100" />
    	<img src="empty.png" style="background-image: url(image2.jpg);" width="100" height="100" />
    	<img src="empty.png" style="background-image: url(image3.jpg);" width="100" height="100" />
    </div>
    

    display: none нужно указывать именно у родителя, а не у самих картинок. Чтобы картинка в скрытом блоке не загружалось, нужно вынести ее из атрибута src. В данном случае я вынес ее стиль: при отключенном джаваскрипте пользователь сможет увидеть картинку (если вы об этом заранее позаботитесь).

    Другие комбинации давали разный результат в разных браузерах: кто-то загружал, кто-то не загружал.

    Метки: ,
  • Производительность браузеров в зависимости от верстки

    Один из моих докладов для конференции Clienttech 2008 (второй был про ictinus).

    У меня наконец-то дошли руки до описания известных мне проблем с производительностью в браузерах в зависимости от того, как сверстаешь страницу. Результаты тестов говорят сами за себя: Opera ни разу не «самый быстрый браузер на планете» (в моем рейтинге качества браузеров последние версии Оперы находятся примерно между IE7 и IE6), а восторженные вопли о быстрых JavaScript-движках я воспринимаю как говеный пиар. На кой черт мне сдались ваши ускоренные работы со строками и массивами, когда банальное изменение размеров картинки, даже не динамическое, вызывает жуткие тормоза? Почему разработчики браузеров не оптимизируют то, что действительно требует оптимизации? Спросите сами себя, для чего вы чаще используете JavaScript на сайтах: для работы со встроенными JavaScript-объектами или для работы c DOM? Ведь именно работа с DOM — самое узкое место современных браузеров.

    В этом свете мне наиболее близка позиция Майкрософта. Где-то, не помню где, они написали что-то вроде: «Оптимизировать работу чистого JavaScript будет только безумец».

  • Эмуляция position: fixed

    Способ эмуляции CSS-свойства position: fixed в IE6.

    На проверку этот способ оказался довольно глючным с точки зрения удобства пользования сайтом:

    1. при навигации вперед/назад по истории браузера страница не докручивается в то положение, откуда перешли на следующую страницу;
    2. страница не прокручивается при нажатии на пробел;
    3. на айфоне прокрутка не работает в принципе.
    Метки: ,
  • Eclipse: редактирование JavaScript в Spket IDE

    Демонстрация возможностей редактирования JavaScript в плагине Spket IDE.

    Метки: ,
  • Способ борьбы с «прыгающими» блоками в IE

    Володя Токмаков уже два раза освещал способы борьбы с этой напастью (способ 1, способ 2), я добавил третий.

    Вкратце, в чем заключается проблема: IE округляет дробные пиксельные значения, полученные из процентов, до наибольшего целого. То есть если у вас будет блок шириной в 101 пиксель, а внутри него будет два блока шириной в 50%, то ширина каждого блока будет 51 пиксель (101 / 2 = 50,5; округляем до наибольшего целого и получаем 51). Что естественно, в сумме больше, чем 101. В итоге последний блок переносится. Этот способ демонстрирует, как этого можно избежать.

    Особый кайф от статей в техногрете в том, что его читает много людей, а некоторые даже делятся своими решениями. В частности, Сергей Комаров прислал вот такое замечательное решение:

    <style type="text/css">
    	ul, ul li {
    		list-style-type: none;
    		margin: 0;
    		padding: 0;
    	}
    
    	ul {
    		width: 100%;
    		overflow:hidden;
    	}
    
    	ul li {
    		float: left;
    		clear: right;
    		width: 50%;
    
    		background:red;
    	}
    </style>
    <ul>
    	<li>item 1</li>
    	<li>item 2</li>
    </ul>
    

    Вратце, в чём суть: в данном случае есть три обязательных компонента — width: 100%, overflow: hidden и, самый важный, clear: right (я его поставил сейчас для всех элементов списка, но, если у них будут разные классы, то можно приписать это свойство только для последнего).

    Несмотря на небольшой недостаток (немного отрезается правый край у последнего <li>-элемента), способ очень и очень хороший. Спасибо всем остальным читателям, которые прислали такое же решение, но чуть позже.

    Метки: ,
  • Eclipse: знакомство, плагины

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

    Метки:

← cтарое