1、媒体查询(media )
通过在CSS文件中使用@media规则来定义媒体查询。
@media screen and (max-width: 768px) { /* 在宽度小于等于768px时应用的CSS样式 */ } @media screen and (min-width: 768px) and (max-width: 992px) { /* 在宽度大于768px且小于等于992px时应用的CSS样式 */ } @media screen and (min-width: 992px) { /* 在宽度大于992px时应用的CSS样式 */ }
使用CSS媒体查询关键字:CSS3还引入了一媒体查询关键字,可以方便地根据设备的类型或特性来应用样式
/* 应用于打印设备 */ @media print { /* 打印相关的CSS样式 */ } /* 应用于屏幕设备 */ @media screen { /* 屏幕相关的CSS样式 */ } /* 应用于横向方向的设备@media (orientation: landscape) /* 横向设备相关的CSS样式 */ } /* 应用于高分辨率设备 */ @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { /* 高分辨率设备相关的CSS样式 */ }
使用CSS框架或工具:许多CSS框架或工具已经内置了响应式设计的媒体查询,如Bootstrap、Foundation等。这些框架会根据一系列的预定义断点(breakpoint)来设置媒体查询,简化了开发过程。你可以选择适合自己的CSS框架,并按照框架的文档来使用。
2、scale(缩放)
根据宽度比率进行缩放
(宽度比率=网页当前宽度/设计稿宽度)
<script> // 设计稿:1920 * 1080 // 1.设计稿尺寸 let targetWidth = 1920; let targetHeight = 1080; let targetRatio = 16 / 9; // 宽高比率 (宽 / 高) // 2.拿到当前设备(浏览器)的宽度和高度 let currentWidth = document.documentElement.clientWidth || document.body.clientWidth; let currentHeight = document.documentElement.clientHeight || document.body.clientHeight; // 3.计算缩放比率(屏幕过宽,根据高度计算缩放比例) // 若currentWidth是4k屏宽度 3840 除于 我们设计稿的宽度 1920 3840/1920 = 2 // 这样页面就行进行2倍缩放 let scaleRatio = currentWidth / targetWidth; // 参照宽度进行缩放(默认情况下) // 当前页面宽高比例,当页面越宽currentRatio值就越大 let currentRatio = currentWidth / currentHeight; // 判断是根据宽度进行缩放,还是根据高度进行缩放 if (currentRatio > targetRatio) { // 根据高度进行网页的缩放 scaleRatio = currentHeight / targetHeight; // 参照高度进行缩放(屏幕很宽的情况下) document.body.style = `transform: scale(${scaleRatio}) translateX(-50%)`; } else { // 根据宽度进行网页的缩放 document.body.style = `transform: scale(${scaleRatio})`; } </script>
3、flexible
h5移动适配解决方案
(function(win, lib) { var doc = win.document; var docEl = doc.documentElement; var metaEl = doc.querySelector('meta[name="viewport"]'); var flexibleEl = doc.querySelector('meta[name="flexible"]'); var dpr = 0; var scale = 0; var tid; var flexible = lib.flexible || (lib.flexible = {}); if (metaEl) { console.warn('将根据已有的meta标签来设置缩放比例'); var match = metaEl.getAttribute('content').match(/initial\-scale=([\d\.]+)/); if (match) { scale = parseFloat(match[1]); dpr = parseInt(1 / scale); } } else if (flexibleEl) { var content = flexibleEl.getAttribute('content'); if (content) { var initialDpr = content.match(/initial\-dpr=([\d\.]+)/); var maximumDpr = content.match(/maximum\-dpr=([\d\.]+)/); if (initialDpr) { dpr = parseFloat(initialDpr[1]); scale = parseFloat((1 / dpr).toFixed(2)); } if (maximumDpr) { dpr = parseFloat(maximumDpr[1]); scale = parseFloat((1 / dpr).toFixed(2)); } } } if (!dpr && !scale) { var isAndroid = win.navigator.appVersion.match(/android/gi); var isIPhone = win.navigator.appVersion.match(/iphone/gi); var devicePixelRatio = win.devicePixelRatio; if (isIPhone) { // iOS下,对于2和3的屏,用2倍的方案,其余的用1倍方案 if (devicePixelRatio >= 3 && (!dpr || dpr >= 3)) { dpr = 3; } else if (devicePixelRatio >= 2 && (!dpr || dpr >= 2)){ dpr = 2; } else { dpr = 1; } } else { // 其他设备下,仍旧使用1倍的方案 dpr = 1; } scale = 1 / dpr; } docEl.setAttribute('data-dpr', dpr); if (!metaEl) { metaEl = doc.createElement('meta'); metaEl.setAttribute('name', 'viewport'); metaEl.setAttribute('content', 'initial-scale=' + scale + ', maximum-scale=' + scale + ', minimum-scale=' + scale + ', user-scalable=no'); if (docEl.firstElementChild) { docEl.firstElementChild.appendChild(metaEl); } else { var wrap = doc.createElement('div'); wrap.appendChild(metaEl); doc.write(wrap.innerHTML); } } function refreshRem(){ var width = docEl.getBoundingClientRect().width; if (width / dpr > 540) { width = 540 * dpr; } var rem = width / 10; docEl.style.fontSize = rem + 'px'; flexible.rem = win.rem = rem; } win.addEventListener('resize', function() { clearTimeout(tid); tid = setTimeout(refreshRem, 300); }, false); win.addEventListener('pageshow', function(e) { if (e.persisted) { clearTimeout(tid); tid = setTimeout(refreshRem, 300); } }, false); if (doc.readyState === 'complete') { doc.body.style.fontSize = 12 * dpr + 'px'; } else { doc.addEventListener('DOMContentLoaded', function(e) { doc.body.style.fontSize = 12 * dpr + 'px'; }, false); } refreshRem(); flexible.dpr = win.dpr = dpr; flexible.refreshRem = refreshRem; flexible.rem2px = function(d) { var val = parseFloat(d) * this.rem; if (typeof d === 'string' && d.match(/rem$/)) { val += 'px'; } return val; } flexible.px2rem = function(d) { var val = parseFloat(d) / this.rem; if (typeof d === 'string' && d.match(/px$/)) { val += 'rem'; } return val; } })(window, window['lib'] || (window['lib'] = {}));
4、vw、vh、rem的使用
;(
function
(win, lib) {
var
doc = win.document;
var
docEl = doc.documentElement;
var
metaEl = doc.querySelector(
'meta[name="viewport"]'
);
var
flexibleEl = doc.querySelector(
'meta[name="flexible"]'
);
var
dpr = 0;
var
scale = 0;
var
tid;
var
flexible = lib.flexible || (lib.flexible = {});
if
(metaEl) {
console.warn(
'将根据已有的meta标签来设置缩放比例'
);
var
match = metaEl.getAttribute(
'content'
).match(/initial\-scale=([\d\.]+)/);
if
(match) {
scale = parseFloat(match[1]);
dpr = parseInt(1 / scale);
}
}
else
if
(flexibleEl) {
var
content = flexibleEl.getAttribute(
'content'
);
if
(content) {
var
initialDpr = content.match(/initial\-dpr=([\d\.]+)/);
var
maximumDpr = content.match(/maximum\-dpr=([\d\.]+)/);
if
(initialDpr) {
dpr = parseFloat(initialDpr[1]);
scale = parseFloat((1 / dpr).toFixed(2));
}
if
(maximumDpr) {
dpr = parseFloat(maximumDpr[1]);
scale = parseFloat((1 / dpr).toFixed(2));
}
}
}
if
(!dpr && !scale) {
var
isAndroid = win.navigator.appVersion.match(/android/gi);
var
isIPhone = win.navigator.appVersion.match(/iphone/gi);
var
devicePixelRatio = win.devicePixelRatio;
if
(isIPhone) {
// iOS下,对于2和3的屏,用2倍的方案,其余的用1倍方案
if
(devicePixelRatio >= 3 && (!dpr || dpr >= 3)) {
dpr = 3;
}
else
if
(devicePixelRatio >= 2 && (!dpr || dpr >= 2)){
dpr = 2;
}
else
{
dpr = 1;
}
}
else
{
// 其他设备下,仍旧使用1倍的方案
dpr = 1;
}
scale = 1 / dpr;
}
docEl.setAttribute(
'data-dpr'
, dpr);
if
(!metaEl) {
metaEl = doc.createElement(
'meta'
);
metaEl.setAttribute(
'name'
,
'viewport'
);
metaEl.setAttribute(
'content'
,
'initial-scale='
+ scale +
', maximum-scale='
+ scale +
', minimum-scale='
+ scale +
', user-scalable=no'
);
if
(docEl.firstElementChild) {
docEl.firstElementChild.appendChild(metaEl);
}
else
{
var
wrap = doc.createElement(
'div'
);
wrap.appendChild(metaEl);
doc.write(wrap.innerHTML);
}
}
function
refreshRem(){
var
width = docEl.getBoundingClientRect().width;
if
(width / dpr > 540) {
width = 540 * dpr;
}
var
rem = width / 10;
docEl.style.fontSize = rem +
'px'
;
flexible.rem = win.rem = rem;
}
win.addEventListener(
'resize'
,
function
() {
clearTimeout(tid);
tid = setTimeout(refreshRem, 300);
},
false
);
win.addEventListener(
'pageshow'
,
function
(e) {
if
(e.persisted) {
clearTimeout(tid);
tid = setTimeout(refreshRem, 300);
}
},
false
);
if
(doc.readyState ===
'complete'
) {
doc.body.style.fontSize = 12 * dpr +
'px'
;
}
else
{
doc.addEventListener(
'DOMContentLoaded'
,
function
(e) {
doc.body.style.fontSize = 12 * dpr +
'px'
;
},
false
);
}
refreshRem();
flexible.dpr = win.dpr = dpr;
flexible.refreshRem = refreshRem;
flexible.rem2px =
function
(d) {
var
val = parseFloat(d) *
this
.rem;
if
(
typeof
d ===
'string'
&& d.match(/rem$/)) {
val +=
'px'
;
}
return
val;
}
flexible.px2rem =
function
(d) {
var
val = parseFloat(d) /
this
.rem;
if
(
typeof
d ===
'string'
&& d.match(/px$/)) {
val +=
'rem'
;
}
return
val;
}
})(window, window[
'lib'
] || (window[
'lib'
] = {}));
标签:scale,dpr,适配,前端,rem,doc,var,match,页面
From: https://www.cnblogs.com/dongzi1997/p/17608102.html