×

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

Константин Осым


Исправляем поведение ссылки в IE

13.01.2011

Этот топик посвящен одному неприятному багу в IE.

Представим себе, что содержимое ссылки нужно обрамить ещё одним тегом, например, span’ом в качестве дополнительной обертки для сложного фона или в моём случае:

Это фрагмент почтовой страницы списка писем. Каждая строка — ссылка, а тема и отправитель — span’ы.

Если внутренний span имеет свойство hasLayout (присвоено значение width, height, float: left/right, position: absolute, zoom и т.д.), то в IE любой версии ссылка теряет своё поведение.

Это выражается в следующем:

  1. При наведении на область, объятую внутренним тегом (далее область X), курсор не меняется;
  2. Контекстное меню, вызываемое при правом клике на область Х, не соответствует меню, характерному для правого клика по ссылке (см. рис).

На рисунке слева видно стандартное поведение ссылки, а справа поведение, которое нужно исправить.

Первое легко исправляется при помощи свойства cursor: pointer. А для второго пришлось немного покопаться. Очевидно, что в случае hasLayout для IE самый верхний по z-index’у элемент определяет поведение ссылки-родителя. Решено было попробовать «утопить» этот элемент с помощью z-index: -1. Как ни странно, это сработало. И к тому же решилась первая проблема.

a{display: block; zoom: 1}
a span{display: block; position: relative; z-index: -1}

Однако, из-за отрицательного z-index’а выделить текст ссылки становится непростым занятием, кроме того, если у span’а есть title, то он не появится. В случае одного span’а title можно повесить на саму ссылку, но в моём случае title был у обоих вложенных тегов. С этим пришлось повозиться. Но это уже совсем другая история :)

Оформление книжного оглавления

05.06.2010

В сегодняшней заметке я затрону вопрос верстки текста в виде книжного оформления. Пример на изображении:

Основные моменты, которые хотелось бы учесть:

  • Верстка резиновая;
  • количество контента слева неограниченно;
  • при сжатии окна, контент переносится на новую строку, точки и контент справа выравниваются по нижней строке. При этом точки начинаются от последней буквы последнего слова слева и доходят до первой буквы первого слова справа;
  • фон блока не обязательно однороден.

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

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

Для устойчивого поведения блока и решения проблемы вертикального выравнивания я использовал двухъячеечную таблицу.

Теперь мне нужен был элемент, который можно поставить на последнюю строку вслед за последним словом и растянуть на всю ширину блока до правой колонки. Для этого идеально подходил абсолютно спозиционированный инлайновый элемент. Если ему явно не указать позицию (left, right, top, bottom), то он выстроится по потоку. Ширине элемента я задал очень большое значение. При выходе за пределы левой колонки он обрезался с помощью родительского overflow: hidden.

Да, после этих манипуляций возникла проблема в опере. Появился очень большой горизонтальный скроллинг. Поэтому я решил абсолютно спозиционированный блок положить в инлайн-блочный элемент шириной 1 пиксель. Еще одна проблема была в ie. Он не хотел обрезать очень длинный блок по границе левой колонки. Но это решилось простым заданием hasLayout родителю, например, при помощи zoom: 1.

И вуаля :)

Поворачиваем изображения

17.02.2010

Сегодняшняя заметка посвящена изучению поворота картинок средствами клиента (браузера). Как, наверное, все уже знают в CSS3 есть прекрасное свойство transform: rotate(), которое поворачивает объект на заданный угол. Однако, оно работает в топовых браузерах. Я попробовал найти кроссбраузерное решение. Итак, вот что у меня получилось :)

Представим, что имеется набор картинок, которые небрежно раскиданы на столе. Чтобы лучше представлялось, привожу скриншот :)

Необходимо было сделать так, чтобы у клиента была возможность менять изображения через CMS. Я сразу почувстовал огромный интерес к этой задаче и засучил рукава :) .

Чтобы обеспечить кроссбраузерность решения, мой взгляд устремился в сторону SVG и VML для IE. Для вставки SVG в документ я использовал тег object:

<object type="image/svg+xml" data="image.svg" width="" height=""></object>

