移动端常用开发tips

220 阅读3分钟

HTML

meta参数设置

//页面不设置缓存
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">  
//允许跨域
<meta http-equiv="Access-Control-Allow-Origin" content="*"> 

CSS

深度选择器重定义组件库样式

.cube-scroll-wrapper /deep/ .bscroll-indicator{
    background-color: #f5498a !important;
}

滤色

.getGray{
    -webkit-filter: grayscale(100%);
    -moz-filter: grayscale(100%);
    -ms-filter: grayscale(100%);
    -o-filter: grayscale(100%);
    filter: grayscale(100%);
}

字体描边

//CSS伪元素用于向某些选择器设置特殊效果。
<div class="success_text" data-text="描边字体">描边字体</div>
.success_text{
    font-size: 29px;
    color: #ffffff;
    position: relative;
 }
.success_text::before {
    content: attr(data-text);
    position: absolute;
    -webkit-text-stroke:4px#00a33e;
    z-index: -1;
    left: 0;
    top: 0;
}

倒三角形图标

//使用伪元素实现倒三角形图标
<div class="box"></div>
.box{
  width: 185px;
  height: 80px;
  background-color: #ffffff;
  position: relative;
  color: #333333;
}
.box::after{
  position: absolute;
  right: 10px;
  bottom:25px;
  content: '';
  width: 0;
  height: 0;
  border-left: 18px solid transparent;
  border-right: 18px solid transparent;
  border-top: 26px solid#00a33e;
}

css禁止用户选择

禁止用户选择页面中的文字或者图片

div {
  -webkit-touch-callout: none;
  -webkit-user-select: none;
  -khtml-user-select: none;
  -moz-user-select: none;
  -ms-user-select: none;
  user-select: none;
}

去除小程序按钮默认样式

button::after {
  border: none;
}
button {
  background-color: transparent;
  padding: 0;
  margin: 0;
  border: 0;
  padding-left: 0;
  padding-right: 0;
  border-radius: 0;
  font-size: 0rpx;
  color: transparent;
  display: block;
}

button[disabled]{
  background-color: transparent !important;
}

禁止长按保存图片

img {
  pointer-event:none;
}

自定义select 三角样式

/* select标签 */
.select_div{
  border0;
  /* 清除默认的箭头样式 */
  appearance: none;
  -moz-appearance: none;
  -webkit-appearance: none;
  /* 右侧添加小箭头的背景图 */
  backgroundurl('../images/arrow.png'320px center no-repeat;
  background-size12px;
}

iScroll自定义滚动条样式

css:

.myScrollbarV{
    position: absolute;
    z-index: 100;
    bottom: -40px;
    top: 50px;
    right: 5px;
    width: 0.15rem;
    height: 8rem;
    background-color: rgb(255, 255, 255);
    border-radius: 0.06rem;
    pointer-events: none;
  }

  .myScrollbarV > div {
    position: absolute;
    z-index: 100;
    background: -webkit-gradient(linear, -135% 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.2)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.2)), color-stop(0.75, rgba(255, 255, 255, 0.2)), color-stop(0.75, transparent), to(transparent)) padding-box padding-box rgb(251, 76, 75);
    box-sizing: border-box;
    margin-left: -40%;
    width: 0.28rem;
    height: 230px;
    box-shadow: rgba(23, 0, 77, 0.55) 0rem 0.02rem 0.09rem 0.01rem;
    border-radius: 0.17rem;
    opacity: 0.9;
    pointer-events: none;
    transition-property: transform;
    transition-timing-function: cubic-bezier(0.33, 0.66, 0.66, 1);
    transform: translate(0px, 0px) translateZ(0px);
  }
  
  js:
  function loaded(id) {
		var myScroll = new iScroll(id, {
			scrollbarClass: 'myScrollbar',
			scrollbars: true,
			hScroll: false, //是否显示水平滚动条
			mouseWheel: true,
			interactiveScrollbars: true,//用户是否可以拖动滚动条
			shrinkScrollbars: false,
			//滚动条超出边缘您是否收缩,clip’:裁剪超出的滚动条‘scale’:按比例的收缩滚动条(占用CPU资源)
			fadeScrollbars: false//是否渐隐滚动条,关掉可以加速
		});
	}

