iview
动态的更新子级菜单
除了更新
open-names 和 active-name属性外
还需增加如下调用
this.$nextTick(() => {
//下面两个方法时iview提供的 不调用无法更新子级菜单
this.$refs.slideMenuIview.updateOpened();
this.$refs.slideMenuIview.updateActiveName();
});
字体显示
强制换行
word-break: break-all;
word-wrap: break-word;
white-space: pre-wrap;
word-break: break-all; 只对英文起作用,以字母作为换行依据。
word-wrap: break-word; 只对英文起作用,以单词作为换行依据。
white-space: pre-wrap; 只对中文起作用,强制换行。
显示省略号
white-space:nowrap;
text-overflow:ellipsis;
overflow:hidden;
注意display的值为 block、inline-block、list-item、table-caption、flow-root才会起作用
参考地址:https://www.cnblogs.com/suizhikuo/p/9155241.html
box-shadow
a.做边框
当父元素的高度是被子元素撑起来的,没有设置具体的宽高,设置 box-sizing: border-box;是没用的,当有选中时增加边框这种需求时,会影响布局,可以用
box-shadow: 0px 0px 0 1px inset;
相比于outline,好处之一时 可以响应border-radius
扩展运算符...
a.
对类数组元素使用forEach高阶函数
let firstDomList = document.getElementsByClassName('first');
console.log(firstDomList);
[...firstDomList].forEach((el, index) => {
console.log(index);
})
因为firstDomList是HTMLCollection类型的,不能直接使用forEach,因为它实现了Iterator 接口,所以能被扩展运算符操作。
b.
替代apply函数
最大值
let a = [1, 2, 3, 56, 7, 89];
console.log(Math.max.apply(null, a));
console.log(Math.max(...a));
合并数组
let a = [1, 2, 3, 56, 7, 89];
let b = [];
// Array.prototype.push.apply(b, a);
b.push(...a);
console.log(b);
详细可看
https://blog.csdn.net/qq_30100043/article/details/53391308
事件捕获
a.
自定义一个下拉菜单,要求点击按钮可以切换隐藏和显示,点击页面其他地方则隐藏,简单的模拟一下
html
<button class="toggle-btn">收缩</button>
<button class="toggle-btn">收缩</button>
<button onclick="test(event)">测试</button>
<button disabled> disabled </button>
<button style="pointer-events: none" onclick="alert(1)"> pointer-events: none</button>
js
function test(event) {
event.stopPropagation();
}
document.addEventListener('click', function (event) {
let target = event.target;
if (target.classList.contains('toggle-btn')) {
let text = target.textContent;
target.textContent = text === '展开' ? '收缩' : '展开'
}
})
document.addEventListener('click', function (event) {
let target = event.target;
[...document.getElementsByClassName('toggle-btn')].forEach(el => {
if (target === el) {
//是本身则交给元素自己处理
} else {
el.textContent = '收缩';
}
})
}, true)
使用捕获的好处时,当出于需求阻止了事件的传播,也可以正确的切换。
采用事件委托可以应对动态的添加dom。
document.addEventListener的第三个参数为true时,表示事件在捕获阶段触发,还可以传递更多,比如实现事件之调用一次。
document.getElementById('first').addEventListener("click",function(event){
alert(123);
},{
once:true
})
至于DOM元素之间的位置关系可使用compareDocumentPosition,一下是JQuery3.3.1的部分实现
var adown = a.nodeType === 9 ? a.documentElement : a,
bup = b && b.parentNode;
return a === bup || !!( bup && bup.nodeType === 1 && (
adown.contains ?
adown.contains( bup ) :
a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
));
更多详细
https://developer.mozilla.org/zh-CN/docs/Web/API/EventTarget/addEventListener
3.谷歌调试工具中对DOM的处理
a.
在Elements 面板中你最新点击的DOM元素,可以在Console中以$0的方式获得引用,持续到$4,
b.
在Console中对DOM元素的操作可以与渲染同步
document.body.contentEditable = true;
//让浏览器变成一个编辑器
同样也可以在Elements直接操作DOM
h 可以切换DOM隐藏与显示
delete和Backspace 进行删除
双击进行编辑
ArrowLeft、ArrowRight对DOM进行展开、收起
键盘Alt+鼠标左键全部展开
Shift+ArrowTop、Shift+ArrowBottom来移动元素
Ctrll+z 进行撤销
更多功能可以点击鼠标右键进行查看,在不同的地方都右键一下,会有很多惊喜。
更多快捷键可以在开发者工具的Shortcuts中查看
image.png
c
console.dir 方便查看DOM属性
获取元素信息
a 获取元素在页面上占用的高度和宽度
let loginDom = document.getElementById("login-id");
console.log(loginDom.offsetHeight);
console.log(loginDom.offsetWidth);
之前一直脑抽的用 parseInt(window.getComputedStyle(loginDom).height) ,直到看iview的源码才恍然大悟。
谷歌浏览器
Ctrl+N 打开新的窗口
Ctrl+T 打开新的标签页
Ctrl+Shift+T 打开关闭的标签
Ctrl+1-8 按从左到右的顺序,切换到指定标签,Ctrl+9定位到最后一个标签
Ctrl+鼠标左键 在新的标签页打开连接
Ctrl+L 定位到浏览器的地址栏
Alt+鼠标左键、Alt+鼠标右键 后退、前进历史记录
Windows操作系统
a.
我的工具栏是这样放置的
image.png
默认是隐藏的,有消息或鼠标放上去才会显示,放到上面是因为有消息时不会影响调试和布局。
按下Win+1 在程序没启动时,会启动程序,启动测切换到程序
按下Win+2 会定位到编辑器,这是再次按下Win+2 则会回到浏览器。
b
运行github下载的代码,如何快速打开cmd
image.png
输入cmd
c
Win+d 回到桌面
Win+l 锁屏
Win+ArrowTop 放大窗口
Win+ArrowBottom 缩小窗口
Alt+F4关闭窗口
Ctrl+Alt+Delete 任务管理器 干掉未响应程序
Flex 布局
参考链接:http://www.ruanyifeng.com/blog/2015/07/flex-grammar.html?utm_source=tuicool
兼容性:Chrome21+、Opera12.1、FireFox22.1、Safari6.1、IE10+
设置在父元素上
display: flex;
display: inline-flex;
设为 Flex 布局以后,子元素的float、clear和vertical-align属性将失效。
flex-direction: row | row-reverse | column | column-reverse;
row(默认值):主轴为水平方向,起点在左端。
row-reverse:主轴为水平方向,起点在右端。
column:主轴为垂直方向,起点在上沿。
column-reverse:主轴为垂直方向,起点在下沿。
flex-wrap: nowrap | wrap | wrap-reverse;
nowrap(默认):不换行。
wrap:换行,第一行在上方。
wrap-reverse:换行,第一行在下方。
flex-flow: <flex-direction> || <flex-wrap>;
flex-flow属性是flex-direction属性和flex-wrap属性的简写形式,默认值为row nowrap。
justify-content: flex-start | flex-end | center | space-between | space-around;
justify-content属性定义了项目在主轴上的对齐方式。
flex-start(默认值):左对齐
flex-end:右对齐
center: 居中
space-between:两端对齐,项目之间的间隔都相等。
space-around:每个项目两侧的间隔相等。所以,项目之间的间隔比项目与边框的间隔大一倍
align-items: flex-start | flex-end | center | baseline | stretch;
align-items属性定义项目在交叉轴上如何对齐。
flex-start:交叉轴的起点对齐。
flex-end:交叉轴的终点对齐。
center:交叉轴的中点对齐。
baseline: 项目的第一行文字的基线对齐。
stretch(默认值):如果项目未设置高度或设为auto,将占满整个容器的高度。
定义在项目上
order: <integer>;
order属性定义项目的排列顺序。数值越小,排列越靠前,默认为0。
flex-grow: <number>; /* default 0 */
flex-grow属性定义项目的放大比例,默认为0,即如果存在剩余空间,也不放大。
flex-shrink: <number>; /* default 1 */
flex-shrink属性定义了项目的缩小比例,默认为1,即如果空间不足,该项目将缩小。
flex-basis: <length> | auto; /* default auto */
flex-basis属性定义了在分配多余空间之前,项目占据的主轴空间(main size)。浏览器根据这个属性,计算主轴是否有多余空间。它的默认值为auto,即项目的本来大小。
flex: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ]
flex属性是flex-grow, flex-shrink 和 flex-basis的简写,默认值为0 1 auto。后两个属性可选。
align-self: auto | flex-start | flex-end | center | baseline | stretch;
align-self属性允许单个项目有与其他项目不一样的对齐方式,可覆盖align-items属性。默认值为auto,表示继承父元素的align-items属性,如果没有父元素,则等同于stretch。
自定义事件
参考连接:https://www.cnblogs.com/MrZouJian/p/8645358.html
自定义事件打破执行顺序的限制,在合适的场景下,可以简化开发。
以下测试基于Chrome72
触发事件
window.dispatchEvent(new Event('resize'))//原生
testButtonDom.dispatchEvent(new CustomEvent("click"));//原生
//自定义
let event = new CustomEvent("alert", { detail: { dnf: 1 }, cancelable: false });
testButtonDom.addEventListener("alert", event => {
alert(event.detail);
});
testButtonDom.dispatchEvent(event );
触发原生的resize事件,许多渲染不正常的行为可以用此方法高效解决。
在Chrome72下测试a标签不能触发跳转
Event和CustomEvent第二个参数可以传对象
{
bubbles: true, //是否冒泡
cancelable: false // preventDefault() 方法是否可以取消与事件关联的默认动作
}
CustomEvent可以在detail传递其他数据,注意只能是detail
{
detail: {
},
bubbles: true, //是否冒泡
cancelable: false //preventDefault() 方法是否可以取消与事件关联的默认动作
}
上述方法不兼容IE浏览器
网友评论