CSS锥形渐变实现环形进度条

news2024/11/21 0:30:16

10月份因为疫情原因、又开启了居家办公模式,空闲之余,与其选择“躺平”,不如去做一些有意义的事情,内心的想法驱使着我去做些什么,但是又没有合适的素材,直到接手了最近的一个可视化项目,一个图表勾起了我无限的好奇心,本着对技术死磕到底的想法,于是开启了我的探索之旅。具体的原型效果如下:

关于此类进度条的实现方式,在我之前的章节(SVG绘制圆环进度条)中也有涉及,本章则另辟蹊跷,从另一个维度简单介绍一下CSS锥形渐变(conic-gradient)在可视化图表中的应用场景。本章依旧采用vue+原生css的形式进行案例展示、在了解本章节之前,需要对vue框架、css变量、css属性conic-gradient有一定程度的认识。案例实现效果如下:

实现思路:首先从原型图入手,我们可以将效果图进行拆分,背景圆环+进度圆环+进度条开始处小圆点(和边框一样大小、模拟圆角效果)+进度尾部圆点+进度尾部小眼睛+进度条中心内容。因此我们只需要将以上几个小功能点实现即可

1.背景圆环:div添加背景颜色+圆角

2.进度圆环:使用css属性conic-gradient进行进度控制

3.进度条开始处小圆点:使用伪元素(::before或::after)或div均可,定位解决

4.进度条尾部圆点:相当于在一个指针上添加一个小球,然后将指针根据数值旋转一定的角度

5.进度尾部小眼睛:使用指针头部小球元素的伪元素进行定位

6.进度条中心内容:可根据需要,使用插槽的形式解决

首先看一下前两个图表的具体实现细节:

<!-- demo1.vue -->
<template>
  <div class="chart-box" :style="styObj">
    <!-- 进度条部分 -->
    <div class="outer-box">
      <div class="inner-box">
        <div class="pointer-box"></div>
      </div>
    </div>
    <!-- 插槽内容 -->
    <div class="slot-content">
      <slot></slot>
    </div>
  </div>
