Определение браузера на PHP
Головная боль всех профессиональных веб‑разработчиков – отличия внешнего вида html‑страниц в зависимости от браузера. Не будет преувеличением сказать, что каждый, кто занимается версткой, активно ненавидит не любит IE, однако, проблемы встречаются и у других браузеров.
На данный момент в среде верстальщиков правильным считается разделение содержимого страницы и ее оформления. Собственно, HTML содержит только информацию, а ее оформление описывается в CSS.
В связи с тем, что разные браузеры по‑разному интерпретируют инструкции оформления, верстальщики идут на хитрости, используя так называемые хаки – специфические методы написания CSS‑правил, при которых та или иная их (правил) часть воспринимается одним браузером, но не воспринимается другим. Самым знаменитым таким хаком является StarHtmlHack – конструкция, воспринимаемая только IE6:
*html .class {}
Для IE есть множество хаков, но для других браузеров их много меньше.
На мой взгляд гораздо безопаснее определить браузер пользователя и добавить к тегу <body> класс с именем этого браузера и, в отношении IE, его версией. В дальнейшем, в CSS очень легко прописать правила для соответствующего браузера.
Иногда я использую следующую конструкцию:
<body class="<?php
if ( stristr($_SERVER['HTTP_USER_AGENT'], 'Firefox') ) echo 'firefox';
elseif ( stristr($_SERVER['HTTP_USER_AGENT'], 'Chrome') ) echo 'chrome';
elseif ( stristr($_SERVER['HTTP_USER_AGENT'], 'Safari') ) echo 'safari';
elseif ( stristr($_SERVER['HTTP_USER_AGENT'], 'Opera') ) echo 'opera';
elseif ( stristr($_SERVER['HTTP_USER_AGENT'], 'MSIE 6.0') ) echo 'ie6';
elseif ( stristr($_SERVER['HTTP_USER_AGENT'], 'MSIE 7.0') ) echo 'ie7';
elseif ( stristr($_SERVER['HTTP_USER_AGENT'], 'MSIE 8.0') ) echo 'ie8';
?>">
Далее, в CSS‑файле можно написать что‑то вроде:
.menu li {правила для всех браузеров}
.ie6 .menu li {исправления для IE6}
.opera .menu li {исправления для Opera}
Этот метод ничуть не умаляет других способов: определение браузера средствами JS, использование условных комментариев, «чистых» и «грязных» хаков и пр.
Ничто не мешает использовать $_SERVER['HTTP_USER_AGENT'] для определения только одного проблемного браузера. К примеру, добавление правок только для Firefox 1.x будет выглядеть следующим образом:
<body class="<?php
if ( stristr($_SERVER['HTTP_USER_AGENT'], 'Firefox/1') ) echo 'ff1';
?>">
И потом в CSS:
.ff1 .trouble {}
Удачной верстки! И пусть IE6 скорее умрет!
9 января 2010
Категория: Web–разработка
Комментировать ↓
Комментарии (уже 15)
Ответить
Ответить
согласен, раньше часто меняли.
сейчас, однако, мне сложно представить хоть сколько-нибудь реальную причину, которая может заставить менять строку юзерагента хотя бы 1% пользователей.
п.с.: ранние версии IE специально писали в начале этой строки слово Mozilla, чтобы получать тот вариант страниц, который предназначен для Navigator-а от Netscape.
Ответить
Ответить
нет, на этом сайте такого кода нет.
этот код ничуть не тормозит, выполняется без к-л проблем и очень быстро.
проблемы с загрузкой сайта, скорее всего, были связаны с вашим каналом связи — ранее мне не встречались ни проблемы с загрузкой страниц, ни жалобы на такие проблемы. хотя, может и хостинг, черт его знает.
о частоте встречаемости подмены строки юзер-агента спорить нечего — это, ориентировочно, менее 1% всех, кто пользуется интернетом. ибо мотива подменять эту строку сейчас уже нет.
Ответить
Ответить
как проверяете?
посмотрите что выдает Ваш браузер в строке юзер-агента: echo $_SERVER['HTTP_USER_AGENT'];
Ответить
Firefox 3 выдаёт: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.2) Gecko/2008091620 FileDownloader;fdnet FirePHP/0.2.4
Ответить
Сделал, проверил, работает.)) Спасибо.
Ответить
все-таки, для IE лучше использовать конструкции наподобие
<!--[if IE 7]><link href="css/ie7.css" rel="stylesheet" type="text/css" media="all" /><![endif]-->Ответить
Ответить
Ответить
elseif ( stristr($_SERVER['HTTP_USER_AGENT'], 'MSIE 7.0') ) echo 'ie7';
elseif ( stristr($_SERVER['HTTP_USER_AGENT'], 'MSIE 6.0') ) echo 'ie6';
надо переставить так т. к. в строчке 8 IE упоминается 6.0
Ответить
Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; Tablet PC 2.0)IE6 не упоминается.
зачем менять местами?
Ответить
function browser($s) {
if(substr($s,0,5) == "Opera")
return "Opera";
if(substr($s,0,7) == "Mozilla")
return "Firefox";
}
echo browser($_SERVER['HTTP_USER_AGENT']);
Ответить