整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

细说html的meta

细说html的meta

lt;meta> 元素可提供有关页面的元信息(meta-information),比如针对搜索引擎和更新频度的描述和关键词。

<meta> 标签位于文档的头部,不包含任何内容。<meta> 标签的属性定义了与文档相关联的名称/值对。

content属性用来存储meta信息的内容,这是一个必需的属性,定义与 http-equiv 或 name 属性相关的元信息,所有的主流浏览器都支持它,但它一般很少单独使用,我们一般使用http-equiv或name来定义content属性信息(或值)的名称,http-equiv和name在一个meta中通常只能用其中一个。

正常我们这样写

<meta charset="utf-8">

视窗的宽度,经常用于收集适配

<meta name="viewport" content="width=device-width, inital-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"/>

http-equiv :

http-equiv 属性为名称/值对提供了名称。并指示服务器在发送实际的文档之前先在要传送给浏览器的 MIME 文档头部包含名称/值对。

当服务器向浏览器发送文档时,会先发送许多名称/值对。虽然有些服务器会发送许多这种名称/值对,但是所有服务器都至少要发送一个:content-type:text/html。这将告诉浏览器准备接受一个 HTML 文档。

使用带有 http-equiv 属性的 <meta> 标签时,服务器将把名称/值对添加到发送给浏览器的内容头部。例如,添加:

<meta http-equiv="charset" content="iso-8859-1">
<meta http-equiv="expires" content="31 Dec 2008">

这样发送到浏览器的头部就应该包含:

content-type: text/html
charset:iso-8859-1
expires:31 Dec 2008

"keywords" 是一个经常被用到的名称。它为文档定义了一组关键字。某些搜索引擎在遇到这些关键字时,会用这些关键字对文档进行分类。

强制刷新,自动刷新并指向新页面。

<meta http-equiv="refresh" content="3">

移动端的 苹果设备的设置

// 下面代码来自天猫移动web
<meta name="apple-mobile-web-app-capable" content="yes"/> // 可以让app运行于全屏模式
<meta name="apple-mobile-web-app-title" content="TMALL"/> // 可以让app的标题不同于页标题
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent"/> // 配置app的状态栏,可设置为default, black, 和 black-translucent。

淘宝首页的设置:

两天去面试,被考察如何适配刘海屏、异性屏,回来总结了一套方案,以供大家参考。

为了演示方便,以下均已 iPhone X 横屏作为例子。

安全区

其实浏览器已经默认使用了一种方案,在大多数情况下都能处理好异形屏问题,它的实现是基于安全区(safe area)的概念。

浏览器在默认情况下,会给页面边缘留空,以适应刘海屏的情况。

上图中的橙色区域,就是浏览器留空的边界,而中间部分就是安全区。页面的元素布局、定位等,都是在安全区中进行。

安全区外的边界大小无法通过 css 控制,但可以通过设置 html 或 body 的 background-color 来控制它的颜色(默认白色)。

可以发现,由于安全区的存在,内容并不能占满整个屏幕。

这时候需要引入一个 meta 属性值 viewport-fit=cover

内容填充整个屏幕

通过设置视口(viewport)的 meta 属性,可以实现安全区填充满整个屏幕。


此时,虽然页面填充满整个屏幕,但是部分内容会被刘海遮挡。

所以,需要手工地调整内容区的边距。

在 React、Vue、Angular 这种单页应用中,都存在根元素 <app-root>,我们可以通过给根元素设置固定的 padding 以规避遮挡。

但是固定的 padding 不能应用于所有的异性屏,毕竟刘海尺寸不一。办法是通过结合上面提到的安全区 ——

注意观察上述代码,引入了 4 组变量,它们是预定义的环境变量,用于获取安全区模式下的边界。如 env(safe-area-inset-left),用于获取在安全区模式中的左边界。

不过,这些变量可能存在兼容问题。通过前置 padding: 20px,使得在不兼容时应用固定的 padding,而兼容时候则覆盖这个固定值。

在设置后,我们实现了如下效果。

