Weui是什么
WeUI 是一套同微信原生视觉体验一致的基础样式库,由微信官方设计团队为微信内网页和微信小程序量身设计,令用户的使用感知更加统一。简单的理解就是有一套自己的样式规范和一组常用的JS插件可供使用,可以满足65-70%的移动页面的开发。
WeUI页面层级
用于规范WeUI页面元素所属层级、层级顺序及组合规范。分别为内容层,菜单层,遮罩层和弹窗内容层。
部分结构源码解读
以官方demo为例,依次为body(无定位-高度100%)>container(absolute-固定定位-限制y轴)>page。内容层class为page(absolute-固定定位-Y轴不限)。这个结构会导致部分页面滚动类的插件$(window).on(“scroll”)失效。因为实际的滚动层为page。
菜单层官方DEMO则是使用的tab布局。层级依次为page__bd>weui-tab>weui-tab__panel | weui-tabbar(菜单层) 。且weui-tab使用的flex布局并flex-direction: column(元素内容垂直排列)。weui-tab__panel 则是 flex:1,scrool为auto(保证内容可以完全输出切不影响底部的菜单层)。weui-tabbar则使用绝对定位,这样可以保证菜单层一直高于内容层。
遮罩层和弹窗内容层则是分别对应#dialogs(在page内与page__bd同级)>weui-mask(fixed-固定定位-1000)和weui-dialog | weui-actionsheet | weui-half-screen-dialog (fixed-固定定位-5000)等。固定定位保证了内容能完全覆盖在菜单层和内容层。Js部分则是更多的使用了fadeIn和fadeOut,先对的简单粗暴。
weui样式组件
样式组件包含了大部分网页所需的表单,按钮,输入框。以及grid布局结构,徽章等样式。这里就不过多的赘述了。、
分享一些CSS的黑科技部分吧。首先是0.5px的border。weui的解决方案是
content: " "; position: absolute; left: 0; top: 0; right: 0; height: 1px; border-top: 1px solid rgba(0,0,0,0.1); border-top: 1px solid var(--weui-FG-3); color: rgba(0,0,0,0.1); color: var(--weui-FG-3); -webkit-transform-origin: 0 0; transform-origin: 0 0; -webkit-transform: scaleY(0.5); transform: scaleY(0.5); left: 16px; z-index: 2;
简单来说就是y轴缩放了0.5倍,将1px缩小为了0.5px。
还有现在流行的深夜模式则是使用了data-weui-theme=”dark” or data-weui-theme=”light“,并且还使用到了CSS变量 赋予深夜模式和白天模式不同的色值。这算是现在主流的解决方案,但是个人不常用深夜模式,因为觉得意义不大。
然后是图标,怎么使用图标字体。weui则是简单粗暴的使用了-webkit-mask-image,图片都是base64转过的图。而且提前设置了图标的大小尺寸。如果未设可能导致div显示不出来。
example.js部分源码解读
首先是图片预加载。
function preload() { $(window).on('load', () => { const imgList = [ './images/layers/content.png', './images/layers/navigation.png', './images/layers/popout.png', './images/layers/transparent.gif', ]; for (let i = 0, len = imgList.length; i < len; ++i) { new Image().src = imgList[i]; } }); }
还有就是移动页面点击延迟修复
function fastClick() { const supportTouch = (function () { try { document.createEvent('TouchEvent'); return true; } catch (e) { return false; } }()); const _old$On = $.fn.on; $.fn.on = function () { if (/click/.test(arguments[0]) && typeof arguments[1] === 'function' && supportTouch) { let touchStartY; const callback = arguments[1]; _old$On.apply(this, ['touchstart', function (e) { touchStartY = e.changedTouches[0].clientY; }]); _old$On.apply(this, ['touchend', function (e) { if (Math.abs(e.changedTouches[0].clientY - touchStartY) > 10) return; e.preventDefault(); callback.apply(this, [e]); }]); } else { _old$On.apply(this, arguments); } return this; }; }
以及CSS结构导致的Android 手机下输入框获取焦点时, 输入法挡住输入框的 bug
function androidInputBugFix() { if (/Android/gi.test(navigator.userAgent)) { window.addEventListener('resize', () => { if (document.activeElement.tagName == 'INPUT' || document.activeElement.tagName == 'TEXTAREA') { window.setTimeout(() => { document.activeElement.scrollIntoViewIfNeeded(); }, 0); } }); } }
总结
weui是一套不错的移动端CSS基础结构,只能满足基础样式统一。如果做复杂的交互等,还是有很多需要补充的地方,虽然之前有jquery weui 但是感觉功能上还是不够用,比如幻灯片,电梯楼层,视频播放等,这些都不满足,其他大厂则是基于vue或React,出的同样有很多优秀框架,例如阿里的 ant design 和 京东的 NutUI 还有 美团的 elment 都是不错的解决方案。