</template>
<script>
export default {
  props: {
    rate: {
      type: Number,
      default: 0,
    },
    config: {
      type: Object,
      default: () => {
        return {};
      },
    },
  },
  computed: {
    styObj() {
      let rate = 0;
      if (this.rate <= 0) {
        rate = 0;
      } else if (this.rate >= 1) {
        rate = 1;
      } else {
        rate = this.rate;
      }
      let endPos = `${rate * 100}%`;
      let obj = Object.assign({}, this.defaultConfig, this.config);
      let rotate = `rotate(${360 * rate}deg)`;
      let chartRotate = obj.clockwise ? "rotateY(0deg)" : "rotateY(180deg)";
      let showEyes = obj.showEyes ? 1 : 0;
      return {
        "--background-image": `conic-gradient(${obj.startColor} 0%, ${obj.endColor} ${endPos}, transparent ${endPos})`,
        "--border-width": obj.borderWidth,
        "--dot-width": obj.circleSize,
        "--pointer-rotate": rotate,
        "--background-color": obj.borderBackground,
        "--center-gap-bg": obj.centerCircleBg,
        "--circle-color": obj.circleColor,
        "--clockwise-wise": chartRotate,
        "--show-eyes": showEyes,
        "--eyes-size": obj.eyesSize,
        "--start-color": obj.startColor,
      };
    },
  },
  data() {
    return {
      /* 此配置下所有属性均可在config中进行覆盖,实现个性化配置 */
      defaultConfig: {
        borderWidth: "8px", // 描边宽度
        borderBackground: "#eee", // 描边背景颜色
        circleSize: "16px", // 结尾处圆点直径
        circleColor: "#2ec4a7", // 结尾处圆点颜色
        startColor: "#d5f4ee", // 进度条起始颜色
        endColor: "#2ec4a7", // 进度条结束颜色
        centerCircleBg: "#fff", // 中间空心圆背景
        clockwise: true, // 是否顺时针
        showEyes: false, // 是否显示结尾处小眼睛
        eyesSize: "8px", // 结尾处小眼睛大小
      },
    };
  },
};
</script>
<style scoped>
.chart-box {
  position: relative;
  width: 100%;
  height: 100%;
}
/* 核心代码、控制进度条样式及进度 */
.outer-box {
  width: 100%;
  height: 100%;
  border-radius: 50%;
  box-sizing: border-box;
  background-color: var(--background-color);
  background-image: var(--background-image);
  padding: var(--border-width);
  transform: var(--clockwise-wise);
}
/* 开始处增加一个圆形端点, 模拟圆角效果 */
.outer-box::after {
  content: "";
  width: var(--border-width);
  height: var(--border-width);
  border-radius: 50%;
  position: absolute;
  left: 50%;
  top: 0;
  transform: translateX(-50%);
  background: var(--start-color);
}
/* 中间添加一个和背景色一样的圆圈 */
.inner-box {
  position: relative;
  width: 100%;
  height: 100%;
  border-radius: 50%;
  background: var(--center-gap-bg);
}
/* 指示针 */
.pointer-box {
  position: absolute;
  left: 50%;
  top: calc(0px - var(--border-width) / 2);
  bottom: calc(0px - var(--border-width) / 2);
  z-index: 1;
  transform-origin: center center;
  transform: var(--pointer-rotate);
}
/* 指示针的头部添加一个小圆点 */
.pointer-box::after {
  content: "";
  position: absolute;
  left: 50%;
  top: 0;
  width: var(--dot-width);
  height: var(--dot-width);
  border-radius: 50%;
  background: var(--circle-color);
  transform: translate(-50%, -50%);
}
/* 进度条结尾处添加一个小眼睛,背景白色 */
.pointer-box::before {
  content: "";
  position: absolute;
  left: 50%;
  top: 0;
  width: var(--eyes-size);
  height: var(--eyes-size);
  border-radius: 50%;
  background: #fff;
  transform: translate(-50%, -50%);
  z-index: 1;
  opacity: var(--show-eyes);
}
/* 插槽内容样式 */
.slot-content {
  position: absolute;
  left: 0;
  top: 0;
  width: 100%;
  height: 100%;
  display: flex;
  align-items: center;
  justify-content: center;
}
</style>

分析:从代码中不难看出、进度圆环中间的空白地方(class类名为“inner-box”)使用了一个背景为白色的元素进行遮盖,这点需要根据具体场景进行微调,在纯色背景下并无大碍,但是在有背景图的场景下,显示效果就有点差强人意了。因此此处需要做一下优化,扒一扒css手册,刚好有一个属性可以解决这个问题,那就是mask属性了,优化后代码如下,实现效果见第三、四个图表

<!-- demo2 -->
<template>
  <div class="chart-box" :style="styObj">
    <!-- 进度条部分 -->
    <div class="process-wrapper">
      <div class="process-box"></div>
      <div class="pointer-box"></div>
    </div>
    <!-- 插槽内容 -->
    <div class="slot-content">
      <slot></slot>
    </div>
  </div>
