Определение браузера на 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 скорее умрет!


Связанные статьи

Комментарии (уже 15)

  1.  mmm (анонимно) (09.01.2010, 23:50)

    Спасибо! Полезный пост!
    Ссылка на комментарий #1
    Ответить
  2.  Steward (анонимно) (10.01.2010, 01:31)

    Ну это очень ненадёжный способ... сроку юзер-агента можно поменять в настройках. Сейчас это конечно редко кто делает - но раньше очень часто меняли родного юзер-агента на ИЕшного...
    Ссылка на комментарий #2
    Ответить
  3.  Николай Громов (10.01.2010, 01:37)

    @ Steward (анонимно):
    согласен, раньше часто меняли.
    сейчас, однако, мне сложно представить хоть сколько-нибудь реальную причину, которая может заставить менять строку юзерагента хотя бы 1% пользователей.

    п.с.: ранние версии IE специально писали в начале этой строки слово Mozilla, чтобы получать тот вариант страниц, который предназначен для Navigator-а от Netscape.
    Ссылка на комментарий #3
    Ответить
  4.  Cyber (анонимно) (15.01.2010, 01:26)

    Это у вас здесь на сайте уже стоит этот код? А то я думаю почему у меня в моем основном браузере, в котором изменена строка идентификации, ваш сайт загрузился только с третьего раза. Я уже подумал что хостинг тормозит. А нет, в других браузерах с первого раза загрузился. Так что да, вот я как раз меняю строку юзер-агента в браузере :)
    Ссылка на комментарий #4
    Ответить
  5.  Николай Громов (15.01.2010, 16:47)

    @ Cyber (анонимно):
    нет, на этом сайте такого кода нет.
    этот код ничуть не тормозит, выполняется без к-л проблем и очень быстро.
    проблемы с загрузкой сайта, скорее всего, были связаны с вашим каналом связи — ранее мне не встречались ни проблемы с загрузкой страниц, ни жалобы на такие проблемы. хотя, может и хостинг, черт его знает.
    о частоте встречаемости подмены строки юзер-агента спорить нечего — это, ориентировочно, менее 1% всех, кто пользуется интернетом. ибо мотива подменять эту строку сейчас уже нет.
    Ссылка на комментарий #5
    Ответить
  6.  40a (анонимно) (16.01.2010, 19:41)

    У меня в FireFox не работает
    Ссылка на комментарий #6
    Ответить
  7.  Николай Громов (18.01.2010, 14:15)

    @ 40a (анонимно):
    как проверяете?
    посмотрите что выдает Ваш браузер в строке юзер-агента: echo $_SERVER['HTTP_USER_AGENT'];
    Ссылка на комментарий #7
    Ответить
  8.  Комментатор 18 (02.02.2010, 19:16)

    Firefox 2 выдаёт: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.8.1.9) Gecko/20071025 FileDownloader;fdnet WebMoney Advisor
    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
    Ссылка на комментарий #8
    Ответить
  9.  Volday (24.02.2010, 04:42)

    Убил много времени, пока нашёл вашу статью. То что мне и было нужно.)) Только хочу сделать маленько по другому. Мне кажется лучше подключать не разные классы css, в зависимости от браузера, а подключать разные файлы css в начале. Пока интересует отдельный файл css для IE.
    Сделал, проверил, работает.)) Спасибо.
    Ссылка на комментарий #9
    Ответить
  10.  Николай Громов (24.02.2010, 23:50)

    @ Volday:
    все-таки, для IE лучше использовать конструкции наподобие
    <!--[if IE 7]><link href="css/ie7.css" rel="stylesheet" type="text/css" media="all" /><![endif]-->
    Ссылка на комментарий #10
    Ответить
  11.  shohrat (анонимно) (13.04.2010, 10:32)

    Очень полезная информация!
    Ссылка на комментарий #11
    Ответить
  12.  Stafox (анонимно) (02.06.2010, 11:21)

    Отличная статья! Сам давно пользовался этим скриптом, однако, подгружал отдельный css-файл. Идея делать класс для каждого браузера понравилась, возьму на заметку, спасибо!
    Ссылка на комментарий #12
    Ответить
  13.  Виктор (анонимно) (15.06.2010, 11:47)

    elseif ( stristr($_SERVER['HTTP_USER_AGENT'], 'MSIE 8.0') ) echo 'ie8';
    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

    Ссылка на комментарий #13
    Ответить
  14.  Ваня (анонимно) (15.06.2010, 12:15)

    а у меня IE8 выдает строку: 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 не упоминается.
    зачем менять местами?
    Ссылка на комментарий #14
    Ответить
  15.  XJIOP (анонимно) (31.07.2010, 02:20)

    пример функции

    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']);
    Ссылка на комментарий #15
    Ответить

Ваш комментарий

Комментарий будет опубликован после проверки.



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







(обязательно)


Дополнительно

RSS-подписка

В этом блоге две категории