前端换肤的一些思考

article/2025/5/20 9:41:30

先看看大家怎么做的。下面是两篇别人写的文章,最后是我自己的方法。

第一篇:聊一聊前端换肤

之前在做网站换肤,所以想谈谈网站换肤的实现。网页换肤就是修改颜色值,因此重点就在于怎么来替换。

一般实现

 

image

 

如上图,我们会看到在某些网站的右上角会出现这么几个颜色块,点击不同的颜色块,网站的整体颜色就被替换了。要实现它,我们考虑最简单的方式:点击不同的按钮切换不同的样式表 ,如:

 

  • theme-green.css
  • theme-red.css
  • theme-yellow.css

可以看出,我们需要为每个颜色块编写样式表,那如果我要实现几百种或者让用户自定义呢,显而易见这种方式十本笨拙,且拓展性并不高,另外,如果考虑加载的成本,那其实这种方式并不可取。

ElementUI 的实现

 

image

 

 

ElementUI 的实现比上面的实现高了好几个level,它能让用户自定义颜色值,而且展示效果也更加优雅。当前我的实现就是基于它的思路来实现。 我们来看看他是怎么实现的(这里引用的是官方的实现解释):

  • 先把默认主题文件中涉及到颜色的 CSS 值替换成关键词:github.com/ElementUI/t…
  • 根据用户选择的主题色生成一系列对应的颜色值: github.com/ElementUI/t…
  • 把关键词再换回刚刚生成的相应的颜色值:github.com/ElementUI/t…
  • 直接在页面上加 style 标签,把生成的样式填进去:github.com/ElementUI/t…

下面我具体讲下我参考它的原理的实现过程 (我们的css 编写是基于 postcss 来编写的):

  1. 先确定一个主题色,其他需在在换肤过程中随主题色一起修改的颜色值就根据主题色来调用例如(上面已经说到了我们是基于postcss来编写的,所以就使用了如下函数来计算颜色值): tint(var(--color-primary), 20%)darken(var(--color-primary), 15%)shade(var(--color-primary), 5%) 等。这也类似就实现了上面的第一步
  2. 然后根据用户选择的颜色值来生成新的一轮对应的一系列颜色值: 这里我先把全部css文件中可以通过主题色来计算出其他颜色的颜色值汇总在一起,如下:
// formula.js
const formula = [{name: 'hoverPrimary',exp: 'color(primary l(66%))',},{name: 'clickPrimary',exp: 'color(primary l(15%))',},{name: 'treeBg',exp: 'color(primary l(95%))',},{name: 'treeHoverBg',exp: 'color(primary h(+1) l(94%))',},{name: 'treeNodeContent',exp: 'color(primary tint(90%))',},{name: 'navBar',exp: 'color(primary h(-1) s(87%) l(82%))',}  
];export default formula;

这里的color函数 是后面我们调用了 css-color-function 这个包,其api使然。

既然对应关系汇总好了,那我们就来进行颜色值的替换。在一开始进入网页的时候,我就先根据默认的主题色根据 formula.js 中的 计算颜色汇总表 生成对应的颜色,以便后面的替换,在这过程中使用了css-color-function 这个包,