</template>
<script>
export default {
  props: {
    rate: {
      type: Number,
      default: 0,
    },
    config: {
      type: Object,
      default: () => {
        return {};
      },
    },
  },
  computed: {
    styObj() {
      let rate = 0;
      if (this.rate <= 0) {
        rate = 0;
      } else if (this.rate >= 1) {
        rate = 1;
      } else {
        rate = this.rate;
      }
      let endPos = `${rate * 100}%`;
      let obj = Object.assign({}, this.defaultConfig, this.config);
      let rotate = `rotate(${360 * rate}deg)`;
      let chartRotate = obj.clockwise ? "rotateY(0deg)" : "rotateY(180deg)";
      let showEyes = obj.showEyes ? 1 : 0;
      return {
        "--background-image": `conic-gradient(${obj.startColor} 0%, ${obj.endColor} ${endPos}, transparent ${endPos})`,
        "--border-width": obj.borderWidth,
        "--dot-width": obj.circleSize,
        "--pointer-rotate": rotate,
        "--background-color": obj.borderBackground,
        "--circle-color": obj.circleColor,
        "--clockwise-wise": chartRotate,
        "--show-eyes": showEyes,
        "--eyes-size": obj.eyesSize,
        "--start-color": obj.startColor,
      };
    },
  },
  data() {
    return {
      /* 此配置下所有属性均可在config中进行覆盖,实现个性化配置 */
      defaultConfig: {
        borderWidth: "8px", // 描边宽度
        borderBackground: "#eee", // 描边背景颜色
        circleSize: "16px", // 结尾处圆点直径
        circleColor: "#2ec4a7", // 结尾处圆点颜色
        startColor: "#d5f4ee", // 进度条起始颜色
        endColor: "#2ec4a7", // 进度条结束颜色
        clockwise: true, // 是否顺时针
        showEyes: false, // 是否显示结尾处小眼睛
        eyesSize: "8px", // 结尾处小眼睛大小
      },
    };
  },
};
</script>
<style scoped>
.chart-box {
  position: relative;
  width: 100%;
  height: 100%;
}
/* 将图表和插槽内容分开,便于控制进度条顺时针亦或是逆时针 */
.process-wrapper {
  position: relative;
  width: 100%;
  height: 100%;
  transform: var(--clockwise-wise);
}
/* 开始处增加一个圆形端点,模拟圆角效果 */
.process-wrapper::after {
  content: "";
  width: var(--border-width);
  height: var(--border-width);
  border-radius: 50%;
  position: absolute;
  left: 50%;
  top: 0;
  transform: translateX(-50%);
  background: var(--start-color);
}
/* 核心代码、控制进度条样式及进度 */
.process-box {
  position: absolute;
  left: 0;
  top: 0;
  width: 100%;
  height: 100%;
  border-radius: 50%;
  box-sizing: border-box;
  background-color: var(--background-color);
  background-image: var(--background-image);
  -webkit-mask: radial-gradient(
    closest-side at center center,
    transparent calc(100% - var(--border-width)),
    #fff calc(100% - var(--border-width))
  );
  mask: radial-gradient(
    closest-side at center center,
    transparent calc(100% - var(--border-width)),
    #fff calc(100% - var(--border-width))
  );
}
/* 指示针 */
.pointer-box {
  position: absolute;
  left: 50%;
  top: calc(0px + var(--border-width) / 2);
  bottom: calc(0px + var(--border-width) / 2);
  z-index: 1;
  transform: var(--pointer-rotate);
}
/* 指示针的头部(进度条结尾处)添加一个小圆点 */
.pointer-box::after {
  content: "";
  position: absolute;
  left: 50%;
  top: 0;
  width: var(--dot-width);
  height: var(--dot-width);
  border-radius: 50%;
  background: var(--circle-color);
  transform: translate(-50%, -50%);
}
/* 进度条结尾处添加一个小眼睛,背景白色 */
.pointer-box::before {
  content: "";
  position: absolute;
  left: 50%;
  top: 0;
  width: var(--eyes-size);
  height: var(--eyes-size);
  border-radius: 50%;
  background: #fff;
  transform: translate(-50%, -50%);
  z-index: 1;
  opacity: var(--show-eyes);
}
/* 插槽内容样式 */
.slot-content {
  position: absolute;
  left: 0;
  top: 0;
  width: 100%;
  height: 100%;
  display: flex;
  align-items: center;
  justify-content: center;
}
</style>

至此、已完成了进度条的优化改造、不过还存在一个小小的瑕疵、使用mask后,进度条内部交合区域稍微也有一点锯齿感,这个暂时还没有找到优化措施,不过并无大碍。

