javascript - Vue JS : How can I access and change Css root variables from vue component to toggle CSS Variables Site Theming?

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

我想在 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>

最佳答案

您在 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>

关于javascript - Vue JS : How can I access and change Css root variables from vue component to toggle CSS Variables Site Theming?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61802008/

相关文章:

javascript - 使用 jQuery 模拟 CMYK 印版偏移

javascript - 如何在搜索时添加加载图标? (Vue.js 2)

vue.js - axios 拦截器与 vuejs 自定义组件集成,以通用方式显示错误消息

javascript - node.js 'non blocking' future 是否与常规网站相关?

javascript - 使用 Javascript 从 Joomla 加载数据

javascript - 如何提高 Math.atan() 的准确性?

vue.js - 属性 'renderChart' 在类型 'LineChartComponent' 上不存在

javascript - Webpack UglifyJS 遇到意外 token

webpack - Webpack/Vue/Vuetify/PWA 项目中绝对路径的问题

javascript - 是否可以在按下按钮时附加组件?