ios上按钮disabled时样式问题。

 opacity: 1;

input标签输入模式

//小数字输入键盘:(包含数字0-9,点号(“.”)和删除(“x”)键)
<input type="text" inputmode="decimal">

//数字输入键盘:(包含数字0-9,删除(“x”)键)
<input type="text" inputmode="numeric">

//电话键盘输入:包括数字0到9,星号(“*”)和磅(“#”)键。
<input type="text" inputmode="tel">

参考:www.xinran001.com/frontend/15…

在指定位置进行分页的分页行为

 <div style="page-break-before: always"></div>

js:

var myScroll = new iScroll(id, {
    scrollbarClass: 'myScrollbar',
    scrollbars: true,
    hScroll: false, //是否显示水平滚动条
    mouseWheel: true,
    interactiveScrollbars: true,//用户是否可以拖动滚动条
    shrinkScrollbars: false,
    //滚动条超出边缘您是否收缩,clip’:裁剪超出的滚动条‘scale’:按比例的收缩滚动条(占用CPU资源)
    fadeScrollbars: false//是否渐隐滚动条,关掉可以加速
});

Javascript

通过参数名获取路径中的某个参数值

function getParamsBydecodeURI(name) {
    const reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
    const decodeQuery = decodeURIComponent(window.location.search);
    let r = decodeQuery.substr(1).match(reg);
    if (r != null) return unescape(r[2]);
    return null;
 }

获取url中search参数,返回参数列表对象

function syncParam(){
    var url = location.search;
    var theRequest = new Object();
    if (url.indexOf("?") != -1) {
        var str = url.substr(1);
        var strs = str.split("&");
        for (var i = 0; i < strs.length; i++) {
            theRequest[strs[i].split("=")[0]] = decodeURIComponent(strs[i].split("=")[1]);
        }
    }
    return theRequest;
}

获取url参数-URLSearchParams 方法

// 创建一个URLSearchParams实例
const urlSearchParams = new URLSearchParams(window.location.search);
// 把键值对列表转换为一个对象
const params = Object.fromEntries(urlSearchParams.entries());

ios 中input失焦页面下不来问题

function changeBlur() {
    let u = navigator.userAgent, app = navigator.appVersion;
    let isIOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/);
    if (isIOS) {
        let timer = setTimeout(() => {
            const scrollHeight = document.documentElement.scrollTop || document.body.scrollTop || 0
            window.scrollTo(0, Math.max(scrollHeight - 1, 0))
            clearTimeout(timer)
        }, 200)
    }
}

 <input type="tel" class="phone_input" v-model="userPhone" maxlength="11" @blur.prevent="changeBlur()">

ios中日期转换NAN的问题

将日期字符串的格式符号'-'替换成'/'

'yyyy-mm-dd'.replace(/-/g, '/')

vconsole调试工具

<script src='//cdn.bootcss.com/eruda/1.5.2/eruda.min.js'></script>
<script>eruda.init();</script> 

页面禁止滑动

function touchForbid(domId) {
     var doms = document.getElementById(domId);
     doms.addEventListener(
       "touchmove",
       function (e) {
         e.preventDefault();
       },
       false
     );
     document.addEventListener(
       "touchmove",
       function (e) {
         e.preventDefault();
       },
       false
     );
 },
 touchForbid("app")//调用

正则表达式

1、正整数、正浮点数,保留两位小数:^(([1-9]\d*)(.\d{1,2})?)(00˙?([19]\d?))|(0\.0?([1-9]\d?))

2、正整数、正浮点数,保留多位小数:^(([1-9]\d*)(.\d*)?)(00˙?([19]\d?))|(0\.0?([1-9]\d*?))

