我正在寻找一种控制和处理浏览器中默认调整大小/缩放功能的明智方法。目的是覆盖默认功能并使用该功能控制页面中某些项目的大小。
经过大量研究,我总结出了整合的总体方法:
- 使用
rem
控制项目的大小。- 使用浏览器上的
resize
事件触发调整大小。
首先,我会注意到我正在使用Firefox 62
,并且已经在Chrome 69
上进行了一些测试。
rem
来控制项目的大小:通过使用rem
,我可以更好地调整页面调整大小时缩放的内容。另一个选择是使用transform: scale()
,根据这个问题的答案,我可能不得不使用它。
以下是显示此内容的html&css片段:
<style type="text/css">
@keyframes size { 0% { font-size: 62.5% } 25% { font-size: 100% } 50% { font-size: 62.5% } 75% { font-size: 25% } 100% { font-size: 62.5% } }
:root { font-size: 62.5%; /* gives a base factor of 10px */ animation: size 10s infinite; }
div { padding: 40px; width: 200px; font-size: 40px; background: steelblue; text-align: center; margin: 16px; }
div.zoomer { padding: 4rem; width: 20rem; font-size: 4rem; background: steelblue; text-align: center; margin: 16px; }
/* note that the margins are set to px on both versions (technically unnecessary but for illustration) and it can be controlled what gets resized */
</style>
<body>
<div>px</div>
<div class="zoomer">rem</div>
</body>
resize
事件触发调整大小。问题从这里开始。
我研究了可以听的各种“缩放”事件。其中包括wheel
和keypress
:
window.addEventListener('wheel',e => {
if (e.ctrlKey) {
e.preventDefault();
// zoom handler
}
});
window.addEventListener('keypress',e => {
if ((e.charCode===61||e.charCode===45)&&e.ctrlKey) { // ctrl+, ctrl-
e.preventDefault();
// zoom handler
}
});
但是主要的缩放事件是resize
,因此聆听该事件更为有意义:
window.addEventListener('resize',handler);
收听resize
事件的某些原因是:
ctrl+
,ctrl-
和ctrl[mousewheel]
之外,浏览器菜单的一部分(浏览器右上角的“汉堡菜单”)允许您单击+
,-
,并在某些情况下将缩放重置为100%
。我发现引发此事件的唯一事件是resize
事件。resize
事件,然后对其进行正确处理。即如果您有一个自定义按钮:<button type="button" onclick="myZoomFunction(amount)">Zoom In</button>
在网页本身上。我在听resize
时发现的问题是:
preventDefault()
在resize
事件上不起作用。因此,您实际上无法阻止浏览器缩放(尽管您可以在preventDefault()
和wheel
上使用click
来停止缩放)。event
对象似乎不包含任何数据。例如:
window.addEventListener('resize', e => {
e.preventDefault(); // doesn't do anything.
console.log(e.defaultPrevented); // false
myZoomFunction(e.resizePropertyThatDoesNotExist);
})
// obviously this function is a conjecture as I need to figure out what values I can actually get passed in.
function myZoomFunction(amount) {
const CURRENT_ROOT_FONT_SIZE_PX = Number.parseInt(window.getComputedStyle(document.documentElement).getPropertyValue('font-size').replace(/\D+/g,''));
return document.documentElement.style.fontSize = `${CURRENT_ROOT_FONT_SIZE_PX+amount}px`;
}
如果有人有任何想法,我正在尝试解决这两个问题。