而 header 和 footer 由于被设置为 position: fixed,宽度基于视口,所以还存在被遮挡问题。同样,应用预定义的环境变量后可以解决这个问题。


结语

以上通过设置 HTML 的 meta 属性和 CSS 的预定义环境变量,精细化地控制页面边距,实现适配刘海屏的效果。

你的点赞和转发,是我创作的动力,希望能多多支持。

ue中pc端与移动端适配解决方案

0. 前言

当涉及屏幕适配方案时,我们常常被众多选择所困扰,如postcss-pxtorem、postcss-px2rem、px2rem-loader、postcss-plugin-px2rem等。然而,在实际测试中,由于不同的Vue和Webpack版本,很多这些方式已经无法使用,反而带来了更多麻烦。

为了尽快解决问题,我们应该始终以解决问题为导向,首先采用那些已经获得验证并能产生效果的方法。对于上述列举的方案,虽然没有一一测试过,但我们需要明确的是,抓住解决问题的关键。

针对移动端和PC端适配,我建议将两者进行拆分并进行工程化配置,以避免整体框架调整后在某些页面上出现轻微不协调。在某些情况下,你可能会注意到笔记本电脑上显示比例缩放后的细微差异,这可以通过插入【整体缩放自适应解决方案(阿里团队高清方案)的JS代码】来解决。

1.移动端适配方案

1.1 基础概念

viewport即视窗、视口,用于显示网页部分的区域,在PC端视口即是浏览器窗口区域,在移动端,为了让页面展示更多的内容,视窗的宽度默认不为设备的宽度,在移动端视窗有三个概念:布局视窗、视觉视窗、理想视窗。

  • 布局视窗:在浏览器窗口css的布局区域,布局视口的宽度限制css布局的宽。为了能在移动设备上正常显示那些为pc端浏览器设计的网站,移动设备上的浏览器都会把自己默认的viewport设为980px或其他值,一般都比移动端浏览器可视区域大很多,所以就有横向滚动条。
  • 视觉视窗:终端设备显示网页的区域。
  • 理想视窗:针对当前设备最理想的展示页面的视窗,不会出现横向滚动条,页面刚好全部展现在视窗内,理想视窗即终端屏幕的宽度。

viewport详细设置:

  • 通过设置viewport可以设置页面大小,通过meta标签可以设置viewport信息。
  • viewport有以下几个属性:
    • width:视口的宽度,正整数或设备宽度device-width(width=device-width)
    • height:视口高度,正整数或device-height
    • initial-scale(initial-scale=1.0):网页初始缩放值,小数缩小,反之放大(initial-scale=1.0)
    • maximum-scale(maximum-scale=1.0):设置页面的最大缩放比例
    • minimum-scale(minimum-scale=1.0): 设置页面的最小缩放比例
    • user-scaleble(user-scalable=no):用户是否可以缩放

移动端默认会缩放大尺寸的页面的,当我们把上述代码去掉之后,就会随着移动端缩放的比例走,而且还可以自由放大。

1.1.1 解决方案一viewport缩放

方案统计:

  1. 设置viewport进行缩放
  2. PC端适配移动端可以通过html标签重meta name="viewport"调整视口比例,进行页面缩放。 不过有部分同学使用过程中反应缩放会导致有些页面元素会糊的情况。

代码原理:

  1. 根据设备屏幕的DPR(设备像素比,比如dpr=2时,表示1个CSS像素由2X2个物理像素点组成) 动态设置 html 的font-size
  2. 同时根据设备DPR调整页面的缩放值,进而达到高清效果。
