JavaScript常用工具方法封装

素颜马尾好姑娘i 2022-03-07 06:13 333阅读 0赞

因为工作中经常用到这些方法,所有便把这些方法进行了总结。

JavaScript

1. type 类型判断

  1. isString (o) { //是否字符串
  2. return Object.prototype.toString.call(o).slice(8, -1) === 'String'
  3. }
  4. isNumber (o) { //是否数字
  5. return Object.prototype.toString.call(o).slice(8, -1) === 'Number'
  6. }
  7. isBoolean (o) { //是否boolean
  8. return Object.prototype.toString.call(o).slice(8, -1) === 'Boolean'
  9. }
  10. isFunction (o) { //是否函数
  11. return Object.prototype.toString.call(o).slice(8, -1) === 'Function'
  12. }
  13. isNull (o) { //是否为null
  14. return Object.prototype.toString.call(o).slice(8, -1) === 'Null'
  15. }
  16. isUndefined (o) { //是否undefined
  17. return Object.prototype.toString.call(o).slice(8, -1) === 'Undefined'
  18. }
  19. isObj (o) { //是否对象
  20. return Object.prototype.toString.call(o).slice(8, -1) === 'Object'
  21. }
  22. isArray (o) { //是否数组
  23. return Object.prototype.toString.call(o).slice(8, -1) === 'Array'
  24. }
  25. isDate (o) { //是否时间
  26. return Object.prototype.toString.call(o).slice(8, -1) === 'Date'
  27. }
  28. isRegExp (o) { //是否正则
  29. return Object.prototype.toString.call(o).slice(8, -1) === 'RegExp'
  30. }
  31. isError (o) { //是否错误对象
  32. return Object.prototype.toString.call(o).slice(8, -1) === 'Error'
  33. }
  34. isSymbol (o) { //是否Symbol函数
  35. return Object.prototype.toString.call(o).slice(8, -1) === 'Symbol'
  36. }
  37. isPromise (o) { //是否Promise对象
  38. return Object.prototype.toString.call(o).slice(8, -1) === 'Promise'
  39. }
  40. isSet (o) { //是否Set对象
  41. return Object.prototype.toString.call(o).slice(8, -1) === 'Set'
  42. }
  43. isFalse (o) {
  44. if (!o || o === 'null' || o === 'undefined' || o === 'false' || o === 'NaN') return true
  45. return false
  46. }
  47. isTrue (o) {
  48. return !this.isFalse(o)
  49. }
  50. isIos () {
  51. var u = navigator.userAgent;
  52. if (u.indexOf('Android') > -1 || u.indexOf('Linux') > -1) {//安卓手机
  53. // return "Android";
  54. return false
  55. } else if (u.indexOf('iPhone') > -1) {//苹果手机
  56. // return "iPhone";
  57. return true
  58. } else if (u.indexOf('iPad') > -1) {//iPad
  59. // return "iPad";
  60. return false
  61. } else if (u.indexOf('Windows Phone') > -1) {//winphone手机
  62. // return "Windows Phone";
  63. return false
  64. }else{
  65. return false
  66. }
  67. }
  68. isPC () { //是否为PC端
  69. var userAgentInfo = navigator.userAgent;
  70. var Agents = ["Android", "iPhone",
  71. "SymbianOS", "Windows Phone",
  72. "iPad", "iPod"];
  73. var flag = true;
  74. for (var v = 0; v < Agents.length; v++) {
  75. if (userAgentInfo.indexOf(Agents[v]) > 0) {
  76. flag = false;
  77. break;
  78. }
  79. }
  80. return flag;
  81. }
  82. browserType(){
  83. var userAgent = navigator.userAgent; //取得浏览器的userAgent字符串
  84. var isOpera = userAgent.indexOf("Opera") > -1; //判断是否Opera浏览器
  85. var isIE = userAgent.indexOf("compatible") > -1 && userAgent.indexOf("MSIE") > -1 && !isOpera; //判断是否IE浏览器
  86. var isIE11 = userAgent.indexOf('Trident') > -1 && userAgent.indexOf("rv:11.0") > -1;
  87. var isEdge = userAgent.indexOf("Edge") > -1 && !isIE; //判断是否IE的Edge浏览器
  88. var isFF = userAgent.indexOf("Firefox") > -1; //判断是否Firefox浏览器
  89. var isSafari = userAgent.indexOf("Safari") > -1 && userAgent.indexOf("Chrome") == -1; //判断是否Safari浏览器
  90. var isChrome = userAgent.indexOf("Chrome") > -1 && userAgent.indexOf("Safari") > -1; //判断Chrome浏览器
  91. if (isIE) {
  92. var reIE = new RegExp("MSIE (\\d+\\.\\d+);");
  93. reIE.test(userAgent);
  94. var fIEVersion = parseFloat(RegExp["$1"]);
  95. if(fIEVersion == 7) return "IE7"
  96. else if(fIEVersion == 8) return "IE8";
  97. else if(fIEVersion == 9) return "IE9";
  98. else if(fIEVersion == 10) return "IE10";
  99. else return "IE7以下"//IE版本过低
  100. }
  101. if (isIE11) return 'IE11';
  102. if (isEdge) return "Edge";
  103. if (isFF) return "FF";
  104. if (isOpera) return "Opera";
  105. if (isSafari) return "Safari";
  106. if (isChrome) return "Chrome";
  107. }
  108. checkStr (str, type) {
  109. switch (type) {
  110. case 'phone': //手机号码
  111. return /^1[3|4|5|6|7|8|9][0-9]{9}$/.test(str);
  112. case 'tel': //座机
  113. return /^(0\d{2,3}-\d{7,8})(-\d{1,4})?$/.test(str);
  114. case 'card': //身份证
  115. return /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/.test(str);
  116. case 'pwd': //密码以字母开头,长度在6~18之间,只能包含字母、数字和下划线
  117. return /^[a-zA-Z]\w{5,17}$/.test(str)
  118. case 'postal': //邮政编码
  119. return /[1-9]\d{5}(?!\d)/.test(str);
  120. case 'QQ': //QQ号
  121. return /^[1-9][0-9]{4,9}$/.test(str);
  122. case 'email': //邮箱
  123. return /^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$/.test(str);
  124. case 'money': //金额(小数点2位)
  125. return /^\d*(?:\.\d{0,2})?$/.test(str);
  126. case 'URL': //网址
  127. return /(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?/.test(str)
  128. case 'IP': //IP
  129. return /((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))/.test(str);
  130. case 'date': //日期时间
  131. return /^(\d{4})\-(\d{2})\-(\d{2}) (\d{2})(?:\:\d{2}|:(\d{2}):(\d{2}))$/.test(str) || /^(\d{4})\-(\d{2})\-(\d{2})$/.test(str)
  132. case 'number': //数字
  133. return /^[0-9]$/.test(str);
  134. case 'english': //英文
  135. return /^[a-zA-Z]+$/.test(str);
  136. case 'chinese': //中文
  137. return /^[\u4E00-\u9FA5]+$/.test(str);
  138. case 'lower': //小写
  139. return /^[a-z]+$/.test(str);
  140. case 'upper': //大写
  141. return /^[A-Z]+$/.test(str);
  142. case 'HTML': //HTML标记
  143. return /<("[^"]*"|'[^']*'|[^'">])*>/.test(str);
  144. default:
  145. return true;
  146. }
  147. // 严格的身份证校验
  148. isCardID(sId) {
  149. if (!/(^\d{15}$)|(^\d{17}(\d|X|x)$)/.test(sId)) {
  150. alert('你输入的身份证长度或格式错误')
  151. return false
  152. }
  153. //身份证城市
  154. var aCity={11:"北京",12:"天津",13:"河北",14:"山西",15:"内蒙古",21:"辽宁",22:"吉林",23:"黑龙江",31:"上海",32:"江苏",33:"浙江",34:"安徽",35:"福建",36:"江西",37:"山东",41:"河南",42:"湖北",43:"湖南",44:"广东",45:"广西",46:"海南",50:"重庆",51:"四川",52:"贵州",53:"云南",54:"西藏",61:"陕西",62:"甘肃",63:"青海",64:"宁夏",65:"新疆",71:"台湾",81:"香港",82:"澳门",91:"国外"};
  155. if(!aCity[parseInt(sId.substr(0,2))]) {
  156. alert('你的身份证地区非法')
  157. return false
  158. }
  159. // 出生日期验证
  160. var sBirthday=(sId.substr(6,4)+"-"+Number(sId.substr(10,2))+"-"+Number(sId.substr(12,2))).replace(/-/g,"/"),
  161. d = new Date(sBirthday)
  162. if(sBirthday != (d.getFullYear()+"/"+ (d.getMonth()+1) + "/" + d.getDate())) {
  163. alert('身份证上的出生日期非法')
  164. return false
  165. }
  166. // 身份证号码校验
  167. var sum = 0,
  168. weights = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2],
  169. codes = "10X98765432"
  170. for (var i = 0; i < sId.length - 1; i++) {
  171. sum += sId[i] * weights[i];
  172. }
  173. var last = codes[sum % 11]; //计算出来的最后一位身份证号码
  174. if (sId[sId.length-1] != last) {
  175. alert('你输入的身份证号非法')
  176. return false
  177. }
  178. return true
  179. }
  180. }

