修复自适应缩放在不同浏览器中的问题
This commit is contained in:
parent
53b8813bcb
commit
ba8e653301
@ -8,21 +8,37 @@
|
||||
padding: 0;
|
||||
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
|
||||
}
|
||||
html {
|
||||
width: 100%;
|
||||
overflow-x: hidden;
|
||||
-webkit-text-size-adjust: 100%;
|
||||
text-size-adjust: 100%;
|
||||
}
|
||||
body {
|
||||
display: block;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
width: 100%;
|
||||
background-color: #ffffff;
|
||||
color: #333;
|
||||
overflow-x: hidden;
|
||||
}
|
||||
#resume-wrapper {
|
||||
width: 100%;
|
||||
max-width: 100vw;
|
||||
margin: 0 auto;
|
||||
overflow: hidden;
|
||||
}
|
||||
#resume-scaler {
|
||||
transform-origin: top left;
|
||||
will-change: transform;
|
||||
}
|
||||
#resume {
|
||||
width: 210mm;
|
||||
margin: 0 auto;
|
||||
transform-origin: top left;
|
||||
}
|
||||
#resume-scaler.is-scaled #resume {
|
||||
margin: 0;
|
||||
}
|
||||
li {
|
||||
line-height: 1.5;
|
||||
|
||||
33
index.html
33
index.html
@ -2,12 +2,13 @@
|
||||
<html lang="zh">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover">
|
||||
<title>张梦南 - 简历</title>
|
||||
<link rel="stylesheet" href="css/style.css">
|
||||
</head>
|
||||
<body>
|
||||
<div id="resume-wrapper">
|
||||
<div id="resume-scaler">
|
||||
<div id="resume">
|
||||
<div class="page page-left">
|
||||
<div class="left-section">
|
||||
@ -251,33 +252,7 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<script>
|
||||
(function () {
|
||||
var resume = document.getElementById('resume');
|
||||
var wrapper = document.getElementById('resume-wrapper');
|
||||
if (!resume || !wrapper) return;
|
||||
function fit() {
|
||||
var a4WidthPx = resume.offsetWidth; // A4 排版宽度(≈794px),不受 transform 影响
|
||||
var vw = document.documentElement.clientWidth || window.innerWidth; // 可视宽度(已扣除滚动条)
|
||||
if (a4WidthPx > 0 && vw < a4WidthPx) {
|
||||
var scale = vw / a4WidthPx; // 等比缩放:让 A4 宽度正好填满屏幕
|
||||
resume.style.transform = 'scale(' + scale + ')';
|
||||
resume.style.marginLeft = '0';
|
||||
resume.style.marginRight = '0';
|
||||
wrapper.style.height = (resume.offsetHeight * scale) + 'px'; // 同步容器高度,消除缩放后空白
|
||||
} else {
|
||||
resume.style.transform = 'none';
|
||||
resume.style.marginLeft = '';
|
||||
resume.style.marginRight = '';
|
||||
wrapper.style.height = '';
|
||||
}
|
||||
}
|
||||
var t = null;
|
||||
window.addEventListener('resize', function () { if (t) clearTimeout(t); t = setTimeout(fit, 80); });
|
||||
window.addEventListener('orientationchange', fit);
|
||||
window.addEventListener('load', fit);
|
||||
fit();
|
||||
})();
|
||||
</script>
|
||||
</div>
|
||||
<script src="js/main.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
88
js/main.js
Normal file
88
js/main.js
Normal file
@ -0,0 +1,88 @@
|
||||
(function () {
|
||||
var resume = document.getElementById('resume');
|
||||
var scaler = document.getElementById('resume-scaler');
|
||||
var wrapper = document.getElementById('resume-wrapper');
|
||||
if (!resume || !scaler || !wrapper) return;
|
||||
|
||||
function getViewportWidth() {
|
||||
var candidates = [
|
||||
wrapper.getBoundingClientRect().width,
|
||||
document.documentElement.getBoundingClientRect().width,
|
||||
document.body.getBoundingClientRect().width,
|
||||
window.innerWidth,
|
||||
document.documentElement.clientWidth
|
||||
];
|
||||
|
||||
if (window.visualViewport && window.visualViewport.width) {
|
||||
candidates.push(window.visualViewport.width);
|
||||
}
|
||||
|
||||
var valid = candidates.filter(function (w) {
|
||||
return typeof w === 'number' && w > 0;
|
||||
});
|
||||
|
||||
if (!valid.length) return 360;
|
||||
|
||||
// 部分国产浏览器(如 vivo)会虚报更大的 layout 宽度,取最小值更接近真实可视区域
|
||||
return Math.min.apply(null, valid);
|
||||
}
|
||||
|
||||
function fit() {
|
||||
scaler.style.transform = '';
|
||||
scaler.style.width = '';
|
||||
scaler.style.height = '';
|
||||
scaler.classList.remove('is-scaled');
|
||||
wrapper.style.width = '100%';
|
||||
wrapper.style.maxWidth = '100%';
|
||||
wrapper.style.height = '';
|
||||
|
||||
var a4Width = resume.offsetWidth;
|
||||
var a4Height = resume.offsetHeight;
|
||||
if (a4Width <= 0 || a4Height <= 0) return;
|
||||
|
||||
var vw = getViewportWidth();
|
||||
var scale = vw / a4Width;
|
||||
|
||||
if (scale < 1) {
|
||||
var scaledWidth = Math.ceil(a4Width * scale);
|
||||
var scaledHeight = Math.ceil(a4Height * scale);
|
||||
|
||||
scaler.classList.add('is-scaled');
|
||||
scaler.style.width = a4Width + 'px';
|
||||
scaler.style.height = a4Height + 'px';
|
||||
scaler.style.transform = 'scale(' + scale + ')';
|
||||
wrapper.style.width = scaledWidth + 'px';
|
||||
wrapper.style.maxWidth = '100%';
|
||||
wrapper.style.height = scaledHeight + 'px';
|
||||
} else {
|
||||
wrapper.style.width = '';
|
||||
wrapper.style.maxWidth = '100vw';
|
||||
}
|
||||
}
|
||||
|
||||
var timer = null;
|
||||
function scheduleFit() {
|
||||
if (timer) clearTimeout(timer);
|
||||
timer = setTimeout(fit, 80);
|
||||
}
|
||||
|
||||
function fitWhenReady() {
|
||||
requestAnimationFrame(function () {
|
||||
requestAnimationFrame(fit);
|
||||
});
|
||||
}
|
||||
|
||||
window.addEventListener('resize', scheduleFit);
|
||||
window.addEventListener('orientationchange', fitWhenReady);
|
||||
window.addEventListener('load', fitWhenReady);
|
||||
|
||||
if (window.visualViewport) {
|
||||
window.visualViewport.addEventListener('resize', scheduleFit);
|
||||
}
|
||||
|
||||
if (document.fonts && document.fonts.ready) {
|
||||
document.fonts.ready.then(fitWhenReady);
|
||||
}
|
||||
|
||||
fitWhenReady();
|
||||
})();
|
||||
Loading…
x
Reference in New Issue
Block a user