响应式排版和布局

1.最先接触的方法是根据不同的设备也设置html的font-size

html {
    font-size: 16px;
}
@media screen and (min-width: 600px) {
    html {
        font-size: 18px;
    }
}
@media screen and (min-width: 1000px) {
    html {
        font-size: 22px;
    }
}

2.第二种是最近了解到的vw,配合CSS3 calc计算实现动态字体大小效果。其实本来第二种想写js方法,但是有代码就放最后吧

例如,我们希望浏览器宽度在600px~1000px变化的时候,html根元素的font-size大小是18px~22px之间对应变化的,则可以:

html {
    /* iPhone6的375px尺寸作为16px基准,600px正好18px大小 */
    font-size: calc(100% + 2 * (100vw - 375px) / 225);
}
@media screen and (min-width: 600px) {
    html {
        /* 600px-1000px每100像素宽字体增加1px(18px-22px) */
        font-size: calc(112.5% + 4 * (100vw - 600px) / 400);
    }
}
@media screen and (min-width: 1000px) {
    html {
        /* 1000px往后是每100像素0.5px增加 */
        font-size: calc(137.5% + 5 * (100vw - 1000px) / 1000);
    }
}

3.第三个就是方法:js。依赖淘宝团队出的lib-flexible

<meta name="flexible" content="initial-dpr=2,maximum-dpr=3" />

iniital-dpr是把dpr强制设定为给定的值,而maximum-dpr则是给出一个最大的dpr限制,然后对其和系统的dpr做一个比较。

  (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 isOS93 = isIPhone && win.navigator.appVersion.match(/OS 9_3/);

            var devicePixelRatio = win.devicePixelRatio;
            if (isIPhone && !isOS93) {
                // 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;
            var height = docEl.getBoundingClientRect().height;
            //if (width / dpr > 540) {
            //width = 540 * dpr;
            //}
            var rem = width / 10;
            if(height < width) {
                rem = height /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‘] = {}));

参考:http://www.zhangxinxu.com/wordpress/2016/08/vw-viewport-responsive-layout-typography/

时间: 2024-10-14 11:51:07

响应式排版和布局的相关文章

懒人的响应式排版

本文由本人翻译自:http://webdesign.tutsplus.com/tutorials/the-lazy-persons-guide-to-responsive-typography--cms-22822 网站设计中争论最多的部门就是排版.在一个空白的页面放一个巨幅的标题会让你感觉自己像是一位极简抽象主义画家.但是将页面放到小一些的设备时会发生什么样的情况呢? 嗯,这效果看起来非常的糟糕. 这就是为什么我们需要用到响应式排版.我们需要让页面在遇到边缘时自己会调整.但没有人愿意去针对每一

实现响应式:flex布局+媒体查询@media

注意: 1. 这个案例,是我写vue项目修改的,所以思路同样适用于vue框架项目.2. 建议先把代码直接复制过去,先看一下效果. 3. 涉及到知识点,flex布局的属性配合使用 , @media媒体查询的语法 4.  给ul设置 flex-wrap: wrap , 一定要允许li可以换行,我在这个坑里,躺了好几分钟.5.  我写的时候,也花了不少时间,学的人应该更耐心些. <!DOCTYPE html> <html lang="en"> <head>

第二次讨论——响应式设计、布局技巧、css性能优化、css预处理

第二次讨论 [响应式设计] 集中创建页面的图片排版大小,可以智能地根据用户行为以及使用的设备环境(系统平台.屏幕尺寸.屏幕定向等)进行相对应的布局. 响应式布局: meta标签的实用:设置布局宽度等于设备宽度,布局viewport等于度量viewport <meta name="viewport" content="width=device-width,initial-scale=1"> [[布局]] [水平居中] 一.text-align和inline

响应式设计-VS-REM布局

水平有限,不对之处还请指出. [目前几种布局] 随着移动互联网的发展和微信的突起,移动端的响应式布局越来越重要了. 目前网站布局有以下几种: 1.定宽度布局 很多pc的网站都是定宽度布局的,也就是设置了min-width, 这样一来,如果小于这个宽度就会出现滚动条, 如果大于这个宽度则内容居中外加背景, 这种设计常见与pc端. 2.响应式布局 所谓响应式布局就是流式布局+媒体查询, 流式布局用来解决不同宽度的布局问题, 外加媒体查询,可以调整布局,例如大屏幕是布局1,小屏幕是布局2, 这种布局通

响应式Web设计 – 布局

写在前面 去年上半年,我开始着手推动项目中响应式设计的落地.以官网优化需求为契机,主动去做了响应式的页面设计,也说服了产品.设计和开发的相关同事一起把它上线落实,但不幸的是,由于各种方面的原因,比如,生搬硬套的PC模块,无差异化的设计使得移动端阅读不佳,导航兼容性有限等等原因,上线几个月后又悄然下线.我不禁反思,项目中是否应该推行响应式?今年年初重新启动了全站响应式项目,从产品.交互.视觉到开发,各个角色全方面参与了响应式项目,最终门户的页面实现全面响应式.在项目过程中有技术沉淀,也有不少的思考

HTML5移动优先的响应式动画网格布局模板

这是一款非常实用的HTML5响应式网格布局模板.该模板带固定侧边栏,侧边栏在小屏幕设备上会自动隐藏.右侧的所有文章以网格进行布局,每行的网格数量自动根据页面大小而改变.点击一篇文章后该文章会以动画的形式全屏放大. 效果演示:http://www.htmleaf.com/Demo/201504161689.html 下载地址:http://www.htmleaf.com/html5/html5muban/201504161688.html

响应式Web设计 - 布局

可扩展的布局 有一种流体布局的概念在早起web兴起的时,就开始盛行了.它的概念是说页面会根据浏览器窗口的变化进行更改,网站可以通过维护一套代码,保质一致性的设计.我这里强调的可扩展的布局也是基于这个概念,只是现在的方法多种多样,因此要强调页面布局的可扩展性. 可扩展的布局途径有很多,比如常见的百分比布局,以及一直未成为标准的栅格布局等等. 框架 就从这框架来说,以一个常见的可扩展的三栏布局为例,就有数十种方法,这里抛砖引玉举几个例子. 方法1: Demo1 方法2: Demo2 方法3: Dem

列表的响应式排版

效果展示:       一.每行固定个数:保证排版的美观 .list li{ width:20%;display:inline-block; *display:inline;*zoom:1;overflow:hidden; } 二.随页面宽度调整个数和大小:保证图文的可读性 .list li{ width:20%;display:inline-block; *display:inline;*zoom:1;overflow:hidden; } 1.媒体查询控制宽度 @media screen an

一个简单的响应式横向网格布局框架Responsive Grid System

网页设计中有一个怎么也绕不开的问题,那就是布局问题.一般来说,一个div可能会分割成很多部分,同样是横向分割成两部分,但是在不同的项目中,我们可能会用不同的css代码,网格系统其实就是为这一类似的问题提供一个统一的解决办法. 网格布局有很多,但是有很多非常复杂,往往无法二次开发.Responsive Grid System是国外的一个网站,他们提供了一种非常简单的实现.其实每一个前端开发人员都可以写出这样的框架,但是,从头开始也许会让很多人动力不足.这个框架代码很简单,对我而言,采用它的原因仅仅