2. Date

  1. /**
  2. * 格式化时间
  3. *
  4. * @param {time} 时间
  5. * @param {cFormat} 格式
  6. * @return {String} 字符串
  7. *
  8. * @example formatTime('2018-1-29', '{y}/{m}/{d} {h}:{i}:{s}') // -> 2018/01/29 00:00:00
  9. */
  10. formatTime(time, cFormat) {
  11. if (arguments.length === 0) return null
  12. if ((time + '').length === 10) {
  13. time = +time * 1000
  14. }
  15. var format = cFormat || '{y}-{m}-{d} {h}:{i}:{s}', date
  16. if (typeof time === 'object') {
  17. date = time
  18. } else {
  19. date = new Date(time)
  20. }
  21. var formatObj = {
  22. y: date.getFullYear(),
  23. m: date.getMonth() + 1,
  24. d: date.getDate(),
  25. h: date.getHours(),
  26. i: date.getMinutes(),
  27. s: date.getSeconds(),
  28. a: date.getDay()
  29. }
  30. var time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => {
  31. var value = formatObj[key]
  32. if (key === 'a') return ['一', '二', '三', '四', '五', '六', '日'][value - 1]
  33. if (result.length > 0 && value < 10) {
  34. value = '0' + value
  35. }
  36. return value || 0
  37. })
  38. return time_str
  39. }
  40. /**
  41. * 返回指定长度的月份集合
  42. *
  43. * @param {time} 时间
  44. * @param {len} 长度
  45. * @param {direction} 方向: 1: 前几个月; 2: 后几个月; 3:前后几个月 默认 3
  46. * @return {Array} 数组
  47. *
  48. * @example getMonths('2018-1-29', 6, 1) // -> ["2018-1", "2017-12", "2017-11", "2017-10", "2017-9", "2017-8", "2017-7"]
  49. */
  50. getMonths(time, len, direction) {
  51. var mm = new Date(time).getMonth(),
  52. yy = new Date(time).getFullYear(),
  53. direction = isNaN(direction) ? 3 : direction,
  54. index = mm;
  55. var cutMonth = function(index) {
  56. if ( index <= len && index >= -len) {
  57. return direction === 1 ? formatPre(index).concat(cutMonth(++index)):
  58. direction === 2 ? formatNext(index).concat(cutMonth(++index)):formatCurr(index).concat(cutMonth(++index))
  59. }
  60. return []
  61. }
  62. var formatNext = function(i) {
  63. var y = Math.floor(i/12),
  64. m = i%12
  65. return [yy+y + '-' + (m+1)]
  66. }
  67. var formatPre = function(i) {
  68. var y = Math.ceil(i/12),
  69. m = i%12
  70. m = m===0 ? 12 : m
  71. return [yy-y + '-' + (13 - m)]
  72. }
  73. var formatCurr = function(i) {
  74. var y = Math.floor(i/12),
  75. yNext = Math.ceil(i/12),
  76. m = i%12,
  77. mNext = m===0 ? 12 : m
  78. return [yy-yNext + '-' + (13 - mNext),yy+y + '-' + (m+1)]
  79. }
  80. // 数组去重
  81. var unique = function(arr) {
  82. if ( Array.hasOwnProperty('from') ) {
  83. return Array.from(new Set(arr));
  84. }else{
  85. var n = {},r=[];
  86. for(var i = 0; i < arr.length; i++){
  87. if (!n[arr[i]]){
  88. n[arr[i]] = true;
  89. r.push(arr[i]);
  90. }
  91. }
  92. return r;
  93. }
  94. }
  95. return direction !== 3 ? cutMonth(index) : unique(cutMonth(index).sort(function(t1, t2){
  96. return new Date(t1).getTime() - new Date(t2).getTime()
  97. }))
  98. }
  99. /**
  100. * 返回指定长度的天数集合
  101. *
  102. * @param {time} 时间
  103. * @param {len} 长度
  104. * @param {direction} 方向: 1: 前几天; 2: 后几天; 3:前后几天 默认 3
  105. * @return {Array} 数组
  106. *
  107. * @example date.getDays('2018-1-29', 6) // -> ["2018-1-26", "2018-1-27", "2018-1-28", "2018-1-29", "2018-1-30", "2018-1-31", "2018-2-1"]
  108. */
  109. getDays(time, len, diretion) {
  110. var tt = new Date(time)
  111. var getDay = function(day) {
  112. var t = new Date(time)
  113. t.setDate(t.getDate() + day)
  114. var m = t.getMonth()+1
  115. return t.getFullYear()+'-'+m+'-'+t.getDate()
  116. }
  117. var arr = []
  118. if (diretion === 1) {
  119. for (var i = 1; i <= len; i++) {
  120. arr.unshift(getDay(-i))
  121. }
  122. }else if(diretion === 2) {
  123. for (var i = 1; i <= len; i++) {
  124. arr.push(getDay(i))
  125. }
  126. }else {
  127. for (var i = 1; i <= len; i++) {
  128. arr.unshift(getDay(-i))
  129. }
  130. arr.push(tt.getFullYear()+'-'+(tt.getMonth()+1)+'-'+tt.getDate())
  131. for (var i = 1; i <= len; i++) {
  132. arr.push(getDay(i))
  133. }
  134. }
  135. return diretion === 1 ? arr.concat([tt.getFullYear()+'-'+(tt.getMonth()+1)+'-'+tt.getDate()]) :
  136. diretion === 2 ? [tt.getFullYear()+'-'+(tt.getMonth()+1)+'-'+tt.getDate()].concat(arr) : arr
  137. }
  138. /**
  139. * @param {s} 秒数
  140. * @return {String} 字符串
  141. *
  142. * @example formatHMS(3610) // -> 1h0m10s
  143. */
  144. formatHMS (s) {
  145. var str = ''
  146. if (s > 3600) {
  147. str = Math.floor(s/3600)+'h'+Math.floor(s%3600/60)+'m'+s%60+'s'
  148. }else if(s > 60) {
  149. str = Math.floor(s/60)+'m'+s%60+'s'
  150. }else{
  151. str = s%60+'s'
  152. }
  153. return str
  154. }
  155. /*获取某月有多少天*/
  156. getMonthOfDay (time) {
  157. var date = new Date(time)
  158. var year = date.getFullYear()
  159. var mouth = date.getMonth() + 1
  160. var days
  161. //当月份为二月时,根据闰年还是非闰年判断天数
  162. if (mouth == 2) {
  163. days = (year%4==0 && year%100==0 && year%400==0) || (year%4==0 && year%100!=0) ? 28 : 29
  164. } else if (mouth == 1 || mouth == 3 || mouth == 5 || mouth == 7 || mouth == 8 || mouth == 10 || mouth == 12) {
  165. //月份为:1,3,5,7,8,10,12 时,为大月.则天数为31;
  166. days = 31
  167. } else {
  168. //其他月份,天数为:30.
  169. days = 30
  170. }
  171. return days
  172. }
  173. /*获取某年有多少天*/
  174. getYearOfDay (time) {
  175. var firstDayYear = this.getFirstDayOfYear(time);
  176. var lastDayYear = this.getLastDayOfYear(time);
  177. var numSecond = (new Date(lastDayYear).getTime() - new Date(firstDayYear).getTime())/1000;
  178. return Math.ceil(numSecond/(24*3600));
  179. }
  180. /*获取某年的第一天*/
  181. getFirstDayOfYear (time) {
  182. var year = new Date(time).getFullYear();
  183. return year + "-01-01 00:00:00";
  184. }
  185. /*获取某年最后一天*/
  186. getLastDayOfYear (time) {
  187. var year = new Date(time).getFullYear();
  188. var dateString = year + "-12-01 00:00:00";
  189. var endDay = this.getMonthOfDay(dateString);
  190. return year + "-12-" + endDay + " 23:59:59";
  191. }
  192. /*获取某个日期是当年中的第几天*/
  193. getDayOfYear (time) {
  194. var firstDayYear = this.getFirstDayOfYear(time);
  195. var numSecond = (new Date(time).getTime() - new Date(firstDayYear).getTime())/1000;
  196. return Math.ceil(numSecond/(24*3600));
  197. }
  198. /*获取某个日期在这一年的第几周*/
  199. getDayOfYearWeek (time) {
  200. var numdays = this.getDayOfYear(time);
  201. return Math.ceil(numdays / 7);
  202. }

