首页 > 其他分享 >Day03 - CSS 变量

Day03 - CSS 变量

时间:2023-04-08 17:03:17浏览次数:57  
标签:变量 Day03 dataset -- base var input CSS


作者:©liyuechun

实现效果

用 JavaScript 和 CSS3 实现拖动滑块时,实时调整图片的内边距、模糊度、背景颜色,同时标题中 JS 两字的颜色也随图片背景颜色而变化。

涉及特性

HTML源码

<h2>Update CSS Variables with <span class='hl'>JS</span></h2>

  <div class="controls">
    <label for="spacing">Spacing:</label>
    <input id="spacing" type="range" name="spacing" min="10" max="200" value="10" data-sizing="px">

    <label for="blur">Blur:</label>
    <input id="blur" type="range" name="blur" min="0" max="25" value="10" data-sizing="px">

    <label for="base">Base Color</label>
    <input id="base" type="color" name="base" value="#ffc600">
  </div>


  <div class="result">
    <div class="showText">{spacing:<label id="label_spacing">#ffc600</label>}</div>
    <div class="showText">{blur:<label id="label_blur">10px</label>}</div>
    <div class="showText">{base:<label id="label_base">10px</label>}</div>
  </div>


  <img src="http://f.hiphotos.baidu.com/lvpics/h=800/sign=b346032cbe389b5027ffed52b534e5f1/960a304e251f95ca545f8b84ce177f3e6709525d.jpg">

CSS源码

<style>
     :root {
      --base: #ffc600;
      --spacing: 10px;
      --blur: 10px;
    }

    img {

      width: 600px;
      height: 400px;
      padding: var(--spacing);
      background: var(--base);
      filter: blur(var(--blur));
    }

    .hl {
      color: var(--base);
    }
    /*
      misc styles, nothing to do with CSS variables
    */

    body {
      text-align: center;
      background: #193549;
      color: white;
      font-family: 'helvetica neue', sans-serif;
      font-weight: 100;
      font-size: 30px;
    }

    .controls {
      margin-bottom: 50px;
    }

    input {
      width: 100px;
    }

    .result {
      display: flex;
      flex-direction: row;
      justify-content: center;
      color: var(--base);
    }

    .showText {
      margin: 0px 25px 50px 25px;
    }
  </style>

JS源码

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

    function handleUpdate() {
      const suffix = this.dataset.sizing || '';
      document.documentElement.style.setProperty(`--${this.name}`, this.value + suffix);
      document.getElementById(`label_${this.name}`).innerText = this.value + suffix;
    }

    inputs.forEach(input => input.addEventListener('change', handleUpdate));
    inputs.forEach(input => input.addEventListener('mousemove', handleUpdate));
  </script>

过程指南

CSS 部分准备

  1. 声明全局(:root)的 CSS 变量
  2. 将变量应用到页面中对应元素 <img>
  3. 处理标题的 CSS 值

JS 实时更新 CSS 值

  1. 获取页面中 input 元素
  2. 给每个 input 添加监听事件,使其在值变动,触发更新操作
  3. 同 2 ,添加鼠标滑过时的事件监听
  4. 编写处理更新操作的方法
  1. 获取参数值后缀
  • 获取参数名(blur、spacing、color)
  • 获取参数值(12px、#efefef)
  • 赋值给对应的 CSS 变量

基础知识

  1. NodeList 和 Array 的区别
    可以打开 proto 查看它的方法,其中有 forEach()item()keys() 等。而 Array 的 prototype 中有 map()pop() 等数组才有的方法。
  2. HTML5 中的自定义数据属性 datasetHTML5 中可以为元素添加非标准的自定义属性,只需要加上 data- 前缀,可以随便添加和命名。添加之后,可以通过元素的 dataset 属性来访问这些值,dataset 的值是 DOMStringMap 的一个实例化对象,其中包含之前所设定的自定义属性的“名-值”对。
  3. CSS variable这是一个 CSS3 的新特性,IE 和 Edge 目前都还不支持。命名写法是 --变量名,在引用这个变量时写法是 var(--变量名)。具体实例见下一条代码。
  4. :root 伪类
    这个伪元素匹配的是文档的根元素,也就是 <html> 标签。
    所以常用于声明全局的 CSS 变量:
:root {
  --color: #fff;
}

在使用时:

img {
  background: var(--base);
}
  1. CSS 滤镜 filterCSS 的滤镜提供了一些图形特效,比如高斯模糊、锐化、变色等。它带有一些预设的函数,在使用时加上参数调用这些函数即可。在 Chrome、Firefox 中都支持。

解决难点

  1. 如何处理参数值(一个有 px 、另一个没有)
    运用 dataset 储存后缀,有 px 后缀的标签中设置 <input data-sizing: px>
<input type="range" name="blur" min="0" max="25" value="10" data-sizing="px">
<input type="color" name="base" value="#8aa8af">

JS 中通过 dataset.sizing 来获取后缀值:

const suffix = this.dataset.sizing || '';

此时 suffix 获取到的值,针对颜色为空,而针对长度类的则为 ‘px’。

  1. 如何用 JavaScript 改变 CSS 属性值?
    在 JavaScript 中 document.documentElement 即代表文档根元素。所以要改变全局的 CSS 变量,可以这样写:
document.documentElement.style.setProperty('--base', '#fff');

源码下载

标签:变量,Day03,dataset,--,base,var,input,CSS
From: https://blog.51cto.com/u_10981011/6177805

相关文章

  • Day02 - JavaScript + CSS Clock
    Day02-JavaScript+CSSClock作者:©liyuechun简介第二天的练习是用JS+CSS模拟时钟效果。效果如下:实现以上模拟时钟的效果,大致思路和解决方案如下:分别获取到当前时间的时、分、秒。通过时分秒对一圈360度,进行映射,确定每一个指针所需旋转的角度。通过CSS的transform:rotate(deg),......
  • 『0008』- Solidity中public、internal、private在状态变量和函数中的使用以及Solidit
    作者:黎跃春,在上一小节中我们在函数参数中使用storage这个关键字时,当前的函数必须是internal或者private类型。在本小节中,我(微信:liyc1215)将重点为大家介绍属性和函数的使用权限。状态变量、函数的权限一、public备注:为了演示方便,我直接通过https://remix.ethereum.org/来进行演示。p......
  • 本地变量的使用范围
    一、可以使用二、可以使用三、并列for、while、if中内部变量不通用四、switch也不可以使用五、总结、只能在自己代码块里使用(大括号为一个代码块)红框框里为一个代码块......
  • Golang反射获取变量类型和值
    Golang反射获取变量类型和值 1.什么是反射反射是程序在运行期间获取变量的类型和值、或者执行变量的方法的能力。Golang反射包中有两对非常重要的函数和类型,两个函数分别是:reflect.TypeOf能获取类型信息reflect.Type;reflect.ValueOf 能获取数据的运行时表示reflect.Val......
  • tailwindcss 安装
    #tailwindcsspnpmitailwindcsspostcssautoprefixer#生成tailwindcss配置文件npxtailwindcssinit-p//tailwind.config.jsmodule.exports={...content:['./public/**/*.html','./src/**/*.{js,jsx,ts,tsx,vue}'],}#新建/src/styl......
  • css:writing-mode控制文字水平排布或垂直排布
    writing-mode属性定义了文本水平或垂直排布以及在块级元素中文本的行进方向。文档https://developer.mozilla.org/zh-CN/docs/Web/CSS/writing-mode语法/*关键字值*/writing-mode:horizontal-tb;writing-mode:vertical-rl;writing-mode:vertical-lr;效果在线demo......
  • css边距合并的问题
    上下两个盒子边距合并问题<style>*{margin:0px;padding:0px;}div{width:100px;height:100px;}.top{background-color:red;margin-b......
  • CSS标准盒子模型与怪异盒子模型
    <style>*{margin:0;padding:0;}div{/*宽高改变的是内容大小*/width:200px;height:200px;}/*w3c标准盒子:盒子的总大小=内容+内边距+边框+外边距*//*只要改变内容,内边距,外边距,边框,盒子都......
  • CSS伪类选择器
    伪类选择器选择第几个元素<style>/*类num后代li的第1个*/.numli:first-child{color:red;}/*类num后代li的最后一个*/.numli:last-child{color:red;}/*类num后代li的第......
  • CSS基础选择器
    基础选择器前端页面结构如下<h1>h1:标签选择器对选定的所有的标签都生效</h1><p>p:标签选择器对选定的所有的标签都生效</p><divclass="green">div:类选择器测试</div><divid="myid">id选择器测试,id是唯一的</div>效果展示如下标签选择器加上如下代码......