rem布局 html,移动端h5之rem布局/px2rem

rem布局之媒体匹配

最早的时候用的rem适配方法,通过手动设置媒体查询对不同设备进行设置font-size

// 自适应

// ------------------------

html{

font-size: 38px;

}

@media only screen and (min-width: 320px) {

html {

font-size: 42.666px !important;

}

}

@media only screen and (min-width: 360px) {

html {

font-size: 48px !important;

}

}

@media only screen and (min-width: 375px) {

html {

font-size: 50px !important;

}

}

@media only screen and (min-width: 414px) {

html {

font-size: 55.2px !important;

}

}

@media only screen and (min-width: 480px) {

html {

font-size: 64px !important;

}

}

@media only screen and (min-width: 560px) {

html {

font-size: 74.666px !important;

}

}

@media only screen and (min-width: 640px) {

html {

font-size: 85.333px !important;

}

}

@media only screen and (min-width: 720px) {

html {

font-size: 96px !important;

}

}

@media only screen and (min-width: 750px) {

html {

font-size: 100px !important;

}

}

@media only screen and (min-width: 800px) {

html {

font-size: 106.666px !important;

}

}

@media only screen and (min-width: 960px) {

html {

font-size: 128px !important;

}

}

当然这是很古老的方法,可以看出来我们的设计稿是750px的,以750为基准设置font-size为100

我们可以看出这个方法通过人为比例计算,不能做到设备之间很好的覆盖有很大误差

rem布局之自动设置fontsize

所有有了下面这个根据屏幕尺寸自动设置font-size的方法,直接贴代码

(function (doc, win) {

var docEl = doc.documentElement,

resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize',

recalc = function () {

var clientWidth = docEl.clientWidth;

if (!clientWidth) return;

if(clientWidth>=640){

docEl.style.fontSize = '100px';

}else{

docEl.style.fontSize = 100 * (clientWidth / 640) + 'px';

}

};

if (!doc.addEventListener) return;

win.addEventListener(resizeEvt, recalc, false);

doc.addEventListener('DOMContentLoaded', recalc, false);

})(document, window);

这段代码的大意是:

如果页面的宽度超过了640px,那么页面中html的font-size恒为100px,否则,页面中html的font-size的大小为: 100 * (当前页面宽度 / 640)

但是如果ui出的图是750px的你也要适当调整一下,为了方便计算也可以调整宽度

我们以设计稿为640px为基准

width:100px;

width:1rem;//转换计算后为1rem

e96ccb603a50

iphone5-1.png

e96ccb603a50

iphone6-1.png

rem布局之开阔视野

该方案使用相当简单,把下面这段已压缩过的 原生JS(仅1kb) 放到 HTML 的 head 标签中即可(注:不要手动设置viewport,该方案自动帮你设置)

这是阿里团队的高清方案布局代码,所谓高清方案就是根据设备屏幕的DPR(设备像素比,又称DPPX,比如dpr=2时,表示1个CSS像素由2个物理像素点组成)** 动态设置 html 的font-size, 同时根据设备DPR调整页面的缩放值,进而达到高清效果**

关于像素请进

此方案也是默认 1rem = 100px,所以你布局的时候,完全可以按照设计师给你的效果图写各种尺寸啦。

e96ccb603a50

iphone5.png

e96ccb603a50

iphone6.png

到这里大家和上面的对比应该有发现些什么,我们屏幕越大,像素越高,看到的应用越多

源码

'use strict';

/**

* @param {Number} [baseFontSize = 100] - 基础fontSize, 默认100px;

* @param {Number} [fontscale = 1] - 有的业务希望能放大一定比例的字体;

*/

const win = window;

