美文网首页
一次关于js中classList及其方法的探究

一次关于js中classList及其方法的探究

作者: ahalshai | 来源:发表于2020-08-14 11:23 被阅读0次

事件的缘起是我根据https://www.bilibili.com/video/BV1Jp4y1y75i?t=570
这一视频,该视频实现了鼠标进入元素的一种特效。原作者使用了jQuery,我在用classList重写时,发现了一个值得注意的点。

const con = document.querySelector('.container');
  let isIn = true;
  let isOut = false;
  var span;
  con.addEventListener('mouseenter',(e)=>{
    if(isIn){
      let inx = e.clientX-e.target.offsetLeft;
      let iny = e.clientY-e.target.offsetTop;

      let el = document.createElement('span');
      el.style.left = inx+'px';
      el.style.top = iny+'px';
      con.appendChild(el);
      span = document.querySelector('.container span');
      console.log(span.style.left);
      span.classList.remove('out');
      span.classList.add('in');
      console.log(span.style.left);
      isIn = false;
      isOut = true;
    }
  })

在使用这一段js代码设置完span的样式后,发现classList的left与top属性没有起效,好奇的我又去自己做了几个实验(小实验,简单的classList.add),发现classList添加的属性有时覆盖原来属性有时不覆盖,那么这究竟是为啥呢。

参考1

经过多方查找(瞎找),感觉这跟css优先级有关
https://juejin.im/post/6844903709772611592
此为掘金上css优先级的文章
https://developer.mozilla.org/en-US/docs/Learn/CSS/Building_blocks/Cascade_and_inheritance#Specificity_2

MDN参考

参考2

https://developer.mozilla.org/zh-CN/docs/Web/API/HTMLElement/style
MDN关于.style属性的说明
https://www.zhangxinxu.com/wordpress/2013/07/domtokenlist-html5-dom-classlist-%E7%B1%BB%E5%90%8D/
旭哥博客关于classList方法的解释

总结

根据以上的两个参考,classList.add方法就是给元素加了个css标签

<span></span>
//classList.add('in')
<span class="in"></span>

而.style设置相当于

<span style="top:???px; left:???px;">

即内联样式,而内联样式有最高的css优先度,故覆盖了之后的in样式
学到了.style是一种很好的设置元素属性的方法。
破案

相关文章

网友评论

      本文标题:一次关于js中classList及其方法的探究

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