//  仅在移动端时候生效,或者浏览器手机模式
//  整体缩放自适应解决方案(阿里团队高清方案) 淘宝m端使用的解决方案
! function (e) {
    function t(a) {
      if (i[a]) return i[a].exports;
      var n=i[a]={
        exports: {},
        id: a,
        loaded: !1
      };
      return e[a].call(n.exports, n, n.exports, t), n.loaded=!0, n.exports
    }
    var i={};
    return t.m=e, t.c=i, t.p="", t(0)
  }([function (e, t) {
    "use strict";
    Object.defineProperty(t, "__esModule", {
      value: !0
    });
    var i=window;
    t["default"]=i.flex=function (e, t) {
      var a=e || 100,
        n=t || 1,
        r=i.document,
        o=navigator.userAgent,
        d=o.match(/Android[\S\s]+AppleWebkit/(\d{3})/i),
        l=o.match(/U3/((\d+|.){5,})/i),
        c=l && parseInt(l[1].split(".").join(""), 10) >=80,
        p=navigator.appVersion.match(/(iphone|ipad|ipod)/gi),
        s=i.devicePixelRatio || 1;
      p || d && d[1] > 534 || c || (s=1);
      var u=1 / s,
        m=r.querySelector('meta[name="viewport"]');
      m || (m=r.createElement("meta"), m.setAttribute("name", "viewport"), r.head.appendChild(m)), m
        .setAttribute("content", "width=device-width,user-scalable=no,initial-scale=" + u + ",maximum-scale=" +
          u + ",minimum-scale=" + u), r.documentElement.style.fontSize=a / 2 * s * n + "px"
    }, e.exports=t["default"]
  }]);
  flex(100, 1);

//  高清方案默认1rem=100px,那么 btn的宽度就设置为:)
.btn {
    width:0.8rem
    height:1.2rem
}


  1. 根据设备屏幕的DPR,自动设置最合适的高清缩放。保证了不同设备下视觉体验的一致性。 旧方案,屏幕越大,元素也越大,新方案,屏幕越大,看到的越多 看得越多的理解: 比如,一篇很长的文章在ip4上,一屏盛不了那么多内容,而在ip6plus上,可以全部看清楚,这是因为,新方案会根据dpr来缩放视口,大屏小屏的手机上,显示的字体大小都是一致的,当然在大屏上看到的东西就多咯~
  2. 有效解决移动端真实1px问题(这里的1px 是设备屏幕上的物理像素)

【7】 移动端开发自适应解决方案(阿里团队高清方案)

1.1.2 解决方案二—两套页面

同时兼任pc和移动适配

通过配置两套不同路由和判断是否是移动端实现

核心代码:router.addRoute(isMobile() ? mobileRoutes[1] : pcRoutes[1]);(区分路由)

1.1.3 解决方案三—postcss-pxtorem、amfe-flexible

搭配工程化,可以参考第二章【PC端适配方案】

npm i postcss-pxtorem --save-dev
?
//使用postcss-pxtorem
module.exports={
    lintOnSave:true,
    css:{
        loaderOptions:{
            postcss:[
                require('postcss-pxtorem')({
                    rootValue:16,//根元素字体大小
                    unitPrecision:5, //允许rem单位增长的十进制数字
                    replace:true, //替换包含rems的规则,而不添加后备
                    mediaQuery:false, //允许在媒体查询中转换px
                    minPixelValue:0, //设置要替换的最小像素值
                    selectorBlackList:[], //忽略转换正则匹配项
                    propList:['*'], //可以从px转换为rem的属性,匹配正则
                    exclude:/node_modules/i  要忽略并保留为px的文件路径
                }),
            ]
        }
    }
}


2.PC端适配方案

vue项目使用element-ui框架Rem适配(postcss-pxtorem、amfe-flexible),自动转换px为rem,解决响应式问题

1366 * 768 : 普通液晶显示器 1920 * 1080: 高清液晶显示器 2560 * 1440: 2K高清显示器 4096 * 2160: 4K高清显示器 1280 * 720: 笔记本(1920*1080分辨率下系统默认推荐150%缩放比产生的尺寸)

大屏数据可视化项目通常用于放在电视或广告屏上展示用,而不允许出现滚动条

2.1. 适配痛点难点

设计稿按照1920*1080的分辨率,16:9的比例设计, 实际开发中,document窗口不足16:9(高度减掉顶部tab及导航栏,地址栏等) 不同分辨率:实际应用场景中,显示场景不同,不能固定写死px单位 不同比例:不同的显示器宽高比与设计稿不一致

2.2. 什么是rem

