欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

基于React實(shí)現(xiàn)一個(gè)todo打勾效果

 更新時(shí)間:2024年03月24日 09:20:29   作者:陽樹陽樹  
這篇文章主要為大家詳細(xì)介紹了如何基于React實(shí)現(xiàn)一個(gè)todo打勾效果,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

正好呢,最近做的一些東西讓我燃起了一些些記錄的熱情,不能再咕咕了。

背景是我自己做的 landing 項(xiàng)目里有一個(gè)實(shí)現(xiàn)類似飛書里的 todo 的效果,然后我研究了下飛書,寫出來了一個(gè) demo。

我們先來提出幾個(gè)問題,解決了之后,我們也就實(shí)現(xiàn)了一個(gè)todo

  • 前面的 icon 用什么來實(shí)現(xiàn)。
  • 如何實(shí)現(xiàn)文字不可點(diǎn)擊,前方icon可點(diǎn)擊的效果?
  • 如果有多個(gè)元素循環(huán)渲染的情況下,我們怎么在點(diǎn)擊的時(shí)候?qū)蝹€(gè)元素做樣式的修改?(React)

這里有幾個(gè)部分需要來討論:

首先是整個(gè)用什么來實(shí)現(xiàn)這個(gè)前面的 icon,是使用偽元素,還是使用一個(gè)真實(shí)的元素?

這里我看飛書直接用的偽元素來實(shí)現(xiàn)的,感覺可能是能用 css 解決的問題就沒有必要再去用 html 去寫了,那么大致實(shí)現(xiàn)邏輯如下。

 <div class="todo" id="todo">11111</div>

我們使用偽元素實(shí)現(xiàn)這個(gè)樣式的時(shí)候,左側(cè)并不會(huì)撐開,也就是說,我們需要去給這個(gè) div 一個(gè)靠左的 margin 值。然后再去做具體的打勾框。

    .todo {
        pointer-events: none;
        margin-left: 20px;
    }

    .todo:before {
        content: " ";
        display: inline-block;
        line-height: normal;
        font-size: 16px;
        border: 1px solid black;
        border-radius: 4px;
        background-position: 50%;
        white-space: normal;
        width: 16px;
        height: 16px;
        margin-right: 8px;
        margin-left: -24px;
        box-sizing: border-box !important;
        position: relative;
        cursor: pointer;
        pointer-events: auto;
        top: 2px;
    }

那么上面這些代碼,就可以得到下圖的展示效果:

是不是看起來已經(jīng)有了完整的樣子啦。

這是我們的 todo 狀態(tài),我們還需要實(shí)現(xiàn)一個(gè) done的狀態(tài),所以還需要額外的 css 去書寫,這里需要注意的是,為了交互更加好看,我們在 hover 的時(shí)候會(huì)讓偽元素的樣式變藍(lán)。于是增加了如下代碼,有了下圖所示的效果

    .todo:hover:before {
        border: 1px solid rgb(100, 149, 237);
    }

第二個(gè)點(diǎn)就是,我們?nèi)绾螌?shí)現(xiàn)一個(gè)文字不可點(diǎn)擊,前方icon可點(diǎn)擊的效果呢?

其實(shí)在上面的代碼中已經(jīng)展示出來了,為這個(gè) div設(shè)置pointer-events: none;,然后給偽元素設(shè)置pointer-events: auto;就可以啦。

這些考慮完之后,我再給你們展示一下點(diǎn)擊狀態(tài)的css咋寫的:

    .done {
        text-decoration: line-through;
    }

    .done::before {
        background-image: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTQiIGhlaWdodD0iMTQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEwLjU4OSAzLjkwM2wuODA4LjgwOGEuMzUuMzUgMCAwMTAgLjQ5NUw2LjE4IDEwLjQyNWEuMzUuMzUgMCAwMS0uNDk1IDBMMi43MDMgNy40NDRhLjM1LjM1IDAgMDEwLS40OTVsLjgwOC0uODA4YS4zNS4zNSAwIDAxLjQ5NSAwbDEuOTI1IDEuOTI0IDQuMTYzLTQuMTYzYS4zNS4zNSAwIDAxLjQ5NSAweiIgZmlsbD0iIzMzNzBGRiIvPjwvc3ZnPg==);
    }

那么你給這個(gè) div 再加上 done 的類名,就可以得到下圖的效果了:

最后呢,如果我們有多個(gè) div,我們?nèi)绾稳プ鲱惷奶幚砟兀?/p>

答案是監(jiān)聽點(diǎn)擊事件,然后在點(diǎn)擊的時(shí)候更換類名,代碼如下:

    const div = document.getElementById('todo');
    div.addEventListener('click', (target) => {
        const classArr = target.currentTarget.className.split(' ');
        if (classArr.length > 1) {
            target.currentTarget.className = 'todo'
        } else {
            target.currentTarget.className = 'todo done'
        }
    })