export default win.flex = (baseFontSize, fontscale) => {

const _baseFontSize = baseFontSize || 100;

const _fontscale = fontscale || 1;

const doc = win.document;

const ua = navigator.userAgent;

const matches = ua.match(/Android[\S\s]+AppleWebkit\/(\d{3})/i);

const UCversion = ua.match(/U3\/((\d+|\.){5,})/i);

const isUCHd = UCversion && parseInt(UCversion[1].split('.').join(''), 10) >= 80;

const isIos = navigator.appVersion.match(/(iphone|ipad|ipod)/gi);

let dpr = win.devicePixelRatio || 1;

if (!isIos && !(matches && matches[1] > 534) && !isUCHd) {

// 如果非iOS, 非Android4.3以上, 非UC内核, 就不执行高清, dpr设为1;

dpr = 1;

}

const scale = 1 / dpr;

let metaEl = doc.querySelector('meta[name="viewport"]');

if (!metaEl) {

metaEl = doc.createElement('meta');

metaEl.setAttribute('name', 'viewport');

doc.head.appendChild(metaEl);

}

metaEl.setAttribute('content', `width=device-width,user-scalable=no,initial-scale=${scale},maximum-scale=${scale},minimum-scale=${scale}`);

doc.documentElement.style.fontSize = `${_baseFontSize / 2 * dpr * _fontscale}px`;

};

看到大漠写了一种关于viewport-vw-vh的适配方法,大家也可以看看相关资料

Viewport移动端适配

rem布局之px2rem

我们在写rem布局的时候发现,尽管我们设置了基准font-size,但是我们还是要去换选一下,有没有办法直接写px,让他自动换算成rem

有这样的需求当然我们也有解决方案

px2rem的原理:

e96ccb603a50

px2rem.png

官方例子 https://www.npmjs.com/package/postcss-px2rem

gulp脚手架下

安装gulp-px2rem-plugin模块

npm install gulp-postcss --save-dev

gulpfile.js文件内处理

var gulp = require('gulp');

var postcss = require('gulp-postcss');

var px2rem = require('postcss-px2rem');

gulp.task('default', function() {

var processors = [px2rem({remUnit: 75})];

return gulp.src('./src/*.css')

.pipe(postcss(processors))

.pipe(gulp.dest('./dest'));

});

vue-webpack下面

webpack官方有简单举例

npm install postcss-loader --save-dev

var px2rem = require('postcss-px2rem');

module.exports = {

module: {

loaders: [

{

test: /\.css$/,

loader: "style-loader!css-loader!postcss-loader"

}

]

},

postcss: function() {

return [px2rem({remUnit: 75})];

}

}

以下举例vue的写法,vue中以上webpack写法加载出错

在webpack.base中先处理css和postcss

{

test: /\.(css|scss)$/,

loader:"style-loader!css-loader!sass-loader!postcss-loader"

}

我们对px2rem写入vue-loader中

e96ccb603a50

vue-px2rem.png

var utils = require('./utils')

var config = require('../config')

var isProduction = process.env.NODE_ENV === 'production'

module.exports = {

//使用px-rem转换

postcss: [require('postcss-px2rem')({remUnit: 100})],

loaders: utils.cssLoaders({

sourceMap: isProduction

? config.build.productionSourceMap

: config.dev.cssSourceMap,

extract: isProduction

})

}

关于1px转换

这样一切看上去如此完美了,但是又有个大问题需要注意——1px的边框在转化为rem时,在andriod webview以及部分低版本ios webview 会看不到。处理方法——让1px在编译后,依然是1px

使用postcss-px2rem插件处理px时候,需要在使用时候注意每个属性后面的分号不能省略,默认是都转换为rem,

如若某个属性不需要转换为rem,需要按照dpr不同而分别设置大小,则在后面加上注释/px/,

如若需要原样输出,则在后面加上注释/no/,此处需要多加留意,对于刚接触的我们新手来说,是个坑啊!

.border_style{

border-color: @border_color;

border-style: solid;

border-width: 1px;/*no*/

}

我们知道现在iphone大多数型号都用上了retina屏,而retina屏的分辨率相较于普通屏幕增加了一倍,也就是说原来1个像素宽度的区域内可以塞进2个像素了。我们css写的1px是一个概念像素,在retina屏的实际设备上占了2px的位置。

而对于手机屏幕整体来说,一个标注了750宽的手机(iPhone6)在css中只需要375px就能表示

scale缩放

全能型写法