为了实现更加丰富的展现形式、我们可以在进度条上添加分割线实现花纹效果、这个其实也不麻烦、只需要再添加一层锥形渐变即可解决,具体实现如下:

<!-- demo3 -->
<template>
  <div class="chart-box" :style="styObj">
    <div class="process-box">
      <div class="center-mask"></div>
    </div>
    <!-- 插槽内容 -->
    <div class="slot-content">
      <slot></slot>
    </div>
  </div>
</template>
<script>
export default {
  props: {
    rate: {
      type: Number,
      default: 0,
    },
    config: {
      type: Object,
      default: () => {
        return {};
      },
    },
  },
  computed: {
    styObj() {
      let rate = 0;
      if (this.rate <= 0) {
        rate = 0;
      } else if (this.rate >= 1) {
        rate = 1;
      } else {
        rate = this.rate;
      }
      let endPos = `${rate * 100}%`;
      let obj = Object.assign({}, this.defaultConfig, this.config);
      let rotate = `rotate(${360 * rate}deg)`;
      let chartRotate = obj.clockwise ? "rotateY(0deg)" : "rotateY(180deg)";
      let bgInfo = [];
      let gap = 100 / obj.gapNum;
      for (let i = 0; i < obj.gapNum; i++) {
        bgInfo.push(`#fff ${i * gap}%`);
        bgInfo.push(`#fff ${i * gap + obj.lineWidth}%`);
        bgInfo.push(`transparent ${i * gap + obj.lineWidth}%`);
        bgInfo.push(`transparent ${(i + 1) * gap}%`);
      }
      return {
        "--background-image": `conic-gradient(${bgInfo.join(",")})`,
        "--background-image1": `conic-gradient(${obj.startColor} 0%, ${obj.endColor} ${endPos}, transparent ${endPos})`,
        "--border-width": obj.borderWidth,
        "--background-color": obj.borderBackground,
        "--center-gap-bg": obj.centerCircleBg,
        "--clockwise-wise": chartRotate,
      };
    },
  },
  data() {
    return {
      /* 此配置下所有属性均可在config中进行覆盖,实现个性化配置 */
      defaultConfig: {
        borderWidth: "8px", // 描边宽度
        borderBackground: "#eee", // 描边背景颜色
        startColor: "#d5f4ee", // 进度条起始颜色
        endColor: "#2ec4a7", // 进度条结束颜色
        centerCircleBg: "#fff", // 中间空心圆背景
        clockwise: true, // 是否顺时针
        gapNum: 10, // 分割段数
        lineWidth: 2, // 间隔线宽度,百分比
      },
    };
  },
};
</script>
<style scoped>
.chart-box {
  position: relative;
  width: 100%;
  height: 100%;
}
.process-box {
  position: relative;
  width: 100%;
  height: 100%;
  border-radius: 50%;
  padding: var(--border-width);
  box-sizing: border-box;
  background-color: var(--background-color);
  background-image: var(--background-image), var(--background-image1);
  transform: var(--clockwise-wise);
}
.center-mask {
  width: 100%;
  height: 100%;
  border-radius: 50%;
  background: var(--center-gap-bg);
}
/* 插槽内容样式 */
.slot-content {
  position: absolute;
  left: 0;
  top: 0;
  width: 100%;
  height: 100%;
  display: flex;
  align-items: center;
  justify-content: center;
}
</style>

最后,在汇总页面中依次将三个组件引入,增加不同的个性化参数,即可实现封面的展示效果,贴一下汇总页面代码

