Как я могу "увеличить страницу" в мобильном браузере
Существует два типа масштабирования. "Пинч-зум" вы получаете в мобильных браузерах, где контент исчезает с краев экрана. И "масштабирование страницы" вы получаете на настольных браузерах, например, когда вы делаете Ctrl +. После "масштабирования страницы" страница перетекает заново, поэтому с адаптивным макетом вы все еще видите всю ширину страницы.
Как я могу разрешить пользователям "масштабировать страницы" на мобильных устройствах?
Я думаю, что на панели заголовка моего сайта может быть кнопка Zoom + и Zoom -. Я хочу это потому, что у меня есть веб-приложение, которое нравится большинству пользователей, как на настольных, так и на мобильных браузерах. Но некоторые менее способные пользователи находят сайт маленьким и неудобным на некоторых своих мобильных устройствах. Возможность щипать масштаб (который я не отключил) - это помощь, но она означает постоянное увеличение и уменьшение масштаба для навигации.
Я пробовал решения, включающие CSS transform: scale(...)
и HTML <meta name="viewport" ...>
и изменяющие их из JavaScript. Но все они, похоже, имеют эффект "щепотки", а не масштаб страницы, который я ищу. Также преобразование: масштаб(...) вызывает проблемы с типами взаимодействия на основе js / pixelbased, такими как draggable, которые я использую.
Я также посмотрел на изменение размеров шрифтов CSS из JavaScript. Но это работает только для текста, а не для изображений, <div>
и т. д..
4 ответа:
Если вы согласны с воспроизведением "pinch zoom", то вы можете использовать широко поддерживаемое свойство
document.body.style.zoom
.Попробуйте запустить это в консоли:
document.body.style.zoom = 2;
Извиняюсь за ответ на мой собственный вопрос, но после долгих поисков я нашел способ, который работает для меня и, кажется, работает на большинстве веб-сайтов, поэтому я подумал, что стоит поделиться:
Фокус в том, чтобы увеличить тело с помощью масштабного преобразования, но затем уменьшить высоту и ширину. Уменьшение высоты и ширины приводит к повторному потоку и удержанию преобразованного содержимого на экране.function zoom(scale) { document.body.style.transform = "scale(" + scale + ")"; document.body.style.transformOrigin = "top left"; document.body.style.width = (100 / scale) + "%"; document.body.style.height = (100 / scale) + "%"; }; zoom(1.25);
Я протестировал приведенный выше код, вставив его в консоль Chrome Firefox и IE на несколько популярных сайтов. Кажется, он идеально масштабируется amazon.com и еще stackoverflow.com, но не gmail. Мое собственное веб-приложение нуждалось в патчах, описанных ниже.
Более полное решение с патчами для jQuery:
С вышеуказанным решением (и после pinch zoom) возникают проблемы, когда JavaScript пытается измерить позиции пикселей и использовать их для позиционирования других элементов. Это происходит потому, что такие функции, как
getBoundingClientRect()
, возвращают координаты, умноженные наscale
. Если вы используете jQuery.height()
,.width()
,offset()
и т. д. вы получаете ту же проблему; все документы jQuery говорят: "размеры могут быть неправильными, когда страница масштабируется пользователем".Вы можете исправить методы jQuery, такие как
.width()
, так что доставляйте значения, как они были бы, если бы просматривали его с помощьюscale = 1
.Редактировать начиная с jQuery 3.2.0: height (), width () и т. д. были исправлены и не требуют патча, показанного ниже. Но offset() все еще нуждается в патче, и если вы используете $(window).height() или width() чтобы найти размер видового порта, вы должны нужно делить по масштабам.
var zoom = (function () { var scale = 1, recurLev = 0; function alter(fn, adj) { var original = $.fn[fn]; $.fn[fn] = function () { var result; recurLev += 1; try { result = original.apply(this, arguments); } finally { recurLev -= 1; } if (arguments.length === 0 && recurLev === 0) { result = adj(result); } return result; }; } function scalePos(n) { return n / scale; } /* Not needed since jQuery 3.2.0 alter("width", scalePos); alter("height", scalePos); alter("outerWidth", scalePos); alter("outerHeight", scalePos); alter("innerWidth", scalePos); alter("innerHeight", scalePos); */ alter("offset", function (o) { o.top /= scale; o.left /= scale; return o; }); return function (s) { scale = s; document.body.style.transform = "scale(" + scale + ")"; document.body.style.transformOrigin = "top left"; document.body.style.width = (100 / scale) + "%"; document.body.style.height = (100 / scale) + "%"; }; }()); zoom(1.25);
Единственная другая проблема, которую я нашел, была в коде (например, перетаскивание и рисование и т. д.), который использует позиции из таких событий, как
mousedown
,touchstart
,mousemove
,touchmove
и т.д. Я обнаружил, что вы должны масштабироватьpageX
иpageY
, разделив их наscale
.
Hi you can try this css: div { margin: 150px; width: 200px; height: 100px; background-color: yellow; border: 1px solid black; border: 1px solid black; -ms-transform: scale(2,3); /* IE 9 */ -webkit-transform: scale(2,3); /* Safari */ transform: scale(2,3); /* Standard syntax */ } Html: <div> This div element is two times of its original width, and three times of its original height. </div>
Изменить размер шрифта на всем? Таким образом, в принципе, каждый размер шрифта, который вы определяете, должен был бы использовать
em
в качестве его единиц (например, intstead ofpx
), чтобы он стал частью шрифта по умолчанию.Затем вы можете установить размер шрифта тела (в
px
), чтобы изменить размер всех шрифтов.
function zoomPage(amount) { var currentSize = Number(window.getComputedStyle(document.body, null).getPropertyValue('font-size').match(/\d+/)); console.log(Number(currentSize), amount, (currentSize + amount)); document.body.style.fontSize = (currentSize + amount) + 'px'; }
body { font-size: 20px; font-family: sans-serif; max-width: 300px; } #smaller { font-size: 0.5em; } .noresize { font-size: 20px; }
<button class="noresize" onclick="zoomPage(1)">+</button><button class="noresize" onclick="zoomPage(-1)">-</button> <h1>I am big text</h1> <p>I am <i>smaller</i> text</p> <p id="smaller">I am even smaller text, even though I am also a paragraph</p>