rem是CSS3新增的相对长度单位,是指相对于根元素html的font-size计算值的大小。简单可理解为屏幕宽度的百分比。 但是,项目中常见尺寸绘制采用的均是px,要改用rem一时半会缓不过来,而且可能还要换算转换,所以使用rem还是比较麻烦的,但是,我们可以通过插件,能够将项目中的px转换为rem,还可以自定义基数。

2.3. 安装依赖

npm install amfe-flexible // CSS单位自适应转换插件 负责更改根font-size
npm install postcss-pxtorem@^5.1.1 // 如果版本过高可以降版本下载5.1.1版本 负责将px转成rem


// 用途:echarts字体适配
/**
 * echarts字体自适应
 * @param {*} font 字号大小
 */
export function echartGetFontSize(font) {
    let docEl=document.documentElement,
      clientWidth=       window.innerWidth ||
        document.documentElement.clientWidth ||
        document.body.clientWidth;
    if (!clientWidth) return;
    let fontSize=clientWidth / 1920;
    return font * fontSize;
}


2.3. 引入amfe-flexible

由于 viewport 单位得到众多浏览器的兼容,lib-flexible 这个过渡方案已经可以放弃使用,不管是现在的版本还是以前的版本,都存有一定的问题。建议大家开始使用 viewport 来替代此方。(待考证?)

amfe-flexible是lib-flexible的升级版

flexible就是根据不同的屏幕算出html的font-size,通过js来动态写meta标签

实上他做了这几样事情:

  • 动态改写<meta>标签
  • 给<html>元素添加data-dpr属性,并且动态改写data-dpr的值
  • 给<html>元素添加font-size属性,并且动态改写font-size的值

在main.js中引入amfe-flexible

import "amfe-flexible"


amfe-flexible 等价代码

// import '@/utils/rem.js'
?
// 在utils文件夹下创建rem.js
// 设置 rem 函数
function setRem() {
    // 1920 默认大小16px; 1920px=120rem ;每个元素px基础上/16
    const screenWidth=1920
    const scale=screenWidth / 16
    const htmlWidth=document.documentElement.clientWidth || document.body.clientWidth
    // 得到html的Dom元素
    const htmlDom=document.getElementsByTagName('html')[0]
    // 设置根元素字体大小
    htmlDom.style.fontSize=htmlWidth / scale + 'px'
  }
  // 初始化
  setRem()
  // 改变窗口大小时重新设置 rem
  window.onresize=function() {
    setRem()
  }


2.4. 配置vue.config.js

配置postcss-pxtorem ,可在vue.config.js、postcsssrc.js、postcss.config.js、其中之一配置,权重从左到右降低,没有则新建文件,只需要设置其中一个即可.

/***
注意点:
(1)rootValue根据设计稿宽度除以10进行设置,这边假设设计稿为1920,即rootValue设为192;
(2)propList是设置需要转换的属性,这边*为所有都进行转换。
***/
module.exports=function(){
    devServer:{
        port:3000,
        open:true
    },
    //rem配置
    css: {
        loaderOptions: {
         postcss: {
            plugins: [
              require('postcss-pxtorem')({
                  rootValue: 192, //根元素字体大小
                  propList: ['*'], //可以从px转换为rem的属性,匹配正则
                  // unitPrecision:5, //允许rem单位增长的十进制数字
                  // replace:true, //替换包含rems的规则,而不添加后备
                  // mediaQuery:false, //允许在媒体查询中转换px
                  // minPixelValue:0, //设置要替换的最小像素值
                  // selectorBlackList:[], //忽略转换正则匹配项
                  // exclude:/node_modules/i  要忽略并保留为px的文件路径
              })
            ]
         }
       }
    },
}


// 效果展示 在html上增加根font-size
<html lang="en” style="font-size: 192px;class="light-themes">


2.5. 总结

2.5.1 注意事项:

1. 不能使用行内样式

对于行内样式,阿里手淘并不能将px转rem,所以对于需要自适应的样式,如font-size、width、height等请不要写在行内。同理,对于不需要转化的样式可以写在行内,或者使用PX(大写)作为单位。

