JavaScript 30天编码挑战——第 3 天

这是我参与更文挑战的第5天,活动详情查看: 更文挑战

Playing with CSS Variables and JS

Hi,几天未见,短暂小长假继已经结束,继续开始学习啦,顺嘴一提,假期后的第一天上班真艰难,险些迟到!

03B2E380.png
言归正传,开始学习!

一、效果展示

同样,每次展示的都是初始化效果(即未填充 JavaScript 代码的静态效果)、原作者的最终效果和我的效果展示。

今天要实现的是,用 JavaScript 和 CSS3 实现在拖动滑块时,同时改变图片的内边距、模糊度、背景颜色,还有一个不容忽视的地方,就是标题结尾的 JS 也要跟随背景色的变化而变化。

1.index-START.html

动画1112.gif

2.index-FINISHED.html

动画11.gif

3.我的最终效果

动画1111111.gif

二、实现

最终代码

<script>
    ;(function(){
        const inputs = document.querySelectorAll('.controls input')

        function changeHandler(){
          //this

          // console.log(this.name,this.value);

          // switch(this.name){
          //   case 'spacing':
          //     document.querySelector('img').style.padding = this.value + 'px'
          //     break;

          //   case 'blur':
          //     document.querySelector('img').style.filter = `blur(${this.value}px)`
          //     break;

          //   case 'base':
          //     document.querySelector('img').style.background = this.value
          //     document.querySelector('.hl').style.color = this.value
          //     break;
          // }
          
          document.documentElement.style.setProperty('--'+this.name, this.value +(this.dataset.sizing || '' ) )

          // const unit = this.dataset.sizing || '' 

          // document.documentElement.style.setProperty('--'+this.name, this.value + unit )

        } 

        inputs.forEach((input)=>{
            input.addEventListener('change',changeHandler)
            input.addEventListener('mousemove',changeHandler)
        })
    })()
  </script>

复制代码

三、总结回顾

1.首先,我们简单分析一下作者的源代码,里边的 input 标签有两个 HTML 预设的属性 type=”range” 和 type=”color”。

2.其次,里边的样式里有个 :root 的伪类,这个用法纯看个人操作习惯,如果觉得这样看起来比较变扭,你可以换成 html ,其产生的效果是一样的。口说无凭,我们代码见真章。

image.png
当我点击回车之后,会看到返回的是整个 html 元素里包含的内容。

image.png
我们再从另外一个角度来解释一下。

image.png
这样的话,基本上解释了这个问题。

  1. 再就是这个标题的核心重点了—— CSS变量(CSS Variables)——var(–xxx),这一点在原作者的源代码里也有体现

image.png

过程分解

1.首先我们取到所有的 input 标签

const inputs = document.querySelectorAll('.controls input')
复制代码

2.对这些 input 标签添加 change 事件

        function changeHandler(){
          //this

          console.log(this.name,this.value);
        }

        inputs.forEach((input)=>{
            input.addEventListener('change',changeHandler)
        })
复制代码

上边的 打印出来的 this.value 和 this.name 是为了查看这一步操作我们的 change 事件的结果。

动画1.gif

3.添加 mousemove 事件,为什么要添加这个事件呢?
不知道大家刚刚操作到这一步的时候有没有发现一个问题,就是 change 事件的结果都是在最后触发的,当你一直在操作的时候,change 事件并不会产生结果,那么,如果我们想要在操作的时候也实时产生结果,那么我们就需要添加一个 mousemove 事件,然后就是这样的效果:

动画11111.gif

4.接下来就是最终的结果了,以往我们有可能会这样做:

       function changeHandler(){
          //this

          // console.log(this.name,this.value);

          switch(this.name){
            case 'spacing':
              document.querySelector('img').style.padding = this.value + 'px'
              break;

            case 'blur':
              document.querySelector('img').style.filter = `blur(${this.value}px)`
              break;

            case 'base':
              document.querySelector('img').style.background = this.value
              break;
          }
        } 
复制代码

然后看效果:

动画1111.gif

这样也可以实现这个效果。
但是我在这里漏掉了 Js 颜色的变化,那么我们需要在代码里加上这样一行代码:

     function changeHandler(){
          //this

          // console.log(this.name,this.value);

          switch(this.name){
            case 'spacing':
              document.querySelector('img').style.padding = this.value + 'px'
              break;

            case 'blur':
              document.querySelector('img').style.filter = `blur(${this.value}px)`
              break;

            case 'base':
              document.querySelector('img').style.background = this.value
              
              //加上这一行
              document.querySelector('.hl').style.color = this.value
              break;
          }
        } 
复制代码

我们这样做的话,不是不可以,但是我们现在这个只是有三个,如果我们以后很多个的话,那我们就需要写很多个,这样的操作对于现在来说太傻了,那么我们当然就要换一种写法了:

function changeHandler(){
          //this

          // console.log(this.name,this.value);

          // switch(this.name){
          //   case 'spacing':
          //     document.querySelector('img').style.padding = this.value + 'px'
          //     break;

          //   case 'blur':
          //     document.querySelector('img').style.filter = `blur(${this.value}px)`
          //     break;

          //   case 'base':
          //     document.querySelector('img').style.background = this.value
          //     document.querySelector('.hl').style.color = this.value
          //     break;
          // }
          
          //新的写法
          document.documentElement.style.setProperty('--'+this.name, this.value +(this.dataset.sizing || '' ) )

          // const unit = this.dataset.sizing || '' 

          // document.documentElement.style.setProperty('--'+this.name, this.value + unit )

        } 
复制代码

四、重难点

其实这一章节里边要说到重难点可能就是两个部分了吧

1. 用 JavaScript 改变 CSS 的属性值

在JavaScript 中,除了我上面提到的两种方式之外,还有一种代表根元素的方式,这三种分别为:

document.querySelector('html');

document.querySelector('":root');

document.documentElement
复制代码

那么改变要改变 CSS 全局变量,我使用了 document.documentElement 。

2. 参数处理,dataset 的使用

这里主要用到的是处理有的需要单位后缀 px,有的不需要单位后缀,比如里边的 spacing 和 blur 是需要后缀的,但是 base 部分的颜色切换肯定是不需要单位后缀的,
如果是使用传统的写法,我们可能会这样去写:

document.documentElement.style.setProperty('--'+this.name, this.value + ( this.name === 'base' ? '': 'px') )
复制代码

就是代码后边部分的三目运算符操作,如果是 base 颜色的话,那么我们就不加后缀,如果不是颜色,那么我们就加 px 后缀,这是传统操作方法,但是我们不这样操作。我们用 dataset 去存储后缀,因为在代码里有设置

<input type="range" name="blur" min="0" max="25" value="10" data-sizing="px">
<input type="color" name="base" value="#8aa8af">
复制代码

那么在 JavaScript 中我们可以通过 dataset。sizing 取到后缀的值:

const unit = this.dataset.sizing || ''
复制代码

这样的话,上边的代码我们就可以换成这样去写了:

document.documentElement.style.setProperty('--'+this.name, this.value +(this.dataset.sizing || '' ) )
复制代码

05582BF4.png

今日份记录分享到此结束了

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享