23-進階:給簡歷加 JS

本節(jié)將在原有基礎上添加一些JS效果

一. 加載動畫---網(wǎng)頁加載完成前的動畫效果

  • 涉及到的一些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組合 使用就可產(chǎn)生動畫效果;

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

經(jīng)過3000ms后再執(zhí)行function(){};

  • 涉及到的一些JS知識點:

二. 會變的topNavBar---當頁面滑動時產(chǎn)生效果

  • 涉及到的一些CSS知識點:
  1. word-break、overflow-wrap、white-space 比較

word-break:
normal
使用默認的斷行規(guī)則。
break-all
對于non-CJK (CJK 指中文/日文/韓文) 文本,可在任意字符間斷行。
keep-all
CJK 文本不斷行。 Non-CJK 文本表現(xiàn)同 normal

overflow-wrap:
normal
表示在正常的單詞結(jié)束處換行。
break-word
表示如果行內(nèi)沒有多余的地方容納該單詞到結(jié)尾,則那些正常的不能被被分割的單詞會被強制分割換行

white-space:
normal
連續(xù)的空白符會被合并,換行符會被當作空白符來處理。填充line盒子時,必要的話會換行。
nowrap
和 normal 一樣,連續(xù)的空白符會被合并。但文本內(nèi)的換行無效。
pre
連續(xù)的空白符會被保留。在遇到換行符或者<br>元素時才會換行。
pre-wrap
連續(xù)的空白符會被保留。在遇到換行符或者<br>元素,或者需要為了填充line盒子時才會換行。
pre-line
連續(xù)的空白符會被合并。在遇到換行符或者<br>元素,或者需要為了填充line盒子時會換行。

  • 涉及到的一些JS知識點:
  1. 與頁面滑動有關的事件有兩個: MouseScrollEvent 與 Scroll;
    監(jiān)聽頁面滾動事件,滾動后給 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上時,浮現(xiàn)子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="">聯(lián)系方式</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的區(qū)別:
    mouseenter與mouseover的區(qū)別:

  2. Document.getElementsByClassName()、x.getElementsByTagName()
    當需要獲取復數(shù)個element時可使用此API;

  3. Element.querySelectorAll()

返回一個non-live的NodeList, 它包含所有元素的非活動節(jié)點,該元素來自與其匹配指定的CSS選擇器組的元素。(基礎元素本身不包括,即使它匹配。)

let aTags = document.querySelectorAll(".top-nav-bar-inner>nav>ul>li>a")
console.log(aTags)
----------------------------
打印結(jié)果:
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
    用于獲取某個元素節(jié)點的下一個兄弟節(jié)點;
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)
    }
}
-----------------
打印結(jié)果為:
 #text
 <ul class=?"submenu">?…?</ul>?

查看打印結(jié)果發(fā)現(xiàn):Node.nextSibling 所獲取的不一定是 Tag標簽,回車、文本都在獲取范圍內(nèi),因此需要判斷獲取節(jié)點的類別;

  1. Target與currentTarget
    Target是觸發(fā)事件時操作的那個元素;
    currentTarget是監(jiān)控事件所關聯(lián)的那個元素;

四. 點擊menu后,滾動到對應的頁面位置

  • 涉及到的一些CSS知識點:
  • 涉及到的一些JS知識點:
  1. 通過 a 標簽的 href 屬性可以在點擊后跳轉(zhuǎn)到對應的標簽位置
<li class="menuTrigger">
    <a href="#siteAbout">關于</a>
</li>

<main id="siteAbout">

然而測試發(fā)現(xiàn),由于導航欄是 fixed 定位方式,導致跳轉(zhuǎn)后的標簽頁面被導航欄覆蓋了一部分,因此頁面實際滾動的 Y 軸距離要有一定增量,而 a 標簽的默認跳轉(zhuǎn)無法達到;

  1. 阻止 a 標簽的默認跳轉(zhuǎn)事件
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)  
------------------
打印結(jié)果:
#siteWorks
http://127.0.0.1:8080/#siteWorks

對比發(fā)現(xiàn):在瀏覽器中 a.href 獲取的經(jīng)過處理過的 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;

參數(shù)

  • topPos 為返回的像素數(shù)。
  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"
});

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標簽默認的外補...
    _Yfling閱讀 14,171評論 1 92
  • 關鍵詞 loading animation (加載動畫) sticky navbar (導航欄黏著可變) auto...
    半齋閱讀 342評論 0 0
  • 人的一生會遇見很多問題,有開心,有快樂。有悲傷有失望,有煩惱有糾結(jié),喜怒哀樂才是人生的主題曲,而人生也有低谷和高潮...
    若非是你閱讀 211評論 0 0
  • 昨日收益¥-474,累計收益¥2009,41天,螞蟻聚寶APP。 什么也沒干啊,大盤就只是收跌0.幾,不能買也不能...
    武超WUCHAO閱讀 596評論 3 2
  • 做人 做人智商高不高沒關系,情商高不高也問題不大,但做人的格局一定要大,說白了,你可以不聰明,也可以不懂交際,但一...
    風清楊閱讀 207評論 0 0

友情鏈接更多精彩內(nèi)容