• Записи 162
  • Теги 66
  • Комментарии 330

Компьютерное

Масштабирование широкого сайта для низких разрешений экрана

Однажды столкнулся с дизайном, который был сделан так, что минимальная ширина составляла около 1350 пикселей. Естественно, на экранах с разрешением 1280px и ниже он не влезал по ширине, что не устраивало заказчика, при этом на вариант с переменной шириной, где меню и некоторые другие элементы выводились бы в две строки, заказчик также не соглашался. Пришлось воспользоваться масштабированием с помощью свойства CSS 3 transform: scale, сделав небольшой Javascript, который рассчитывал необходимый масштаб:



<script type="text/javascript"><!--
var elm = document.getElementById('all'); // all — элемент, в который был обернут весь сайт
var coeff = document.body.clientWidth/elm.offsetWidth; // считаем коэффициент масштабирования так, чтобы элемент all занял весь экран
if (coeff>1) coeff=1; // нам нужно только уменьшение сайта, но не его увеличение, поэтому ограничиваем коэффициент сверху единицей
if (coeff<0.6) coeff=0.6; // ограничение снизу добавлено для того, чтобы сайт совсем уж не превращался в нечитаемый
if (coeff!=1.0) {
if (navigator.userAgent.indexOf('Firefox')!=-1) elm.style.boxShadow='none'; // масштабирование в Firefox порождало некорректное отображение boxshadow, и пришлось это свойство отключить
elm.style.webkitTransform =
elm.style.msTransform =
elm.style.mozTransform =
elm.style.transform = 'scale('+coeff+')'; // собственно масштабирование
}
--></script>

Кроме этого, необходимо в CSS для элемента all прописать свойство transfom-origin, чтобы при масштабировании левый верхний угол не смещался:



#all { -webkit-transform-origin: 0 0;
-o-transform-origin: 0 0;
-ms-transform-origin: 0 0;
-moz-transform-origin: 0 0;
transform-origin: 0 0; }

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

7 комментариев:

Нет
Захар
0

Здравствуйте! У меня таже проблема, ширина должна быть 1580, но при использовании Вашего скрипта в консоли выдает Uncaught TypeError: Cannot read property 'clientWidth' of null.
Видимо я что-то не так делаю, в чем может быть проблема? Буду благодарен за помощь.

4X_Pro
0

Тут дело не в JavaScript, а в HTML. Вот эта вот строка var elm = document.getElementById('all'); получает самый верхний div с id="all". У вас он может называться иначе (например, wrapper или еще как-то), и тогда нужно выяснить как он называется (найти самый первый div после тега body) заменить строку 'all' на его id.

Нет
Artem
0

Здравствуйте. Установил скрипт перед закрытием head, но не работает. Сайт обернут в #wrapper. Помогите, пожалйуста.

4X_Pro
0

Вам надо вторую строку заменить вот на такую:
var elm = document.getElementById('wrapper');
Если не помогает, то подробнее объяснить, что именно не работает и в каком именно броузере.

Нет
vikpol
0

Здравствуйте. Спасибо огромное за код, по моему самый простой и элегантный способ. Вставил - все работает идеально, даже с встроенными фреймами.
Но - возникла проблема. Пытаюсь сделать фиксированное меню под шапкой страницы (слой + собственно элементы меню). При скроллинге:
1.Начинает увеличиваться расстояние между фиксированным слоем и верхом экрана - в идеале прижато к верху. Чем больше скроллинг тем больше расстояние.
2. При скроллинге начинает уменьшатся высота слоя вплоть до нуля, исчезновения.
Пытался найти решение сам, но видимо я слишком плохо знаю js и css - не получилось.
Можете подсказать как исправить?

4X_Pro
0

Без кода сказать что-то сложно. А в чем у вас высота слоя задана: в пикселях или в каких-то относительных единицах, типа процентов? Попробуйте задать ее явно в пикселях.

Нет
Вика
0

Спасибо за такой полезный и работающий код. Только вот в ИЕ после масштабирования внизу и сбоку появляется пустое место, которое стилями никак не получается убрать.
(т.е html остается в своем первоначальном масштабе и дает эти пустые места, а div масштабируется как положено).
Подскажите, пожалуйста, что можно добавить в данный скрипт, чтобы ИЕ его корректно понимал?

Написать комментарий


Задать вопрос