23-进阶:给简历加 JS

本节将在原有基础上添加一些JS效果

一. 加载动画---网页加载完成前的动画效果

  • 涉及到的一些CSS知识点:
  1. 伪元素选择器---::before::after
  2. 水平、垂直居中套路之---
display: flex;
justify-content: center;
align-items: center;
position: absolute;
top: 0;
left: 0;
bottom: 0;
right: 0;
margin: auto;
  1. 动画---animation与@keyframes组合

CSS animation属性是如下属性的一个简写属性形式: animation-name, animation-duration, animation-timing-function, animation-delay, animation-iteration-count, animation-directionanimation-fill-mode.

animation与@keyframes组合 使用就可产生动画效果;

  1. 定时器
setTimeout(function(){
    siteWelcome.classList.remove('active')
},3000)

经过3000ms后再执行function(){};

  • 涉及到的一些JS知识点:

二. 会变的topNavBar---当页面滑动时产生效果

  • 涉及到的一些CSS知识点:
  1. word-break、overflow-wrap、white-space 比较

word-break:
normal
使用默认的断行规则。
break-all
对于non-CJK (CJK 指中文/日文/韩文) 文本,可在任意字符间断行。
keep-all
CJK 文本不断行。 Non-CJK 文本表现同 normal

overflow-wrap:
normal
表示在正常的单词结束处换行。
break-word
表示如果行内没有多余的地方容纳该单词到结尾,则那些正常的不能被被分割的单词会被强制分割换行

white-space:
normal
连续的空白符会被合并,换行符会被当作空白符来处理。填充line盒子时,必要的话会换行。
nowrap
和 normal 一样,连续的空白符会被合并。但文本内的换行无效。
pre
连续的空白符会被保留。在遇到换行符或者<br>元素时才会换行。
pre-wrap
连续的空白符会被保留。在遇到换行符或者<br>元素,或者需要为了填充line盒子时才会换行。
pre-line
连续的空白符会被合并。在遇到换行符或者<br>元素,或者需要为了填充line盒子时会换行。

  • 涉及到的一些JS知识点:
  1. 与页面滑动有关的事件有两个: MouseScrollEvent 与 Scroll;
    监听页面滚动事件,滚动后给 topNavBar 增加新的样式:
window.onscroll = function(xxx){
    console.log(1);        //测试
    console.log(xxx);
    console.log(window.scrollY);
    if (window.scrollY > 0) {
        yyy.classList.add('sticky')
    }
}

三. 会变的menu---鼠标移到menu上时,浮现子menu

  • 涉及到的一些CSS知识点:
  1. 使用absolute时的一点注意:
<body>
<div class="div1"></div>
</body>
--------------------------
.div1{
  width:100px;
  height:100px;
  border: 10px solid red;
  position:relative;
}
.div1::after{
  content:'hhh';
  font-size:20px;
  border: 1px solid black;
  position:absolute;
  top:100%;
  left:0px;
}

效果如下图:


image.png

从上图可看到:在计算top、left 时并没有考虑 父元素的border;

  • 涉及到的一些JS知识点:

涉及到以下知识点的代码:

 <div id="topNavBar" class="top-nav-bar clearfix">
        <div class="top-nav-bar-inner clearfix">
            <a href="" alt="logo">
                <span class="rs">RS</span>
                <span class="card">card</span>
            </a>
            <nav>
                <ul class="clearfix">
                    <li class="menuTrigger">
                        <a href="">关于</a>
                    </li>
                    <li class="menuTrigger">
                        <a href="">技能</a>
                    </li>
                    <li class="menuTrigger">
                        <a href="">作品</a>
                        <ul class="submenu">
                            <li>作品1</li>
                            <li>作品2</li>
                            <li>作品3</li>
                        </ul>
                    </li>
                    <li class="menuTrigger">
                        <a href="">博客</a>
                        <ul class="submenu">
                            <li>博客1235455555</li>
                            <li>博客2</li>
                            <li>博客3</li>
                        </ul>
                    </li>
                    <li class="menuTrigger">
                        <a href="">日历</a>
                    </li>
                    <li class="menuTrigger"> 
                        <a href="">联系方式</a>
                    </li>
                    <li class="menuTrigger">
                        <a href="">其他</a>
                    </li>
                </ul>
            </nav>
        </div>
    </div>
------------------------------
let aTags = document.querySelectorAll(".top-nav-bar-inner>nav>ul>li>a")
console.log(aTags)
 for(let i = 0; i < aTags.length; i++ ){
        aTags[i].onmouseenter = function(xx){
              let a = xx.currentTarget
             let aBrother = a.nextSibling
             console.log(aBrother)
             while(aBrother.nodeType === 3){
                  aBrother = aBrother.nextSibling
              }
            console.log(aBrother)
         }
 }       
  1. mouseenter、mouseleave
    mouseleave与mouseout的区别:
    mouseenter与mouseover的区别:

  2. Document.getElementsByClassName()、x.getElementsByTagName()
    当需要获取复数个element时可使用此API;

  3. Element.querySelectorAll()

