пятница, Июль 21, 2006

font-size, scaling, zooming

Немножко о шрифтах. Уж не знаю, кто как делает, а я предпочитаю делать так: body { font: 100% someFamily } #someElem { font-size: somePercentageOrEmSize } Остается просто помнить про размеры, которые во всех браузерах идентично отображаются.

Но! Куча «но» появляется при использовании какого-нибудь image-replacement'a… Например, при масштабировании текст начинает вылазить из-под графики. Или макет не дает возможности указать все размеры в em'ах. И начинаешь понимать, что масштабирование только текста просто бесполезно. К сожалению, нормально масштабирование всего и вся реализовано только в IE. В опере оно есть, и сделано вроде бы нормально, да вот только из js доступ к масштабированию норвежцы дать забыли… Ну а FF… Наверное, решить проблему масштабирования произвольного элемента — слишком сложная задача для mozilla foundation.

Итак, задача: реализовать визуально доступное пользователю грамотное масштабирование сайта. Решение: 3 кнопочки вида «ААА», масштабирующие сайт с сохраненим состояния.

Решение: <html>
<head>
  <title>full page scaling, IE-only</title>

  <style type="text/css">
    body { font: 14px "Trebuchet MS", Arial, sans-serif; }
    #sizeScale { display: none; }
    #sizeScale a { text-decoration: none }
    #small, .small   { zoom: 0.8 }
    #normal, .normal { zoom: 1 }
    #large, .large   { zoom: 1.2 }
    .small #small,
    .normal #normal,
    .large #large { text-decoration: underline }
  </style>

  <script type="text/javascript">
    window.onload = function() {
      //window.external есть только у IE.
      if (window.external) {
      //если получилось взять из куки, выставляем сохранённое значение
         document.body.className = dom.cookie.get('sizeScale') || 'normal'
        //показываем блок с масштабирующими ссылками          sizeScale.style.display = 'block'
         //описываем обработчик нажатия на ссылку
         var handler = function(){
           //выставляем
           document.body.className = this.id
           //сохраняем
           dom.cookie.set('sizeScale', this.id)
           //предотвращаем переход по ссылке.
           return false
         }
         //выставляем обработчики
         small.onclick = normal.onclick = large.onclick = handler
      }
    }  
  </script>

  </head>
  <body>

    <div id="sizeScale">
      <a id="small" href="#">A</a>
      <a id="normal" href="#">A</a>
      <a id="large" href="#">A</a>
    </div>

  <p>sometext</p>
  <p>sometext</p>
  <p>sometext</p>
  <p>sometext</p>
  <p>sometext</p>
  <p>sometext</p>
  <p>sometext</p>
  <p>sometext</p>
  <p>sometext</p>
  <p>sometext</p>

  </body>

</html>

таким образом, по нажатию на одну из кнопок посредством изменения className'a будет применено соответствующее правило для body (и сохранено в куки), а ссылка с текущим состоянием будет подчеркнута.

Как видно, мой пример рассчитан только на Internet Explorer.

Так как FF не может масштабировать произвольного элемента в принципе, есть два решения:

  1. Забить на FF
  2. Страдать фигней Для каждого "уровня" масштабирования писать каждому элементу размеры. Также придётся наделать кучищу изображений и переключать их.

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

Так как Opera не дает программной возможности управления своим замечательным механизмом масштабирования, есть три решения:

  1. Забить на Оперу
  2. Страдать фигней делать то же самое, что и для FF
  3. Забить на юзабилити Предложить пользователю самому смасштабировать страницу

Ну а в ИЕ все просто — пишем в каждое правило соответствующее значение zoom и радуемся.

Вывод: для пользователей ИЕ предоставляем возможность нормального масштабирования с красивым контролом, а остальные к неудобствам наверняка привыкли ;)

P.S. Даешь в Опере доступ к зуму из js!

np: Cafe del Mar Volumen 10\Kinema — Katia

3 Comments:

Anonymous dnt said...

div id="size"
#sizeScale a { text-decoration: none } /* отключим для всех */

Не понимаю. Был идентификатор size а стал sizeScale?

27 Июль, 2006 01:00 
Blogger Bitari Shirobatobu said...

Дим, я категорически извиняюсь — после очередного репоста то ли через недосып то ли через что на блог был выложен ранний драфт поста. Поправил. Я совершенно слеп!

28 Июль, 2006 14:51 
Blogger Bitari Shirobatobu said...

Да, чуть не забыл %) о dom.cookie.get/dom.cookie.set я расскажу гораздо позже:) Сейчас готовится к выходу статья про события, затем уже буду про DOM потихоньку освещать...

28 Июль, 2006 15:37 

Отправить комментарий

<< Home

Powered by Blogger