sass中如何使用vue的变量,来作为@if的判断条件?

新手上路,请多包涵

最近需要做一个png和webp格式兼容的功能,对于img标签的使用公用组件方式处理,但是对于每个vue文件中的background: url()也需要做到根据浏览器是否兼容来展示png或是webp的图片。

初步的想法是使用sass的@if功能,判断浏览器是否支持webp,类似这样image.png

判断浏览器是否支持webp的参数在组件渲染前存储到了sessionstorage中,目前想问一下sass中如何使用vue的变量来作为判断的依据?或者有没有其他的好方法。

阅读 4.1k
5 个回答

之前的没考虑到编译时无法访问运行时的 CSS 变量,看下这个应该可以了吧,你把背景图片的 URL 直接设置为 CSS 变量:


<template>
  <div class="image-container"></div>
</template>

<script>
export default {
  mounted() {
    // 从 sessionStorage 中获取 webpSupport 变量
    const webpSupport = sessionStorage.getItem("webpSupport");

    // 设置 CSS 自定义属性
    if (webpSupport === "true") {
      this.$el.style.setProperty("--background-image", "url('path/to/image.webp')");
    } else {
      this.$el.style.setProperty("--background-image", "url('path/to/image.png')");
    }
  },
};
</script>

再把 background-image 属性的值设置为 CSS 变量:


<style lang="scss">
.image-container {
  background-image: var(--background-image);
}
</style>

使用 CSS variable 就行。

SCSS是属于CSS样式预处理器的,是在项目编译前构建成静态的CSS文件的,并不是说你项目打包之后SCSS还是存在于项目中的。类似的 LessStylus 也是同理的。

你是在浏览器端使用sass动态渲染样式?

  • 如果不是在浏览器端使用sass动态渲染样式
    那你的想法无法实现
  • 如果你是在浏览器端使用sass动态渲染样式
    那你调用sass动态渲染的时候,
    最简单的方式就是把一个叫做$webp的变量拼接到你需要动态渲染的sass代码前面
    其他办法,具体见文档sass js-api

SCSS也是生成静态的CSS文件啊,怎么可以用到vue里面的变量了...
建议使用直接操作dome,在div判断一下就好了,如果CSS用到的地方多就使用 CSS variable 全局setProperty,之后在引用var(--xxx)

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题