【问题标题】:Vue JS : How can I access and change Css root variables from vue component to toggle CSS Variables Site Theming?Vue JS:如何从 vue 组件访问和更改 Css 根变量以切换 CSS 变量站点主题?
【发布时间】:2020-08-31 06:17:29
【问题描述】:

我想在一个 Vue 组件中访问项目中的 css 根变量的值。例如,更改 10 个变量,包括颜色、边距和字体大小,通过按一个按钮为新值,然后按相同的按钮将变量更改为它们的(默认)原始值,实际上是在更改值项目中的css根变量。我怎样才能做到这一点 ?其实我想通过按键来切换明暗。

这个想法的灵感来自以下链接中的更改。 链接里面的例子是用纯 JavaScript 脚本编写的,我想在 Next Js Framework 上开发的 Vue 项目中使用它。实现一个包含大约 10 个变量的网站,这些变量的值必须立即更改,只需按下按钮即可在暗/亮模式下切换。

The codepen link that inspired me :)

如何访问和更改 Css 根变量?

new Vue({
	el: "#theme",
	data: {
    return {
      dark: true,
      
    };
  },
  
  watch: {
    dark() {
    
      let bg = this.dark ? "#1b1b1b" : "#f5f5f5";
      let txtColor = this.dark ? "#999999" : "#333333";
      
      document.documentElement.style.setProperty("--bg", bg);
      document.documentElement.style.setProperty("--txt", txtColor);
      
    }
  }
});
:root{

--bg: white;
--txt: black;

}


body {
  background-color: var(--bg);
  color: var(--txt)
}
article {
  padding: 50px
}
article h2 {
  margin-top: 100px;
}
<div id="theme">

  <button @click="dark=!dark">dark</button>

<article>
  <h1>Hello World</h1>
  Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean v
</article>

</div>

【问题讨论】:

    标签: javascript vue.js vue-component nuxt.js css-variables


    【解决方案1】:

    在您的示例中,data 出现语法错误,但除此之外它工作正常。您想在页面加载后立即运行吗?

    new Vue({
      el: "#theme",
      data() {
        return {
          dark: false,
          root: null
        };
      },
      mounted: function() {
        this.root = document.documentElement;
      },
      watch: {
        dark: {
          handler: function() {
            // because we are using this handler immideatly we need to wait for data changes using nextTick.
            this.$nextTick(() => {
              if (this.dark) {
                this.root.style.setProperty("--bg", "red");
                this.root.style.setProperty("--text", "black");
                this.root.style.setProperty("--padding", "10px");
                this.root.style.setProperty("--font", "1rem");
              } else {
                this.root.style.setProperty("--bg", "blue");
                this.root.style.setProperty("--text", "green");
                this.root.style.setProperty("--padding", "15px");
                this.root.style.setProperty("--font", "2rem");
              }
            })
          },
          immediate: true
    
        }
      }
    });
    :root {
      --bg: white;
      --bg-text: black;
      --padding: 5px;
      --font: 3rem;
    }
    
    body {
      background-color: var(--bg);
      color: var(--bg-text)
    }
    
    article {
      padding: 50px
    }
    
    article h2 {
      margin-top: 100px;
    }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
    <div id="theme">
    
      <button @click="dark=!dark">dark</button>
    
      <article>
        <h1>Hello World</h1>
        Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis,
        sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus.
        Vivamus elementum semper nisi. Aenean v
      </article>
    
    </div>

    【讨论】:

    • 是的,在初始加载时会显示亮模式。
    • 我已经更新了我的答案。您需要添加handlerimmediate 属性才能观看。另外,将dark 设置为 false
    • 谢谢,这个方案和下一个方案,哪个性能更好?
    • 我不确定性能。我猜如果你有很少的变化,它不会有太大的不同。如果你想让 vuejs 缓存值,你可以使用计算而不是监视。
    • 它nuxt js Framework运行时报错,错误文本:ReferenceError document is not defined
    猜你喜欢
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    • 2020-02-14
    • 2019-01-21
    • 2018-04-13
    • 2021-03-04
    • 2021-10-22
    • 1970-01-01
    相关资源
    最近更新 更多