<template>
  <div class="page-box">
    <div class="main-box">
      <!-- 第一种实现方式,中间的镂空部分采用背景色(和页面背景一致)的形式 -->
      <div class="module">
        <conic-gradient :rate="0.8888">
          <span class="slot-font1">88.88%</span>
        </conic-gradient>
      </div>
      <div class="module">
        <conic-gradient :rate="0.8888" :config="config">
          <div class="slot-bg">
            <span class="slot-font2">88.88%</span>
          </div>
        </conic-gradient>
      </div>
      <!-- 第二种实现方式,中间镂空部分采用遮罩(mask)的方式实现 -->
      <div class="module">
        <conic-mask
          :rate="0.6666"
          :config="{ showEyes: true, eyesSize: '6px', circleSize: '8px' }"
        >
          <span class="slot-font1">66.66%</span>
        </conic-mask>
      </div>
      <div class="module">
        <conic-mask :rate="0.6666" :config="config">
          <div class="slot-bg">
            <span class="slot-font2">66.66%</span>
          </div>
        </conic-mask>
      </div>
    </div>
    <hr />
    <!-- 锥形渐变实现花纹进度条 -->
    <div class="main-box">
      <div class="module">
        <conic-process :rate="0.6666">
          <span class="slot-font1">66.66%</span>
        </conic-process>
      </div>
      <div class="module">
        <conic-process
          :rate="0.8888"
          :config="{
            startColor: '#e45739',
            endColor: '#e45739',
            borderBackground: '#fbedea',
            gapNum: 20,
            lineWidth: 1,
            clockwise: false
          }"
        >
          <div class="slot-bg">
            <span class="slot-font2">88.88%</span>
          </div>
        </conic-process>
      </div>
      <div class="module">
        <conic-process :rate="0.8888" :config="{ gapNum: 1, lineWidth: 0 }">
          <span class="slot-font1">88.88%</span>
        </conic-process>
      </div>
      <div class="module">
        <conic-process
          :rate="0.8888"
          :config="{
            startColor: '#e45739',
            endColor: '#e45739',
            borderBackground: '#fbedea',
            gapNum: 1,
            lineWidth: 0,
            clockwise: false,
          }"
        >
          <div class="slot-bg">
            <span class="slot-font2">88.88%</span>
          </div>
        </conic-process>
      </div>
    </div>
  </div>
</template>
<script>
import ConicGradient from "./demo1";
import ConicMask from "./demo2";
import ConicProcess from "./demo3";
export default {
  components: {
    ConicGradient,
    ConicMask,
    ConicProcess,
  },
  data() {
    return {
      config: {
        borderWidth: "8px",
        circleSize: "16px",
        circleColor: "#e45739",
        borderColor: "#d5f4ee",
        startColor: "#eead99",
        endColor: "#e45739",
        borderBackground: "#fbedea",
        centerCircleBg: "#fff",
        clockwise: false,
        showEyes: true,
      },
    };
  },
};
</script>
<style scoped>
.page-box {
  width: 100%;
  height: 100%;
  overflow: auto;
}
.main-box {
  display: flex;
  flex-wrap: wrap;
  width: 100%;
}
.module {
  width: 200px;
  height: 200px;
  box-sizing: border-box;
  padding: 20px;
}
.slot-bg {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 75%;
  height: 75%;
  border-radius: 50%;
  background: #fbedea;
}
.slot-font1 {
  color: #009d84;
  font-size: 20px;
  font-weight: bold;
}
.slot-font2 {
  color: #e45638;
  font-size: 20px;
  font-weight: bold;
}
</style>

好了,本章节的内容就到这里,如小伙伴有疑问,可评论区留言、随时交流。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/408763.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

若依框架---权限管理设计

前言 若依权限管理包含两个部分&#xff1a;菜单权限 和 数据权限。菜单权限控制着我们可以执行哪些操作。数据权限控制着我们可以看到哪些数据。 菜单是一个概括性名称&#xff0c;可以细分为目录、菜单和按钮&#xff0c;以若依自身为例&#xff1a; 目录&#xff0c;就是页…

关于古老的jsp页面的知识汇总(超详细)

1. 为什么要开发出来jsp文件呢&#xff1f; 面对需要将大量的结果&#xff0c;甚至是一整个<html>页面返回给响应体&#xff0c;之前的方法就显得十分麻烦。 之前我们是这样将结果返回给响应体的&#xff0c;如下图&#xff1a; 于是就设计了jsp文件&#xff0c;用来解决…