@media (-webkit-min-device-pixel-ratio: 2){

.border-bottom::after {

border-bottom-width: 1px;

}

.border:after {

content: ' ';

display: block;

position: absolute;

top: 0;

right: -100%;

bottom: -100%;

left: 0;

border: 0 solid #e1e1e1;

-webkit-transform-origin: 0 0;

transform-origin: 0 0;

pointer-events: none;

-webkit-transform: scale(.5);

transform: scale(.5);

width: 200%;

-webkit-box-sizing: border-box;

box-sizing: border-box;

}

}

满足一般需求可以使用这个

@media (-webkit-min-device-pixel-ratio: 2)

.border:after {

height: 1px;

content: '';

width: 100%;

border-top: 1px solid #e1e1e1;

position: absolute;

bottom: -1px;

right: 0;

transform: scaleY(0.5);

-webkit-transform: scaleY(0.5);

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/559576.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

消息已读未读的模型设计_阿里云技术专家分享:现代 IM 系统中消息推送和存储架构的实现...

前言IM 全称是“Instant Messaging”,中文名是即时通讯。在这个高度信息化的移动互联网时代,生活中 IM 类产品已经成为必备品,比较有名的如钉钉、微信、QQ 等以 IM 为核心功能的产品。当然目前微信已经成长为一个生态型产品,但其核…

移动端html5广告的优势,h5手机端开发的优势都有哪些呢

原标题:h5手机端开发的优势都有哪些呢现在是手机不离手的时代,可以说每个人都有一部甚至两部手机来打发日常的空余时间,那么你知道h5手机端开发的优势都有哪些吗?下面原创先锋小编给大家详细介绍下,想要了解的朋友一起来看看吧。…

园林景观cad_自学CAD太难?送你550张练习图纸,七天时间小白蜕变成大神

自学CAD太难?送你550张练习图纸,七天时间小白蜕变成大神俗话说:实践是检验真理的唯一标准。对于想要熟练CAD的朋友来说,最重要的就是练习!大量的练习!CAD画图是个熟能生巧的事情,练多了&#xf…

面条html5,使用 babel 全家桶模块化古老的面条代码

在最近的工作中,接手了一个古老的项目,其中的 JS 代码是一整坨的面条代码,约 3000 行的代码全写在一个文件里,维护起来着实让人头疼。想不通为啥之前维护项目的同学能够忍受这么难以维护的代码……既然现在这个锅被我拿下了&#…

cad批量打印快捷键_批量打印CAD图(无删减版)

前面两期小编出的PDF教程想必用了的人都觉得还不错吧?(此处应有掌声)上一期提到的CAD批量打印今天放出来了,擦亮眼睛往下看很多时候大批量的一堆图纸要输出,比如下面这个当然这批图纸并不多,也只是局部的,通常一个项目…

docker 容器之间通信_四、Docker 网络原理、分类及容器互联配置

本文是《Docker必知必会系列》第四篇,原文发布于个人博客:悟尘纪。上一篇:Docker必知必会系列(三):基于 Docker-registry/Nexus3 搭建本地仓库Docker 网络配置Docker 网络基本原理要实现网络通信&#xff0…

键盘与鼠标器是微型计算机上最常用的,2016年职称计算机考试WindowsXP考前预测试题5...

填空题1.3.5英寸磁盘的滑块小孔打开时,该盘只能(读),不能(写),称为(写保护)。2.软盘上的HD标记表示(双面高密度)。3.常用的双面高密度3.5英寸盘的容量为(1.44MB)。4.硬盘与软盘相比,具有(容量大)、(价格低)的特点。5.常见的光盘驱…

2020idea插件怎么同步_没有用过这些插件,别说你在用vscode

vscode 插件Rainbow Brackets编码过程中,尤其在我们使用js进行函数式编程时,代码里会有很多的花括号,想要保证它们对称十分困难,所以就出现了上面小粉同学的尴尬局面,相信很多人都遇到过类似的情况。Rainbow Brackets&…

python 删除特定行数据_怎么用 Python 做数据分析实例

01 生成数据表第一部分是生成数据表,常见的生成方法有两种,第一种是导入外部数据,第二种是直接写入数据。 Excel 中的文件菜单中提供了获取外部数据的功能,支持数据库和文本文件和页面的多种数据源导入。获取外部数据python 支持从…

html 地址 点击召唤高德,高德地图api 点聚合+海量点+点击事件(根据地区或坐标进行定位)...

javascript区划聚合海量点展现html,body,#container {width: 100%;height: 100%;margin: 0px;}#loadingTip {position: absolute;z-index: 9999;top: 0;left: 0;padding: 3px 10px;background: red;color: #fff;font-size: 14px;}#right {position: absolute;z-index: 9999;top…

python中集合运算_入门 | 一文带你了解Python集合与基本的集合运算

原标题:入门 | 一文带你了解Python集合与基本的集合运算 选自DataCamp 作者:Michael Galarnyk 参与:Geek Ai、思源 一般我们熟悉 Python 中列表、元组及字典等数据结构,但集合可能用得稍微少一点。但集合独特的元素唯一性与 O(1) …

python中文本文件r_Python如何读写文本文件

展开全部 1.open使用open打开文件后一定要记2113得调5261用4102文件对象的close()方法。比如可以用try/finally语句来确保最后1653能关闭文件。 file_object open(thefile.txt) try: all_the_text file_object.read( ) finally: file_object.close( ) 注:不能把op…

台式计算机性能清单是强制的吗,教你识别良心商家和奸商电脑配置清单区别以及如何选购台式电脑机箱...

我们想要组装一台电脑,由于隔行如隔山,无疑对硬件品牌型号都不太了解,会将自己的预算和大致的要求和商家说,而商家会根据预算与要求写具体的电脑配置清单,不同商家写出来的配置或多或少存在不同,含糊不清写…

mysql显示表已存在_MySQL数据库与数据表的相关操作

数据库相关操作:显示数据库:show databases;如果是0.00秒并不代表没有花费时间,而是时间非常短,小于0.01秒。创建数据库:Query OK表示创建成功,1行受到影响,处理时间为0、05秒。使用下面的命令查…

怎么用计算机算成250,万能计算器

彩票彩宝贝体彩排列五March 29, 2016彩票计划网站导航Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse ultrices egestas nunc, quis venenatis orci tincidunt id. Fusce commodo blandit eleifend. Nullam viverra tincidunt dolor, at pulvinar dui.…

android怎样判断插入数据是否成功_MySQL一个表的自增id用完了,背井大佬让我用这些姿势再往里插数据...

点击上方"码之初"关注,选择"设为星标"与精品技术文章不期而遇在之前有篇文章中,和大家探讨了在MySOL数据库中,一个表的自增id用完,再插入数据有什么问题?评论处 背井 公众号的大佬建议我另开一篇再…

计算机硬件系统教具,计算机硬件系统 (2)

计算机硬件系统 (2) (3页)本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦!9.9 积分计算机硬件系统克井一中杨致远教学目标:1、了解计算机的发展概况、特点以及种类2、理解计算机的工作原理3…

经典计算机实现量子逻辑门,量子计算机:对量子逻辑门的探讨

在分析了经典比特和量子比特的异同点之后,阐述了量子逻辑门的特点;然后具体介绍了几种常见的量子逻辑门:基本量子逻辑门,量子异或门,量子与门。最后又给出了更复杂的量子逻辑门的构建方法。维普资讯 http://doc.wendoc.com信息科学}J宋纳红侯丽敏科量子计算机&#…

命名空间中不存在名称_原木定制中不开裂的木材真的存在吗?

广大的读者朋友们大家好,之前壹信缅甸柚木高端全屋定制小编和大家讲解了为什么那么多人喜欢原木实木全屋定制护墙板,本文壹信小编将给大家讲讲原木整装中不开裂的木材真的存在吗。原木整装行业的从业人员都知道,最麻烦最让人担心的是木头的开…

go 字符串替换_Go语言爱好者周刊:第 64 期 — goup 这个工具了解下

这里记录每周值得分享的 Go 语言相关内容,周日发布。本周刊开源(GitHub:polaris1119/golangweekly),欢迎投稿,推荐或自荐文章/软件/资源等,请提交 issue 。鉴于大部分人可能没法坚持把英文文章看…