暂未找到可以转行内rem的插件,可根据下面地址的方式自己实现(未验证是否可行)。blog.csdn.net/weixin_3961…

2. 字号不使用rem

我们都知道chrome的最小显示的字体是12px,如果字体用rem,计算出来小于12px,那么就也会以12px显示,而且我们不希望出现13px或者15px这样的奇葩尺寸,所以字体最好是用PX(大写)来表示,至于适应,我们可以写媒体查询。

.item {
    border-bottom: 1PX #8d8d8d dashed;
    font-size: 12PX;
    line-height: 16PX;
    @media screen and (min-width: 576PX) {
        font-size: 14PX;
        line-height: 18PX;
    }
    @media screen and (min-width: 768PX) {
        font-size: 16PX;
        line-height: 28PX;
    }
    @media screen and (min-width: 992PX) {
        font-size: 16PX;
        line-height: 32PX;
    }
    @media screen and (min-width: 1200PX) {
        font-size: 18PX;
        line-height: 64PX;
    }
}
?
PC端响应式媒体断点:
?
```css
   @media (min-width: 1024px){
    body{font-size: 18px}
   } /*>=1024的设备*/
?
   @media (min-width: 1100px) {
    body{font-size: 20px}
   } /*>=1100的设备*/
   @media (min-width: 1280px) {
    body{font-size: 22px;}
   } /*>=1280的设备*/
?
   @media (min-width: 1366px) {
    body{font-size: 24px;}
   }  
?
   @media (min-width: 1440px) {
     body{font-size: 25px !important;}
   } 
?
   @media (min-width: 1680px) {
    body{font-size: 28px;}
   } 
   @media (min-width: 1920px) {
    body{font-size: 33px;}
   } 
```
?
?


2.5.2 测试反馈:

已测试屏幕尺寸:1920*1080 、1366 * 768

问题:屏幕缩小,网页缩放,效果与原1920*1080不一致

//  仅在移动端时候生效,或者浏览器手机模式
//  整体缩放自适应解决方案(阿里团队高清方案)
! function (e) {
    function t(a) {
      if (i[a]) return i[a].exports;
      var n=i[a]={
        exports: {},
        id: a,
        loaded: !1
      };
      return e[a].call(n.exports, n, n.exports, t), n.loaded=!0, n.exports
    }
    var i={};
    return t.m=e, t.c=i, t.p="", t(0)
  }([function (e, t) {
    "use strict";
    Object.defineProperty(t, "__esModule", {
      value: !0
    });
    var i=window;
    t["default"]=i.flex=function (e, t) {
      var a=e || 100,
        n=t || 1,
        r=i.document,
        o=navigator.userAgent,
        d=o.match(/Android[\S\s]+AppleWebkit/(\d{3})/i),
        l=o.match(/U3/((\d+|.){5,})/i),
        c=l && parseInt(l[1].split(".").join(""), 10) >=80,
        p=navigator.appVersion.match(/(iphone|ipad|ipod)/gi),
        s=i.devicePixelRatio || 1;
      p || d && d[1] > 534 || c || (s=1);
      var u=1 / s,
        m=r.querySelector('meta[name="viewport"]');
      m || (m=r.createElement("meta"), m.setAttribute("name", "viewport"), r.head.appendChild(m)), m
        .setAttribute("content", "width=device-width,user-scalable=no,initial-scale=" + u + ",maximum-scale=" +
          u + ",minimum-scale=" + u), r.documentElement.style.fontSize=a / 2 * s * n + "px"
    }, e.exports=t["default"]
  }]);
  flex(100, 1);


2.5.3其他问题:

  1. 如果没效果,查看根元素是否添加上了fongt-size,为添加的话查看css预处理器,如果是sass改成node-sass;我这边使用的版本为:
“node-sass”: “^4.9.0”,
“sass-loader”: “^7.1.0”


  1. 大屏改进方案:
  2. 限制rem的最大值
  3. 通过媒体查询,限制内容最大宽度


作者:幸运_
链接:https://juejin.cn/post/7278646930174165050