wW3school前端小知识
1、css一行文本超出...
overflow: hidden;
text-overflow:ellipsis;
white-space: nowrap;
2、多行文本超出显示...
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 3;
overflow: hidden;
3、IOS手机容器滚动条滑动不流畅
overflow: auto;
-webkit-overflow-scrolling: touch;
4、修改滚动条样式,隐藏div元素的滚动条
div::-webkit-scrollbar { display: none; }
div::-webkit-scrollbar滚动条整体部分
div::-webkit-scrollbar-thumb滚动条里面的小方块,能向上向下移动(或往左往右移动,取决于是垂直滚动条还是水平滚动条)
div::-webkit-scrollbar-track滚动条的轨道(里面装有Thumb)
div::-webkit-scrollbar-button滚动条的轨道的两端按钮,允许通过点击微调小方块的位置
div::-webkit-scrollbar-track-piece内层轨道,滚动条中间部分
div::-webkit-scrollbar-corner边角,即两个滚动条的交汇处
div::-webkit-resizer两个滚动条的交汇处上英语通过拖动调整元素大小的小空间,注意此方案有兼容性问题,一般需要隐藏滚动条时我都是用一个色块通过定位改上去,或者将子级元素调大,父级元素使用overflow-hidden截掉滚动条部分。
5、使用css写出一个三角形角标
元素宽高设置为 0,通过border属性来设置,让其他三个方向的border颜色为透明或者和背景色保持一致,剩余一条border的颜色设置为需要的颜色
div { width: 0; height: 0; border: 5px solid #transparent; border-top-color: red; }
6、解决ios audio 无法自动播放、循环播放的问题
ios手机在使用audio或者video播放的时候,个别机型无法实现自动播放,可以使用下面的代码hack
// 解决ios audio无法自动播放、循环播放的问题 var music = document.getElementById('video'); var state = 0; document.addEventListener('touchstart', function(){ if(state==0){ music.play(); state=1; } }, false); document.addEventListener("WeixinJSBridgeReady", function () { music.play(); }, false); //循环播放 music.onended = function () { music.load(); music.play(); }
7、水平垂直居中
一般使用两种方式,定位或者flex
div { width: 100px; height: 100px; position: absolute; top: 0; right: 0; bottom: 0; left: 0; margin: auto; } //父级控制子集居中 .parent { display: flex; justify-content: center; align-items: center; }
8、隐藏页面元素
display-none:元素不存在,从dom中删除
opacity-0:元素透明度将为 0,但元素仍然存在,绑定的时间仍旧有效扔可触发执行
visibility-hidden:元素隐藏,但元素仍旧存在,页面中无法触发该元素的事件
9、前端工程化
一般来说前端工程包含:项目初始化、项目开发、继承、构建、打包、测试、部署等流程。工程化就是以工程的角度来解决这些问题。(webpack仅仅是前端工程化中的一环,在整个工程化过程中帮我们解决了大多数问题)
10、contenteditable
html中大部分标签都是不可以编辑的,但是添加了contenteditable属性之后,标签会变成可编辑状态
<div contenteditable="true"></div>
不过通过这个属性把标签变成可编辑状态后只有input事件,没有change事件。也不能像表单一样通过maxlength控制最大长度。
11、calc
这是一个css属性,可以计算css的值。
div { width: calc(25% - 20px); }
12、Proxy 和 Object.defineProperty 区别
Proxy 的意思是代理,可以拦截对象上的一个操作。通过 new 的方式创建对象,第一个参数是被拦截的对象,第二个参数是对象操作的描述。实例化后返回一个新的对象
new Proxy(target, { get(target, property) { }, set(target, property) { }, deleteProperty(target, property) { } })
Proxy 区别于 Object.definedProperty
Object.defineProperty 只能监听到属性的读写,而 Proxy 除读写外还可以监听属性的删除,方法的调用等
通常情况下我们想要监视数组的变化,基本要靠重写数组方法的方式实现,这也是 Vue 的实现方式,而 Proxy 可以直接监视数组的变化
const list = [1, 2, 3]; const listproxy = new Proxy(list, { set(target, property, value) { target[property] = value; return true; // 标识设置成功 } }); list.push(4);
Proxy 是以非入侵的方式监管了对象的读写,而 defineProperty 需要按特定的方式定义对象的属性
13、Reflect
Reflect 的静态方法和 Proxy 描述中的方法完全一致。也就是 Reflect 成员方法就是 Proxy 处理对象的默认实现
Proxy 对象默认的方法就是调用了 Reflect 内部的处理逻辑,也就是如果我们调用 get 方法,那么在内部,proxy 就是将 get 原封不动的交给了 Reflect
const proxy = new Proxy(obj, { get(target, property) { return Reflect.get(target, property); } })
判断对象是否存在某个属性,可以使用 in 操作符,可以使用Reflect.has(obj, name);
删除一个属性可以使用 delete,也可以使用 Reflect.deleteProperty(obj, name);
获取所有属性名可以使用 Object.keys,也可以使用 Reflect.ownKeys(obj);
14、解析 get 参数
通过 replace 方法获取 url 中的参数键值对,可以快速解析 get 参数
const q = {}; location.search.replace(/([^?&=]+)=([^&]+)/g,(_,k,v)=>q[k]=v); console.log(q);
15、解析连接 url
可以通过创建 a 标签,给 a 标签赋值 href 属性的方式,获取到协议, pathname,origin 等 location 对象上的属性
// 创建a标签
const aEle = document.createElement('a');
// 给a标签赋值href路径
aEle.href = '/test.html';
// 访问aEle中的属性
aEle.protocol; // 获取协议
aEle.pathname; // 获取path
aEle.origin;
aEle.host;
aEle.search;