简单实现原生小程序界面灰色模式

2022-12-08  本文已影响0人  夏天只想吃西瓜

导语

在遇到公祭日或其它特殊日子的时候,我们需要将我们的网站、小程序变成灰色(黑白)模式,那么以何种方式能够快速实现这个目标呢?

一、web/h5

网页端实现非常简单,只需要*、html最外层标签的样式设置filter: grayscale(100%)就OK啦。效果如下所示

二、小程序

在小程序内实现会稍稍麻烦一点,小程序端不可能像网页端那样直接在page设置filter: grayscale(100%),这样做的后果是导致小程序内使用flex失效,布局出现错位的情况。
那么还有没有类似这种只需设置根元素css的方法达到呢?

当然必须有~

我们可以用伪类来实现,废话不多说直接上代码
在app.less中对page设置伪类来达到目标

page::before {

  content: "";

  width: 100vw;

  height: 100vh;

  position: fixed;

  inset: 0;

  backdrop-filter: grayscale(100%);

  pointer-events: none;

  z-index: 99999999999999;

}


我们来看下实现的效果

三、通过数据预拉取服务端动态控制灰色模式开关

原生小程序前端设置灰色模式:

wxml

<view class=“grayscale”>

<view class=“content”></view>

…小程序代码

</view>

wxss

.grayscale .content,

.grayscale text,

.grayscale button {

-moz-filter: grayscale(100%);

-ms-filter: grayscale(100%);

-o-filter: grayscale(100%);

filter: grayscale(100%);

}

切忌直接设置

page {

filter: grayscale(100%);

}

接下来讲我们利用小程序的数据预拉取来实现动态开关。

之所以选择使用数据预拉取来控制,是因为灰色模式并不是我们日常运营所需,如果单独封装到一个请求中去,会造成不必要的资源浪费,而且数据预拉取会在用户每次访问小程序的时候都会执行一次,所以能够保证尽可能实时获取到最新的状态,但是因为本身也是异步请求,所以无法100%保证页面加载完之前,就能够实时响应,所以返回的class并没有直接设置在全局变量globalData中,而是先存到本地存储Storage里,当我们在小程序后台关闭数据预拉取后,小程序端便不会再去请求相关接口,这样就做到了随时控制开关的效果了。

实现方式:

app.js

App({

onLaunch: async function (options) {

// 此处用于服务端鉴权,可根据自身情况设置

App({

  onLaunch: async function (options) {

    // 此处用于服务端鉴权,可根据自身情况设置

    wx.setBackgroundFetchToken({

      token: ‘grayscale’

    })

    wx.onBackgroundFetchData((res) => {

      if(res.fetchedData && res.fetchedData.class) {

        wx.setStorageSync(‘class’, res.fetchedData.class);

      }

    })

  },

  globalData: {

    grayscale: wx.getStorageSync(“class”).grayscale || “”

  }

});

需要灰色模式的wxml

<view class="{{grayscale}}">

<view class=“content”></view>

…小程序代码

</view>

需要灰色模式的js

接收到微信推送的get请求后返回数据response

data = {

    class: {

        grayscale: “grayscale”

    }

}

上一篇下一篇

猜你喜欢

热点阅读