Изображение в svg файле вставляется с помощью конструкции:

<image width="" height="" xlink:href="image.jpg"><title></title></image>

А для поворота картинки на n градусов добавим атрибут transform:

<image width="" height="" xlink:href="image.jpg" transform="rotate(n, x, y)"><title></title></image>

Где x, y – координаты точки, относительно которой нужно вращать.

В моем случае была еще рамка вокруг изображения. Для её появления пришлось в svg файле добавить под картинку подложку, повернутую на тот же градус.

Мой хороший друг Евгений помог мне в написании php-скрипта, который в зависимости от передаваемых параметров (путь к картинке, угол поворота и координаты точки поворота) возвращал повернутое svg изображение.

Замечу, что в простых случаях svg файл можно вставить прямо в атрибут data тега object:

<object type='image/svg+xml'
data='data:image/svg+xml; charset=utf-8, <svg width="100%" height="100%"
version="1.1" xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"><image width="" height=""
xlink:href="image.jpg"  transform="rotate(n, x, y)"><title>
</title></image></svg>'
width='' height=''></object>

После этого осталось только с помощью позиционирования разложить картинки в нужном порядке.

Для IE пришлось поковыряться :) . Первый способ, который я применил, это VML.

<style>v\: * { behavior: url(#default#VML);display:inline-block }</style>
<xml:namespace ns="urn:schemas-microsoft-com:vml" prefix="v"/>
<v:image src="image.jpg" style="rotation: n"/>

Здесь, как видно, все гораздо проще. В стилях объявляем правила отображения элементов с префиксом v, а ниже определяем пространство имен для этих элементов. Потом вставляем изображение и поворачиваем его на n градусов.

Однако, края некоторых картинок после поворота оказались зазубрены… Я стал искать возможность это исправить. Искал в спецификации VML какие-нибудь магические атрибуты для сглаживания, вспомнил про режимы рендеринга изображений и прочее, но ничего не получалось. К счастью, по наводке Сергея Чикуёнка я вспомнил про матричные фильтры, с помощью которых можно ресайзить, переворачивать и вращать объекты. После применения этого фильтра, края картинок оказались хорошо сглаженными. От VML в данном случае я отказался.

Ну вот и все. Я так тоже в этот момент подумал :) Но, после просмотра моего творения в Safari, у меня отвалились челюсти :) Картинки, конечно, повернулись, но под ними лежал прямоугольный фон белого цвета… После недолгих разбирательств я понял, что такую заливку дает тег object, и нет возможности его убрать с помощью CSS. Пришлось делать третью ветку в моем коде для обхода бага Safari. Для него картинки я отдавал в чистом виде, а поворачивал их с помощью CSS.

Кастомизированные полосы прокрутки

05.02.2010

Вообще, я строго против кастомизации скроллбаров. Хотя бы потому, что мне до сих пор не встречалось сколь-нибудь адекватной реализации полос прокрутки… Однако, в присылаемых мне макетах все чаще стали попадаться разрисованные скроллы и стрелочки, что я всерьез задумался над этим. И решил создать решение, которое устроило меня хотя бы тем, что работает не хуже нативных полос прокрутки.

Скажу честно, что за основу был взят чужой код. Но я его доработал, чтобы он удовлетворял моим требованиям.

Вид скроллбара настраивается достаточно гибко. Для фонов можно использовать как обычные png, так и полупрозрачные.

Особенности:

  • гибкая настройка;
  • можно тянуть бегунок, а можно сделать фиксированным;
  • работает как для фиксированных по ширине, так и для «резиновых» областей;
  • работает как с помощью мышки, так и с помощью клавиатуры;
  • горизонтальным скроллбаром можно управлять с помощью мышки, как и вертикальным;
  • при отключенном javascript выполняется принцип graceful degradation.

Примеры горизонтальных и вертикальных скроллбаров:

Для использования нужно подключить файлы style.css, flexcroll.js, а также для IE6 ie.css. Полосы прокрутки автоматически кастомизируются у блоков с классом b-custom-scroll, обернутых блоком с классом b-scroll.