3. Array

  1. /*判断一个元素是否在数组中*/
  2. contains (arr, val) {
  3. return arr.indexOf(val) != -1 ? true : false;
  4. }
  5. /**
  6. * @param {arr} 数组
  7. * @param {fn} 回调函数
  8. * @return {undefined}
  9. */
  10. each (arr, fn) {
  11. fn = fn || Function;
  12. var a = [];
  13. var args = Array.prototype.slice.call(arguments, 1);
  14. for(var i = 0; i < arr.length; i++) {
  15. var res = fn.apply(arr, [arr[i], i].concat(args));
  16. if(res != null) a.push(res);
  17. }
  18. }
  19. /**
  20. * @param {arr} 数组
  21. * @param {fn} 回调函数
  22. * @param {thisObj} this指向
  23. * @return {Array}
  24. */
  25. map (arr, fn, thisObj) {
  26. var scope = thisObj || window;
  27. var a = [];
  28. for(var i = 0, j = arr.length; i < j; ++i) {
  29. var res = fn.call(scope, arr[i], i, this);
  30. if(res != null) a.push(res);
  31. }
  32. return a;
  33. }
  34. /**
  35. * @param {arr} 数组
  36. * @param {type} 1:从小到大 2:从大到小 3:随机
  37. * @return {Array}
  38. */
  39. sort (arr, type = 1) {
  40. return arr.sort( (a, b) => {
  41. switch(type) {
  42. case 1:
  43. return a - b;
  44. case 2:
  45. return b - a;
  46. case 3:
  47. return Math.random() - 0.5;
  48. default:
  49. return arr;
  50. }
  51. })
  52. }
  53. /*去重*/
  54. unique (arr) {
  55. if ( Array.hasOwnProperty('from') ) {
  56. return Array.from(new Set(arr));
  57. }else{
  58. var n = {},r=[];
  59. for(var i = 0; i < arr.length; i++){
  60. if (!n[arr[i]]){
  61. n[arr[i]] = true;
  62. r.push(arr[i]);
  63. }
  64. }
  65. return r;
  66. }
  67. // 注:上面 else 里面的排重并不能区分 2 和 '2',但能减少用indexOf带来的性能,暂时没找到替代的方法。。。
  68. /* 正确排重
  69. if ( Array.hasOwnProperty('from') ) {
  70. return Array.from(new Set(arr))
  71. }else{
  72. var r = [], NaNBol = true
  73. for(var i=0; i < arr.length; i++) {
  74. if (arr[i] !== arr[i]) {
  75. if (NaNBol && r.indexOf(arr[i]) === -1) {
  76. r.push(arr[i])
  77. NaNBol = false
  78. }
  79. }else{
  80. if(r.indexOf(arr[i]) === -1) r.push(arr[i])
  81. }
  82. }
  83. return r
  84. }
  85. */
  86. }
  87. /*求两个集合的并集*/
  88. union (a, b) {
  89. var newArr = a.concat(b);
  90. return this.unique(newArr);
  91. }
  92. /*求两个集合的交集*/
  93. intersect (a, b) {
  94. var _this = this;
  95. a = this.unique(a);
  96. return this.map(a, function(o) {
  97. return _this.contains(b, o) ? o : null;
  98. });
  99. }
  100. /*删除其中一个元素*/
  101. remove (arr, ele) {
  102. var index = arr.indexOf(ele);
  103. if(index > -1) {
  104. arr.splice(index, 1);
  105. }
  106. return arr;
  107. }
  108. /*将类数组转换为数组的方法*/
  109. formArray (ary) {
  110. var arr = [];
  111. if(Array.isArray(ary)) {
  112. arr = ary;
  113. } else {
  114. arr = Array.prototype.slice.call(ary);
  115. };
  116. return arr;
  117. }
  118. /*最大值*/
  119. max (arr) {
  120. return Math.max.apply(null, arr);
  121. }
  122. /*最小值*/
  123. min (arr) {
  124. return Math.min.apply(null, arr);
  125. }
  126. /*求和*/
  127. sum (arr) {
  128. return arr.reduce( (pre, cur) => {
  129. return pre + cur
  130. })
  131. }
  132. /*平均值*/
  133. average (arr) {
  134. return this.sum(arr)/arr.length
  135. }

4. String 字符串操作

  1. /**
  2. * 去除空格
  3. * @param {str}
  4. * @param {type}
  5. * type: 1-所有空格 2-前后空格 3-前空格 4-后空格
  6. * @return {String}
  7. */
  8. trim (str, type) {
  9. type = type || 1
  10. switch (type) {
  11. case 1:
  12. return str.replace(/\s+/g, "");
  13. case 2:
  14. return str.replace(/(^\s*)|(\s*$)/g, "");
  15. case 3:
  16. return str.replace(/(^\s*)/g, "");
  17. case 4:
  18. return str.replace(/(\s*$)/g, "");
  19. default:
  20. return str;
  21. }
  22. }
  23. /**
  24. * @param {str}
  25. * @param {type}
  26. * type: 1:首字母大写 2:首页母小写 3:大小写转换 4:全部大写 5:全部小写
  27. * @return {String}
  28. */
  29. changeCase (str, type) {
  30. type = type || 4
  31. switch (type) {
  32. case 1:
  33. return str.replace(/\b\w+\b/g, function (word) {
  34. return word.substring(0, 1).toUpperCase() + word.substring(1).toLowerCase();
  35. });
  36. case 2:
  37. return str.replace(/\b\w+\b/g, function (word) {
  38. return word.substring(0, 1).toLowerCase() + word.substring(1).toUpperCase();
  39. });
  40. case 3:
  41. return str.split('').map( function(word){
  42. if (/[a-z]/.test(word)) {
  43. return word.toUpperCase();
  44. }else{
  45. return word.toLowerCase()
  46. }
  47. }).join('')
  48. case 4:
  49. return str.toUpperCase();
  50. case 5:
  51. return str.toLowerCase();
  52. default:
  53. return str;
  54. }
  55. }
  56. /*
  57. 检测密码强度
  58. */
  59. checkPwd (str) {
  60. var Lv = 0;
  61. if (str.length < 6) {
  62. return Lv
  63. }
  64. if (/[0-9]/.test(str)) {
  65. Lv++
  66. }
  67. if (/[a-z]/.test(str)) {
  68. Lv++
  69. }
  70. if (/[A-Z]/.test(str)) {
  71. Lv++
  72. }
  73. if (/[\.|-|_]/.test(str)) {
  74. Lv++
  75. }
  76. return Lv;
  77. }
  78. /*过滤html代码(把<>转换)*/
  79. filterTag (str) {
  80. str = str.replace(/&/ig, "&");
  81. str = str.replace(/</ig, "<");
  82. str = str.replace(/>/ig, ">");
  83. str = str.replace(" ", " ");
  84. return str;
  85. }

