Viewport那些事(三)

来源:互联网 发布:linux ssh命令 端口 编辑:程序博客网 时间:2024/04/29 22:22
再谈layout viewport

     根据前面的介绍,对于桌面浏览器来说,可以认为viewport的大小始终等于窗口的大小,并且是以CSS像素为单位,document.documentElement.clientWidth/Height和window.innerWidth/Height这两对属性的区别仅仅在于前者不包含滚动条的大小而后者包含。如果用户放大网页,那么以CSS像素为单位的浏览器窗口会变小,viewport也会变小。
     而对于移动浏览器来说,作者引入了两个viewport的概念,一个layout viewport,是页面排版是参考的大小,另一个是visual viewport,是用户可视的区域,都是以CSS像素为单位。 George Cummins用拿着边框看画的比喻生动地描述了这两个viewport的区别。
     其实,我们认为桌面浏览器也可以引入这两个viewport的概念,只是需要加上一个限制条件,桌面浏览器的layout viewport的大小始终和visual viewport的大小相等。但是,visual viewport其实还包含了滚动偏移的信息。

Fix元素的排版
     根据前面的介绍,网页排版是以layout viewport的宽度为标准来排版。还是以这个包含蓝色banner条的网页为例,这里蓝条的宽度为width:100%,所以它根据viewport的宽度来排版,在桌面浏览器上viewport的宽度就是窗口的宽度,而这时如果网页在窗口之外还有内容,滚动横向滚动条,就会发现蓝条的宽度固定为窗口的宽度。
     
     那么,如果蓝条的position属性为fixed又会是怎样呢?


     从上图中我们发现,position:fixed; width:100%的蓝条判断宽度依旧是窗口的宽度,并且排版的起始坐标也是相对于窗口的,这里我们可以认为fixed元素是以visual layout为参考来排版的,只是对于桌面浏览器来说layout viewport和visual viewport的大小始终是相等的,都等于窗口的大小。
     那么对于移动浏览器来说又是怎么样的呢?我们知道无论是旋转屏幕,缩放页面,移动浏览器的layout viewport大小都是固定不变的(width=device-width情况除外),而visual viewport会随着页面的缩放,屏幕旋转和滚动发生变化。
     于是,我们就会发现移动浏览器上fixed元素和其它元素的排版宽度不一致的现象。我用Ipad上的Safari测试如下页面:

<html>
    <head>
        <style>
            body {
                height:2000px;
            }
            div#overflow {
                width:2000px;
                height:50px;
            }
            div#relative {
                width:100%;
                height:50px;
                background-color:green;
            }
            div#fix {
                width:100%;
                height:40px;
                top:200px;
                left:0px;
                background-color:yellow;
                position:fixed;
                text-align:center;
            }
            div#fix div {
                width:100px;
                height:40px;
                background-color:blue;
                position:relative;
                display:inline-block;
            }
        </style>
    </head>
    <body>
        <div id="overflow">
        </div>
        <div id="relative">
        </div>
        <div id="fix">
            <div>
            </div>
        </div>
    </div>
    </body>
</html>

     其中,绿条是position:static的元素,它的宽度为width:100%;黄条是position:fixed的元素,它的宽度也是width:100%,并且在它下面放了一个居中的蓝色方块。
当缩放比例为1时,layout viewport和visual viewport相等,两个元素排版的宽度也是一样:


     此时window.innerWidth = document.documentElement.clientWidth

     而缩小页面时,layout viewport保持不变,visual viewport变小。这时,页面的排版结果就变成了如下样子:


     此时window.innerWidth > document.documentElement.clientWidth

     可以看到,position:fixed元素排版是以visual viewport为标准,而其它元素排版时是以layout viewport为标准。
     从w3c上fixed元素的定义也可以看出,fixed元素的排版应该是相对于这里提到的visual viewport概念:
Fixed positioning is really just a specialized form of absolute positioning; elements with fixed positioning are fixed relative to the viewport/browser window rather than the containing element; even if the page is scrolled, they stay in exactly the same position inside the browser window.

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 菜把下水道堵了怎么办 一楼厕所堵了怎么办 农村房屋确权有争议怎么办 盲审一个没过怎么办 本科生论文盲审不过怎么办 本科盲审没通过怎么办 一篇论文多次引用著作怎么办 学生毕业后改名学籍怎么办 大学毕业后改名字后学籍怎么办 考科目三下暴雨怎么办 挂科太多拿不到毕业证怎么办 挂科太多不给毕业证怎么办 大专毕业拿不到毕业证怎么办 高考差一分二本怎么办 3个月宝宝大小眼怎么办 华东交大理工学院没有评教怎么办 学校断4g网怎么办 学校移动4g网卡怎么办 没上专科线怎么办福建 联考没过本科线怎么办 拍婚纱拍的脸歪怎么办? 老婆彻底寒心要离婚怎么办 手机被同学偷了怎么办 钱被同学偷了怎么办 上班穿皮鞋脚疼怎么办 高跟靴子买大了怎么办 我怀了第三个小孩怎么办? 离婚前把钱花了怎么办 对谈对象有压力怎么办 和对象感情淡了怎么办 孩子处对象学习下降怎么办 孩子高三成绩差怎么办 老妈怨气太重怎么办 广东小高考有d怎么办 高考考生档案袋有个小洞怎么办 江苏省考生出省后小高考成绩怎么办 江苏小高考三D怎么办 小高考补考没过怎么办 理科高考200多分怎么办 高考没考过200分怎么办 电子手表指针不走了怎么办