【问题标题】:Svelte - change the style of a nav-item when clickedSvelte - 单击时更改导航项的样式
【发布时间】:2022-03-29 21:01:09
【问题描述】:

我正在使用Bulma CSS 在 Svelte 中创建一个导航组件,并且我希望在 class:is-active 为 true 时将每个导航栏项设置为粗体。我目前所做的如下:

    <script>
    import {onMount} from 'svelte';
    let segment;
    
    onMount(() => {
        const linkOne = document.getElementById("linkOne");
        const linkTwo = document.getElementById("linkTwo");
        const linkThree = document.getElementById("linkThree");
        const linkFour = document.getElementById("linkFour");
        const linkFive = document.getElementById("linkFive");
        
        linkOne.addEventListener('focusin', (event) => {
            event.target.style["font-weight"] = 'bold';    
        });

        linkOne.addEventListener('blur', (event) => {
            event.target.style["font-weight"] = 'normal';    
        });
        
        linkTwo.addEventListener('focusin', (event) => {
            event.target.style["font-weight"] = 'bold';    
        });

        linkTwo.addEventListener('blur', (event) => {
            event.target.style["font-weight"] = 'normal';    
        });
        
        linkThree.addEventListener('focusin', (event) => {
            event.target.style["font-weight"] = 'bold';    
        });

        linkThree.addEventListener('blur', (event) => {
            event.target.style["font-weight"] = 'normal';    
        });
        
        linkFour.addEventListener('focusin', (event) => {
            event.target.style["font-weight"] = 'bold';    
        });

        linkFour.addEventListener('blur', (event) => {
            event.target.style["font-weight"] = 'normal';    
        });
        
        linkFive.addEventListener('focusin', (event) => {
            event.target.style["font-weight"] = 'bold';    
        });

        linkFive.addEventListener('blur', (event) => {
            event.target.style["font-weight"] = 'normal';    
        });
    });
</script>
<nav class="navbar" role="navigation" aria-label="main navigation">
    <div class="navbar-brand">
        <a href="/" class="navbar-item">
        </a>
    </div>
    <div class="nav-menubar">
        <div class="navbar-menu">
            <a id="linkOne" href="/" class="navbar-item" class:is-active={segment === undefined}>LinkOne</a>
            <a id="linkTwo" href="/linkTwo" class="navbar-item" class:is-active={segment === "linktwo"}>LinkTwo</a>
            <a id="linkThree" href="/linkThree" class="navbar-item" class:is-active={segment === "linkthree"}>LinkThree</a>
            <a id="linkFour" href="/linkFour" class="navbar-item" class:is-active={segment === "linkfour"}>LinkFour</a>
            <a id="linkFive" href="/linkFive" class="navbar-item" class:is-active={segment === "linkfive"}> LinkFive</a>
        </div>
    </div>
</nav>

在 Firefox(81.0) 上,这会导致链接在焦点上变为粗体,但是当切换到另一个链接并返回时,相同的链接不会变为粗体,除非单击两次。另外,我不确定这是为这些组件设置样式的最佳方式。有人可以提出更好的方法吗?

【问题讨论】:

    标签: svelte-3 svelte-component


    【解决方案1】:

    您可以在 Svelte 中轻松实现:

    <script>
      let current = 0;
    </script>
    
    <a
      on:click="{() => current = 1}"
      class:active="{current === 1}"
    >Number 1</a>
    
    <a
      on:click="{() => current = 2}"
      class:active="{current === 2}"
    >Number 2</a>
    
    <a
      on:click="{() => current = 3}"
      class:active="{current === 3}"
    >Number 3</a>
    
    <style>
      a {
        display: block;
      }
    
      .active {
        color: rgb(255, 133, 34);
        font-weight: bolder;
      }
    </style>
    

    您还可以通过以下方式了解更多信息:https://svelte.dev/tutorial/classes

    【讨论】:

      【解决方案2】:

      您可以用一个简单的 CSS 规则替换所有 JavaScript:

      a:focus {
        font-weight: bold;
      }
      

      【讨论】:

      • 这部分工作。即使导航元素不再是焦点,粗体状态也会持续存在。
      • 这将指向设置字体粗细的其他样式,在 html 页面中只能有一个具有焦点的元素
      • @user13132709 你说得对,我添加了一个新的答案来解决你的问题。
      猜你喜欢
      • 2016-08-06
      • 2013-11-08
      • 2013-07-06
      • 1970-01-01
      • 2018-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多