5. Number

  1. /*随机数范围*/
  2. random (min, max) {
  3. if (arguments.length === 2) {
  4. return Math.floor(min + Math.random() * ( (max+1) - min ))
  5. }else{
  6. return null;
  7. }
  8. }
  9. /*将阿拉伯数字翻译成中文的大写数字*/
  10. numberToChinese (num) {
  11. var AA = new Array("零", "一", "二", "三", "四", "五", "六", "七", "八", "九", "十");
  12. var BB = new Array("", "十", "百", "仟", "萬", "億", "点", "");
  13. var a = ("" + num).replace(/(^0*)/g, "").split("."),
  14. k = 0,
  15. re = "";
  16. for(var i = a[0].length - 1; i >= 0; i--) {
  17. switch(k) {
  18. case 0:
  19. re = BB[7] + re;
  20. break;
  21. case 4:
  22. if(!new RegExp("0{4}//d{" + (a[0].length - i - 1) + "}$")
  23. .test(a[0]))
  24. re = BB[4] + re;
  25. break;
  26. case 8:
  27. re = BB[5] + re;
  28. BB[7] = BB[5];
  29. k = 0;
  30. break;
  31. }
  32. if(k % 4 == 2 && a[0].charAt(i + 2) != 0 && a[0].charAt(i + 1) == 0)
  33. re = AA[0] + re;
  34. if(a[0].charAt(i) != 0)
  35. re = AA[a[0].charAt(i)] + BB[k % 4] + re;
  36. k++;
  37. }
  38. if(a.length > 1) // 加上小数部分(如果有小数部分)
  39. {
  40. re += BB[6];
  41. for(var i = 0; i < a[1].length; i++)
  42. re += AA[a[1].charAt(i)];
  43. }
  44. if(re == '一十')
  45. re = "十";
  46. if(re.match(/^一/) && re.length == 3)
  47. re = re.replace("一", "");
  48. return re;
  49. }
  50. /*将数字转换为大写金额*/
  51. changeToChinese (Num) {
  52. //判断如果传递进来的不是字符的话转换为字符
  53. if(typeof Num == "number") {
  54. Num = new String(Num);
  55. };
  56. Num = Num.replace(/,/g, "") //替换tomoney()中的“,”
  57. Num = Num.replace(/ /g, "") //替换tomoney()中的空格
  58. Num = Num.replace(/¥/g, "") //替换掉可能出现的¥字符
  59. if(isNaN(Num)) { //验证输入的字符是否为数字
  60. //alert("请检查小写金额是否正确");
  61. return "";
  62. };
  63. //字符处理完毕后开始转换,采用前后两部分分别转换
  64. var part = String(Num).split(".");
  65. var newchar = "";
  66. //小数点前进行转化
  67. for(var i = part[0].length - 1; i >= 0; i--) {
  68. if(part[0].length > 10) {
  69. return "";
  70. //若数量超过拾亿单位,提示
  71. }
  72. var tmpnewchar = ""
  73. var perchar = part[0].charAt(i);
  74. switch(perchar) {
  75. case "0":
  76. tmpnewchar = "零" + tmpnewchar;
  77. break;
  78. case "1":
  79. tmpnewchar = "壹" + tmpnewchar;
  80. break;
  81. case "2":
  82. tmpnewchar = "贰" + tmpnewchar;
  83. break;
  84. case "3":
  85. tmpnewchar = "叁" + tmpnewchar;
  86. break;
  87. case "4":
  88. tmpnewchar = "肆" + tmpnewchar;
  89. break;
  90. case "5":
  91. tmpnewchar = "伍" + tmpnewchar;
  92. break;
  93. case "6":
  94. tmpnewchar = "陆" + tmpnewchar;
  95. break;
  96. case "7":
  97. tmpnewchar = "柒" + tmpnewchar;
  98. break;
  99. case "8":
  100. tmpnewchar = "捌" + tmpnewchar;
  101. break;
  102. case "9":
  103. tmpnewchar = "玖" + tmpnewchar;
  104. break;
  105. }
  106. switch(part[0].length - i - 1) {
  107. case 0:
  108. tmpnewchar = tmpnewchar + "元";
  109. break;
  110. case 1:
  111. if(perchar != 0) tmpnewchar = tmpnewchar + "拾";
  112. break;
  113. case 2:
  114. if(perchar != 0) tmpnewchar = tmpnewchar + "佰";
  115. break;
  116. case 3:
  117. if(perchar != 0) tmpnewchar = tmpnewchar + "仟";
  118. break;
  119. case 4:
  120. tmpnewchar = tmpnewchar + "万";
  121. break;
  122. case 5:
  123. if(perchar != 0) tmpnewchar = tmpnewchar + "拾";
  124. break;
  125. case 6:
  126. if(perchar != 0) tmpnewchar = tmpnewchar + "佰";
  127. break;
  128. case 7:
  129. if(perchar != 0) tmpnewchar = tmpnewchar + "仟";
  130. break;
  131. case 8:
  132. tmpnewchar = tmpnewchar + "亿";
  133. break;
  134. case 9:
  135. tmpnewchar = tmpnewchar + "拾";
  136. break;
  137. }
  138. var newchar = tmpnewchar + newchar;
  139. }
  140. //小数点之后进行转化
  141. if(Num.indexOf(".") != -1) {
  142. if(part[1].length > 2) {
  143. // alert("小数点之后只能保留两位,系统将自动截断");
  144. part[1] = part[1].substr(0, 2)
  145. }
  146. for(i = 0; i < part[1].length; i++) {
  147. tmpnewchar = ""
  148. perchar = part[1].charAt(i)
  149. switch(perchar) {
  150. case "0":
  151. tmpnewchar = "零" + tmpnewchar;
  152. break;
  153. case "1":
  154. tmpnewchar = "壹" + tmpnewchar;
  155. break;
  156. case "2":
  157. tmpnewchar = "贰" + tmpnewchar;
  158. break;
  159. case "3":
  160. tmpnewchar = "叁" + tmpnewchar;
  161. break;
  162. case "4":
  163. tmpnewchar = "肆" + tmpnewchar;
  164. break;
  165. case "5":
  166. tmpnewchar = "伍" + tmpnewchar;
  167. break;
  168. case "6":
  169. tmpnewchar = "陆" + tmpnewchar;
  170. break;
  171. case "7":
  172. tmpnewchar = "柒" + tmpnewchar;
  173. break;
  174. case "8":
  175. tmpnewchar = "捌" + tmpnewchar;
  176. break;
  177. case "9":
  178. tmpnewchar = "玖" + tmpnewchar;
  179. break;
  180. }
  181. if(i == 0) tmpnewchar = tmpnewchar + "角";
  182. if(i == 1) tmpnewchar = tmpnewchar + "分";
  183. newchar = newchar + tmpnewchar;
  184. }
  185. }
  186. //替换所有无用汉字
  187. while(newchar.search("零零") != -1)
  188. newchar = newchar.replace("零零", "零");
  189. newchar = newchar.replace("零亿", "亿");
  190. newchar = newchar.replace("亿万", "亿");
  191. newchar = newchar.replace("零万", "万");
  192. newchar = newchar.replace("零元", "元");
  193. newchar = newchar.replace("零角", "");
  194. newchar = newchar.replace("零分", "");
  195. if(newchar.charAt(newchar.length - 1) == "元") {
  196. newchar = newchar + "整"
  197. }
  198. return newchar;
  199. }

