成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

前端每日實(shí)戰(zhàn):153# 視頻演示如何用 CSS 和原生 JS 創(chuàng)作一組 tooltip 提示框

高勝山 / 1649人閱讀

摘要:這里的常量存儲(chǔ)了個(gè)方向,常量存儲(chǔ)了個(gè)鼠標(biāo)事件,常量包裝了根據(jù)類名獲取元素的操作為眼珠設(shè)置緩動(dòng)時(shí)間,使動(dòng)畫平滑接下來制作提示框。

效果預(yù)覽

按下右側(cè)的“點(diǎn)擊預(yù)覽”按鈕可以在當(dāng)前頁(yè)面預(yù)覽,點(diǎn)擊鏈接可以全屏預(yù)覽。

https://codepen.io/comehope/pen/rqyoYY

可交互視頻

此視頻是可以交互的,你可以隨時(shí)暫停視頻,編輯視頻中的代碼。

請(qǐng)用 chrome, safari, edge 打開觀看。

https://scrimba.com/p/pEgDAM/c6p2Es2

源代碼下載

每日前端實(shí)戰(zhàn)系列的全部源代碼請(qǐng)從 github 下載:

https://github.com/comehope/front-end-daily-challenges

代碼解讀

定義 dom,容器中包含一個(gè)名為 .emoji 的子容器,代表一個(gè)頭像,它的子元素 eye left、eye right、mouth 分別代表左眼、右眼和嘴巴:

居中顯示:

body {
    margin: 0;
    height: 100vh;
    display: flex;
    align-items: center;
    justify-content: center;
    background-color: lightyellow;
}

定義容器尺寸和子元素對(duì)齊方式:

.container {
    position: relative;
    width: 20em;
    height: 20em;
    font-size: 10px;
    display: flex;
    align-items: center;
    justify-content: center;
}

定義頭像的輪廓:

.emoji {
    position: relative;
    box-sizing: border-box;
    width: 10em;
    height: 10em;
    background-color: pink;
    border-radius: 50% 50% 75% 50%;
}

定義頭像眼睛的輪廓:

.emoji .eye {
    position: absolute;
    box-sizing: border-box;
    width: 3em;
    height: 3em;
    border: 0.1em solid gray;
    border-radius: 50%;
    top: 3em;
}

.emoji .eye.left {
    left: 1em;
}

.emoji .eye.right {
    right: 1em;
}

畫出眼珠:

.emoji .eye.left::before,
.emoji .eye.right::before {
    content: "";
    position: absolute;
    width: 1em;
    height: 1em;
    background-color: #222;
    border-radius: 50%;
    top: 1em;
    left: calc((100% - 1em) / 2);
}

畫出微笑的嘴:

.emoji .mouth {
    position: absolute;
    width: 2em;
    height: 2em;
    border: 0.1em solid;
    bottom: 1em;
    left: 40%;
    border-radius: 50%;
    border-color: transparent gray gray transparent;
    transform: rotate(20deg);
}

接下來制作眼珠轉(zhuǎn)向 4 個(gè)方向的效果。
用 2 個(gè)變量分別表示眼珠的定位位置:

.emoji .eye {
    --top: 1em;
    --left: calc((100% - 1em) / 2);
}

.emoji .eye.left::before,
.emoji .eye.right::before {
    top: var(--top);
    left: var(--left);
}

設(shè)置眼珠在 4 個(gè)方向的定位位置:

.emoji.top .eye {
    --top: 0;
}

.emoji.bottom .eye {
    --top: 1.8em;
}

.emoji.left .eye {
    --left: 0;
}

.emoji.right .eye {
    --left: 1.8em;
}

此時(shí),如果為 dom 元素 .emoji 增加 top、bottomleft、right 4 個(gè)樣式中的任何一個(gè)樣式,眼珠就會(huì)轉(zhuǎn)向特定的方向。

在 dom 中增加 4 個(gè)元素,每個(gè)元素的內(nèi)容是一個(gè) @ 字符:

@ @ @ @

把 4 個(gè)元素布局在頭像周圍:

.tip {
    position: absolute;
    cursor: pointer;
    font-size: 4.5em;
    color: silver;
    font-family: sans-serif;
    font-weight: 100;
}

.tip.top {
    top: -15%;
}

.tip.bottom {
    bottom: -15%;
}

.tip.left {
    left: -15%;
}

.tip.right {
    right: -15%;
}

寫一段腳本,增加一點(diǎn)交互效果。當(dāng)鼠標(biāo)懸停在 4 個(gè)方向的 @ 上時(shí),使眼珠朝相應(yīng)的方向轉(zhuǎn)去。這里的 DIRECTION 常量存儲(chǔ)了 4 個(gè)方向,EVENTS 常量存儲(chǔ)了 2 個(gè)鼠標(biāo)事件,$ 常量包裝了根據(jù)類名獲取 dom 元素的操作:

const DIRECTIONS = ["top", "bottom", "left", "right"]
const EVENTS = ["mouseover", "mouseout"]
const $ = (className) => document.getElementsByClassName(className)[0]

DIRECTIONS.forEach(direction => 
    EVENTS.forEach((e) => 
        $(`tip ${direction}`).addEventListener(e, () =>
            $("emoji").classList.toggle(direction)
        )
    )
)

為眼珠設(shè)置緩動(dòng)時(shí)間,使動(dòng)畫平滑:

.emoji .eye.left::before,
.emoji .eye.right::before {
    transition: 0.3s;
}

接下來制作 tooltip 提示框。
為 4 個(gè) @ 符號(hào)的 dom 增加 data-tip 屬性,其內(nèi)容就是 tooltip 信息:

@ @ @ @

::before 偽元素展示提示信息,樣式為黑底白字:

.tip::before {
    content: attr(data-tip);
    position: absolute;
    font-size: 0.3em;
    font-family: sans-serif;
    width: 10em;
    text-align: center;
    background-color: #222;
    color: white;
    padding: 0.5em;
    border-radius: 0.2em;
    box-shadow: 0 0.1em 0.3em rgba(0, 0, 0, 0.3);
}

把頂部的提示框定位到頂部 @ 符號(hào)的上方正中:

.tip.top::before {
    top: 0;
    left: 50%;
    transform: translate(-50%, calc(-100% - 0.6em));
}

類似地,把其他 3 個(gè)提示框也定位到 @ 符號(hào)的旁邊:

.tip.bottom::before {
    bottom: 0;
    left: 50%;
    transform: translate(-50%, calc(100% + 0.6em));
}

.tip.left::before {
    left: 0;
    top: 50%;
    transform: translate(calc(-100% - 0.6em), -50%);
}

.tip.right::before {
    right: 0;
    top: 50%;
    transform: translate(calc(100% + 0.6em), -50%);
}

::after 偽元素在頂部提示框下面畫出一個(gè)倒三角形:

.tip::after {
    content: "";
    position: absolute;
    font-size: 0.3em;
    width: 0;
    height: 0;
    color: #222;
    border: 0.6em solid transparent;
}

.tip.top::after {
    border-bottom-width: 0;
    border-top-color: currentColor;
    top: -0.6em;
    left: 50%;
    transform: translate(-50%, 0);
}

類似地,在其他 3 個(gè)提示框旁邊畫出三角形:

.tip.bottom::after {
    border-top-width: 0;
    border-bottom-color: currentColor;
    bottom: -0.6em;
    left: 50%;
    transform: translate(-50%, 0);
}

.tip.left::after {
    border-right-width: 0;
    border-left-color: currentColor;
    left: -0.6em;
    top: 50%;
    transform: translate(0, -50%);
}

.tip.right::after {
    border-left-width: 0;
    border-right-color: currentColor;
    right: -0.6em;
    top: 50%;
    transform: translate(0, -50%);
}

最后,隱藏提示框,使提示框只在鼠標(biāo)懸停時(shí)出現(xiàn):

.tip::before,
.tip::after {
    visibility: hidden;
    filter: opacity(0);
    transition: 0.3s;
}

.tip:hover::before,
.tip:hover::after {
    visibility: visible;
    filter: opacity(1);
}

大功告成!

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/113986.html

相關(guān)文章

  • 前端每日實(shí)戰(zhàn)153# 視頻演示何用 CSS 原生 JS 創(chuàng)作一組 tooltip 提示

    摘要:這里的常量存儲(chǔ)了個(gè)方向,常量存儲(chǔ)了個(gè)鼠標(biāo)事件,常量包裝了根據(jù)類名獲取元素的操作為眼珠設(shè)置緩動(dòng)時(shí)間,使動(dòng)畫平滑接下來制作提示框。 showImg(https://segmentfault.com/img/bVbh12C?w=400&h=303); 效果預(yù)覽 按下右側(cè)的點(diǎn)擊預(yù)覽按鈕可以在當(dāng)前頁(yè)面預(yù)覽,點(diǎn)擊鏈接可以全屏預(yù)覽。 https://codepen.io/comehope/pen/r...

    趙春朋 評(píng)論0 收藏0
  • 前端每日實(shí)戰(zhàn) 2018年10月至2019年6月項(xiàng)目匯總(共 20 個(gè)項(xiàng)目)

    摘要:過往項(xiàng)目年月份項(xiàng)目匯總共個(gè)項(xiàng)目年月份項(xiàng)目匯總共個(gè)項(xiàng)目年月份項(xiàng)目匯總共個(gè)項(xiàng)目年月份項(xiàng)目匯總共個(gè)項(xiàng)目年月份項(xiàng)目匯總共個(gè)項(xiàng)目年月份項(xiàng)目匯總共個(gè)項(xiàng)目年月至年月發(fā)布的項(xiàng)目前端每日實(shí)戰(zhàn)專欄每天分解一個(gè)前端項(xiàng)目,用視頻記錄編碼過程,再配合詳細(xì)的代碼解讀, 過往項(xiàng)目 2018 年 9 月份項(xiàng)目匯總(共 26 個(gè)項(xiàng)目) 2018 年 8 月份項(xiàng)目匯總(共 29 個(gè)項(xiàng)目) 2018 年 7 月份項(xiàng)目匯總(...

    muddyway 評(píng)論0 收藏0
  • 前端每日實(shí)戰(zhàn):163# 視頻演示何用原生 JS 創(chuàng)作一個(gè)多選一場(chǎng)景的交互游戲(內(nèi)含 3 個(gè)視頻

    摘要:本項(xiàng)目將設(shè)計(jì)一個(gè)多選一的交互場(chǎng)景,用進(jìn)行頁(yè)面布局用制作動(dòng)畫效果用原生編寫程序邏輯。中包含個(gè)展示頭像的和個(gè)標(biāo)明當(dāng)前被選中頭像的。 showImg(https://segmentfault.com/img/bVbknOW?w=400&h=302); 效果預(yù)覽 按下右側(cè)的點(diǎn)擊預(yù)覽按鈕可以在當(dāng)前頁(yè)面預(yù)覽,點(diǎn)擊鏈接可以全屏預(yù)覽。 https://codepen.io/comehope/pen/L...

    pakolagij 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<