返回一个non-live的NodeList, 它包含所有元素的非活动节点,该元素来自与其匹配指定的CSS选择器组的元素。(基础元素本身不包括,即使它匹配。)

let aTags = document.querySelectorAll(".top-nav-bar-inner>nav>ul>li>a")
console.log(aTags)
----------------------------
打印结果:
NodeList(7) [a, a, a, a, a, a, a]
0:a
1:a
2:a
3:a
4:a
5:a
6:a
length:7
__proto__:NodeList

相似API:document.querySelector()---获取单个元素;

  1. Node.nextSibling
    用于获取某个元素节点的下一个兄弟节点;
for(let i = 0; i < aTags.length; i++ ){
    aTags[i].onmouseenter = function(xx){
        let a = xx.currentTarget
        let aBrother = a.nextSibling
        console.log(aBrother)
        while(aBrother.nodeType === 3){
            aBrother = aBrother.nextSibling
        }
        console.log(aBrother)
    }
}
-----------------
打印结果为:
 #text
 <ul class=​"submenu">​…​</ul>​

查看打印结果发现:Node.nextSibling 所获取的不一定是 Tag标签,回车、文本都在获取范围内,因此需要判断获取节点的类别;

  1. Target与currentTarget
    Target是触发事件时操作的那个元素;
    currentTarget是监控事件所关联的那个元素;

四. 点击menu后,滚动到对应的页面位置

  • 涉及到的一些CSS知识点:
  • 涉及到的一些JS知识点:
  1. 通过 a 标签的 href 属性可以在点击后跳转到对应的标签位置
<li class="menuTrigger">
    <a href="#siteAbout">关于</a>
</li>

<main id="siteAbout">

然而测试发现,由于导航栏是 fixed 定位方式,导致跳转后的标签页面被导航栏覆盖了一部分,因此页面实际滚动的 Y 轴距离要有一定增量,而 a 标签的默认跳转无法达到;

  1. 阻止 a 标签的默认跳转事件
aTags[i].onclick = function(xx){
    let aTag = xx.currentTarget
    console.log(xx)
    xx.preventDefault()  //这种写法可以阻止
    aTag.preventDefault() // 这种写法不可以阻止???
}
  1. 获取 a 标签的 href 属性值--Element.getAttribute()
let href = a.getAttribute('href')
console.log(href)
let href2 = a.href
console.log(href2)  
------------------
打印结果:
#siteWorks
http://127.0.0.1:8080/#siteWorks

对比发现:在浏览器中 a.href 获取的经过处理过的 href ,a.getAttribute('href') 获取的才是我们在HTML里实际写的值。

  1. Element.getBoundingClientRect()---返回元素的大小及其相对于视口的位置。

语法:
rectObject = object.getBoundingClientRect();

返回值是一个 DOMRect 对象,这个对象是由该元素的 getClientRects() 方法返回的一组矩形的集合, 即:是与该元素相关的CSS 边框集合 。

DOMRect 对象包含了一组用于描述边框的只读属性——left、top、right和bottom,单位为像素。除了 width 和 height 外的属性都是相对于视口的左上角位置而言的。

getBoundingClientRect示例图

此API所获取的是相对位置,而不是绝对位置,并不符合我们的要求;
如何获取绝对位置????

  1. HTMLElement.offsetTop

HTMLElement.offsetTop 为只读属性,它返回当前元素相对于其 offsetParent 元素的顶部的距离。

语法

topPos = element.offsetTop;

参数

  • topPos 为返回的像素数。
  1. Element.getClientRects() 方法返回一个指向客户端中每一个盒子的边界矩形的矩形集合。

  2. Window.scrollTo()----滚动到文档中的某个坐标。

语法
window.scrollTo(x-coord,y-coord )
window.scrollTo(options)

例子
window.scrollTo( 0, 1000 );
// 设置滚动行为改为平滑的滚动
window.scrollTo({
top: 1000,
behavior: "smooth"
});

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 14,190评论 1 92
  • 关键词 loading animation (加载动画) sticky navbar (导航栏黏着可变) auto...
    半斋阅读 343评论 0 0
  • 人的一生会遇见很多问题,有开心,有快乐。有悲伤有失望,有烦恼有纠结,喜怒哀乐才是人生的主题曲,而人生也有低谷和高潮...
    若非是你阅读 212评论 0 0
  • 昨日收益¥-474,累计收益¥2009,41天,蚂蚁聚宝APP。 什么也没干啊,大盘就只是收跌0.几,不能买也不能...
    武超WUCHAO阅读 596评论 3 2
  • 做人 做人智商高不高没关系,情商高不高也问题不大,但做人的格局一定要大,说白了,你可以不聪明,也可以不懂交际,但一...
    风清杨阅读 211评论 0 0

友情链接更多精彩内容