一、N多的唠哩唠叨CSS3中一些新的单位早在去年春暖花开的时候就介绍了,参见:CSS长度值及时间、频率、角度单位。显然,其中就提到了本文要感叹的单位vw, vh,见下图: 不过“我看见你”和“我触碰你”是不一样的。正好,机缘巧合,最近又与这两个单位想见。大致琢磨了下,貌似vh这个单位可以实现我以前曾希望实现的的整体高度自适应布局。想到这里,自己不由得小兴奋了下,于是决定抽时间研究研究(虽然最近整iPad忙得屁股尿流~~)。 然而…… //zxx: 先卖个关子,一点一点唠叨来~~ vw, vh这个可用来实现动态布局的单位到底潜力如何?我不想直接吐露;请跟随我的学习印记以及心理历程一起去寻找答案吧~~ 二、需要提前知道的兼容性
著名的CSS属性可用性查询网站caniuse给出了具体的兼容性表,点击这里查看。 因此,本文后面要展示的N个demo,就没有必要再低版本的IE浏览器上查看了~~ 三、明确含义看到上图黄色背景标示的文字(“视窗”用“视区”一词代替更恰当):
我的第一反应是:如果视区宽度是 是浏览器内部宽度大小( 每当我疑惑的时候,我不是去找个“我觉得应该是”的解释,而是,新建个HTML页面,像学生时代做生物实验般,多条件对比验证之。 为了便于其他同行的快速理解,测试的demo页面我特意添加了交互,您可以狠狠地点击这里:vw所谓视窗何意?demo 下图为在IE9浏览器下默认打开的效果: 显然,这里的“视区”不可能是浏览器外部的宽度,计算值不匹配。 我们改变浏览器的宽度,然后会看到: 至此,真相大白,“视区”所指为浏览器内部的可视区域大小,即 修改 注:一般情况下,Chrome浏览器浏览器内外宽度是一样的(因为浏览器左右无边框);加上浏览器大小变小时图片尺寸不渲染的bug,因此,上demo最佳测试浏览器是IE9. // zxx: 不容易啊,IE系终于勃起了一把~~ 四、承上启下视区相关单位 首先,很容易想到的是,宽度的自适应布局,例如,两栏1:3的宽度自适应布局: .sidebar { width: 25vw; float: left; } .main { width: 75vm; float: right; } 但是,block水平元素本身具有自适应性,加上这里的 我们需要想的是其他一些只能 五、场景之:元素的尺寸限制我们应该都做过或见过这样的交互:点击下图,弹框查看原始大图;或者一屏内(不能有滚动条)大图幻灯片浏览。这类需求让人头疼的地方之一就是原始大图的尺寸限制问题——因为很有可能图片过大,尼玛一屏显示器区域不够放,我们需要对其进行缩放处理。例如:点击这里查看(无论浏览器尺寸多小,图片永远在一屏内显示)。 这类限制的实现,在当下,需要获得图片的原始大小,以及浏览器内部尺寸,算大小,算比例等,算是比较折腾的。 但是, img { max-height: 90vh; } 您可以狠狠地点击这里:vw, vh与图片的尺寸限制demo 例如,在暂未支持 连弹框一起被废掉了! 而支持 IE浏览器这回终于是“媳妇熬成婆”了,不容易,大家鼓掌…… 相关图片限制CSS如下: .vw_vh_img { max-width: 90vw; max-height: 90vh; } 注:demo页面使用的弹框脚本就是之前“seajs使用示例及spm合并压缩工具”一文中展示的最终脚本。 六、视区覆盖以及边界定位既然 拿视区覆盖举例,如果我定义一个元素的高宽如下: .element { width: 100vw; height: 100vh; } 然后,再将其定位到视区左上角,岂不是可以实现视区的完整覆盖;我立马想到了弹出框的半透明覆盖层。您可以狠狠地点击这里:vw, vh视区完全覆盖与纯CSS弹框 建议在Chrome20+浏览器下查看效果(因为有range控件),点击demo页面按钮,则半透明覆盖层显现了——完整覆盖: 吐槽:
正如上面所提到的,某些情况下, 您可以狠狠地点击这里:vh, vw等同百分比单位测试demo //zxx: 我这里更多地是为了演示,其实要实现效果,最简单就是 关键CSS代码如下: { height: 30px; margin-top: -30px; position: fixed; top: 100%; top: 100vh; left: 5%; left: 5vw; right: 5%; right: 5vw; } 代码含义很简单,支持 然后各个浏览器测试发现,效果是一模一样的(不支持position: fixed的IE6就当它不存在吧),固定在视区底部,不随滚动条滚动的空白工具栏: 说实话,原本第一眼看到单位 在制作高宽限制demo的时候,我还觉得,应该是可以的。尼玛,当我做覆盖以及定位这两个demo的时候,心一下子凉下去了:
于是,我下面所设想的应用场景就会脱离宽度,脱离绝对定位元素,会是什么呢?? 七、场景之:Office Word效果我们可以把web页面做得像Office文档那样,一屏正好一页;拖动滚动条,我们可以一直往下看到最后一页。 如果只借助CSS,这种效果绝对定位是实现不了的。因为其top值是动态的(100%, 200%, 300% …),必须借助JavaScript才能实现。而使用 您可以狠狠地点击这里:vh单位模拟office word效果demo 建议使用Chrome20+浏览器查看demo,IE9浏览器下背景图片的vh单位定位似乎有bug! 您会看到大致如下的效果(下图为手动改小浏览器高度后的效果,实际效果更佳): 相关CSS代码如下: page { display: block; height: 98vh; width: 69.3vh; margin: 1vh auto; padding: 12vh; border: 1px solid #646464; box-shadow: 0 0 15px rgba(0,0,0,.75); box-sizing: border-box; background: url(office/bl.png) no-repeat 8vh 88vh, url(office/br.png) no-repeat 59vh 88vh, url(office/tl.png) no-repeat 8vh 8vh, url(office/tr.png) no-repeat 59vh 8vh; background-color: white; position: relative; } page:after { content: attr(data-page); color: graytext; font-size: 12px; text-align: center; bottom: 4vh; position: absolute; left: 10vh; right: 10vh; } HTML代码如下: <page></page> <page></page> <page></page> JavaScript代码为创建data-page属性值,如下: var elePages = document.querySelectorAll("page"), lenPage = elePages.length; for (var i=0; i<lenPage; i+=1) { elePages[i].setAttribute("data-page", "第 "+ (i+1) +" 页,共 "+ lenPage +" 页"); } 说明:
八、场景之:水平时间轴水平方向上的流体布局,正在琢磨折腾中,有不少技术难点,稍等几天…… 下图为demo雏形截图,其中,左上角第一个已经成型的垂直布局显然要调整成水平方向型的,具体如何操作,请等我再好好想想,您也可以一同思考! 补充于2016年8月8日
九、结语视区相关单位除了文章多次提到的 补充: 自从上次写了关于CSS学习瓶颈的文章后,还是有不少人询问我,说自己确实觉得有问题,需要突破,不知该从何下手? 以我个人,以本文的内容举例:
多花点功夫,多些想法(感性认知,如果这样……或者那样……),多实践实践(制作demo),多总结总结(写作),再深入延伸延伸(水平方向流体布局 → 水平时间轴);久而久之,水平自然大幅提升,瓶颈自然会突破。 对于技术文章,技术本身有时候是次要的;反而是一些想法,观点会给人以更长远以及持久的积极影响。 本文尽量从我自己,以第一人称来叙述,从前到后,基本上就是自己平时学习新东西的套路。本文的内容从技术层面讲,确实是薄纸一张;但是,希望自己平时的学习套路,思考方式,实际做法等能够为初入前端的新人们一些启示。 文章最后提到的,水平时间轴实现,如果最近实践效果不错,我可能会新开一篇文章,重点介绍,因为我觉得应该会比较有趣! |
|
来自: 昵称57256554 > 《web框架》