О переносе слов и строк

27.01.2010

Эта статья является вольным переводом. Оригинал находится по адресу http://www.cs.tut.fi/~jkorpela/html/nobr.html#prevent.

Internet Explorer переносит строки странным образом. Он считает любой дефис потенциальным местом для переноса, например строка «-a» может быть разделена на две: «-» и «a». Другие браузеры тоже не отличаются хорошим поведением, особенно Opera.

В этой статье будут рассмотрены инструменты по предотвращению нежелательного поведения браузеров в местах переноса строк.

Содержание:

Нежелательные переносы в IE

Было замечено, что в некоторых из приведенных случаев может возникнуть разрыв строки:

  • после дефиса (-);
  • после знака процента (%);
  • после знака градуса (°);
  • после следующих символов •, (, ), [, ], {, };
  • до открывающей кавычки («);
  • после закрывающей кавычки (»);
  • после восклицательного и вопросительного знака.

Таким образом, фраза «Latin-1″ может быть разделена на «Latin-» и «1″ или даже «Latin», «-» и «1″. Это очень плохо, например, из-за того, что в финском языке распространены слова с префиксом «-», обозначающим, что первая часть слова опущена. Во французском языке в закавыченной фразе (« comme ici ») важно использовать неразрывный пробел (вместо обычно) между первым словом и открывающей кавычкой и последним словом и закрывающей кавычкой.

Перенос строки после знака процента опасен в ситуациях, когда этот символ используется по особому назначению (в языках программирования или в URL-ах). К счастью, IE не переносит строки вида «%:n». Более того, IE может вставить перенос строки между косой и обратной косой чертой (/\). Но и это еще не все! В полной мере оценить странное поведение браузера можно в разных его версиях и в разных контекстах.

Избегание переносов строк

Довольно часто разрыв слова со знаком переноса приемлем и даже желателен. Страница в таких случаях выглядит лучше, особенно, если в ней встречаются длинные или составные слова, соединенные дефисом. Но проблема в том, что IE любой дефис расценивает как потенциальную точку переноса и разрывает трех- или даже двухбуквенные слова…

Есть несколько способов избежать нежелательного переноса слов. Так как они работают по-разному, то их даже можно комбинировать. Все они представлены в следующей таблице. В первых четырех строках примеры, иллюстрирующие как избежать переноса между цифрой и единицей измерения в строке «100 м», в остальных в строке «A-1″

Где применять Способ Пример Примечание
Html разметка Тег nobr <nobr>100 м</nobr> Нестандартный тег, но поддержка широкая
Html разметка Атрибут nowrap <td nowrap>100 м</td> Применяется только для ячеек таблицы, что сужает область применения
Css White-space: nowrap <span style=»white-space: nowrap»>100 м</span> Обычно срабатывает на самом глубоковложенном элементе
Символ в тексте Неразрывный пробел 100&nbsp;м Хорошо предотвращает разрыв между двумя словами, не подходит для проблем, обсуждаемых здесь
Символ в тексте Неразрывный дефис A&#8209;1 Применяется для предупреждения переноса после дефиса. Ограниченная область применения из-за проблем со шрифтами
Символ в тексте Word joiner (wj) A-&#8288;1 Широкая область применения в принципе, но очень небольшая полезность из-за ограниченной поддержки в браузерах
Символ в тексте Неразрывный пробел с нулевой шириной A-&#xfeff;1 небольшая полезность из-за несовместимости с IE

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

Nobr

Как видим, единственный верный способ – использовать нестандартный тег nobr. С момента его появления не было полного описания принципов работы этого тега. Поэтому браузеры воспринимают его так: <nobr> – отменить все переносы, начиная с этого момента, </nobr> – дальше переносы разрешены. Конечно, нужно учитывать, что лучше всего этот тег применять на небольших по длине фразах.

Нет, &nbsp; не решит наши проблемы

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

Для ячеек таблиц сработает nowrap

В особых случаях, когда информация представлена в таблице, и можно отменить переносы с трок во всей ячейке, нас выручит атрибут nowrap. Конечно, он относится к нерекомендуемым спецификацией Html 4.01, но по-прежнему валиден.

