js找弟弟

2018-03-10  本文已影响0人  CeaCrab

hover之后动画效果

我们可以在需要hover的元素hover之后用::after {content:''; display:block;}添加一个伪div。

ul li a:hover::after{
  content: '';
  display: block;
  position: absolute;
  top: 100%;
  left: 0;
  width: 100%;
  height:3px;
  background: red;
  animation: huadong 0.5s;
}
@keyframes huadong{
  0%{
    width: 0;
  }
  100%{
    width: 100%;
  }
}

下拉列表

    <div class="nav">
        <ul>
            <li><a href="#">导航1</a></li>
            <li>
                <a class="menuTagger" href="#">导航2</a>
                <ul class="menu">
                    <li>1</li>
                    <li>2</li>
                    <li>3</li>
                </ul>
            </li>
            <li>
                <a class="menuTagger" href="#">导航3</a>
                <ul class="menu">
                    <li>1</li>
                    <li>2</li>
                    <li>3</li>
                </ul>
            </li>
            <li><a href="#">导航4</a></li>
            <li><a href="#">导航5</a></li>
            <li><a href="#">导航6</a></li>
            <li><a href="#">导航7</a></li>
        </ul>
    </div>
//通过className获取多个a标签aTags,aTags包装成了一个hash
    <script>
        let aTags = document.getElementsByClassName('menuTagger')
        console.log(aTags)
    </script>
    <script>
        let aTags = document.getElementsByClassName('menuTagger')
        for(let i=0; i<aTags.length; i++){  //遍历我们监听的元素
            aTags[i].onmouseenter = function(x){
                console.log(x.currentTarget)//监听的元素
                // console.log(x.target) //用户操作的元素
                //监听的元素和用户操作的元素可能不是一个元素,如果我们遍历的两个a标签中有个span标签,我们监听的是a标签,很可能用户操作的是span标签。由于onmouseenter比较特殊(onclick可以测试)
                
                //此时我们需要我们监听的元素,所以需要x.currentTarget
                
            }
        }
    </script>
    <script>
        let aTags = document.getElementsByClassName('menuTagger')
        for(let i=0; i<aTags.length; i++){  
            aTags[i].onmouseenter = function(x){
                let a = x.currentTarget
                let brother = a.nextSibling //定义当前弟弟元素为a标签的弟弟元素
                //如果当前弟弟元素的节点类型是3(文本类型),当前弟弟元素为下一个弟弟的弟弟…不停的找,找到类型不为3为1(节点类型)为止。
                while(brother.nodeType === 3){//1是节点类型,3是文本类型
                    brother = brother.nextSibling 
                }
                console.log(brother)
            }
        }
    </script>
while循环递归寻找节点

如果一个元素后边有很多弟弟元素(节点),怎么确认找到的是我们需要的节点呢,很简单,borther.tag !=='UL'时,一直寻找找到为UL为止。然后给这个弟弟元素添加一个class,达到我们需要的效果。当鼠标移除时,不需要active这个效果,就移除它。

    <script>
        let aTags = document.getElementsByClassName('menuTagger')
        //添加active
        for(let i=0; i<aTags.length; i++){  
            aTags[i].onmouseenter = function(x){
                let a = x.currentTarget
                let brother = a.nextSibling //定义当前弟弟元素为a标签的弟弟元素
                //如果当前弟弟元素的节点类型不是UL,当前弟弟元素为下一个弟弟的弟弟…不停的找,找到为止。
                while(brother.tagName !== 'UL'){//如果弟弟元素的tagName不是‘UL’ tagName返回是大写的,ul必须是大写,一定要用小写的:brother.tagName.toLowe !== 'UL' === brother.tagName !== 'UL'
                    brother = brother.nextSibling 
                brother.classList.add('active')
                }
            }
        //移除active
        for(let i=0; i<aTags.length; i++){  
            aTags[i].onmouseleave = function(x){
                let a = x.currentTarget
                let brother = a.nextSibling //定义当前弟弟元素为a标签的弟弟元素
                //如果当前弟弟元素的节点类型不是UL,当前弟弟元素为下一个弟弟的弟弟…不停的找,找到为止。
                while(brother.tagName !== 'UL'){//如果弟弟元素的tagName不是‘UL’ tagName返回是大写的,ul必须是大写,一定要用小写的:brother.tagName.toLowe !== 'UL' === brother.tagName !== 'UL'
                    brother = brother.nextSibling 
                brother.classList.remove('active')
                }
            }
        }
    </script>
    <script>
        let liTags = document.getElementsByClassName('menuTagger')
        //添加active
        for(let i=0; i<liTags.length; i++){  
            liTags[i].onmouseenter = function(x){
                let li = x.currentTarget
                let brother = li.getElementsByTagName('ul')[0] //getElements【s】 li下有多个子元素,虽然UL只有一项,也必须加上[0]
                brother.classList.add('active')
            }

        //移除active
            liTags[i].onmouseleave = function(x){
                let li = x.currentTarget
                let brother = li.getElementsByTagName('ul')[0]
                brother.classList.remove('active')
            }
        }    
    </script>
<script>
        let liTags = document.getElementsByClassName('menuTagger')
        //添加active
        for(let i=0; i<liTags.length; i++){  
            liTags[i].onmouseenter = function(x){
                x.currentTarget.classList.add('active')             
            }

        //移除active
            liTags[i].onmouseleave = function(x){
                x.currentTarget.classList.remove('active')  
            }
        }    
    </script>

JS只负责切换状态,至于效果就有css来控制


深度截图_选择区域_20180310154533.png
上一篇 下一篇

猜你喜欢

热点阅读