6. Http

  1. /**
  2. * @param {setting}
  3. */
  4. ajax(setting){
  5. //设置参数的初始值
  6. var opts={
  7. method: (setting.method || "GET").toUpperCase(), //请求方式
  8. url: setting.url || "", // 请求地址
  9. async: setting.async || true, // 是否异步
  10. dataType: setting.dataType || "json", // 解析方式
  11. data: setting.data || "", // 参数
  12. success: setting.success || function(){}, // 请求成功回调
  13. error: setting.error || function(){} // 请求失败回调
  14. }
  15. // 参数格式化
  16. function params_format (obj) {
  17. var str = ''
  18. for (var i in obj) {
  19. str += i + '=' + obj[i] + '&'
  20. }
  21. return str.split('').slice(0, -1).join('')
  22. }
  23. // 创建ajax对象
  24. var xhr=new XMLHttpRequest();
  25. // 连接服务器open(方法GET/POST,请求地址, 异步传输)
  26. if(opts.method == 'GET'){
  27. xhr.open(opts.method, opts.url + "?" + params_format(opts.data), opts.async);
  28. xhr.send();
  29. }else{
  30. xhr.open(opts.method, opts.url, opts.async);
  31. xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
  32. xhr.send(opts.data);
  33. }
  34. /*
  35. ** 每当readyState改变时,就会触发onreadystatechange事件
  36. ** readyState属性存储有XMLHttpRequest的状态信息
  37. ** 0 :请求未初始化
  38. ** 1 :服务器连接已建立
  39. ** 2 :请求已接受
  40. ** 3 : 请求处理中
  41. ** 4 :请求已完成,且相应就绪
  42. */
  43. xhr.onreadystatechange = function() {
  44. if (xhr.readyState === 4 && (xhr.status === 200 || xhr.status === 304)) {
  45. switch(opts.dataType){
  46. case "json":
  47. var json = JSON.parse(xhr.responseText);
  48. opts.success(json);
  49. break;
  50. case "xml":
  51. opts.success(xhr.responseXML);
  52. break;
  53. default:
  54. opts.success(xhr.responseText);
  55. break;
  56. }
  57. }
  58. }
  59. xhr.onerror = function(err) {
  60. opts.error(err);
  61. }
  62. }
  63. /**
  64. * @param {url}
  65. * @param {setting}
  66. * @return {Promise}
  67. */
  68. fetch(url, setting) {
  69. //设置参数的初始值
  70. let opts={
  71. method: (setting.method || 'GET').toUpperCase(), //请求方式
  72. headers : setting.headers || {}, // 请求头设置
  73. credentials : setting.credentials || true, // 设置cookie是否一起发送
  74. body: setting.body || {},
  75. mode : setting.mode || 'no-cors', // 可以设置 cors, no-cors, same-origin
  76. redirect : setting.redirect || 'follow', // follow, error, manual
  77. cache : setting.cache || 'default' // 设置 cache 模式 (default, reload, no-cache)
  78. }
  79. let dataType = setting.dataType || "json", // 解析方式
  80. data = setting.data || "" // 参数
  81. // 参数格式化
  82. function params_format (obj) {
  83. var str = ''
  84. for (var i in obj) {
  85. str += `${i}=${obj[i]}&`
  86. }
  87. return str.split('').slice(0, -1).join('')
  88. }
  89. if (opts.method === 'GET') {
  90. url = url + (data?`?${params_format(data)}`:'')
  91. }else{
  92. setting.body = data || {}
  93. }
  94. return new Promise( (resolve, reject) => {
  95. fetch(url, opts).then( async res => {
  96. let data = dataType === 'text' ? await res.text() :
  97. dataType === 'blob' ? await res.blob() : await res.json()
  98. resolve(data)
  99. }).catch( e => {
  100. reject(e)
  101. })
  102. })
  103. }

7. DOM

  1. $ (selector){
  2. var type = selector.substring(0, 1);
  3. if (type === '#') {
  4. if (document.querySelecotor) return document.querySelector(selector)
  5. return document.getElementById(selector.substring(1))
  6. }else if (type === '.') {
  7. if (document.querySelecotorAll) return document.querySelectorAll(selector)
  8. return document.getElementsByClassName(selector.substring(1))
  9. }else{
  10. return document['querySelectorAll' ? 'querySelectorAll':'getElementsByTagName'](selector)
  11. }
  12. }
  13. /*检测类名*/
  14. hasClass (ele, name) {
  15. return ele.className.match(new RegExp('(\\s|^)' + name + '(\\s|$)'));
  16. }
  17. /*添加类名*/
  18. addClass (ele, name) {
  19. if (!this.hasClass(ele, name)) ele.className += " " + name;
  20. }
  21. /*删除类名*/
  22. removeClass (ele, name) {
  23. if (this.hasClass(ele, name)) {
  24. var reg = new RegExp('(\\s|^)' + name + '(\\s|$)');
  25. ele.className = ele.className.replace(reg, '');
  26. }
  27. }
  28. /*替换类名*/
  29. replaceClass (ele, newName, oldName) {
  30. this.removeClass(ele, oldName);
  31. this.addClass(ele, newName);
  32. }
  33. /*获取兄弟节点*/
  34. siblings (ele) {
  35. console.log(ele.parentNode)
  36. var chid = ele.parentNode.children,eleMatch = [];
  37. for(var i = 0, len = chid.length; i < len; i ++){
  38. if(chid[i] != ele){
  39. eleMatch.push(chid[i]);
  40. }
  41. }
  42. return eleMatch;
  43. }
  44. /*获取行间样式属性*/
  45. getByStyle (obj,name){
  46. if(obj.currentStyle){
  47. return obj.currentStyle[name];
  48. }else{
  49. return getComputedStyle(obj,false)[name];
  50. }
  51. }

8. Storage 储存操作

  1. class StorageFn {
  2. constructor () {
  3. this.ls = window.localStorage;
  4. this.ss = window.sessionStorage;
  5. }
  6. /*-----------------cookie---------------------*/
  7. /*设置cookie*/
  8. setCookie (name, value, day) {
  9. var setting = arguments[0];
  10. if (Object.prototype.toString.call(setting).slice(8, -1) === 'Object'){
  11. for (var i in setting) {
  12. var oDate = new Date();
  13. oDate.setDate(oDate.getDate() + day);
  14. document.cookie = i + '=' + setting[i] + ';expires=' + oDate;
  15. }
  16. }else{
  17. var oDate = new Date();
  18. oDate.setDate(oDate.getDate() + day);
  19. document.cookie = name + '=' + value + ';expires=' + oDate;
  20. }
  21. }
  22. /*获取cookie*/
  23. getCookie (name) {
  24. var arr = document.cookie.split('; ');
  25. for (var i = 0; i < arr.length; i++) {
  26. var arr2 = arr[i].split('=');
  27. if (arr2[0] == name) {
  28. return arr2[1];
  29. }
  30. }
  31. return '';
  32. }
  33. /*删除cookie*/
  34. removeCookie (name) {
  35. this.setCookie(name, 1, -1);
  36. }
  37. /*-----------------localStorage---------------------*/
  38. /*设置localStorage*/
  39. setLocal(key, val) {
  40. var setting = arguments[0];
  41. if (Object.prototype.toString.call(setting).slice(8, -1) === 'Object'){
  42. for(var i in setting){
  43. this.ls.setItem(i, JSON.stringify(setting[i]))
  44. }
  45. }else{
  46. this.ls.setItem(key, JSON.stringify(val))
  47. }
  48. }
  49. /*获取localStorage*/
  50. getLocal(key) {
  51. if (key) return JSON.parse(this.ls.getItem(key))
  52. return null;
  53. }
  54. /*移除localStorage*/
  55. removeLocal(key) {
  56. this.ls.removeItem(key)
  57. }
  58. /*移除所有localStorage*/
  59. clearLocal() {
  60. this.ls.clear()
  61. }
  62. /*-----------------sessionStorage---------------------*/
  63. /*设置sessionStorage*/
  64. setSession(key, val) {
  65. var setting = arguments[0];
  66. if (Object.prototype.toString.call(setting).slice(8, -1) === 'Object'){
  67. for(var i in setting){
  68. this.ss.setItem(i, JSON.stringify(setting[i]))
  69. }
  70. }else{
  71. this.ss.setItem(key, JSON.stringify(val))
  72. }
  73. }
  74. /*获取sessionStorage*/
  75. getSession(key) {
  76. if (key) return JSON.parse(this.ss.getItem(key))
  77. return null;
  78. }
  79. /*移除sessionStorage*/
  80. removeSession(key) {
  81. this.ss.removeItem(key)
  82. }
  83. /*移除所有sessionStorage*/
  84. clearSession() {
  85. this.ss.clear()
  86. }
  87. }