Замечу, что браузеры проигнорируют nowrap, если у ячейки выставлена фиксированная ширина, а контент не сможет уместиться в одну строку без переноса.

Может быть white-spase: nowrap?

Мы можем указать в css правило, говорящее о том, что все переносы строк (кроме переносов, созданных тегом br) запрещаются. Все современные браузеры и IE6 поддерживают это правило.

В IE есть баг: если это правило установить для ячейки таблицы, то оно может не сработать. Лечится оборачиванием содержимого ячейки дополнительным тегом (span или div) и переносом на него правила из ячейки.

Примечание. Согласно спецификации CSS 2.0 свойство white-space применялось только для блочных элементов, позволяя избегать нежелательных переносов внутри параграфов. Однако, это ограничение было снято в CSS 2.1

Unicode: word joiner (WJ)

В стандарте Unicode говорится, что есть специальный символ U+2060 (в html &#8288;), который используется для предотвращения переносов строк.Значит, чтобы строка «2003-03-24» была представлена в одну линию всегда, нужно использовать запись 2003-&#8288;03-&#8288;24, – решим мы. Однако, некоторые браузеры не распознают wj как специальный символ и просто пытаются его отобразить, но в большинстве шрифтов нет глифов для этого символа. В результате мой IE6 на месте wj символа показывает квадрат со знаком вопроса.

Даже при использовании такого редкого шрифта, как Code2000, содержащего глиф для wj символа, этот способ непригоден, потому что IE не знает специального значения нашего символа и продолжает его отображать кракозяброй.
Можно еще попробовать неразрывный пробел нулевой ширины. В тексте он имеет такое же значение как и wj символ, да и в Unicode он гораздо дольше… К счастью IE понимает, что для этого символа нет глифа и не отображает его в виде кракозябры, но на сегодняшний день ни одна версия IE не знает, что этот символ запрещает разрыв.

Проблемы с валидацией nobr

Так как тега nobr нет ни в одной спецификации html, он вызывает ошибки при попытке прохождения валидации. Но мы можем (если нам очень важна зеленая галочка валидатора) , используя nobr, пройти валидацию! Достаточно использовать модифицированный DTD (Creating your own DTD for HTML validation)

Однако, заметьте, что в таком случае w3c валидатор не подойдет для нашего документа в силу внутренних ограничений. Вместо него можно использовать WDG валидатор.

Строго говоря, при модификации DTD мы не можем заявлять о соответствии своих страниц спецификации HTML 4.01 или какой-то другой…

Особые случаи с дефисом

Возвращаясь к дефису, теоретически, мы можем его заменить различными Unicode аналогами, в надежде обмануть IE :) . Например, переноса в фразе «a-b» можно избежать написав «a&#8209;b» однако, хотя такая конструкция хорошо поддерживается современными браузерами, поддержка все-таки не универсальна. Основная проблема в том, что в большинстве шрифтов нет такого неразрывного дефиса, и браузер отобразит какой-нибудь квадрат или вопрос на его месте.

Не редки случаи, когда дефисы заменяют длинные или короткие тире. В таких случаях нестандартное поведение IE (помним, что дефис для IE – место, куда можно вставить разрыв строки) крайне нежелательно. Например, 5&nbsp;-&nbsp;6. В данном случае дефис, окруженный двумя неразрывными пробелами, эмулирует длинное тире. Мы уверены, что наша фраза всегда останется на одной строке. НО! IE ведет себя непредсказуемо. Он может разделить строку на две в том месте, где встречается дефис, хотя даже после него стоит неразрывный пробел. Единственный действенный способ в данном случае обернуть фразу тегом nobr.

Особые случаи: номера телефонов

Телефонные номера вызывают проблемы достаточно часто:

  1. это может случиться в таблице. Расположенные в одном столбце номера, браузер может расположить в две строки. Неприятно, но этого можно избежать, используя атрибут nowrap, как описано выше в таблице;
  2. проблемы возникают из-за появления в номере символов, к которым IE не равнодушен. Например, в номере (495) 555 555 IE может вставить перенос строки после закрывающей скобки. К счастью в данном случае, проблемы с IE можно избежать, поставив после скобки вместо обычного пробела неразрывный.