antd upload上传格式.doc、.docx、.pdf、.png、.jpg、.rar和大小100兆限制

限制上传文件格式.rar、.zip、.pdf、.jpg、.png、.docx antd 中upload对于限制上传文件格式的属性是accept&#xff0c;在开发的过程中&#xff0c;accept对于.doc、.docx、.pdf、.png、.jpg、.rar&#xff0c;格式的限制是完全没有问题的。但是测试和我说&#xff0c;当选择文…

前端开发之vue-grid-layout的使用和实例

前端开发之vue-grid-layout的使用和实例前言效果图一、vue中简单案例1、安装组件NPMYarn2、vue文件二、vue3使用&#xff08;vue文件&#xff09;1、需要导入vue3支持的该版本插件2、在mian.js里引入&#xff1a;三、在IE上无法打开&#xff0c;并报错缺少&#xff1a;&#xf…

【TypeScript基础】TypeScript之常用类型(下)

前言 博主主页&#x1f449;&#x1f3fb;蜡笔雏田学代码 专栏链接&#x1f449;&#x1f3fb;【TypeScript专栏】 上篇文章讲解了TypeScript的一些常用类型&#xff0c;&#x1f449;&#x1f3fb;详细内容请阅读【TypeScript基础】TypeScript之常用类型&#xff08;上&#x…

解决TypeError: Cannot read properties of undefined (reading ‘NormalModule‘)的三种方案

目录 前言 第一种 第二种 第三种 前言 大家好呀&#xff01;我是爷爷的茶七里香&#xff0c;今天遇到了一件&#x1f95a;疼的事&#xff0c;一个vuevant写的APP&#xff0c;更换了电脑之后运行不起来&#xff0c;就很奇怪很离谱&#xff0c;报错信息如下&#xff1a; ER…

使用Iframe打印预览pdf,兼容谷歌火狐浏览器

功能场景&#xff1a; 点击页面的打印按钮&#xff0c;可以调用浏览器的打印功能&#xff0c;并预览打印pdf文件。解决火狐浏览器出现about:blank问题。 功能实现&#xff1a; 实现思路&#xff1a; 使用接口获取pdf文件的二进制流&#xff0c;响应类型为blob将拿到的二进制…

vite 本地运行首次进入页面加载慢问题

思考 vite的适用场景是什么&#xff1f; 由于我使用了tailwindcss插件 使用webpack 每次启动所有的项目的css样式都预先使用tailwindcss 转换成css 性能普通的电脑启动项目需要1分钟到2分钟。不过首次加载不会有什么多大的延迟&#xff0c;按需导入的页面加载也不会有多大的延…

博客项目- SSM 实现

文章目录1. 创建项目2. 数据库设计3. 前置任务3.1 拦截器3.2 统一数据格式3.3 创建一个 Constant3.4 统一异常处理3.5 密码加密4. 功能实现4.1 登录功能4.2 注册功能4.3 博客列表页 &#xff08;功能实现&#xff09;4.3.1 左侧框4.3.2 右侧框 (分页功能 页面显示)4.4 博客详情…

【CSS】盒子模型外边距 ③ ( 插入图片 | 插入图片位置移动 - 修改外边距 | 背景图片 | 背景图片移动位置 - 修改背景位置 background-position )

文章目录一、插入图片1、简介2、代码示例二、背景图片1、简介2、代码示例一、插入图片 1、简介 插入图片 : 插入图片方式 : 在 HTML 中 , 使用 <img> 标签可以插入一张图片 ;插入图片适用场景 : 显示 内容 , 按钮 , 一般都使用 插入图片 的方式 展示图片 ,设置插入图片大…

IDEA从零到精通(26)之MybatisX插件的安装与使用