完整代碼如下:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <div class="todo" id="todo">11111</div>
</body>
<script>
    const div = document.getElementById('todo');
    div.addEventListener('click', (target) => {
        const classArr = target.currentTarget.className.split(' ');
        if (classArr.length > 1) {
            target.currentTarget.className = 'todo'
        } else {
            target.currentTarget.className = 'todo done'
        }
    })
</script>
<style>
    .todo {
        margin-left: 20px;
    }

    .todo:before {
        content: " ";
        display: inline-block;
        line-height: normal;
        font-size: 16px;
        border: 1px solid black;
        border-radius: 4px;
        background-position: 50%;
        white-space: normal;
        width: 16px;
        height: 16px;
        margin-right: 8px;
        margin-left: -24px;
        box-sizing: border-box !important;
        position: relative;
        cursor: pointer;
        pointer-events: auto;
        top: 2px;
    }

    .todo:hover:before {
        border: 1px solid rgb(100, 149, 237);
    }

    .done {
        text-decoration: line-through;
    }

    .done::before {
        background-image: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTQiIGhlaWdodD0iMTQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEwLjU4OSAzLjkwM2wuODA4LjgwOGEuMzUuMzUgMCAwMTAgLjQ5NUw2LjE4IDEwLjQyNWEuMzUuMzUgMCAwMS0uNDk1IDBMMi43MDMgNy40NDRhLjM1LjM1IDAgMDEwLS40OTVsLjgwOC0uODA4YS4zNS4zNSAwIDAxLjQ5NSAwbDEuOTI1IDEuOTI0IDQuMTYzLTQuMTYzYS4zNS4zNSAwIDAxLjQ5NSAweiIgZmlsbD0iIzMzNzBGRiIvPjwvc3ZnPg==);
    }
</style>

</html>

到此這篇關(guān)于基于React實(shí)現(xiàn)一個(gè)todo打勾效果的文章就介紹到這了,更多相關(guān)React todo打勾內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • React工作流程及Error Boundaries實(shí)現(xiàn)過程講解

    React工作流程及Error Boundaries實(shí)現(xiàn)過程講解

    這篇文章主要介紹了React工作流程及Error Boundaries實(shí)現(xiàn)過程講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-02-02
  • React?Native集成支付寶支付的實(shí)現(xiàn)方法

    React?Native集成支付寶支付的實(shí)現(xiàn)方法

    這篇文章主要介紹了React?Native集成支付寶支付的實(shí)現(xiàn)現(xiàn),ativeModules是JS代碼調(diào)用原生模塊的橋梁。所以,我們只需要在原生工程中集成支付寶和微信支付的sdk,然后使用NativeModules調(diào)用即可,需要的朋友可以參考下
    2022-02-02
  • 從零開始搭建一個(gè)react項(xiàng)目開發(fā)

    從零開始搭建一個(gè)react項(xiàng)目開發(fā)

    這篇文章主要介紹了從零開始搭建一個(gè)react項(xiàng)目開發(fā),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-02-02
  • React State與生命周期詳細(xì)介紹

    React State與生命周期詳細(xì)介紹

    React將組件(component)看成一個(gè)狀態(tài)機(jī)(State Machines),通過其內(nèi)部自定義的狀態(tài)(State)和生命周期(Lifecycle)實(shí)現(xiàn)并與用戶交互,維持組件的不同狀態(tài)
    2022-08-08
  • react動(dòng)態(tài)路由的實(shí)現(xiàn)示例

    react動(dòng)態(tài)路由的實(shí)現(xiàn)示例

    React中動(dòng)態(tài)路由通過ReactRouter庫實(shí)現(xiàn),根據(jù)應(yīng)用狀態(tài)或用戶交互動(dòng)態(tài)顯示或隱藏組件,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-11-11
  • ahooks整體架構(gòu)及React工具庫源碼解讀

    ahooks整體架構(gòu)及React工具庫源碼解讀

    這篇文章主要為大家介紹了ahooks整體架構(gòu)及React工具庫的源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • 使用React實(shí)現(xiàn)內(nèi)容滑動(dòng)組件效果

    使用React實(shí)現(xiàn)內(nèi)容滑動(dòng)組件效果

    這篇文章主要介紹了使用React實(shí)現(xiàn)一個(gè)內(nèi)容滑動(dòng)組件效果,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-05-05
  • 詳解React 元素渲染

    詳解React 元素渲染

    這篇文章主要介紹了React 元素渲染的相關(guān)資料,文中示例代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • react中(含hooks)同步獲取state值的方式

    react中(含hooks)同步獲取state值的方式

    這篇文章主要介紹了react(含hooks)中同步獲取state值的方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • 解決React報(bào)錯(cuò)You provided a `checked` prop to a form field

    解決React報(bào)錯(cuò)You provided a `checked` prop&n

    這篇文章主要為大家介紹了React報(bào)錯(cuò)You provided a `checked` prop to a form field的解決方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12

最新評論