当前位置: 首页 > news >正文

用原生JS进行CSS格式化和压缩

前言

一直比较喜欢收集网页特效,很多时候都会遇到CSS被压缩过的情况,这时查看起来就会非常不方便,有时为了减少文件大小,也会对自己的CSS进行压缩,网上提供这样服务的很多,但都不尽如人意,因此打算自己动手写一个JS来进行CSS的格式化和压缩

原理

CSS的结构如下:

选择器{
  css属性声明:值;
}

所以对CSS格式化也就比较简单,大致分为以下几步;

1、把多个空格合并成一个,去掉换行

2、对处理后的字符串按"{"进行分组

3、遍历分组,对含有"}"的部分再次以"}"进行分组

4、对分组后的数据进行处理,主要是加上空格和换行

对CSS压缩就比较简单了,把空格合并,去掉换行就可以了

格式化

下面分步对以上步骤进行实现。

初始化:

function formathtmljscss(source, spaceWidth, formatType) {
this.source = source;
this.spaceStr = " ";
if (!isNaN(spaceWidth)) {
if (spaceWidth > 1) {
this.spaceStr = "";
for (var i = 0; i < spaceWidth; i++) {
this.spaceStr += " ";
}
}
else {
this.spaceStr = "\t";
}
}
this.formatType = formatType;
this.output = [];
}

这里几个参数分别是要格式化的CSS代码、CSS属性声明前空格宽度,类型(格式化/压缩)

1、把多个空格合并成一个,去掉换行:

formathtmljscss.prototype.removeSpace = function () {
this.source = this.source.replace(/\s+|\n/g, " ")
.replace(/\s*{\s*/g, "{")
.replace(/\s*}\s*/g, "}")
.replace(/\s*:\s*/g, ":")
.replace(/\s*;\s*/g, ";");
}

2、对处理后的字符串按"{"进行分组

formathtmljscss.prototype.split = function () {
var bigqleft = this.source.split("{");
}

3、遍历分组,对含有"}"的部分再次以"}"进行分组

formathtmljscss.prototype.split = function () {
var bigqleft = this.source.split("{");
var bigqright;
for (var i = 0; i < bigqleft.length; i++) {
if (bigqleft[i].indexOf("}") != -1) {
bigqright = bigqleft[i].split("}");
}
else {

}
}
}

4、对分组后的数据进行处理,主要是加上空格和换行

这里的处理主要分为,把CSS属性声明和值部分取出来,然后加上空格和换行:

formathtmljscss.prototype.split = function () {
var bigqleft = this.source.split("{");
var bigqright;
for (var i = 0; i < bigqleft.length; i++) {
if (bigqleft[i].indexOf("}") != -1) {
bigqright = bigqleft[i].split("}");
var pv = bigqright[0].split(";");
for (var j = 0; j < pv.length; j++) {
pv[j] = this.formatStatement(this.trim(pv[j]),true);
if (pv[j].length > 0) {
this.output.push(this.spaceStr + pv[j] + ";\n");
}
}
this.output.push("}\n");
bigqright[1] = this.trim(this.formatSelect(bigqright[1]));
if (bigqright[1].length > 0) {
this.output.push(bigqright[1], " {\n");
}
}
else {
this.output.push(this.trim(this.formatSelect(bigqleft[i])), " {\n");
}
}
}

这里调用了几个方法:trim、formatSelect、formatStatement,下面一一说明。

trim:从命名就可以看出是去除首尾空格;

formathtmljscss.prototype.trim = function (str) {
return str.replace(/(^\s*)|(\s*$)/g, "");
}

formatSelect:是处理选择器部分语法,做法就是给"."前面加上空格,把","前后的空格去掉,把多个空格合并为一个:

formathtmljscss.prototype.formatSelect = function (str) {
return str.replace(/\./g, " .")
.replace(/\s+/g, " ")
.replace(/\. /g, ".")
.replace(/\s*,\s*/g, ",");
}

formatStatement:是处理“css属性声明:值;”部分的语法,做法就是给":"后面加上空格,把多个空格合并为一个,去掉“#”后面的空格,去掉"px"前面的空格,去掉"-"两边的空格,去掉":"前面的空格:

formathtmljscss.prototype.formatStatement = function (str, autoCorrect) {
str = str.replace(/:/g, " : ")
.replace(/\s+/g, " ")
.replace("# ", "#")
.replace(/\s*px/ig, "px")
.replace(/\s*-\s*/g, "-")
.replace(/\s*:/g, ":");

return str;
}

调用

调用部分比较简单,对于格式化来说就是去掉空格和换行,然后分组处理,对于压缩来说就是去掉空格和换行:

formathtmljscss.prototype.formatcss = function () {
if (this.formatType == "compress") {
this.removeSpace();
}
else {
this.removeSpace();
this.split();
this.source = this.output.join("");
}
}

