美文网首页
适配和缩放

适配和缩放

作者: skoll | 来源:发表于2023-02-25 17:43 被阅读0次

    rem适配

    1 .rem是css3新增的一个相对单位。是指相对于根元素的字体大小的单位

    function setRootRem() {
                const root = document.documentElement;
                /** 以iPhone6为例:布局视口为375px,我们把它分成10份,则1rem = 37.5px,
                 * 这时UI给定一个元素的宽为375px(设备独立像素),
                 * 我们只需要将它设置为375 / 37.5 = 10rem。
                */
                const scale = root.clientWidth / 10
                root.style.fontSize = scale + 'px'  
            }
            setRootRem()
            window.addEventListener('resize', setRootRem)
    //人为的把页面分成了10份。1/10作为根节点的fontSize。
    

    2 .根节点的font-size会随着设备的布局视口的宽度变化而变化,所以这里的元素宽度10rem永远等于当前布局视口的宽度,font-size也会随着设备变化而变化,
    3 .由于viewport单位得到众多浏览器的兼容,lib-flexible这个过渡方案已经可以放弃使用,不管是现在的版本还是以前的版本,都存有一定的问题。建议大家开始使用viewport来替代此方
    4 .问题 1.lib-flexible不能与响应式布局兼容

    1 .网页通过css媒介查询可视区域的宽度,在不同范围应用不同的样式,以便不同尺寸的设备上呈现最佳的界面效果
    2 .响应式布局的viewport要采用如下配置<meta name="viewport" content="width=device-width, initial-scale=1">
    3 .device-width指的是在移动设备下的宽度,在pc下这个属性是不生效的。
    4 .media query里的device-width 属性,始终指向的是设备的宽度,所以响应式布局查询要用到width属性,不用device-width属性没因为在桌面设备下,把浏览器窗口缩小的时候,device-width并不会发生改变,当调整浏览器窗口大小就看不到响应式的效果
    

    7 .默认1rem等于16px

    5 .问题2 :1px 边框在lib-flexible下如何处理。

    1 .大部分的手机分辨率很高,1个css像素,可能相当于2到3个物理分辨率像素,不像pc,一个css像素始终等于一个物理分辨率像素。
    .setTopLine(@c: #C7C7C7) {
        content: " ";
        position: absolute;
        left: 0;
        top: 0;
        width: 100%;
        height: 1px;
        border-top: 1px solid @c;
        transform-origin: 0 0;
        transform: scaleY(0.5);
    }
    //transform来缩放,而不是直接写小数
    

    6 .问题3,retina屏下的background-image

    1 .devicePixelRatio大于等于2.5的设备都会应用到3x图
    2 .其它设备都会应用到2x的图。
    

    7 .问题4 .无法响应系统字体大小

    1 .在微信或者其他可以设置字体大小的浏览器中,调整字体大小之后,位置错乱
    

    8 .问题5 .不兼容高倍屏的安卓手机。源码对于高倍安卓手机,一律按照1来处理
    9 .问题6 .不兼容iframe。即iframe中展示的内容依然使用的是css像素,在高倍屏下会出问题

    vw,vh适配

    1 .vw,vh是基于试图窗口的单位,将innerWidth,innerHeight等分为100份
    2 .1vw是1%的视觉窗口宽度

    viewport + px

    1 .开发时不需要关注设备屏幕尺寸的差异,直接按照设计稿上的标注进行开发,无需单位的换算
    2 .

    <meta name="viewport" content="width={设计稿宽度}, initial-scale={屏幕逻辑像素宽度/设计稿宽度}" >
    

    英屏幕尺寸

    1 .屏幕尺寸指的是屏幕对角线的长度,一般指的是英寸。一英寸就是一个拇指的宽度

    像素

    1 .计算机所能呈现信息的最小单位,就是显示屏上最小的点。
    2 .一个画面会包含成千上万的像素,每个像素都有自己的颜色信息,他们组合起来,就是一幅完整的画面

    屏幕分辨率

    1 .指的是一个屏幕由多少个像素点组成。单位是px

    css像素的改变

    1 .当用户缩放页面,css像素就会被放大,此时的css像素就会跨越更多的设备像素

    apple 手机适配

    1 .不同的屏幕尺寸,定义不同的基础值,然后还是使用px来做

    利用viewport 来做适配高倍屏展示的效果

    var metaEL= doc.querySelector('meta[name="viewport"]');
    var dpr = window.devicePixelRatio;
    var scale = 1 / dpr
    metaEl.setAttribute('content', 'width=device-width, initial-scale=' + scale + ', maximum-scale=' + scale + ', minimum-scale=' + scale + ', user-scalable=no'); 
    1物理像素等于1css像素
    

    1 .平时手机图片好像没遇到这种情况。目前只是在canvas渲染图片的时候,手机变模糊。
    2 .https://segmentfault.com/a/1190000003730246 基本是这样。之前自己在phaser 里面提取问题感觉还是有点问题,没有第一时间想到要这样来搜索问题
    3 .canvas 中绘制一张 300 x 90 的图片,并且要保证它在高清屏中不模糊。那么我们首先要准备一张 600 x 180 的图片
    4 .出现问题就是在一个canvas的500*300屏幕的里面渲染一张图片的时候,电脑上面的比手机上的清晰很多
    5 .解决方法:https://github.com/jondavidjohn/hidpi-canvas-polyfill 还是一个专门的包

    先放大 canvas,再用 CSS 将其限制回原始大小。
    
    一是将 canvas 的高和宽分别乘以 ratio 将其放大,然后又用 CSS 将高和宽限制成初始的大小;二是 hack canvas 中常用的函数,如:fillRect, clearRect, lineTo, arc 等,将它们的参数都乘以 ratio,以方便我们可以像以前那样使用这些方法,而不用在传参的时候手动乘以 ratio
    

    6 .那问题来了,webGL渲染图片的时候也会有这个问题么?

    1 .canvas 渲染和webGl渲染的区别?
    1 .Canvas就是画布,只要浏览器支持,可以在canvas上获取2D上下文和3D上下文,其中3D上下文一般就是WebGL,当然WebGL也能用于2D绘制,并且WebGL提供硬件渲染加速,性能更好
    2 .在不支持 WebGL 的情况下,只能使用 Canvas 2D api,注意这里的降级不是降到 Canvas,它只是一个画布元素,而是降级使用 浏览器提供的 Canvas 2D Api,这就是很多库的兜底策略,如 Three.js, PIXI 等
    3 .canvas是一个H5标签,作用是在网页上画图,但是只支持2D,不支持3D
    4 .WebGL是一种3D绘图标准,WebGL支持3D,且性能优于canvas
    5 .WebGL允许工程师使用JS去调用部分封装过的 OpenGL ES2.0标准接口去 提供硬件级别的3D图形加速功能
    三者的关系是 JavaScript -> WebGL -> OpenGL ->.... -> 显卡 并把最终渲染出来图形 呈现到Canvas
    

    7 .canvas

    1 .Canvas 是 HTML5 提供的一个特性,你可以把它当做一个载体,简单的说就是一张白纸。而 Canvas 2D 相当于获取了内置的二维图形接口,也就是二维画笔
    2 .
    

    8 .webGl

    1 .OpenGL是 底层的驱动级的图形接口(是显卡有直接关系的) 类似于 DirectX
    2 .但是这种底层的 OpenGL 是 寄生于浏览器的JavaScript无法涉及的
    3 .WebGL 允许工程师使用JS 去调用部分封装过的 OpenGL ES2.0 标准接口去 提供硬件级别的3D图形加速功能
    4 .webgl实际上用了canvas的一个3d渲染上下文,在绘制平面内容时,和canvas 2d相比,webgl更为直接的利用了gpu硬件,在某些场合,几乎可以摆脱cpu的限制,达到性能极致。
    

    9 .总结

    1 .Canvas就是画布,只要浏览器支持,可以在canvas上获取2D上下文和3D上下文,其中3D上下文一般就是WebGL,当然WebGL也能用于2D绘制,并且WebGL提供硬件渲染加速,性能更好
    2 .canvas让web具有绘图能力,webGL让canvas具有3D渲染能力
    

    出现模糊图片的原理

    1 .https://web.dev/canvas-hidipi/ 原文地址
    2 .

    vw方案的缺陷

    1 .使用margin的时候,很容易造成整体宽度超过100vw,影响布局效果.解决情况就是使用padding
    2 .高倍屏适配问题。高倍屏展示图片,1px边框都没有解决

    1 .1px,.5px的解决方法:伪元素 + transform scale的方法相比以上几种方案是比较简洁、可控好理解的方式,并且这种方式也支持设置圆角。在腾讯、京东的大部分移动端产品中大都采用的这种适配方案
    

    相关文章

      网友评论

          本文标题:适配和缩放

          本文链接:https://www.haomeiwen.com/subject/nfnfldtx.html