美文网首页优美编程
前端实用技巧

前端实用技巧

作者: 小遁哥 | 来源:发表于2019-02-28 18:16 被阅读0次

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浏览器

相关文章

网友评论

    本文标题:前端实用技巧

    本文链接:https://www.haomeiwen.com/subject/hbqvhqtx.html