界面HTML代码:

View Code
<div id="content">
<div class="container">
<div class="box">
<div class="main">
<h2>CSS格式化/压缩</h2>
<div id="blurb">
<fieldset id="options">
<button id="submit">
<span>格式化 / 压缩&nbsp;&nbsp;<img alt="格式化" src="/images/29.png"/></span>
</button><br/>
<span>缩进:</span>
<ul>
<li>
<select name="tabsize" id="tabsize">
<option value="1">tab键缩进</option>
<option value="2">2空格缩进</option>
<option selected="selected" value="4">4空格缩进</option>
</select>
</li>
</ul><br />
<span>类型:</span><br />
<input type="radio" name="format_type" value="format" checked="checked" id="format_format" /><label for="format_format">格式化</label>
<input type="radio" name="format_type" value="compress" id="format_compress" /><label for="format_compress">压缩</label>
</fieldset>
</div>
<div id="beauty">
<fieldset id="textarea-wrap">
<textarea rows="20" cols="40" id="source"></textarea>
</fieldset>
</div>
</div>
</div>
</div>
</div>

跟页面元素按钮绑定事件:

View Code
window.onload = function () {
var submitBtn = document.getElementById("submit");
var tabsize = document.getElementById("tabsize");
var sourceCon = document.getElementById("source");
var size = 4;
var formatType = "format";
submitBtn.onclick = function () {
var radios = document.getElementsByName("format_type");
for (i = 0; i < radios.length; i++) {
if (radios[i].checked) {
formatType = radios[i].value;
break;
}
}
var format = new formathtmljscss(sourceCon.value, size, formatType);
format.formatcss();
sourceCon.value = format.source;
}
tabsize.onchange = function () {
size = this.options[this.options.selectedIndex].value;
submitBtn.click();
return false;
}
}

演示


欢迎大家测试挑刺哈!

转载于:https://www.cnblogs.com/artwl/archive/2012/03/25/2416909.html

相关文章:

  • EXT.NET高效开发(四)——实用技巧
  • js 基础
  • 免费空间域名,简易免费安装百科网站教程!!!
  • 函数的弹性设计
  • 常见100个管理学定律
  • flexigrid
  • 内核开发基础——'make menuconfig' requires the ncurses libraries
  • COJ 1156 Switching bulbs
  • 配置Struts 2应用程序的安全功能
  • 程序猿的执业修养(四)——全力以赴,做到最好
  • 复杂报表中向上扩展
  • onMouseOut事件冒泡的问题解决
  • extjs 如何将局部的变量变为全局变量
  • ASP.net的身份验证方式FORMS
  • .net生成的类,跨工程调用显示注释
  • Angular6错误 Service: No provider for Renderer2
  • axios 和 cookie 的那些事
  • CSS居中完全指南——构建CSS居中决策树
  • ES6--对象的扩展
  • ES学习笔记(10)--ES6中的函数和数组补漏
  • JavaScript 基本功--面试宝典
  • mongodb--安装和初步使用教程
  • nodejs实现webservice问题总结
  • React Native移动开发实战-3-实现页面间的数据传递
  • SAP云平台运行环境Cloud Foundry和Neo的区别
  • Spring框架之我见(三)——IOC、AOP
  • webpack+react项目初体验——记录我的webpack环境配置
  • 闭包--闭包之tab栏切换(四)
  • 大快搜索数据爬虫技术实例安装教学篇
  • 关于字符编码你应该知道的事情
  • 基于HAProxy的高性能缓存服务器nuster
  • 前端攻城师
  • 日剧·日综资源集合(建议收藏)
  • 网页视频流m3u8/ts视频下载
  • 深度学习之轻量级神经网络在TWS蓝牙音频处理器上的部署
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • #android不同版本废弃api,新api。
  • #NOIP 2014# day.1 生活大爆炸版 石头剪刀布
  • #pragma pack(1)
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • #我与Java虚拟机的故事#连载04:一本让自己没面子的书
  • (02)Hive SQL编译成MapReduce任务的过程
  • (k8s中)docker netty OOM问题记录
  • (八)Spring源码解析:Spring MVC
  • (力扣题库)跳跃游戏II(c++)
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (五)IO流之ByteArrayInput/OutputStream
  • (已解决)报错:Could not load the Qt platform plugin “xcb“
  • (转)AS3正则:元子符,元序列,标志,数量表达符
  • (转)nsfocus-绿盟科技笔试题目
  • (转)Windows2003安全设置/维护
  • (转)创业家杂志:UCWEB天使第一步
  • .axf 转化 .bin文件 的方法
  • .NET Compact Framework 多线程环境下的UI异步刷新
  • .NET 线程 Thread 进程 Process、线程池 pool、Invoke、begininvoke、异步回调