评论

小程序中使用css var变量,使js可以动态设置css样式属性

开发中经常遇到的问题是,css的数据是写死的,不能够和js变量直通,即有些数据使用动态变化的,但css用不了。对了,可以使用css变量试试呀

使用sass,stylus可以很方便的使用变量来做样式设计,其实css也同样可以定义变量,在小程序中由于原生不支持动态css语法,so,可以使用css变量来使用开发工作变简单。

基本用法

基础用法

<!--web开发中顶层变量的key名是:root,小程序使用page-->
page { 
  --main-bg-color: brown;
}

.one {
  color: white;
  background-color: var(--main-bg-color);
  margin: 10px;
}

.two {
  color: white;
  background-color: black;
  margin: 10px;
}
.three {
  color: white;
  background-color: var(--main-bg-color);
}

提升用法

<div class="one">
  <div class="two">
    <div class="three">
    </div>
    <div class="four">
    </div>
  <div>
</div>
.two { --test: 10px; }
.three { --test: 2em; }

在这个例子中,var(--test)的结果是:

class=“two” 对应的节点: 10px
class=“three” 对应的节点: element: 2em
class=“four” 对应的节点: 10px (继承自父级.two)
class=“one” 对应的节点: 无效值, 即此属性值为未被自定义css变量覆盖的默认值

上述是一些基本概念,大致说明css变量的使用方法,注意在web开发中,我们使用:root来设置顶层变量,更多详细说明参考MDN的 文档

妙用css变量

开发中经常遇到的问题是,css的数据是写死的,不能够和js变量直通,即有些数据使用动态变化的,但css用不了。对了,可以使用css变量试试呀

wxml

js

// 在js中设置css变量
let myStyle = `
--bg-color:red; 
--border-radius:50%;
--wid:200px;
--hgt:200px;
`

let chageStyle = `
--bg-color:red; 
--border-radius:50%;
--wid:300px;
--hgt:300px;
`
Page({
  data: {
    viewData: {
      style: myStyle
    }
  },
  onLoad(){
    setTimeout(() => {
      this.setData({'viewData.style': chageStyle})
    }, 2000);
  }
})

wxml

<!--将css变量(js中设置的那些)赋值给style-->
<view class="container">
  <view class="my-view" style="{{viewData.style}}">
    <image src="/images/abc.png" mode="widthFix"/>
  </view>
</view>

wxss

/* 使用var */
.my-view{
  width: var(--wid);
  height: var(--hgt);
  border-radius: var(--border-radius);
  padding: 10px;
  box-sizing: border-box;
  background-color: var(--bg-color);
  transition: all 0.3s ease-in;
}

.my-view image{
  width: 100%;
  height: 100%;
  border-radius: var(--border-radius);
}

通过css变量就可以动态设置css的属性值

代码片段

https://developers.weixin.qq.com/s/aWfUGCmG7Efe

github

小程序演示

最后一次编辑于  2020-03-05  
点赞 12
收藏
评论

8 个评论

  • 钱小二
    钱小二
    02-21

    看了前面的,我本来想放弃,突然想到一个简单的解决方案,可靠!测试后效果出来。

    实现效果:小程序页面input字段,获取焦点时,字段方框变色(其他效果以此类推)。

    设计思路:input每个标签带id=''标识,data里面设置一个变量,当前选择的id,假如为:sel_id,默认为空。input标签里面增加onfocus,onblur函数,当字段编辑获取焦点时,data变量sel_id变为当前字段id,同时input标签class里面判断sel_id是否和当前字段id一致,一致加载效果class,不一致加载空。

    data{

    sel_id:''

    }

    input标签:

     <input type="textid="input11class="L2_txt {{sel_id=='input11'?'L2_txt_focus':''}}"  bindfocus="onFocusbindblur="onBlur"  />

    js:

        onFocus: function(e) {

            this.setData({

              sel_id:e.currentTarget.id

            });

          },

          onBlur: function(e) {

            this.setData({

              sel_id:''

            });

          },

    各个手机版本兼容性没有测试,我感觉也没有啥兼容性,应该都支持,嘿嘿。


    02-21
    赞同
    回复
  • LJH
    LJH
    2024-03-18

    用不了呀,

    2024-03-18
    赞同
    回复
  • 隋。
    隋。
    2023-03-28

    请问现在这个方案在项目中实践了吗,兼容性如何,有哪些不足的地方吗

    2023-03-28
    赞同
    回复 2
    • 。
      2024-02-07
      我们项目就用的这个方案,没问题
      2024-02-07
      回复
    • 隋。
      隋。
      2024-03-15回复
      好的 谢谢 我们现在也在用,目前没发现什么问题
      2024-03-15
      回复
  • 约瑟夫.拉格朗日布鲁克.泰勒牛顿
    约瑟夫.拉格朗日布鲁克.泰勒牛顿
    2023-02-09

    存在非实体标签元素(如css添加的伪元素)的Page行不通

    2023-02-09
    赞同
    回复
  • Awalker
    Awalker
    2022-05-31

    兼容性怎么样?

    2022-05-31
    赞同
    回复
  • sky
    sky
    2022-04-18

    谢谢!

    2022-04-18
    赞同
    回复
  • Peter👊
    Peter👊
    2020-04-22

    实践证明,工具中2.6以上绝对没问题,部分手机没用。

    2020-04-22
    赞同
    回复
  • Admin ²º²⁵
    Admin ²º²⁵
    2020-03-05

    为毛不直接在style=里用变量修改样式,还要再次通过css变量来修改?

    2020-03-05
    赞同
    回复 7
    • 天天修改
      天天修改
      2020-03-05
      在动画等交互场景里面会比较有用
      2020-03-05
      回复
    • Randy
      Randy
      2020-04-20
      在实际项目中用了吗  兼容性如何?
      2020-04-20
      回复
    • 天天修改
      天天修改
      2020-04-22回复Randy
      用了,但我只有小范围测试
      2020-04-22
      回复
    • Randy
      Randy
      2020-04-22回复天天修改
      ios9 不可用.. 基本凉凉
      2020-04-22
      回复
    • 天天修改
      天天修改
      2020-04-22回复Randy
      升级完微信也不行?
      2020-04-22
      回复
    查看更多(2)
登录 后发表内容