9. Other 其它操作

  1. /*获取网址参数*/
  2. getURL(name){
  3. var reg = new RegExp("(^|&)"+ name +"=([^&]*)(&|$)");
  4. var r = decodeURI(window.location.search).substr(1).match(reg);
  5. if(r!=null) return r[2]; return null;
  6. }
  7. /*获取全部url参数,并转换成json对象*/
  8. getUrlAllParams (url) {
  9. var url = url ? url : window.location.href;
  10. var _pa = url.substring(url.indexOf('?') + 1),
  11. _arrS = _pa.split('&'),
  12. _rs = {};
  13. for (var i = 0, _len = _arrS.length; i < _len; i++) {
  14. var pos = _arrS[i].indexOf('=');
  15. if (pos == -1) {
  16. continue;
  17. }
  18. var name = _arrS[i].substring(0, pos),
  19. value = window.decodeURIComponent(_arrS[i].substring(pos + 1));
  20. _rs[name] = value;
  21. }
  22. return _rs;
  23. }
  24. /*删除url指定参数,返回url*/
  25. delParamsUrl(url, name){
  26. var baseUrl = url.split('?')[0] + '?';
  27. var query = url.split('?')[1];
  28. if (query.indexOf(name)>-1) {
  29. var obj = {}
  30. var arr = query.split("&");
  31. for (var i = 0; i < arr.length; i++) {
  32. arr[i] = arr[i].split("=");
  33. obj[arr[i][0]] = arr[i][1];
  34. };
  35. delete obj[name];
  36. var url = baseUrl + JSON.stringify(obj).replace(/[\"\{\}]/g,"").replace(/\:/g,"=").replace(/\,/g,"&");
  37. return url
  38. }else{
  39. return url;
  40. }
  41. }
  42. /*获取十六进制随机颜色*/
  43. getRandomColor () {
  44. return '#' + (function(h) {
  45. return new Array(7 - h.length).join("0") + h;
  46. })((Math.random() * 0x1000000 << 0).toString(16));
  47. }
  48. /*图片加载*/
  49. imgLoadAll(arr,callback){
  50. var arrImg = [];
  51. for (var i = 0; i < arr.length; i++) {
  52. var img = new Image();
  53. img.src = arr[i];
  54. img.onload = function(){
  55. arrImg.push(this);
  56. if (arrImg.length == arr.length) {
  57. callback && callback();
  58. }
  59. }
  60. }
  61. }
  62. /*音频加载*/
  63. loadAudio(src, callback) {
  64. var audio = new Audio(src);
  65. audio.onloadedmetadata = callback;
  66. audio.src = src;
  67. }
  68. /*DOM转字符串*/
  69. domToStirng(htmlDOM){
  70. var div= document.createElement("div");
  71. div.appendChild(htmlDOM);
  72. return div.innerHTML
  73. }
  74. /*字符串转DOM*/
  75. stringToDom(htmlString){
  76. var div= document.createElement("div");
  77. div.innerHTML=htmlString;
  78. return div.children[0];
  79. }
  80. /**
  81. * 光标所在位置插入字符,并设置光标位置
  82. *
  83. * @param {dom} 输入框
  84. * @param {val} 插入的值
  85. * @param {posLen} 光标位置处在 插入的值的哪个位置
  86. */
  87. setCursorPosition (dom,val,posLen) {
  88. var cursorPosition = 0;
  89. if(dom.selectionStart){
  90. cursorPosition = dom.selectionStart;
  91. }
  92. this.insertAtCursor(dom,val);
  93. dom.focus();
  94. console.log(posLen)
  95. dom.setSelectionRange(dom.value.length,cursorPosition + (posLen || val.length));
  96. }
  97. /*光标所在位置插入字符*/
  98. insertAtCursor(dom, val) {
  99. if (document.selection){
  100. dom.focus();
  101. sel = document.selection.createRange();
  102. sel.text = val;
  103. sel.select();
  104. }else if (dom.selectionStart || dom.selectionStart == '0'){
  105. let startPos = dom.selectionStart;
  106. let endPos = dom.selectionEnd;
  107. let restoreTop = dom.scrollTop;
  108. dom.value = dom.value.substring(0, startPos) + val + dom.value.substring(endPos, dom.value.length);
  109. if (restoreTop > 0){
  110. dom.scrollTop = restoreTop;
  111. }
  112. dom.focus();
  113. dom.selectionStart = startPos + val.length;
  114. dom.selectionEnd = startPos + val.length;
  115. } else {
  116. dom.value += val;
  117. dom.focus();
  118. }
  119. }

CSS

1. pc-reset PC样式初始化

  1. /* normalize.css */
  2. html {
  3. line-height: 1.15;
  4. /* 1 */
  5. -ms-text-size-adjust: 100%;
  6. /* 2 */
  7. -webkit-text-size-adjust: 100%;
  8. /* 2 */
  9. }
  10. body {
  11. margin: 0;
  12. }
  13. article,
  14. aside,
  15. footer,
  16. header,
  17. nav,
  18. section {
  19. display: block;
  20. }
  21. h1 {
  22. font-size: 2em;
  23. margin: 0.67em 0;
  24. }
  25. figcaption,
  26. figure,
  27. main {
  28. /* 1 */
  29. display: block;
  30. }
  31. figure {
  32. margin: 1em 40px;
  33. }
  34. hr {
  35. box-sizing: content-box;
  36. /* 1 */
  37. height: 0;
  38. /* 1 */
  39. overflow: visible;
  40. /* 2 */
  41. }
  42. pre {
  43. font-family: monospace, monospace;
  44. /* 1 */
  45. font-size: 1em;
  46. /* 2 */
  47. }
  48. a {
  49. background-color: transparent;
  50. /* 1 */
  51. -webkit-text-decoration-skip: objects;
  52. /* 2 */
  53. }
  54. abbr[title] {
  55. border-bottom: none;
  56. /* 1 */
  57. text-decoration: underline;
  58. /* 2 */
  59. text-decoration: underline dotted;
  60. /* 2 */
  61. }
  62. b,
  63. strong {
  64. font-weight: inherit;
  65. }
  66. b,
  67. strong {
  68. font-weight: bolder;
  69. }
  70. code,
  71. kbd,
  72. samp {
  73. font-family: monospace, monospace;
  74. /* 1 */
  75. font-size: 1em;
  76. /* 2 */
  77. }
  78. dfn {
  79. font-style: italic;
  80. }
  81. mark {
  82. background-color: #ff0;
  83. color: #000;
  84. }
  85. small {
  86. font-size: 80%;
  87. }
  88. sub,
  89. sup {
  90. font-size: 75%;
  91. line-height: 0;
  92. position: relative;
  93. vertical-align: baseline;
  94. }
  95. sub {
  96. bottom: -0.25em;
  97. }
  98. sup {
  99. top: -0.5em;
  100. }
  101. audio,
  102. video {
  103. display: inline-block;
  104. }
  105. audio:not([controls]) {
  106. display: none;
  107. height: 0;
  108. }
  109. img {
  110. border-style: none;
  111. }
  112. svg:not(:root) {
  113. overflow: hidden;
  114. }
  115. button,
  116. input,
  117. optgroup,
  118. select,
  119. textarea {
  120. font-family: sans-serif;
  121. /* 1 */
  122. font-size: 100%;
  123. /* 1 */
  124. line-height: 1.15;
  125. /* 1 */
  126. margin: 0;
  127. /* 2 */
  128. }
  129. button,
  130. input {
  131. /* 1 */
  132. overflow: visible;
  133. }
  134. button,
  135. select {
  136. /* 1 */
  137. text-transform: none;
  138. }
  139. button,
  140. html [type="button"],
  141. /* 1 */
  142. [type="reset"],
  143. [type="submit"] {
  144. -webkit-appearance: button;
  145. /* 2 */
  146. }
  147. button::-moz-focus-inner,
  148. [type="button"]::-moz-focus-inner,
  149. [type="reset"]::-moz-focus-inner,
  150. [type="submit"]::-moz-focus-inner {
  151. border-style: none;
  152. padding: 0;
  153. }
  154. button:-moz-focusring,
  155. [type="button"]:-moz-focusring,
  156. [type="reset"]:-moz-focusring,
  157. [type="submit"]:-moz-focusring {
  158. outline: 1px dotted ButtonText;
  159. }
  160. fieldset {
  161. padding: 0.35em 0.75em 0.625em;
  162. }
  163. legend {
  164. box-sizing: border-box;
  165. /* 1 */
  166. color: inherit;
  167. /* 2 */
  168. display: table;
  169. /* 1 */
  170. max-width: 100%;
  171. /* 1 */
  172. padding: 0;
  173. /* 3 */
  174. white-space: normal;
  175. /* 1 */
  176. }
  177. progress {
  178. display: inline-block;
  179. /* 1 */
  180. vertical-align: baseline;
  181. /* 2 */
  182. }
  183. textarea {
  184. overflow: auto;
  185. }
  186. [type="checkbox"],
  187. [type="radio"] {
  188. box-sizing: border-box;
  189. /* 1 */
  190. padding: 0;
  191. /* 2 */
  192. }
  193. [type="number"]::-webkit-inner-spin-button,
  194. [type="number"]::-webkit-outer-spin-button {
  195. height: auto;
  196. }
  197. [type="search"] {
  198. -webkit-appearance: textfield;
  199. /* 1 */
  200. outline-offset: -2px;
  201. /* 2 */
  202. }
  203. [type="search"]::-webkit-search-cancel-button,
  204. [type="search"]::-webkit-search-decoration {
  205. -webkit-appearance: none;
  206. }
  207. ::-webkit-file-upload-button {
  208. -webkit-appearance: button;
  209. /* 1 */
  210. font: inherit;
  211. /* 2 */
  212. }
  213. details,
  214. /* 1 */
  215. menu {
  216. display: block;
  217. }
  218. summary {
  219. display: list-item;
  220. }
  221. canvas {
  222. display: inline-block;
  223. }
  224. template {
  225. display: none;
  226. }
  227. [hidden] {
  228. display: none;
  229. }
  230. /* reset */
  231. html,
  232. body,
  233. h1,
  234. h2,
  235. h3,
  236. h4,
  237. h5,
  238. h6,
  239. div,
  240. dl,
  241. dt,
  242. dd,
  243. ul,
  244. ol,
  245. li,
  246. p,
  247. blockquote,
  248. pre,
  249. hr,
  250. figure,
  251. table,
  252. caption,
  253. th,
  254. td,
  255. form,
  256. fieldset,
  257. legend,
  258. input,
  259. button,
  260. textarea,
  261. menu {
  262. margin: 0;
  263. padding: 0;
  264. box-sizing: border-box;
  265. }

2. Phone-reset

  1. /* normalize.css */
  2. html {
  3. line-height: 1.15;
  4. /* 1 */
  5. -ms-text-size-adjust: 100%;
  6. /* 2 */
  7. -webkit-text-size-adjust: 100%;
  8. /* 2 */
  9. }
  10. body {
  11. margin: 0;
  12. }
  13. article,
  14. aside,
  15. footer,
  16. header,
  17. nav,
  18. section {
  19. display: block;
  20. }
  21. h1 {
  22. font-size: 2em;
  23. margin: 0.67em 0;
  24. }
  25. figcaption,
  26. figure,
  27. main {
  28. /* 1 */
  29. display: block;
  30. }
  31. figure {
  32. margin: 1em 40px;
  33. }
  34. hr {
  35. box-sizing: content-box;
  36. /* 1 */
  37. height: 0;
  38. /* 1 */
  39. overflow: visible;
  40. /* 2 */
  41. }
  42. pre {
  43. font-family: monospace, monospace;
  44. /* 1 */
  45. font-size: 1em;
  46. /* 2 */
  47. }
  48. a {
  49. background-color: transparent;
  50. /* 1 */
  51. -webkit-text-decoration-skip: objects;
  52. /* 2 */
  53. }
  54. abbr[title] {
  55. border-bottom: none;
  56. /* 1 */
  57. text-decoration: underline;
  58. /* 2 */
  59. text-decoration: underline dotted;
  60. /* 2 */
  61. }
  62. b,
  63. strong {
  64. font-weight: inherit;
  65. }
  66. b,
  67. strong {
  68. font-weight: bolder;
  69. }
  70. code,
  71. kbd,
  72. samp {
  73. font-family: monospace, monospace;
  74. /* 1 */
  75. font-size: 1em;
  76. /* 2 */
  77. }
  78. dfn {
  79. font-style: italic;
  80. }
  81. mark {
  82. background-color: #ff0;
  83. color: #000;
  84. }
  85. small {
  86. font-size: 80%;
  87. }
  88. sub,
  89. sup {
  90. font-size: 75%;
  91. line-height: 0;
  92. position: relative;
  93. vertical-align: baseline;
  94. }
  95. sub {
  96. bottom: -0.25em;
  97. }
  98. sup {
  99. top: -0.5em;
  100. }
  101. audio,
  102. video {
  103. display: inline-block;
  104. }
  105. audio:not([controls]) {
  106. display: none;
  107. height: 0;
  108. }
  109. img {
  110. border-style: none;
  111. }
  112. svg:not(:root) {
  113. overflow: hidden;
  114. }
  115. button,
  116. input,
  117. optgroup,
  118. select,
  119. textarea {
  120. font-family: sans-serif;
  121. /* 1 */
  122. font-size: 100%;
  123. /* 1 */
  124. line-height: 1.15;
  125. /* 1 */
  126. margin: 0;
  127. /* 2 */
  128. }
  129. button,
  130. input {
  131. /* 1 */
  132. overflow: visible;
  133. }
  134. button,
  135. select {
  136. /* 1 */
  137. text-transform: none;
  138. }
  139. button,
  140. html [type="button"],
  141. /* 1 */
  142. [type="reset"],
  143. [type="submit"] {
  144. -webkit-appearance: button;
  145. /* 2 */
  146. }
  147. button::-moz-focus-inner,
  148. [type="button"]::-moz-focus-inner,
  149. [type="reset"]::-moz-focus-inner,
  150. [type="submit"]::-moz-focus-inner {
  151. border-style: none;
  152. padding: 0;
  153. }
  154. button:-moz-focusring,
  155. [type="button"]:-moz-focusring,
  156. [type="reset"]:-moz-focusring,
  157. [type="submit"]:-moz-focusring {
  158. outline: 1px dotted ButtonText;
  159. }
  160. fieldset {
  161. padding: 0.35em 0.75em 0.625em;
  162. }
  163. legend {
  164. box-sizing: border-box;
  165. /* 1 */
  166. color: inherit;
  167. /* 2 */
  168. display: table;
  169. /* 1 */
  170. max-width: 100%;
  171. /* 1 */
  172. padding: 0;
  173. /* 3 */
  174. white-space: normal;
  175. /* 1 */
  176. }
  177. progress {
  178. display: inline-block;
  179. /* 1 */
  180. vertical-align: baseline;
  181. /* 2 */
  182. }
  183. textarea {
  184. overflow: auto;
  185. }
  186. [type="checkbox"],
  187. [type="radio"] {
  188. box-sizing: border-box;
  189. /* 1 */
  190. padding: 0;
  191. /* 2 */
  192. }
  193. [type="number"]::-webkit-inner-spin-button,
  194. [type="number"]::-webkit-outer-spin-button {
  195. height: auto;
  196. }
  197. [type="search"] {
  198. -webkit-appearance: textfield;
  199. /* 1 */
  200. outline-offset: -2px;
  201. /* 2 */
  202. }
  203. [type="search"]::-webkit-search-cancel-button,
  204. [type="search"]::-webkit-search-decoration {
  205. -webkit-appearance: none;
  206. }
  207. ::-webkit-file-upload-button {
  208. -webkit-appearance: button;
  209. /* 1 */
  210. font: inherit;
  211. /* 2 */
  212. }
  213. details,
  214. /* 1 */
  215. menu {
  216. display: block;
  217. }
  218. summary {
  219. display: list-item;
  220. }
  221. canvas {
  222. display: inline-block;
  223. }
  224. template {
  225. display: none;
  226. }
  227. [hidden] {
  228. display: none;
  229. }
  230. /* reset */
  231. html,
  232. body,
  233. h1,
  234. h2,
  235. h3,
  236. h4,
  237. h5,
  238. h6,
  239. div,
  240. dl,
  241. dt,
  242. dd,
  243. ul,
  244. ol,
  245. li,
  246. p,
  247. blockquote,
  248. pre,
  249. hr,
  250. figure,
  251. table,
  252. caption,
  253. th,
  254. td,
  255. form,
  256. fieldset,
  257. legend,
  258. input,
  259. button,
  260. textarea,
  261. menu {
  262. margin: 0;
  263. padding: 0;
  264. box-sizing: border-box;
  265. }
  266. html,
  267. body {
  268. /* 禁止选中文本 */
  269. -webkit-user-select: none;
  270. user-select: none;
  271. font: Oswald, 'Open Sans', Helvetica, Arial, sans-serif
  272. }
  273. /* 禁止长按链接与图片弹出菜单 */
  274. a,
  275. img {
  276. -webkit-touch-callout: none;
  277. }
  278. /*ios android去除自带阴影的样式*/
  279. a,
  280. input {
  281. -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
  282. }
  283. input[type="text"] {
  284. -webkit-appearance: none;
  285. }

3. 公共样式提取

  1. /* 禁止选中文本 */
  2. .usn{
  3. -webkit-user-select:none;
  4. -moz-user-select:none;
  5. -ms-user-select:none;
  6. -o-user-select:none;
  7. user-select:none;
  8. }
  9. /* 浮动 */
  10. .fl { float: left; }
  11. .fr { float: right; }
  12. .cf { zoom: 1; }
  13. .cf:after {
  14. content:".";
  15. display:block;
  16. clear:both;
  17. visibility:hidden;
  18. height:0;
  19. overflow:hidden;
  20. }
  21. /* 元素类型 */
  22. .db { display: block; }
  23. .dn { display: none; }
  24. .di { display: inline }
  25. .dib {display: inline-block;}
  26. .transparent { opacity: 0 }
  27. /*文字排版、颜色*/
  28. .f12 { font-size:12px }
  29. .f14 { font-size:14px }
  30. .f16 { font-size:16px }
  31. .f18 { font-size:18px }
  32. .f20 { font-size:20px }
  33. .fb { font-weight:bold }
  34. .fn { font-weight:normal }
  35. .t2 { text-indent:2em }
  36. .red,a.red { color:#cc0031 }
  37. .darkblue,a.darkblue { color:#039 }
  38. .gray,a.gray { color:#878787 }
  39. .lh150 { line-height:150% }
  40. .lh180 { line-height:180% }
  41. .lh200 { line-height:200% }
  42. .unl { text-decoration:underline; }
  43. .no_unl { text-decoration:none; }
  44. .tl { text-align: left; }
  45. .tc { text-align: center; }
  46. .tr { text-align: right; }
  47. .tj { text-align: justify; text-justify: inter-ideograph; }
  48. .wn { /* 强制不换行 */
  49. word-wrap:normal;
  50. white-space:nowrap;
  51. }
  52. .wb { /* 强制换行 */
  53. white-space:normal;
  54. word-wrap:break-word;
  55. word-break:break-all;
  56. }
  57. .wp { /* 保持空白序列*/
  58. overflow:hidden;text-align:left;white-space:pre-wrap;word-wrap:break-word;word-break:break-all;
  59. }
  60. .wes { /* 多出部分用省略号表示 , 用于一行 */
  61. overflow:hidden;
  62. word-wrap:normal;
  63. white-space:nowrap;
  64. text-overflow:ellipsis;
  65. }
  66. .wes-2 { /* 适用于webkit内核和移动端 */
  67. display: -webkit-box;
  68. -webkit-box-orient: vertical;
  69. -webkit-line-clamp: 2;
  70. overflow: hidden;
  71. }
  72. .wes-3 {
  73. display: -webkit-box;
  74. -webkit-box-orient: vertical;
  75. -webkit-line-clamp: 3;
  76. overflow: hidden;
  77. }
  78. .wes-4 {
  79. display: -webkit-box;
  80. -webkit-box-orient: vertical;
  81. -webkit-line-clamp: 4;
  82. overflow: hidden;
  83. }
  84. /* 溢出样式 */
  85. .ofh { overflow: hidden; }
  86. .ofs {overflow: scroll; }
  87. .ofa {overflow: auto; }
  88. .ofv {overflow: visible; }
  89. /* 定位方式 */
  90. .ps {position: static; }
  91. .pr {position: relative;zoom:1; }
  92. .pa {position: absolute; }
  93. .pf {position: fixed; }
  94. /* 垂直对齐方式 */
  95. .vt {vertical-align: top; }
  96. .vm {vertical-align: middle; }
  97. .vb {vertical-align: bottom; }
  98. /* 鼠标样式 */
  99. .csd {cursor: default; }
  100. .csp {cursor: pointer; }
  101. .csh {cursor: help; }
  102. .csm {cursor: move; }
  103. /* flex布局 */
  104. .df-sb {
  105. display:flex;
  106. align-items: center;
  107. justify-content: space-between;
  108. }
  109. .df-sa {
  110. display:flex;
  111. align-items: center;
  112. justify-content: space-around;
  113. }
  114. /* 垂直居中 */
  115. .df-c {
  116. display: flex;
  117. align-items: center;
  118. justify-content: center;
  119. }
  120. .tb-c {
  121. text-align:center;
  122. display:table-cell;
  123. vertical-align:middle;
  124. }
  125. .ts-c {
  126. position: absolute;
  127. left: 50%; top: 50%;
  128. transform: translate(-50%, -50%);
  129. }
  130. .ts-mc {
  131. position: absolute;
  132. left: 0;right: 0;
  133. bottom: 0; top: 0;
  134. margin: auto;
  135. }
  136. /* 辅助 */
  137. .mask-fixed-wrapper {
  138. width: 100%;
  139. height: 100%;
  140. position: fixed;
  141. left:0;top:0;
  142. background: rgba(0, 0, 0, 0.65);
  143. z-index: 999;
  144. }
  145. .bg-cover {
  146. background-size: cover;
  147. background-repeat: no-repeat;
  148. background-position: center center;
  149. }
  150. .bg-cover-all {
  151. background-size: 100% 100%;
  152. background-repeat: no-repeat;
  153. background-position: center center;
  154. }
    • *

发表评论

表情:
评论列表 (有 0 条评论,333人围观)

还没有评论,来说两句吧...

相关阅读