Как написать CSS только для Safari
15 Ноября, 2007Несмотря на экзотичность такого фильтра, он мне понадобился уже на двух проектах. Это, ясное дело, из-за того что у меня мак, и мне не все равно. Короткий грязный(невалидный и не future proof) но работающий здесь и сейчас хак для Safari 2-3.
Зачем это надо?
Ситуаций, в которых я он мне понадобился оказалось пока 2.
1. Когда вы стилизуете submit’ы, они, как известно в Mac OS Tiger не поддаются, и это иногда вызывает нежелательные эффекты для дизайна.
Например на сайте UA WEB 2007 поле регистрации выглядит по разному в Safari и всех остальных броузерах:
Safari 2
Firefox2. На этом блоге я использовал для (всего)текста шрифт Myriad. Очень красивый и читабельный шрифт. Под виндой, однако, имеет совершенно неадекватное и нечитабельное сглаживание, догадайтесь какой скрин из винды:
Бебебе
Вау!Фильтр же позволил мне хотя бы для Сафари пользователей (а это дизайнер и верстальщик моего блога =)) отдавать сайт в первозданном виде с Myriad. Остальным же показывать красивый Arial.
Как
Фильтр является комбинацией двух фильтров (Safari 2 и 3).
Известно что Safari 2 очень чувствителен к посторонним невалидным символам в CSS, настолько, что не читает код после них. К примеру в вот такой конструкции:
- p{color:red}
- span{font-weight:normal;#}
- p{color:green}
Все броузеры сделают параграф зеленым, в то время как в Сафари 2 он останется красным. На самом деле вместо # можно использовать кучу странных символов, но какая разница, если работает и этот. Разумеется, если эти три строки написать в самом начале CSS, сафари 2 его(файл) не прочитает вовсе. Вдобавок никто не мешает использовать вместо селекторов, например import, и отдавать целый отдельный CSS файл для Safari 2.
Safari 3
C Safari 3 все проще. Он вышел недавно, и как любой новый броузер поддерживает тьму-тьмущую интересных CSS3 псевдоклассов, до которых не додумались еще пока Windows броузеры, да и вообще все остальные. А значит есть большая вероятность что ближайшие несколько лет их будет поддерживать только он. Одно из таких свойств:
- body:first-of-type{color:red}
Шрифт будет красным только в Safari 3. Псевдокласс, кстати сам по себе экзотический – вразумительного теоретического применения ему я так и не придумал. Официальное предназначение:
The :first-of-type pseudo-class represents an element that is the first sibling of its type in the list of children of its parent element
Вобщем, прямой перевод, “первый, среди всех подобных ему”. Скорее всего другие броузеры скоро(или не очень) начнут его тоже поддерживать. Так что, он ни разу не future proof. Однако, если очень нужно(критично), есть javascript определение Safari 3. Выглядит примерно так:
- <script type="text/javascript">
- isSafari3 = false;
- if(window.devicePixelRatio) isSafari3 = true;
- </script>
Комбинация для Safari 2 и 3
Комбинируя эти два фильтра, можно скормить стили только для Safari 2-3.
Вот как я делаю это на своем блоге, что бы любоваться Myriad:
- body{font:62.5%/1 “Myriad Pro”, arial, sans-serif;}
- …
- /*В конце файла*/
- span{font-weight:normal;#} /*Safari 2 дальше не читает, для него остался Myriad*/
- body{font-family:Arial, sans-serif;} /*Для всех броузеров*/
- body:first-of-type{font-family:”Myriad Pro”, arial, sans-serif;} /*для Safari 3*/
Работает!. Несмотря на малый процент Сафари в целом, есть тенденция к тому, что среди современных заказчиков он очень распространен. В целом, Safari очень хороший и фильтры эти нужны крайне редко.
Буду рад если кто-то поделится своим опытом!
Update v.2
Финальная подборка фильтров (спасибо Antejan и Mester):
- /*поймут только сафари*/
- body:first-of-type .class{}
- /*поймут только сафари*/
- html:root*.class {}
- /*поймут только сафари*/
- html*.class {}
- /*поймут только сафари и опера*/
- @media screen and (-webkit-min-device-pixel-ratio:0){ .class { } }
- /*поймут только сафари*/
- body:first-of-type .class{}
Если ваши наблюдения отличаются, жду письма или комментария, вместе надеюсь оттестим наконец пуленепробиваемый способ фильтровать Сафари. Тестировать тут:
Update (2009.07.06)
На данный момент из всех перечисленных хаков работает только один:
- @media screen and (-webkit-min-device-pixel-ratio:0){
- .class { }
- }
Новая Opera, по своим каким-то причинам, перестала его читать.
Update: В силу выхода новых версий браузеров, обязательно тестируйте хаки.
Хороший вариант предложил Василий Половнёв в комментарии к этой заметке.
наиболее удачный на мой взгляд способ написать css только для Safari 3/Chrome:
@media screen and (-webkit-min-device-pixel-ratio:0) {
body:first-of-type .clazz {color: red}
}
Во-первых. Шрифт в инпутах и тексареах тоже надо поправить, остался старый.
Во-вторых и главных. Я удивляюсь пафосным арт-директорам, которые не удосужились за резонансными проектами и прочим буттером выучить список из десятка шрифтов.
Чем добавляют головняка верстальщикам и пользователям сайтов. Ну какой нахрен может быть мириад, Генн?! Это же не флеш, и не фотошоп, и даже не твой сафари со своим убийственно стремным сглаживанием , пора бы уже и понимать что к чему, еб то!
И да, я утверждаю, что можно делать охуенные сайты, используя шрифты нормально работающие на всех платформах, без вот этих вот перверсий.
Спасибо, Инпуты то я и проглядел =). Genn может и сам ответит, но это на самом деле больше “приятная мелочь” для меня и пользователей сафари, нежели “сайт на мириад”, в своих больших проектах я всегда мириад заменял на Тахому или Ариал и даже не задумывался. Пока не увидел Мириад под Сафари…
Это ж личный блог – где еще мне так можно извратиться? =)
PS: про сглаживание в Сафари эт ты зря =)
Субпиксельное сглаживание это такая штука, спорная. Оставим его :)
В нотифаях о коментах кодировка всего служебного текста сбивается, похоже что у самого шаблона кодировка неверная.
Ну и неплохо бы сделать якорь для коментов и давать в письме ссылку на него :)
Да, мои попытки сделать везде UTF-8 пока не увенчались успехом =) Отчасти поэтому у меня до сих пор WordPress 1.5, только тссс….
Вот интересно, а у меня Бебебе и Вау! распределились совершенно обратным образом. Винда, FF, CRT-монитор (подозреваю, что имеет значение именно это). Мораль? Сами придумайте:)
В сафари под винду, у меня отображается очень сглаженный Arial.. инпуты на уавебе выглядят как задумано.. а, нестилизованные сабмиты — как всегда мыльницы..
<script type=”text/javascript”>
isSafari3 = (window.devicePixelRatio)?true:false;
</script>
input#subscr-email на сайті UA Web 2008 відображається не коректно тому що він більший ніж background image.
@Давид: бебебе и вау ) это я что б запутать, переборщил с шутками-издевками вобщем =) Мне разница казалась такой очевидной – что никакие бебе и вау не могут сбить вас с толку. В чем я оказался прав!
@ОТО: Хак естественно только под Мак Ос, ибо сафари под виндой сглаживал бы так же отвратительно “мой” Мириад. Да и вообще – разве кто то всерьез относится к Сафари под винду? Это ж так… игрушка.
@Сергей: не сомсем понял о каком именно некорректном отображении вы говорите? Просто в моих броузерах все сейчас ок, был бы очень благодарен за помощь в указании бага. (или вы про гипотетический?)
/*+safari only*/
html*.class { }
/*-safari only*/
/*+safari3 only*/
@media screen and (-webkit-min-device-pixel-ratio:0){
.class { }
}
/*-safari3 only*/
За первый спасибо! добавлю в пост
А вот второй уже понимает и opera 9… Нужно это помнить. Он не “safari3 only”
сенкс
К слову, body:first-of-type понимает и Opera 9.5
А вот @media screen and (-webkit-min-device-pixel-ratio:0) моя Opera не поняла, в отличии от, к примеру, @media screen and (min-width: 20px)
Насколько мне известно, оно понималось именно 9й оперой, то есть будущей поддержки не будет, это ж специальный -webkit-***
Оба добавил в пост, будет полный взгляд на проблему.
Спасибо огромное Antejan и Kildor!
А с последним апдейтом мака, поставился автоматом сафари 3. Может пора забить на второй. Через месяц-полгода его доля будет ничтожной.
Согласен =) Но по своей природе многие макюзеры хотят его купить, и потому переход затягивается. А я вообще пока недостаточно насладился тигром ) потому сижу на 2м Сафари и Mac OS Tiger. Да и вообще сафари настолько хорош что хак этот скорее “прикол” нежели реальная нужда
Эх, а у меня Google Toolbar в Файерфоксе портит даже вон то красивое коричневенькое закругление.
Да, пожалуй таки идея кастомизировать инпуты утопична :(
Я про последний апдейт Тигра :) Он успешно поставил Сафари 3.
Точно! ) Урра! )
А можете подсказать как посмотреть сайт в сафари на винде?
Ну типа сервис какой нить или програмулина…
Во первых есть Сафари 3 под винду – http://www.apple.com/safari/
Потом есть несколько сервисов –
http://www.browsercam.com/
http://browsershots.org/
Ну и наконец можно попросить меня или других знакомых макюзеров сделать скрин и выслать =) Под маком это проще чем под виндой.
Маки у нас слишком не распространены – оптимизировать свои сайты под них начну только тогда, когда реально будет нечем занятся:)
Конечно тебе хотелось сделать приятное всем, но стоит ли это стольких усилий?
Как это напряжно иногда быть веб-дизайнером…разработан единый стандарт, но каждый считает, что вправе ломать его посвоему, а отдуваемся мы:)
В общем случае ты прав конечно =)
Но… в данном частном посуди сам – у меня мак, у дизайнера мак, мы вместе делаем сайт… =) И все же у многих зажиточных клиентов есть маки – и они конечно увидят верстку в первую очередь под этой ОС, потому решил что не всегда, но иногда такие хаки пригодятся
Конструкцию html*.class { } Safari3win оставляет без внимания…
Уже в четверг буду на своем маке — посмотрю. Вот ведь, доверяй но проверяй. Хотя я все же склоняюсь пока к несерьезному отношению к виндовой версии…
html*.class { } – Safari + IE
html:root*.class { } – only Safari
html*.class { } – nevalidno
:first-of-type – этот псевдокласс (как и любой другой надо полагать) подменяется на :hover при наведении мыши. и рвёт… как тузик тряпку
А что, псевдоклассы не могут применяться одновременно? Вы что-то путаете. Вспомните :hover и :first-child например.
Или я вас неправильно понял?
Я имел в виду, что, если описаны свойства для :first-child и для :hover, а они [свойства], естесственно, разные, то при наведении мыши тюнинг для сафари (то, что описано в :first-child) теряется, а вступает в силу то, что описано для псевдокласса :hover
Нe подразумевается использование:
body:first-of-type #yourdiv
Вряд ли кто то задает :hover для body…
Аааа, тогда ясно, а то у меня не получилось .class:first-of-type, потому, что он пересекался с .class:hover
Давайте более детально определимся с синтаксисом конструкций html*.class { } и html:root*.class { }. У меня эти конструкции не понимает ни один браузер ни в одной интерпретации… В какое место этих чудо-директив вставляем реальный селектор со свойствами? )
Создал страничку со всеми фильтрами, в моем Safari 3 все блоки зеленые. Это значит что сафари 3 весь этот ЦСС воспринимает. В фаерфоксе – все красные. В опере зеленый блок по номером 4.
Поделитесь скриншотом или наблюдением? Safari 2 есть у кого-то?
Юрий, спасибо. Нашел свою ошибку в синтаксисе. Конструкции html*.class { } и html:root*.class { } действительно работают.)
ещё html:root .class {} – работает в Safari + Firefox
идеал:
.class { background: white } /* Для оперы и прочего */
html*.class {
background: yellow !important; /* IE 7 */
background: gray; /* IE6 */
}
html:root .class { background: green; } /* FF */
html:root*.class { background: red !important; } /* Safari */
Спасибо за подборку =) Как хорошо что все хаки в одном месте все же не нужны практически никогда, было бы очень страшно запоминать такие конструкции )
А если мне надо хак для Сафари для наследованных классов, типа
h3.green .listing {top:-14px;}
Подойдёт только первый “грязный” вариант?
Когда уже лидеры сговорятся как-то наконец, и не надо будет под каждый браузер чего-то дошлифовывать и дорабатывать напильником. Не будучи шпециалистом в html/css порой уходит уйма времени, чтоб сайт не перекособочивало и всё везде выглядело одинаково.
А сейчас ситуация немного изменилась.
Во-первых, -webkit-min-device-pixel-ratio: 0 понимает Opera 9 до 9.5, во-вторых, начиная с 9.5 она понимает :first-of-type. Ну, а в-третьих, помимо Safari 3 все это понимает и Chrome.
Поэтому, наиболее удачный на мой взгляд способ написать css только для Safari 3/Chrome:
@media screen and (-webkit-min-device-pixel-ratio:0) {
body:first-of-type .clazz {color: red}
}
Opera 9 пройдет через @media, но обломается на :first-of-type, а 9.5 сразу же на @media.
А вот и скриншоты в подтверждение своих слов.
1. Плохая, плохая опера (http://i.piccy.kiev.ua/i2/c2/c2/4462439ea7135942e73cdaafb38b.png): 9.10 и 9.51 на тестовой страничке. В 9.10 зеленый — четвертый блок, в 9.51 — первый.
2. Чуть подправленная версия тестовой странички (http://i.piccy.kiev.ua/i2/03/ea/89743fcda9cbd414c5d2bd8ae142.png). Добавленный вариант выделен синей границей. Chrome + Safari 3 все зеленое, в Opera 9.10 и 9.51 нужный блок красный.
Исправления минимальные:
@media screen and (-webkit-min-device-pixel-ratio:0) {
body:first-of-type .n5{
background:green;
}
}
.n5 {border: 3px solid #5587bb}
Кстати, может кто-нибудь из пользователей/поклонников Оперы объяснить, как пробралось проприетарное (если я не ошибаюсь) -webkit- свойство в этот браузер?
html* ие понимает уверенно
body:first-of-type селектор – мозилла и опера тоже в теме :)
body:first-of-type – хром тоже шарит
Так что остается только html:root*
Спасибо большое
помогло)))
html:root*.class { background: red !important; } /* Safari */
[...] Также не работает в Chrome 2. О причине использования такого хака и о других хаках для сафари можно узнать здесь. [...]
А есть какие-то соображения, как написать хак для третьего сафари, который не будет работать в четвертом?
[...] Также не работает в Chrome 2. О причине использования такого хака и о других хаках для сафари можно узнать здесь. [...]
Ну и что для версии типа 5 нет хаков :( ?
Оставить комментарий