Как указать возможное место переноса. Почему это проблема?

В большинстве своем, браузеры не переносят слова. IE – исключение, но только в некоторых случаях. Раньше нам приходилось просто жить с этим, пока браузеры не стали лучше и не стали понимать язык страницы и применять специфичные для него правила переноса слов. Теоретически, это могло решить проблему, но решение грубовато.

К счастью, сегодня браузеры поддерживают мягкий перенос (&shy;). Вам нужно просто указать с помощью специального символа (&shy;) место возможного переноса, а браузер при необходимости сам вставит туда перенос.

Бывают случаи, когда браузер не переносит строку даже в том месте, где стоит обычный пробел. IE грешит таким поведением, когда фраза содержит двоеточие. Например, мы в своей работе описываем «псевдоэлемент :before». IE будет считать эту строку неделимой до тех пор, пока не появится символ разрыва строки перед двоеточием. Аналогичные проблемы у этого браузера и с точкой в начале строки. Более того, IE не разорвет строку в месте, где открывающая скобка следует за закрывающей кавычкой (“example” (intentionally).

Нормальный перенос слова против разрыва строки

У нас есть два пути:

  • настоящий перенос слова, когда в месте разрыва слова ставится дефис. И
  • разрыв строки на две или более частей без указания дефиса в местах разрыва (C:\Program Files\Netscape\Communicator\
    Program\NetHelp\Netscape).

Переносим все: word-wrap

В соответствии с документацией Microsoft, начиная с версии 5.5, IE поддерживает свойства word-wrap, полезное, когда контент выходит за границы содержащего его контейнера. Свойство оказалось настолько необходимым, что его включили в черновик CSS3. Оно поддерживается последними версиями браузеров, отличных от IE.

Конечно, у нас еще есть принудительный перенос br, но он пригоден не во всех случаях в силу малой своей гибкости.

Удобный путь: wbr

Тегом wbr отмечается место, где, в случае необходимости, браузер может поставить перенос строки. Это одиночный пустой тег без атрибутов.
В настоящее время этот тег поддерживают все современные браузеры, IE6, кроме IE8 в стандартном режиме. IE8 просто не знает этого тега. Для обхода этой проблемы можно, например, перевести браузер в режим IE7.

Заметим, что не следует использовать wbr для разметки мест возможных переносов внутри слов. Так как в таком случае браузер перенесет слово, но не поставит знак переноса. Используйте wbr в местах предполагаемого переноса слов после дефиса (мышка-норушка).

Так как wbr не включен ни в одну спецификацию, при валидации страниц возникнут проблемы, аналогичные описанным выше.

Unicode: ZWSP

В случаях, когда при переносе слова появление символа переноса нежелательно, например, при разрыве длинной строки URL, есть способ сделать это с помощью специального Unicode символа:
ZWSP (zero width space character, U+200B, в html &#8203;).

Этот символ не имеет ширины и указывает на место возможного разрыва там, где обычный символ пробела недопустим. Однако, поддержка этого символа браузерами достаточно ограничена. Последствия применения zwsp аналогичны описанным выше. Единственные широко распространенные шрифты, в которых есть глифы для этого символа – Arial Unicode MS и Lucida Sans Unicode.

Правила Unicode line breaking

Вдобавок ко всему, в нашу непростую ситуацию вмешиваются Unicode стандарты…

Например, последовательность «.foo» (.foo .foo .foo …) в IE отображается в одну строку, как длина она бы не была. Такую строку сложно встретить, но все же нельзя забывать и о такой возможности. Самое быстрое лекарство – вставить wbr перед каждым словом, начинающимся с точки. Теоретически верным и соответствующим стандартам решением будет использование zwsp, но мы уже говорили о его ограниченной поддержке…

Если немного углубиться в теорию, то согласно Unicode-стандартам точка перед словом (принадлежит классу IS: infix separator (numeric)) запрещает перенос строки перед собой, а также после себя в случае, когда за точкой следует цифра. Таким образом, в фразе «foo .foo» пробел разрешает перенос строки после себя, а точка запрещает перенос строки перед собой. В данном противостоянии побеждает правило для точки (LB 8: Don’t break before a character in class IS even after spaces). Аналогично, для случая с открывающей скобкой, следующей за закрывающей кавычкой.

Html спецификации ничего не говорят по поводу большинства правил Unicode line breaking. Они просто ссылаются на эти правила, что можно расценить как слепое им подчинение. К несчастью, именно это браузеры и начали делать…

Скругление углов у изображений

25.10.2009

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

Начну с примеров.

На главной странице одного сайта есть большое имиджевое изображение. По дизайну необходимо было скруглить углы у этого изображения, к тому же само изображение сменное. Для заказчика важно не иметь сложностей, связанных со сменой этого изображения, т.е. зашел в админку, указал другую картинку, подходящего размера, и всё. Углы должны скруглиться автоматом. Пусть сложностью примера будет то, что основной фон сайта неоднородный. Это значит: нельзя вырезать из макета четыре угла и наложить их поверх картинки.

Для другого сайта таких имиджевых картинок было уже четыре, причем они круглые, разного размера, а поверх еще накладывается полупрозрачный блик, круглая рамка и тень. Естественно, это все располагается на далеко неоднородном фоне :)

Для решения таких задач я решил использовать canvas и vml для IE. Общая суть такова: динамически создаем canvas, рисуем область со скругленными углами, загружаем в неё имиджевую картинку, и обрезаем все, что выходит за рамки этой области. Звучит просто, что же на деле?

А на деле все оказалось еще проще :)

