当前位置: 首页 > Web前端 > CSS

记一个傻问题(cssenv)

时间:2023-03-30 18:03:48 CSS

去年11月中旬,随着有赞VantWeapp库1.0版本的正式发布,我们的小程序也立刻按照官方的步骤开始升级依赖库。但是在微信开发者工具中发现VantWeapp对苹果的底边适配消失了。在不了解cssenv的实际作用和开发工具适配的情况下,胡乱发了一个issue,记录在这里,以备日后参考和学习。safe-area其实因为我之前的工作主要集中在js和pc上,而忽略了css和移动端,所以并没有深入了解这个safearea。面对新手机的刘海和胡须,开发移动端的小伙伴不得不适应手机机型。如果当前使用的界面是整屏,则当前显示会被遮挡。当然,其实对于小程序来说,大多数情况下是不需要考虑上面的刘海的。一方面是因为现在小程序的navigationBar已经实现了适配的功能,不需要考虑头部的问题。另一方面,小程序在没有特殊要求的情况下不需要横屏显示。但是对于底部的小胡子,我们需要给它一个34px的高度。在1.0版本之前,VantWeapp的适配是这样的。以下代码相对于源码有所改动,但基本逻辑是在组件中获取当前手机信息。//缓存数据letcache=null;//获取安全区域的数据(带缓存)functiongetSafeArea(){returnnewPromise((resolve,reject)=>{if(cache!=null){resolve(cache);}else{wx.getSystemInfo({success:({model,statusBarHeight})=>{constdeviceType=model.replace(/\s/g,'-');constiphoneNew=/iphone-x|iPhone11|iPhone12/i.test(deviceType);cache={isIPhoneX:iphoneNew,statusBarHeight};resolve(cache);},fail:reject});}});}//提供外部函数调用exportconstsafeArea=({safeAreaInsetBottom=真,safeAreaInsetTop=false}={})=>Behavior({properties:{safeAreaInsetTop:{type:Boolean,value:safeAreaInsetTop},safeAreaInsetBottom:{type:Boolean,value:safeAreaInsetBottom}},lifetimes:{attached():void{getSafeArea().then(({isIPhoneX,statusBarHeight})=>{//当前数据中有判断数据this.setData({isIPhoneX,statusBarHeight});});}}});Behavior相当于Vue中的mixin,提供了isIPhoneX的数据,我们把代码也复制过来,以便在业务中使用。具体可以参考Component构造函数,方便小程序自身开发。env,为了获取safe-area可用空间,我们要写很多js代码判断当前手机型号,然后通过data驱动在wxml中添加css。单从代码可维护性的角度来说,为了处理safe-area,我们做了一些不必要的耦合,也增加了代码的复杂度。当前代码也无法处理未来可能出现的更多手机型号。因此,浏览器提供了另一个功能env来帮助我们处理这一切,但在此之前,我们需要使用meta让网页使用整个屏幕。刚开始拿到这个的时候我也是一头雾水。我不是说要用安全区吗?为什么我之前要平铺整个页面?后来发现如果没有这个属性,当前屏幕会在上下安全区域显示白条,对用户体验很没用。其实浏览器已经为我们做好了保留安全区的工作,但是我们一定不能满足于上面展示的样式。如果我来做设计,我可能会把网页分成多个部分,然后为每个部分编写css样式。但是那些大佬们可不这么想。他们只是让你填满页面,然后提供变量让你在网页的区域做功课。viewport-fit的初衷是为了适配智能手表的网页显示,但是最早被苹果用在了iPhoneX上(翻看css的历史,你会发现我们在业务中使用的很多功能本来就是目的根本不是解决手头的问题)。告诉浏览器使用整个屏幕后,我们可以结合env进行适配。在不兼容env()的浏览器中,规则会被自动忽略。/*使用safe-area-inset对应竖屏的上下,横屏的左右*/env(safe-area-inset-top);env(safe-area-inset-right);env(safe-area-inset-bottom);env(safe-area-inset-left);/*如果当前浏览器没有提供safe-area-inset-top,则退回到20px*/env(safe-area-inset-top,20px);env(safe-area-inset-right,1em);env(safe-area-inset-bottom,0.5vh);env(safe-area-inset-left,1.4rem);.console{填充:12px;padding-left:env(safe-area-inset-left);padding-right:env(safe-area-inset-right);}任何提议都不是一蹴而就的。在ios11中,我们是通过constant来控制的。为了兼容性,我们必须使用以下代码:.console{/*iOS11.0*/padding-bottom:constant(safe-area-inset-bottom);/*iOS11.2*/padding-bottom:env(safe-area-inset-bottom);}当然,常量这个词我认为是命名的“错误”。命名上应该对应cssvar,但是功能意义上没有this。而env更符合现在的语义。我也有理由相信未来的env可以提供更多的变量来辅助开发。鼓励如果您觉得这篇文章不错,希望您能给我一些鼓励,帮我在我的github博客下star。博客地址参考文档DesigningWebsitesforiPhoneXMDNviewport-fithttps://drafts.c??sswg.org/css-...cssenv兼容iphonex刘海的正确姿势