前端小知识11点
- 2019 年 12 月 16 日
- 笔记
1、Chrome浏览器全屏显示及监听
主要是几个关键的浏览器 API: ① 判断浏览器是否是全屏
document.webkitIsFullScreen // true/false
② 全屏
document.documentElement.webkitRequestFullScreen()
③ 退出全屏
//注意:不是 document.documentElement document.exitFullscreen()
④ 添加全屏切换时的监听事件
window.addEventListener('webkitfullscreenchange', yourfunction );
根据这几个就能控制及监听浏览器的全屏行为
2、moment.js获取任意两个日期之间所在的月或年的集合
逻辑代码:
//两个日期之间所在的月、年 const getBetweenMonthsOrYearsArray=(startDate, endDate,monthOrYear)=> { //给定返回的日期格式 const dateFormat=monthOrYear==='month'?"YYYY-MM":"YYYY" //获取 开始日期 的月或年 let startMonthOrYear = moment(startDate).startOf(monthOrYear).format(dateFormat); //获取 结束日期 的月或年 const endMonthOrYear = moment(endDate).startOf(monthOrYear).format(dateFormat); //日期之间月或年的集合 const monthOrYearArray = []; //循环将月/年 push进数组中,直到开始日期比结束日期大 while (startMonthOrYear <= endMonthOrYear) { console.log(startMonthOrYear,endMonthOrYear,'endMonthOrYear97') monthOrYearArray.push(startMonthOrYear); startMonthOrYear = moment(startMonthOrYear).add(1, monthOrYear).format(dateFormat); } //返回结果 return monthOrYearArray; }
例:
getBetweenMonthsOrYearsArray('2018-05-17','2019-02-01','year') //["2018", "2019"] getBetweenMonthsOrYearsArray('2018-05-17','2019-02-01','month') //["2018-05", "2018-06", "2018-07", "2018-08", "2018-09", "2018-10", "2018-11", "2018-12", "2019-01", "2019-02"]
3、moment.js当日期为周日时,获取所在周的周日,出现的bug
let date='2019-08-11' //获取该日期所在的周几 const n = moment(date, 'YYYY-MM-DD').format('E') // '7' //获取所在年的第几周 //如果是周日(7)的话,周数需要加 1,否则算的是上周!! const end_weeknumber = n==='7'?moment(date).isoWeek()+1:moment(date).isoWeek() const end_condition = moment(date) .week(+end_weeknumber) .isoWeekday(7) .format('YYYY-MM-DD') //'2019-08-11'
特别特别需要注意的就是,当所选日期是周日的时候,获取所在的周数是需要加 1 的
配合 前端小知识10点(2019.9.29) 的第一点使用:
完美版:
let date='2019-08-11' let when=0 const n = moment(date, 'YYYY-MM-DD').format('E') const weeknumber= n==='7'?moment(date).isoWeek()+1:moment(date).isoWeek() const startDate=moment(date) .week(+weeknumber+when) .isoWeekday(1) .format('YYYY-MM-DD'); //2018-12-31 const endDate=moment(date) .week(+weeknumber+when) .isoWeekday(7) .format('YYYY-MM-DD'); //2019-01-06
4、在web页面显示LCD液晶字体
参考:页面显示LCD液晶字体,特殊字体,@font-face属性详细用法(https://blog.csdn.net/sunshine_han/article/details/78258880)
但里面废话比较多,这么写就够了:

效果图:

5、absolute垂直居中和水平居中
.a { position: absolute; top: 50%; left: 50%; transform: translateX(-50%) translateY(-50%); }
6、动态显示时间(React)
class updateTime extends Component { state = { time: '', }; componentDidMount() { this.calculTime(); } calculTime = () => { const that = this; // 当前时间 this.setState({ time: moment().format('YYYY年M月D日, h:mm:ss A'), }); // 延迟一秒执行自己 setTimeout(() => { that.calculTime(); }, 1000); }; render() { } }
最好是单独做成一个组件不断更新
7、引用leaflet的扩展包
之前不懂怎么引用扩展包,写成这个样子:
import L from "leaflet-editable";
或
import L from "leaflet"; import LL from "leaflet-editable";
这些都是不对的,正确引用:
import L from "leaflet"; import "leaflet-editable"; import "leaflet-path-drag";
8、给定两个颜色,获取一定数量的渐变色
// min rgba(155,224,178,1) max rgba(255,152,0,1) //startColor 起始底色 //endColor 最亮的颜色 //number 待染色的个数 function fColorGradualChange( //[155,224,178,1] startColorArr, //[255,152,0,1] endColorArr, //3 number ) { //红 const startR = startColorArr[0]; //绿 const startG = startColorArr[1]; //蓝 const startB = startColorArr[2]; //红 const endR = endColorArr[0]; //绿 const endG = endColorArr[1]; //蓝 const endB = endColorArr[2]; //计算每个色阶的平均值 const sR = (endR - startR) / number; const sG = (endG - startG) / number; const sB = (endB - startB) / number; const colors = []; for (let i = 0; i < number; i++) { colors.push( fColorToHex( //每个item 分配得到的 R、G、B parseInt(sR * i + startR, 10), parseInt(sG * i + startG, 10), parseInt(sB * i + startB, 10) ) ); } return colors; } //rgb转hex function fColorToHex(r, g, b) { const hex = "#" + // numObj.toString([radix]) 默认转 10 进制, // 此处是转为 16 进制 fAddZero(r.toString(16)) + fAddZero(g.toString(16)) + fAddZero(b.toString(16)); //返回拼接的十六进制颜色码 return hex; } // 加0补位 function fAddZero(value) { //value是0 位、1 位或两位的 16 进制数字 const newv = "00" + value; return newv.substring(newv.length - 2, newv.length); }
例:
<div> <div class="a">aaa</div> <div class="a">bbb</div> <div class="a">ccc</div> <div class="a">ddd</div> <div class="a">eee</div> </div> const colorArr=fColorGradualChange([155,224,178,1],[255,152,0,1],5) $('.a').each((index,item)=> { item.style.color=colorArr[index] })
效果:

9、防抖函数
只有在最后一次触发事件的时候才会执行, 比如在不断拖动(dragging)的事件中采用防抖函数:
let timeoutId=0 'dragging':(e:object) =>{ clearTimeout(timeoutId) timeoutId=window.setTimeout(()=>{ //do something //... },100) },
这个知识在自己的项目里还是挺有用的,一个是拖拽,另一个是鼠标滚轮滚动里也用到过
10、获取网页缩放比例
window.devicePixelRatio
11、控制input光标的位置——setSelectionRange
文档参考:
https://developer.mozilla.org/zh-CN/docs/Web/API/HTMLInputElement/setSelectionRange
例1:单个 input 选择一段值
<input type="text" id="inputa" value="123456789" /> document.getElementById('inputa').focus() document.getElementById('inputa').setSelectionRange(2,5)

例 2:多个 input 联动,跳光标
<input type="text" id="inputa" value="" oninput="setInput()"/> <input type="text" id="inputb" value="34"/> const a=document.getElementById('inputa') const b=document.getElementById('inputb') function setInput() { if (a.value.length === 2) { b.focus() b.setSelectionRange(3, 3) } }
inputa 输入 2 个值后,光标自动跳到inputb 的值的最后:


(完)