Функция arc(x, y, radius, startAngle, endAngle, anticlockwise) рисует дугу с центром в точке x, y, радиуса radius, от угла startAngle до угла endAngle. Anticlockwise – булевый параметр, указывающий рисовать по или против часовой стрелке. Углы указываются в радианах.

У объекта canvas есть свойство globalCompositeOperation, которому можно присвоить ряд предопределенных значений. Это свойство указывает как новое изображение будет взаимодействовать с уже имеющимся на canvas. (подробнее)

Для нашего случая подойдет значение source-in, т.е. новое изображение рисуется только в местах пересечения со старым. Остается только загрузить это изображение (наши имиджевые картинки) в canvas.

И, наконец, позаботимся о пользователях IE. Для него создаем элемент, некое подобие canvas, на котором также нарисуем фигуру, подходящую для нашего случая (прямоугольник или круг). Загрузим в эту фигуру изображение с помощью v:fill, укажем параметр заливки type=”tile” (http://msdn.microsoft.com/en-us/library/bb229619%28VS.85%29.aspx) и всё.

пример

CSS3 :target

14.10.2009

Сегодня хочется немного поизучать возможности нового в css3 псевдо-класса :target (http://www.w3.org/TR/css3-selectors/#target-pseudo). Он позволяет задавать стилевые правила для элемента с указанным id, к которому перешли по ссылке-якорю. Например, если в документе есть параграф с id=»my_paragraph», то обращаясь к странице, на которой расположен наш  параграф, по адресу http://domain.com/page.html#my_paragraph, можно задать стили именно для этого параграфа в виде:


p:target{
background: blue
}

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

:target поддерживается всеми современными браузерами, кроме семейства MSIE, включая восьмую версию.

Какой же практический толк от этого псевдо-класса (кроме выделения ссылок сносок) можно извлечь?

Больше всего меня заинтересовала возможность создания вкладок (табов) на чистом css.

Для понимающих браузеров все делается достаточно просто, а вот для IE можно создать эмуляцию.

Посмотреть готовый пример

Недостатки:

  • При наличии вертикального скрола и переключении вкладок неминуемы подпрыгивания контента, как это обычно происходит при переходе по ссылке-якорю. Но можно покопаться и с помощью небольшого JavaScript избежать такого поведения.
  • Если в документе, кроме вкладок, можно перейти на другие якоря (или перейти на страницу по адресу, не содержащему символ «#» в конце), то при совершении этого действия в данном примере не будет ни одной активной вкладки. Это можно поправить, в некоторых приближенных случаях.

В интернете можно найти еще возможные варианты применения псевдо-класса, например, для создания галерей изображений, как обычных, так и подобных галерее lightbox.

Индивидуальные стили для счетчиков списка

12.10.2009

Сегодня передо мной встала задача: как без лишней разметки, для буллетов нумерованного списка сделать свои стили (цвет, размер, гарнитура шрифта и т.п.).

В списке вакансий цифра и закрывающая скобка помечены цветом и шрифтом, отличающимся от дефолтных.

Тривиальное решение, как всегда, – решение в лоб :) обрамляем цифру и скобку span-ом и уже есть, за что зацепиться в стилях.

Однако, если контента на странице много или сам список длинный, а редактируется это дело с помощью виз. редактора, человеком, который слабо разбирается в верстке… Короче, нужно избавиться от пресловутого span-а :)

С помощью css легко реализовать данную задачу, если воспользоваться счетчиками и автогенерируемым контентом (http://www.w3.org/TR/CSS2/generate.html#counters). К счастью в настоящее время эти свойства поддерживают все современные браузеры, кроме сами знаете какого. Даже в восьмой версии :( . Но это мы поправим.

Итак, начнем.

Для начала инициируем счетчик:


ol{
counter-reset: li_item
}

Таким образом мы задаем идентификатор, в котором хранится счетчик. Через пробел можно указать несколько счетчиков, со своими начальными значениями. По умолчанию начальное значение равно 0.

Затем указываем для каких селекторов нужно изменить значение счетчика и вывести его:


ol.ol-list > li:before
{
counter-increment: li_item;
content: counter(li_item) ") ";
color: #999;
font: 24px Georgia, Times New Roman, Times, serif;
line-height: 1
}

counter-increment указывает какой счетчик изменить и на сколько. По умолчанию счетчик увеличивается на 1.
Для вывода значения счетчика используется псевдо класс before, в котором мы и задаем стилевое оформление для счетчика.

Для IE такое поведение можно сэмулировать, написав небольшой behavior (JavaScript, подключаемые через css), в котором автоматически в начало селектора будет вставляться span с нужным номером.

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

Кроссбраузерные скругленные углы

11.10.2009

За основу способа взят, подсмотренный здесь и доработанный мной материал.

Для понимающих браузеров отдаём свойство border-radius в чистом виде и с вендорными префиксами: -moz и -webkit. Опера пока не поддерживает css3 свойство в своем последнем официальном релизе (10.00), для неё придется использовать svg картинку, загруженную фоном и вдобавок закодированную в base-64. Для фильтрации Оперы пригодится хак, который понимают версии браузера, начиная с 9.50.

Не забудем про ослика. Для него используем vml конструкции (roundrect) для рисования скругленных областей. vml внедрён с помощью одноразового expression. Одним из минусов roundrect в данном случае является то, что параметр arcsize указывает процентную зависимость радиуса скругления от половины наименьшей из величин высоты и ширины прямоугольника. Для обхода этой особенности мне пришлось ввести два дополнительных блока с фиксированной высотой: перед контентом и после. В них вставляются абсолютно спозиционированные области roundrect, у которых отсекается нижняя половина (для верхнего блока) и верхняя половина (для нижнего).

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

Из недостатков:

  • В силу особенностей разметки для MSIE этот способ пригоден для блоков с одноцветным фоном. Но, возможно, если поковыряться, то и это можно обойти.
  • Так как используются expression, то для того, чтобы заработало в MSIE8, я его перевожу в режим отображения IE7. Для чистой восьмерки можно использовать способ с :before и :after.
  • Ну и, конечно, для отображения блоков со скругленными углами и тенью этот способ сомнителен.

UPD Наткнулся на решение (http://www.htmlremix.com/css/curved-corner-border-radius-cross-browser), в котором для скругдения углов в MSIE vml-конструкция вставляется с помощью behavior. При этом arcsize расчитывается так, чтобы не зависеть от размеров блока. Оч удобно :)