文章目录作者简介引言导航概述安装插件插件的使用小结导航热门专栏推荐作者简介 作者名&#xff1a;编程界明世隐 简介&#xff1a;CSDN博客专家&#xff0c;从事软件开发多年&#xff0c;精通Java、JavaScript&#xff0c;博主也是从零开始一步步把学习成长、深知学习和积累的…

前端发起请求,后端响应请求的整个过程

文章目录前端注册页面axios 请求方法URL 路径配置自定义 axios方法封装后端创建服务器模块接口方法模块连接数据库本文分为&#xff1a;前端、后端两部分讲诉。以下是前端发送请求到服务器&#xff0c;服务器响应前端&#xff0c;的整个过程的图解&#xff1a;前端 前端主要是…

在vue项目当中绑定键盘事件

在vue项目当中&#xff0c;有时会遇到为文本输入框或者button按钮绑定键盘事件&#xff0c;最常见的就是enter回车事件。 按照vue官网给出的方法是&#xff1a; v-on:keyup.enter 简写&#xff1a;keyup.enter &#xff08;注意&#xff1a;如果是绑定在组件上的话&#xff…

让她/他心动的告白,页面制作(9个页面+链接+代码,原生HTML+CSS+JS实现)

文章目录一、pikachu告白信件1.效果图2.代码1.envelope.html2.envelope.css3.pikachu.html4.pikachu.css二、告白小宇宙1.效果图2.代码1.index.html2.index.css三、流光爱心1.效果图2.代码1.index.html2.index.css3.index.js四、520贺卡&#xff08;1&#xff09;1.效果图2.代码…

Node.js16.15.1的一个报错及解决方案

Node.js16.15.1的一个报错及解决方案前言准备工作核心解决方案测试前言 最近在进行Node.js的下载安装和环境的配置&#xff0c;在官网上下载了LTS版本16.15.1&#xff0c;没想到在后续的使用中出现一种报错。 例如&#xff0c;在命令提示符窗口中输入npm -v 想要查看npm的版本…

微信小程序下拉刷新

一、如何设置微信小程序所有页面都可以下拉刷新呢&#xff1f; 1、在app.json的"window"中进行配置 &#xff08;1&#xff09;把"backgroundTextStyle":“light"改为"backgroundTextStyle”:“dark” &#xff08;2&#xff09;添加"enab…

【青山css】css3阴影效果属性详解及创意玩法

前言 css阴影效果是我们经常使用的一个css属性&#xff0c;但你有仔细了解过它吗&#xff1f;是不是用的时候直接从蓝湖上复制过来就行了&#xff0c;那你了解它的每个参数吗&#xff1f;用阴影又能实现哪些好看的效果呢&#xff1f;来看一看我收集总结的css阴影知识吧&#x…

js执行顺序

1.首先js是单线程的 所有的同步任务都是按顺序依次执行的&#xff0c;前面的执行完了之后才会执行后面的任务。遇到计算量大的代码就会阻塞在这里。下面的代码就是打印输出10000次&#xff0c;当循环走完了之后 才会走后面的代码&#xff0c;输出的时间是981ms 输出981ms 2.因…

Plugin [id: ‘com.android.application‘, version: ‘7.*.*‘, apply: false] was not found 的解决办法

呜呜~ 在新建项目File->New->New Project->Empty Activity 后遇到以下情况&#xff1a;Plugin [id: com.android.application, version: 7.2.2, apply: false] was not found in any of the following sources: 问题1&#xff1a;配置了 proxy 把File | Settings | A…

vue3中使用vue-i18n(ts中使用$t, vue3不用this)

vue项目里多语言工具一直用的vue-i18n。 以前用的 vue2&#xff0c;也没啥大问题&#xff0c;就是配置好之后用t(“你的属性名”)就行&#xff0c;现在用vue3其实本来也没太大变化。 但是配置完之后&#xff0c;在html中用$t()没有问题&#xff0c;显示文案什么的一切正常。而在…