移动端知识点

158 阅读1分钟

vw适配

vw 适配在 .postcssrc.js 中使用了 postcss-viewport-units,官方配置直接默认,该插件功能是给 CSS 的属性添加 content 的属性,配合 viewport-units-buggyfill 库给 vw、vh、vmin和vmax 做适配的操作,但是因为和伪元素冲突会导致引入第三方库和伪元素冲突,所以需要转化过程中我加入了过滤器,用来回避伪类选择器
"postcss-viewport-units":{  
    filterRule: rule => rule.selector.indexOf('::after') === -1 &&   
        rule.selector.indexOf('::before') === -1 &&   
        rule.selector.indexOf(':after') === -1 &&   
        rule.selector.indexOf(':before') === -1
}

1px细线

@mixin border-px($type: default, $color: #ebedf0, $radius: 0) {  
    position: relative;  
    &::after {  
        content: "";  
        box-sizing: border-box;  
        position: absolute;  
    @if $type == default {    
        top: 0;    
        left: 0;    
        width: 200%;    
        height: 200%;    
        border: 1PX solid $color;    
        border-radius: $radius;  
    } @else if $type == top {    
        top: 0;    
        left: 0;    
        width: 200%;    
        height: 1PX;    
        background: $color;  
    } @else if $type == bottom {    
        bottom: 0;    
        left: 0;    
        width: 200%;    
        height: 1PX;    
        background: $color;  
    } @else if $type == left {    
        top: 0;    
        left: 0;    
        width: 1PX;    
        height: 200%;    
        background: $color;  
    } @else if $type == right {    
        top: 0;    
        right: 0;    
        width: 1PX;    
        height: 200%;    
        background: $color;  
    } 
     transform: scale(0.5);  
    transform-origin: 0 0;  
    }
}

vconsole 调式

可使用 vconsole 组件调试手机移动端页面

混合开发

Android 与 h5 通过 bridge 传递消息,自己手动写的 json 数据可以在子线程传过来,通过 api 接口请求的数据需要主线程前端才可以接收到(前端自己请求 api 接口会出现 cookie 携带被拦截导致无法请求成功数据,所以使用 token 对用户验证比较好)

Android 会出现 echarts 图形不显示,可在 mounted 创建延时渲染 echarts 图形来解决

混合开发 app,在 vue 中使用 WebViewJavascriptBridge 来与 Android 和 ios 进行交互:

//iOS 交互声明
let flag = true;
function connectWebViewJavascriptBridgeIOS(callback) {  
    if (window.WebViewJavascriptBridge) {    
        return callback(window.WebViewJavascriptBridge)  
    }  
    if (window.WVJBCallbacks) {    
        return window.WVJBCallbacks.push(callback)  
    } 
     window.WVJBCallbacks = [callback]  
    let WVJBIframe = document.createElement('iframe')  
    WVJBIframe.style.display = 'none'  
    WVJBIframe.src = 'https://__bridge_loaded__'  
    document.documentElement.appendChild(WVJBIframe)  
    setTimeout(() => {    
        document.documentElement.removeChild(WVJBIframe)  
    }, 0)
}
//Android 交互声明
function connectWebViewJavascriptBridgeANDROID(callback) {  
    if (window.WebViewJavascriptBridge) {    
        callback(WebViewJavascriptBridge);  
    } else {    
        document.addEventListener(      
            "WebViewJavascriptBridgeReady",      
            function () {        
                callback(WebViewJavascriptBridge);      
            },      
            false    
        );  
    }
}
export default {  
    callhandler(name, data, callback) {    
        if(/(Android)/i.test(navigator.userAgent)){      
            connectWebViewJavascriptBridgeANDROID(function(bridge){        
                bridge.callHandler(name, data, callback)      
            })    
        }else if(/(iPhone|iPad|iPod|iOS)/i.test(navigator.userAgent)){      
            connectWebViewJavascriptBridgeIOS(function (bridge) {       
               bridge.callHandler(name, data, callback)      
            })    
        }  
    },  
    registerhandler(name, callback) {    
        if(/(Android)/i.test(navigator.userAgent)){      
            connectWebViewJavascriptBridgeANDROID(function(bridge){        
                if(flag){          
                    bridge.init(function(message, responseCallback) {            
                        callback(message, responseCallback)          
                    });          
                    flag = false;        
                }        
                bridge.registerHandler(name, function(data, responseCallback){          
                    callback(data, responseCallback)        
                })      
            })    
        }else if(/(iPhone|iPad|iPod|iOS)/i.test(navigator.userAgent)){      
            connectWebViewJavascriptBridgeIOS(function (bridge) {        
                bridge.registerHandler(name, function (data, responseCallback) {          
                    callback(data, responseCallback)        
                })      
            })    
        }      
    }
}