3、正则替换

* "hhhh\\nhhhhhhhh\\n".replace(/\\n/g,'<br>') 等同于 
"hhhh\\nhhhhhhhh\\n".replaceAll('\\n','<br>') //replaceAll chrome 85版本以上
//'hhhh<br>hhhhhhhh<br>'

打印

//js 打印
 window.print();
 
//css 打印时隐藏某些内容
@media print {
  .delImgHandle {
    display: none;
  }
}

//打印背景色设置,若不生效,颜色添加!important属性
@media print {
	.investigation-report-content {
		-webkit-print-color-adjust: exact;
	}
}
.title{
    background: #f5f5f5 !important;
}

微信小程序

bindtap触发事件延迟

//微信小程序中连续点击按钮触发多次接口请求,有时通过定义变量控制不了,可通过以下方法解决:
接口请求前加loading,避免连续点击按钮多次触发接口请求;
wx.showToast({
   title: '',
   icon: 'loading',
   duration: 1000,
   mask:true
})

多次触发点击获取手机号

//小程序获取用户手机号按钮,添加防抖进行优化
<button class="btn_getMob"  open-type="getPhoneNumber" bindgetphonenumber="debounceSubmit">获取用户手机号</button>

wx.canvasToTempFilePath图片生成失败

调用wx.canvasToTempFilePath将画布生成图片时失败,提示create bitmap failed,生成时加延时解决。
 setTimeout(()=>{
        wx.canvasToTempFilePath({
          canvasId: id,
          success(response) {
         
          },
          fail(e) {
            console.log(e);
            }
          }
        }, this)
},200)

小程序中使用async/await方法

微信小程序中使用async/await方法,提示regeneratorRuntime is not defined的解决方案:

小程序构建npm过程:
1.进入小程序根目录,打开cmd,输入:npm init,生成package.json文件(一路回车就好)
2.输入命令:npm install regenerator-runtime --production
执行命令完之后,然后再去微信开发者中,点击工具-构建npm,然后就成功了;
3、页面引入:import regeneratorRuntime from 'regenerator-runtime';

vue

vue刷新当前页面方法

1、App.vue页面
<template>
  <div id="app">
    <keep-alive>
        <router-view v-if="$route.meta.keepAlive"></router-view>
    </keep-alive>
    <router-view v-if="!$route.meta.keepAlive&&isRouterAlive"></router-view>
  </div>
</template>

<script>
export default {
  name: "App",
  components: {},
  provide () {
    return {
      reload: this.reload
    }
  },
  data() {
    return {
       isRouterAlive:true
    };
  },
  created() {
  },
  methods: {
    //页面刷新方法
    reload () {
      this.isRouterAlive = false
      this.$nextTick(() => {
        this.isRouterAlive = true
      })
    },
  },
};
</script>

2、在需要刷新的页面上注入这个函数然后调用就可

<script>
export default {
  name: "childPage",
  components: {},
  inject: ['reload'],
  data() {
    return {
       title:'需要使用刷新当前页的页面'
    };
  },
  created() {
  },
  methods: {
  //调用刷新方法
  refresh(){
  	this.reload()
   }
  },
};
</script>

vue刷新当前页面: www.cnblogs.com/aurora-ql/p…

组件传值

1、父子组件传值(props/$emit)

2、获取父子组件的值/方法(ref)

父组件获取子组件:
<childerComponent ref="childerComponentRef"></childerComponent>
 this.$refs.childerComponentRef.val //子组件data的数据或方法名
子组件获取父组件:
this.$parent.parentVal

3、非父子组件之间传值(eventBus)

1、main.js全局注册
Vue.prototype.bus = new Vue();

2、发送消息的页面
this.bus.$emit('事件名','传值')

3、接收消息的页面
this.bus.$on('事件名',(e)=>{
	console.log("接收到的值",e)
})
//只能在created或者mounted中接收

4、vuex状态管理