import Color from 'css-color-function';componentDidMount(){
this.initColorCluster = ['#ff571a', ...this.generateColors('#ff571a')];// 拿到所有初始值之后,因为我们要做的是字符串替换,所以这里利用了正则,结果值如图2:this.initStyleReg = this.initColorCluster  .join('|').replace(/\(/g, '\\(') // 括号的转义.replace(/\)/g, '\\)').replace(/0\./g, '.');  // 这里替换是因为默认的css中计算出来的值透明度会缺省0,所以索性就直接全部去掉0
}generateColors = primary => {return formula.map(f => {const value = f.exp.replace(/primary/g, primary);  // 将字符串中的primary 关键字替换为实际值,以便下一步调用 `Color.convert`return Color.convert(value);     // 生成一连串的颜色值,见下图1,可以看见计算值全部变为了`rgb/rgba` 值});};

图1:

image

 

 

图2,黑色字即为颜色正则表达式:

image

 

 

好了,当我们拿到了原始值之后,就可以开始进行替换了,这里的替换源是什么?由于我们的网页是通过如下 内嵌style标签 的,所以替换原就是所有的style标签,而 element 是直接去请求网页 打包好的的css文件

 

image

 

 

注:并不是每次都需要查找所有的 style 标签,只需要一次,然后,后面的替换只要在前一次的替换而生成的 style 标签(使用so-ui-react-theme来做标记)中做替换

下面是核心代码:

changeTheme = color => {// 这里防止两次替换颜色值相同,省的造成不必要的替换,同时验证颜色值的合法性if (color !== this.state.themeColor && (ABBRRE.test(color) || HEXRE.test(color))) {const styles =document.querySelectorAll('.so-ui-react-theme').length > 0? Array.from(document.querySelectorAll('.so-ui-react-theme')) // 这里就是上说到的: Array.from(document.querySelectorAll('style')).filter(style => {  // 找到需要进行替换的style标签const text = style.innerText;const re = new RegExp(`${this.initStyleReg}`, 'i');return re.test(text);});const oldColorCluster = this.initColorCluster.slice();const re = new RegExp(`${this.initStyleReg}`, 'ig');  // 老的颜色簇正则,全局替换,且不区分大小写this.clusterDeal(color);  // 此时 initColorCluster 已是新的颜色簇styles.forEach(style => {const { innerText } = style;style.innerHTML = innerText.replace(re, match => {let index = oldColorCluster.indexOf(match.toLowerCase().replace('.', '0.'));if (index === -1) index = oldColorCluster.indexOf(match.toUpperCase().replace('.', '0.'));// 进行替换return this.initColorCluster[index].toLowerCase().replace(/0\./g, '.');});style.setAttribute('class', 'so-ui-react-theme');});this.setState({themeColor: color,});}};

效果如下:

image

 

 

至此,我们的颜色值替换已经完成了。正如官方所说,实现原理十分暴力😂,同时感觉使用源css通过 postcss 编译出来的颜色值不好通过 css-color-function 这个包来计算的一模一样,好几次我都是对着 rgba 的值一直在调🤣🤣,( 👀难受

antd 的实现

antd 的样式是基于 less 来编写的,所以在做换肤的时候也利用了 less 可以直接 编译css 变量 的特性,直接上手试下。页面中顶部有三个色块,用于充当颜色选择器,下面是用于测试的div块。

image

 

 

下面div的css 如下,这里的 @primary-color@bg-color 就是 less 变量:

.test-block {width: 300px;height: 300px;text-align: center;line-height: 300px;margin: 20px auto;color: @primary-color;background: @bg-color;
}

当我们点击三个色块的时候,直接去加载 less.js,具体代码如下(参考antd的实现):

import React from 'react';
import { loadScript } from '../../shared/utils';
import './index.less';
const colorCluters = ['red', 'blue', 'green'];export default class ColorPicker extends React.Component {handleColorChange = color => {const changeColor = () => {window.less.modifyVars({  // 调用 `less.modifyVars` 方法来改变变量值'@primary-color': color,'@bg-color': '#2f54eb',}).then(() => {console.log('修改成功');});};const lessUrl ='https://cdnjs.cloudflare.com/ajax/libs/less.js/2.7.2/less.min.js';if (this.lessLoaded) {changeColor();} else {window.less = {async: true,};loadScript(lessUrl).then(() => {this.lessLoaded = true;changeColor();});}};render() {return (<ul className="color-picker">{colorCluters.map(color => (<listyle={{ color }}onClick={() => {this.handleColorChange(color);}}>color</li>))}</ul>);}
}

然后点击色块进行试验,发现并没有生效,这是why?然后就去看了其文档,原来它会找到所有如下的less 样式标签,并且使用已编译的css同步创建 style 标签。也就是说我们必须吧代码中所有的less 都以下面这种link的方式来引入,这样less.js 才能在浏览器端实现编译。

<link rel="stylesheet/less" type="text/css" href="styles.less" />

这里我使用了 create-react-app ,所以直接把 less 文件放在了public目录下,然后在html中直接引入:

image

 

 

 

image

 

 

点击blue色块,可以看见 colorbackground 的值确实变了:

 

image

 


并且产生了一个 id=less:color 的style 标签,里面就是编译好的 css 样式。紧接着我又试了link两个less 文件,然后点击色块:

 

 

image

 

 

从上图看出,less.js 会为每个less 文件编译出一个style 标签。 接着去看了 antd 的实现,它会调用 antd-theme-generator 来把所有antd 组件 或者 文档 的less 文件组合为一个文件,并插入html中,有兴趣的可以去看下 antd-theme-generator 的内部实现,可以让你更加深入的了解 less 的编程式用法。

注:使用less 来实现换肤要注意 less 文件html 中编写的位置,不然很可能被其他css 文件所干扰导致换肤失败

基于 CSS自定义变量 的实现

先来说下 css自定义变量 ,它让我拥有像less/sass那种定义变量并使用变量的能力,声明变量的时候,变量名前面要加两根连词线(--),在使用的时候只需要使用var()来访问即可,看下效果:

 

image

 

 

如果要局部使用,只需要将变量定义在 元素选择器内部即可。具体使用见使用CSS变量,关于 CSS 变量,你需要了解的一切

使用 css 自定义变量 的好处就是我们可以使用 js 来改变这个变量:

  • 使用 document.body.style.setProperty('--bg', '#7F583F'); 来设置变量
  • 使用 document.body.style.getPropertyValue('--bg'); 来获取变量
  • 使用 document.body.style.removeProperty('--bg'); 来删除变量

有了如上的准备,我们基于 css 变量 来实现的换肤就有思路了:将css 中与换肤有关的颜色值提取出来放在 :root{} 中,然后在页面上使用 setProperty 来动态改变这些变量值即可。

上面说到,我们使用的是postcss,postcss 会将css自定义变量直接编译为确定值,而不是保留。这时就需要 postcss 插件 来为我们保留这些自定义变量,使用 postcss-custom-properties,并且设置 preserve=true 后,postcss就会为我们保留了,效果如下:

 

image

 

 

 

image

 

 

这时候就可以在换肤颜色选择之后调用 document.body.style.setProperty 来实现换肤了。

不过这里只是替换一个变量,如果需要根据主颜色来计算出其他颜色从而赋值给其他变量就可能需要调用css-color-function 这样的颜色计算包来进行计算了。

import colorFun from "css-color-function"document.body.style.setProperty('--color-hover-bg', colorFun.convert(`color(${value} tint(90%))`));

其postcss的插件配置如下(如需其他功能可自行添加插件):

module.exports = {plugins: [require('postcss-partial-import'),require('postcss-url'),require('saladcss-bem')({defaultNamespace: 'xxx',separators: {descendent: '__',},shortcuts: {modifier: 'm',descendent: 'd',component: 'c',},}),require('postcss-custom-selectors'),require('postcss-mixins'),require('postcss-advanced-variables'),require('postcss-property-lookup'),require('postcss-nested'),require('postcss-nesting'),require('postcss-css-reset'),require('postcss-shape'),require('postcss-utils'),require('postcss-custom-properties')({preserve: true,}),require('postcss-calc')({preserve: false,}),],
};

聊下 precss 和 postcss-preset-env

它们相当于 babelpreset

precss 其包含的插件如下:

  • postcss-extend-rule
  • postcss-advanced-variables
  • postcss-preset-env
  • postcss-atroot
  • postcss-property-lookup
  • postcss-nested

使用如下配置也能达到相同的效果,precss 的选项是透传给上面各个插件的,由于 postcss-custom-properties 插件位于 postcss-preset-env 中,所以只要按 postcss-preset-env 的配置来即可:

plugins:[
require('precss')({features: {   'custom-properties': {preserve: true,},},}),
]
复制代码

postcss-preset-env 包含了更多的插件。这了主要了解下其 stage 选项,因为当我设置了stage=2 时(precss 中默认 postcss-preset-envstage= 0 ),我的 字体图标 竟然没了:

image

 

 

这就很神奇,由于没有往 代码的编写 上想,就直接去看了源码

它会调用 cssdb,它是 CSS特性 的综合列表,可以到各个css特性 在成为标准过程中现阶段所处的位置,这个就使用 stage 来标记,它也能告知我们该使用哪种 postcss 插件 或者 js包 来提前使用css 新特性。cssdb 包的内容的各个插件详细信息举例如下

{ id: 'all-property',title: '`all` Property',description:'A property for defining the reset of all properties of an element',specification: 'https://www.w3.org/TR/css-cascade-3/#all-shorthand',stage: 3,caniuse: 'css-all',docs:{ mdn: 'https://developer.mozilla.org/en-US/docs/Web/CSS/all' },example: 'a {\n  all: initial;\n}',polyfills: [ [Object] ] }
复制代码

当我们设置了stage的时候,就会去判断 各个插件的stage 是否大于等于设置的stage,从而筛选出符合stage的插件集来处理css。最后我就从stage小于2的各个插件一个一个去试,终于在 postcss-custom-selectors 时候试成功了。然后就去看了该插件的功能,难道我字体图标的定义也是这样?果然如此:

 

image

 

 

总结

上面介绍了四种换肤的方法,个人更加偏向于 antd 或者基于 css 自定义变量 的写法,不过 antd 基于 less 在浏览器中的编译,less 官方文档中也说到了:

This is because less is a large javascript file and compiling less before the user can see the page means a delay for the user. In addition, consider that mobile devices will compile slower.

所以编译速度是一个要考虑的问题。然后是 css 自定义变量 要考虑的可能就是浏览器中的兼容性问题了,不过感觉 css 自定义变量 的支持度还是挺友好了的🤣🤣。

ps:如果你还有其他换肤的方式,或者上面有说到不妥的地方,欢迎补充与交流🤝🤝


作者:大搜车无线开发中心
链接:https://juejin.im/post/5ca41617f265da3092006155
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 

第二篇:一文总结前端换肤换主题

最近项目涉及换主题/换肤的工作, 查了查资料,总结出五种换肤方案:

序号方法特点
1利用class 命名空间最简单的换肤方案
2准备多套CSS主题传统前端最常用
3利用CSS预处理生成多套主题样式现代前端最常用
4动态换肤支持浏览器热换肤,最酷炫
5CSS变量换肤不考虑IE,最佳换肤方式

这是五种均为通用方案,可以适用于各种前端框架,脚手架中

1. 利用class 命名空间

这是最简单的换肤方式, 看下面示例即可轻松理解。

1.利用class 名称准备两个主题:


<style>p.red-theme {color: red}p.blue-theme {color: blue}
</style>

2.如果用红色主题, 给body增加 red-theme标签


<body class="red-theme"><p> 这里是红色主题 </p>...</body>

3.如果用蓝色主题, 用 blue-theme 代替 red-theme


<body class="blue-theme"><p> 这里是蓝色主题 </p>...</body>

优缺点

  • 优点: 简单,好理解,好实现
  • 缺点: CSS中需多写主题的class,代码容易混乱;需手动编写

参考

基于element动态换肤

2.准备多套CSS主题

本地存放多套主题, 根据需要切换加载不同的样式

  1. 准备份默认样式主题

/*theme-default.css*/
p {color: #333
}
...
  1. 准备各主题的样式
/* theme-red.css */
p {color: #red
}
...
/* theme-blue.css */
p {color: #blue
}
...
  1. 页面加载后,根据用户需求加载不同的样式列表
   var link = document.createElement('link');link.type = 'text/css';link.id = "theme-blue";  link.rel = 'stylesheet';link.href = '/css/theme-blue.css';document.getElementsByTagName("head")[0].appendChild(link);
  1. 有时候需要保存用户使用的主题,可以通过如下方式:
    • 利用路由标记
    • 利用cookie标记
    • 利用localstorage
    • 保存到后端服务器

优缺点

  • 优点: 简单,好理解,好实现
  • 缺点: 需要手写两份以上CSS配色样式; 切换样式需要下载CSS的时间

参考

web网页中主题切换的实现思路 中有更多细节

3. 利用CSS预处理生成多套主题样式

这是“准备多套CSS主题”的优化方案,利用CSS预处理生成多套主题样式,再根据需要切换

  1. 利用Less,stylus 或 sass 的变量代替颜色值

  2. 配置多个主题颜色配置
  3. 利用webpack等工具输出多套主题样式
  4. 页面加载后,根据用户需求加载不同的样式列表(同方案2)

优缺点

  • 优点: 不用手写两套CSS
  • 确定: 配置复杂;生成冗余的CSS文件; 切换样式需要下载CSS的时间

参考

webpack的配置比较复杂,可以看这篇文章:webpack 换肤功能多主题/配色样式打包解决方案
ant 环境下可以利用antd-theme-generator 快速配置,详见:antd-theme-generator,antd在线换肤定制功能

4.动态换肤

这是element ui中的换肤方案,支持浏览器热换肤。生成一套主题, 将主题配色配置写在js中,在浏览器中用js动态修改style标签覆盖原有的CSS。

  1. 准备一套默认theme.css样式
/* theme.css */
.title {color: #FF0000
}
  1. 准备主题色配置
var colors = {red: {themeColor: '#FF0000'},blue: {themeColor: '#0000FF'}}
  1. 异步获取 theme.css ,将颜色值替换为关键词
    关键字可以确保以后能多次换色
var styles = ''
axios.get('theme.css').then((resp=> {const colorMap = {'#FF0000': 'themeColor'}styles = resp.dataObject.keys(colorMap).forEach(key => {const value = colorMap[key]styles = styles.replace(new RegExp(key, 'ig'), value)})
}))

style 变为:

.title {color: theme-color
}
  1. 把关键词再换回刚刚生成的相应的颜色值,并在页面上添加 style 标签
 // console 中执行 writeNewStyle (styles, colors.blue)  即可变色function writeNewStyle (originalStyle, colors) {let oldEl = document.getElementById('temp-style')let cssText = originalStyle// 替换颜色值Object.keys(colors).forEach(key => {cssText = cssText.replace(new RegExp(key, 'ig'), colors[key])})const style = document.createElement('style')style.innerText = cssTextstyle.id = 'temp-style'oldEl ? document.head.replaceChild(style, oldEl) : document.head.appendChild(style)  // 将style写入页面}

此时style 变为:

.title {color: '#0000FF'
}

优缺点

  • 优点: 只需一套CSS文件; 换肤不需要延迟等候;可自动适配多种主题色;
  • 缺点: 稍难理解; 需准确的css颜色值;可能受限于浏览器性能;

参考

本文最后有该方案的完整代码
Vue 换肤实践
elementUI 及 vuetifyjs动态换色实践
vue-element-admin 动态换肤
webpack 插件抽取CSS中的主题色

5. CSS 变量换肤

利用CSS 变量设置颜色, 用js动态修改CSS变量,进而换色。
如果不考虑IE兼容,这是最佳换肤方案
看下面的例子,很好理解

<html><head><title>CSS varies</title><style>:root {--theme-color: red /* css 变量赋值位置 */}.title {color: var(--theme-color) /* 用css变量标记颜色 */}</style></head><body><h3 class="title">CSS 变量换肤</h3><script>// console 中执行 changceColor('blue') 即可变色function changeColor(color = 'blue') {document.documentElement.style.setProperty("--theme-color",color);}</script></body>
</html>

优缺点

  • 优点:只需一套CSS文件; 换肤不需要延迟等候;对浏览器性能要求低;可自动适配多种主题色;
  • 缺点: 不支持IE, 2016年前的chrome,safari; 兼容性参见Can I Use CSS Variables

参考

  • 使用CSS3自定义属性实现换肤功能

附A: 方案四 态换换肤完整代码

dynamic.html

<html lang="en">
<head><title>js 动态换肤</title><!-- 利用axios 实现异步加载样式--><script src="https://cdn.bootcss.com/axios/0.19.0-beta.1/axios.min.js"></script>
</head>
<body><h3 class="title">js 动态换肤</h3><script>// 1. 主题颜色配置var colors = {red: {themeColor: '#FF0000' },blue: {themeColor: '#0000FF'}}// 2. 异步获取样式var styles = ''axios.get('theme.css').then((resp=> {const colorMap = {'#FF0000': 'themeColor'}styles = resp.dataObject.keys(colorMap).forEach(key => {const value = colorMap[key]styles = styles.replace(new RegExp(key, 'ig'), value)console.log(styles)})writeNewStyle (styles, colors.red)}))// 3.换色// console.log 中输入 writeNewStyle (styles, colors.blue)可以换蓝色主题// console.log 中输入 writeNewStyle (styles, colors.blue)可以换红色主题function writeNewStyle (originalStyle, colors) {let oldEl = document.getElementById('temp-style')let cssText = originalStyleObject.keys(colors).forEach(key => {cssText = cssText.replace(new RegExp(key, 'ig'), colors[key])})const style = document.createElement('style')style.innerText = cssTextstyle.id = 'temp-style'oldEl ? document.head.replaceChild(style, oldEl) : document.head.appendChild(style)}</script>
</body>
</html>

theme.css

.title {color: #FF0000
}


作者:seaasun
链接:https://www.jianshu.com/p/35e0581629d2
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 

我的方法

根据上面两篇文章的分析和总结。从易用性和复杂度上面权衡,我更倾向与使用class结合动态写入样式表的方案。

比如我们有下面这个结构代码:

<div class="theme">
...<div class="th-bg-primary"><p class="th-primary">title</p><p class="th-text">desc</p></div>
...
</div>

我们把所有会根据主题改变的颜色的地方,都使用一个特定的class标记出来。然后维护一个class到颜色的css文件模板。比如这样:

const bgPrinmaryColor = '#cecece'
const primaryColor = '#333333'
const textColor = '#666666'
let themeTemplate = `.theme.th-bg-primary {background-color: ${bgPrinmaryColor} !important;}.theme.th-primary {color: ${bgPrinmaryColor};}.theme.th-text {color: ${textColor};}`const style = document.createElement('style');
style.type = 'text/css';
style.innerHTML = themeTemplate;
document.getElementsByTagName('HEAD').item(0).appendChild(style);

然后当用户切换主题的时候,就修改themeTemplate里的变量值,然后重更新把样式表添加到界面上。当然添加之前可以删除之前添加的样式表。

这样只用写一份样式表,又能动态切换。

优点:

1、简单直观,不编写多个样式文件

2、也不需要引入第三方插件来动态编译样式表

3、没有新概念,新语法,新占位符

缺点:

1、颜色和class绑定了

 


http://chatgpt.dhexx.cn/article/pMRDpGIf.shtml

相关文章

Visio保存为网页出错

visio 试图保存文档时出错。已创建的页面可能无效。 试图保存文档时出错。以创建的页面可能无效。最近在用Visio作图的时候时长发生的问题。 经过摸索&#xff0c;不覆盖保存没有问题&#xff0c;如果覆盖保存&#xff0c;有时会有这个问题。解决办法就是把以前生成的网页和相关…

Visio 2016软件

Visio 2016是微软官方最新发布的一款领先的图表解决方案&#xff0c;它可以帮助企业制作定义流程、编辑最佳方案的同时还可以建立可视化计划变革的一款实用工具。这款软件目前提供了&#xff1a;上手图例&#xff08;starter diagrams&#xff09;、成百上千的智能形状、一步数…

解决visio和office365冲突,无法安装visio问题

本教程用于解决office365和visio冲突&#xff0c;无法安装visio问题 目前系统中已经安装Office365 尚未安装visio专业版本 1、下载office增强工具。 office增强工具下载地址 右键解压&#xff0c;此处要记得解压的目录&#xff08;建议在当前目录下&#xff09;。 根据自…

Visio软件

Visio使用小技巧 上标、下标快捷键 上标&#xff1a;CtrlShift“”下标&#xff1a;Ctrl“” 自定义图形旋转角度 当点击菜单栏上的视图——任务窗格——大小和位置选项&#xff0c;在页面编辑区的左下方出现一个大小和位置窗口。 大小和位置窗口如下&#xff1a; 自…

Visio文件编辑查看工具Visio Viewer for Mac

Visio Viewer for Mac可以打开和查看Visio文件&#xff08;.vsd、.vdx和.vsdm文件&#xff09;。它具有简单易用的用户界面&#xff0c;可以快速加载和显示Visio文件。此外&#xff0c;它还支持导出文件为PDF、PNG、JPEG等格式&#xff0c;方便用户进行文件转换和共享。 Visio…

与你一起学习Microsoft Visio——基础篇

Hi&#xff0c;你好&#xff01;我是大黄蜂&#xff0c;非常高兴借此机会与你一起学习MS Visio的相关知识和技能。这一次的分享主要是结合本人在实际使用Visio过程中的一些方法技巧并总结整理其他人分享的知识&#xff0c;其中有一些材料则来源于互联网&#xff0c;期待通过我的…

【Visio】 windows Visio 画图

1、Visio如何画圆形 画圆用 里面的第二个画圆工具 &#xff0c;用这个工具可以画出圆或者椭圆。如果想得到一个正圆&#xff0c;在画的时候按住shift键即可。 画好一个圆之后单击它&#xff0c;再单击 填充选项&#xff0c;选择你想填充的颜色&#xff0c;选黑色的话就会出现一…

visio2019 专业版,两种方法

安装好visio后&#xff0c;有两种方法jihuo&#xff1a;方法2中自带安装包&#xff0c;有需要可以下载 注意:visio版本要和电脑上带的其他office版本保持一致&#xff0c;否则会不兼容。 1.参考这篇文章&#xff0c;使用代码jihuo https://blog.csdn.net/qq_39400113/article…

Microsoft Visio-Microsoft Visio下载

Microsoft Visio 2013可以帮助你以更直观的方式创建图表的新功能。Microsoft Visio 2013提供共同编写功能&#xff0c;可使团队协作变得更加容易。你也可以通过Microsoft Visio 2013软件增强图表的动态性&#xff0c;方法是将形状链接到实时数据&#xff0c;然后使用 SharePoin…

网页草图利器:Visio Stencils for Information Architects

以前&#xff0c;一直为如何在正式编码开发前与用户确认一个需求而苦恼&#xff0c;因为在互联网企业做内部系统开发&#xff0c;开发周期实在太短&#xff0c;以至于几乎不太可能先给用户一个原型已确认前端UI的需求&#xff0c;因此多数情况下我们会选择画一个Web界面草图给用…

visio对象放入word显示不全_这个可以代替Visio的流程图绘制软件,你值得拥有,还有网页版的~...

一、开篇前言 大家好&#xff0c;大飞鸽就是我&#xff0c;我就是大飞鸽。 流程图大家都熟悉&#xff0c; 像化工专业工艺流程图、 实验方案技术路线图等等。 流程图的优势也显而易见&#xff0c; 不但可以帮助自己梳理思路&#xff0c; 而且也可以让读者一目了然。 常用的绘制…

用Python将音频内容转换为文本格式,方言可以吗?

当对一个或多个人的谈话进行记录时&#xff0c;采用一种高度准确和自动化的方式将口语提取为文本非常有用。转换成文字后&#xff0c;便可以将其用于进一步分析或用作其他功能。 在本教程中&#xff0c;我们将使用称为AssemblyAI&#xff08;https://www.assemblyai.com/&…

python批量转换音频格式,flac转mp3等

可以批量的将一种格式的音频文件转化成指定的格式&#xff0c; 如&#xff1a;mp3&#xff0c;wav , ogg ,flac 的格式之间可以相互转换&#xff0c; 转换后的文件名与原文件相同。 注意&#xff1a;运行代码除了需要安装库pydub之外&#xff0c;还需安装软件ffmpeg.exe&…

Python如何将仅包含音频内容的Mp4,提取并转换为Mp3

关于如何将Mp4转换为Mp3的文章很多&#xff0c;方案也都很有效。但是这其中的大部分方法&#xff0c;并不适用于该Mp4文件中仅包含音频内容的情况&#xff0c;比如&#xff1a;有人从YouTube&#xff0c;下载了仅包含音频内容的文件&#xff0c;这个文件其实还是Mp4格式的&…

PCM和WAV音频格式的区别,以及python自动转换

目录 WAV和PCM的简单介绍PCMWAV 关于音频的基础知识声道数channels采样位数bits采样频率sample_rate 进阶内容互相转换代码 WAV和PCM的简单介绍 PCM pcm&#xff1a;pulse code modulation&#xff0c;脉冲编码调制。将声音等模拟信号变成符号化的脉冲列&#xff0c;予以记录…

音频文件常用格式

目录 一、前言二、音频文件格式1、MP32、WAV3、WMA4、FLAC5、MIDI6、RA7、APE8、AAC9、CDA10、MOV 三、总结 一、前言 在复习备考《多媒体技术》时整理的多媒体技术音频文件的常用格式。本文完全足以应对《多媒体技术》中音频的相关考点后续还有一份多媒体技术相关的文档整理会…

Python处理音频文件的实用姿势

每天叫醒我的不是理想&#xff0c;是楼下广场舞的音乐。 音乐是人类的通用语言&#xff0c;不分国界不分种族。 抖音短视频爆火的关键因素之一&#xff0c;就是普通人也能便捷地使用BGM表达自我。 从感性角度看&#xff0c;音乐可以有很多种解释&#xff0c;如&#xff1a; …

用 Python 将音频内容转换为文本格式

当对一个或多个人的谈话进行记录时&#xff0c;采用一种高度准确和自动化的方式将口语提取为文本非常有用。转换成文字后&#xff0c;便可以将其用于进一步分析或用作其他功能。 在本教程中&#xff0c;我们将使用称为AssemblyAI&#xff08;https://www.assemblyai.com/&#…

Python:运用pydub模块转换音频格式、对音频进行剪辑

Python:运用pydub模块转换音频格式、对音频进行剪辑 近端时间看了一个短视频&#xff0c;觉得视频的背景音乐片段很不错&#xff0c;想把这个背景音乐得到&#xff0c;虽然小编运用Python爬虫肯定能得到这首音乐&#xff0c;但是这个音乐片段肯定是得不到的&#xff0c;于是网上…

python 音频格式转换

一、安装pydub库 WinR运行输入cmd进入控制台窗口&#xff0c;输入pip install pydub 回车进行安装 二、编写代码 1、在音频文件夹目录下新建文件Audio_Deal.py 2、用python自带的编辑器打开 3、输入下方代码&#xff08;把“安静的午后_高至豪.flac”格式转换为“安静的午后_高…