一.sass的好处

用css画图也算是简单的实战吧,虽然用到的东西还比较少。。用过之后,发现sass主要有以下优势:

  1. 可维护性。最重要的一点,可维护性的很大一部分来自变量

    嗯,最简单的例子,画图总要有前景色背景色填涂色等等一堆色值吧,用css也可以完成,但如果要修改某个填涂色可能需要先审查元素找到具体色值,再对源码Ctrl + H全文替换一遍才行。用sass的话就不用这么麻烦了,简单地改下变量的值,轻松搞定,没错,根本不用审查元素找色值那么麻烦,因为好的变量名肯定是自解释的

  2. 易用性。刚刚入门用起来都很顺手

    兼容css语法,在此基础上提供扩展功能,用起来非常顺手。比如嵌套结构表示后代选择器,使用方便,容易理解,还能避免一些书写错误

  3. 灵活性。难以置信的灵活

    @mixin提供了极大的灵活性,无参、多参、可选参、任意多参要比很多编程语言更加灵活,入口灵活不仅有利于代码复用,还让接口变得更加易用(不需要记一堆功能相似的函数名)

    无意中发现了一个很灵活的用法,代码如下:

    // 如果只想简单地支持1参数和4参数形式,可以这样实现
    @mixin radius ($r1, $r2: $r1, $r3: $r1, $r4: $r1) { // 注意把默认值设置为了其它形参的值,这太灵活了
    // 作为例子就不考虑兼容性了
    border-radius: $r1 $r2 $r3 $r4;
    } // 如果想实现0冗余和支持1、2、3、4参数形式,可以这样实现
    @mixin radius2 ($r...) { // 类似于c++的语法
    $argNum: length($r); @if ($argNum == 1) { // 1参
    border-radius: nth($r, 1);
    }
    @else if ($argNum == 2) { // 2参
    border-radius: nth($r, 1) nth($r, 2);
    }
    @else if ($argNum == 3) { // 3参
    border-radius: nth($r, 1) nth($r, 2) nth($r, 3);
    }
    @else { // 4参,再多就只取前4个
    border-radius: nth($r, 1) nth($r, 2) nth($r, 3) nth($r, 4);
    }
    } // 测试
    h1 {
    @include radius(1px);
    @include radius(1px, 2px, 3px, 4px); @include radius2(1px);
    @include radius2(1px, 2px);
    @include radius2(1px, 2px, 3px);
    @include radius2(1px, 2px, 3px, 4px);
    }

    生成的css代码如下:

    h1 {
    border-radius: 1px 1px 1px 1px;
    border-radius: 1px 2px 3px 4px;
    border-radius: 1px;
    border-radius: 1px 2px;
    border-radius: 1px 2px 3px;
    border-radius: 1px 2px 3px 4px;
    }
  4. 可复用性。画过蜗牛后,画青蛙什么的将会很快

    画蜗牛只是一个很简单很独立的“项目”(额,麻雀虽小。。),所以创建了很多工具函数(@mixin),而大多数工具函数都是可以复用的,用来画青蛙、画麻雀。。当然,肯定不会局限于画画,别的地方也能用

    比如,可以有一个自动添属性名前缀的@mixin:

    // 带浏览器前缀的属性设置
    @mixin attr ($name, $value) {
    #{$name}: $value; // 注意左边要添上#{},否则就是赋值了
    /* Firefox */
    -moz-#{$name}: $value;
    /* IE */
    -ms-#{$name}: $value;
    /* Opera */
    -o-#{$name}: $value;
    /* WebKit */
    -webkit-#{$name}: $value;
    }
  5. 自解释性。或者说是语义上的好处

    变量名、@mixin名、@function名都可以语义化,如果是css就不得不添加一堆注释去解释。自解释的东西,不仅对自己好,将来对别人也好

二.画图

小蜗原图:

很简单的小蜗牛,除了圈还是圈,以前用div角角的1px拼这个不现实,但有了border-radius后,曲线什么的,太容易了

1.分解线条

用css画图,第一步肯定是把图中的线条分解成div(div比span有更大的自由度,而且没有语义,正适合干这个),说白了就是写HTML

一般规则从上到下、从左向右分解,每条线对应一个div就好了,这样分解可以很大程度上避免出现margin-left: -30px;之类的东西,让代码更具可读性

分解结果:

<!-- HTML结构 -->
<div class="wrapper">
<!-- 小蜗整体 -->
<div class="xiaowo">
<!-- 头部 -->
<div class="head">
<!-- 眼睛-->
<div class="eyes">
<!-- 左眼 -->
<div class="eye left">
<!--眼珠-->
<div class="black bleft"></div>
</div> <!-- 短横线 -->
<div class="shortHLine">
</div> <!-- 右眼 -->
<div class="eye right">
<div class="black bright"></div>
</div> <!-- 短斜线 -->
<div class="shortSlash">
</div> <!-- 嘴巴 -->
<div class="mouth">
</div>
</div>
</div> <!-- 壳儿 -->
<div class="shell">
<!-- 内圈 -->
<div class="innerCircle">
<!-- 最内圈 -->
<div class="innerinnerCircle">
</div>
</div>
</div> <!-- 右边身体 -->
<div class="rbody">
</div> <!-- 底部身体 -->
<div class="bbody">
<!-- 左边短弧线 -->
<div class="shortArc">
</div> <!-- 底部长弧线 -->
<div class="longArc">
</div>
</div>
</div>
</div>

P.S.具体怎么分解,并没有太大关系,一个线条对应一个div,肯定只多不少,不妨先这样做,到时候如果发现多余了再删掉就好

2.写sass

有了HTML结构就可以直接开始写样式了,规则是从外到内、从左向右一点一点写

很简单,只是需要些耐心,1个像素1个像素、一遍一遍地调试

成品sass代码如下:

/*!
* 小蜗 - sass
*/ // 变量
$fc: #2b2b2b;
$bc: #fafafa;
$bWidth: 7px;
$bStyle: solid;
$bColor: #2b2b2b;
// 此处透明色不考虑IE兼容,因为IE6下很难画出曲线边框,透明也没什么意义
$hidden: transparent;
$border: $bWidth $bStyle $bColor;
$_border: $bWidth $bStyle $hidden; // 混合
// 0 ~ 无,1 ~ borderStyle,-1 ~ transparent
@mixin border($t, $r, $b, $l) {
@if ($t == 1) {
border-top: $border;
}
@else if ($t == -1) {
border-top: $_border;
} @if ($r == 1) {
border-right: $border;
}
@else if ($r == -1) {
border-right: $_border;
} @if ($b == 1) {
border-bottom: $border;
}
@else if ($b == -1) {
border-bottom: $_border;
} @if ($l == 1) {
border-left: $border;
}
@else if ($l == -1) {
border-left: $_border;
}
} // 简单起见,只支持1个参数或者4个参数形式
@mixin radius ($r...) {
@if (length($r) == 1) {
border-radius: nth($r, 1);
/* Firefox */
-moz-border-radius : nth($r, 1);
/* IE */
-ms-border-radius : nth($r, 1);
/* Opera */
-o-border-radius : nth($r, 1);
/* WebKit */
-webkit-border-radius : nth($r, 1);
}
@else {
$r1: nth($r, 1);
$r2: nth($r, 2);
$r3: nth($r, 3);
$r4: nth($r, 4);
border-radius: $r1 $r2 $r3 $r4;
/* Firefox */
-moz-border-radius : $r1 $r2 $r3 $r4;
/* IE */
-ms-border-radius : $r1 $r2 $r3 $r4;
/* Opera */
-o-border-radius : $r1 $r2 $r3 $r4;
/* WebKit */
-webkit-border-radius : $r1 $r2 $r3 $r4;
}
} @mixin transform ($deg) {
transform: rotate($deg);
// IE 9
-ms-transform:rotate($deg);
// Firefox
-moz-transform:rotate($deg);
// Safari and Chrome
-webkit-transform:rotate($deg);
// Opera
-o-transform:rotate($deg);
} // 盒子
.wrapper{
margin: 10px 0 0 30px;
} // 小蜗
.xiaowo{
position: relative; // 头部
.head {
position:relative;
z-index: 100;
margin-left: 200px;
width: 232px;
height: 125px;
background-color: $bc;
} // 眼睛
.eyes{
position: relative;
}
.eye{
position: absolute;
width: 100px;
height: 105px;
@include radius(57px);
border: $border;
}
// 左眼
.left{
top: 10px;
left: -3px;
}
// 眼珠
.black{
position: absolute;
background-color: #000; // 炯炯有神的黑眼珠
width: 30px;
height: 32px;
@include radius(15px);
}
// 左眼珠 */
.bleft{
top: 25px;
left: 40px;
}
// 短横线
.shortHLine{
position: absolute;
top: 60px;
left: 110px;
width: 12px;
@include border(0, 0, 1, 0);
}
// 右眼
.right{
top: 7px;
right: 0;
}
// 右眼珠
.bright{
top: 25px;
left: 40px;
} // 短斜线
.shortSlash{
position: absolute;
top: 125px;
left: 32px;
width: 30px;
height: 30px;
border-left: 7px solid #2b2b2b;
@include transform(20deg);
} // 嘴巴
.mouth{
position: absolute;
top: 130px;
left: 92px;
width: 50px;
height: 24px;
@include border(0, 1, 1, 1);
@include radius(0, 0, 30px, 32px);
} // 壳儿
.shell{
position: absolute;
top: 75px;
width: 300px;
height: 300px;
@include radius(157px);
@include border(1, -1, 1, 1);
}
// 内圈
.innerCircle{
position: absolute;
top: 55px;
left: 50px;
width: 230px;
height: 230px;
@include radius(122px);
@include border(1, 1, -1, 1);
}
// 最内圈
.innerinnerCircle{
position: absolute;
top: 55px;
left: 75px;
width: 80px;
height: 80px;
@include radius(47px);
border: $border;
} // 右边身体
.rbody{
position: absolute;
top: 60px;
left: 0px;
width: 410px;
height: 345px;
@include border(-1, 1, -1, -1);
@include radius(0, 170px, 137px, 0);
} // 底部身体
.bbody{
position: absolute;
top: 317px;
left: 0;
width: 300px;
height: 100px;
}
// 左边短弧线
.shortArc{
position: absolute;
top: 30px;
left: 27px;
width: 36px;
height: 36px;
@include border(1, -1, -1, 1);
@include radius(25px);
}
// 底部长弧线
.longArc{
position: absolute;
top: -248px;
left: -5px;
width: 415px;
height: 345px;
@include border(-1, 1, 1, -1);
@include radius(900px, 630px, 605px, 527px);
}
}

3.修缮

具体工作是:

  1. 去除多余线条

    用类似于border-bottom: 5px solid transparent;的代码去掉多余线条,注意不能用border-bottom: 0;来消除,因为底边宽度为0会影响其它边(border-radius是连边框宽度一起算的)

  2. 拼接曲线

    去掉多余线条后肯定会出现断开的线条,需要重新定位让曲线完美地接起来

  3. 微调

    接好后再调调比例、宽高、弯曲程度什么的,就更完美了

三.运行结果

P.S.可能你也发现了,其实sass并不适合干这个,画图时的调试是直接针对css的,把sass扯进来反而更麻烦了。。这都没关系,拿到把新锤子总想用用,现在如愿了

参考资料

用sass画蜗牛的更多相关文章

  1. Sass mixin 使用css border属性画三角形

    To be finished. //triangle@mixin css-triangle ($direction: "down", $size: 20px, $color: #0 ...

  2. Css3动画(一) 如何画3D旋转效果或者卫星围绕旋转效果

    如何画3D旋转效果或者卫星围绕旋转效果,当然这个也是工作中的一个任务,我在网上翻了一下,并没有找到类似的东西,所以写下来还是费了一番功夫,因此我把它拿出来记录一下,当然替换了一部分内容.好了,话不多说 ...

  3. wepack+sass+vue 入门教程(三)

    十一.安装sass文件转换为css需要的相关依赖包 npm install --save-dev sass-loader style-loader css-loader loader的作用是辅助web ...

  4. wepack+sass+vue 入门教程(二)

    六.新建webpack配置文件 webpack.config.js 文件整体框架内容如下,后续会详细说明每个配置项的配置 webpack.config.js直接放在项目demo目录下 module.e ...

  5. wepack+sass+vue 入门教程(一)

    一.安装node.js node.js是基础,必须先安装.而且最新版的node.js,已经集成了npm. 下载地址 node安装,一路按默认即可. 二.全局安装webpack npm install ...

  6. 前端CSS预处理器Sass

    前面的话   "CSS预处理器"(css preprocessor)的基本思想是,用一种专门的编程语言,进行网页样式设计,然后再编译成正常的CSS文件.SASS是一种CSS的开发工 ...

  7. SASS教程sass超详细教程

    SASS安装及使用(sass教程.详细教程) 采用SASS开发CSS,可以提高开发效率. SASS建立在Ruby的基础之上,所以得先安装Ruby. Ruby的安装: 安装 rubyinstaller- ...

  8. 一步一步教你用CSS画爱心

    今天小颖给大家分享一个用CSS画的爱心,底下有代码和制作过程,希望对大家有所帮助. 第一步: 先画一个正方形.如图: <!DOCTYPE html> <html> <he ...

  9. 参考bootstrap中的popover.js的css画消息弹框

    前段时间小颖的大学同学给小颖发了一张截图,图片类似下面这张图: 小颖当时大概的给她说了下,其实小颖也不知道上面那个三角形怎么画嘻嘻,给她说了DOM结构,具体的css让她自己百度,今天小颖自己参考boo ...

随机推荐

  1. RMQ(范围最值问题)算法学习

    RMQ算法适合求解对一个数组多次查询给定范围内的最值. 预处理操作: 令d[i,j]表示从i开始,长度为2^j的一段元素的最值,可以用递推公式写出d[i,j] = min{ d[i][j-1], d[ ...

  2. 获取Spring容器中的Bean

    摘要 SpringMVC框架开发中可能会在Filter或Servlet中用到spring容器中注册的java bean 对象,获得容器中的java bean对象有如下方法 Spring中的Applic ...

  3. pcm跟.wav文件的关系

    PCM(Pulse Code Modulation----脉码调制录音).所谓PCM录音就是将声音等模拟信号变成符号化的脉冲列,再予以记录.PCM信号是由[1].[0]等符号构成的数字信号,而未经过任 ...

  4. zstu2016校赛圣杯战争

    这题不知道为什么就是T,简直有毒. 思想和巴比伦那题差不多. 话说,寻找一个区间内满足一个条件的最左(右)边的一个数,用线段树来写,应该是可以的,之前博客里大连网赛那题的线段树写法应该是有点小问题的. ...

  5. swift 代码添加image

    let image_ElectricianBtn = UIImage(named: "ElectricianBtn") let vimage_ElectricianBtn = UI ...

  6. ActiveMQ安装与使用

    一 .安装运行ActiveMQ: 1.下载activemq wget http://archive.apache.org/dist/activemq/apache-activemq/5.9.0/apa ...

  7. udp-->socket通信原理

    UDP数据通讯原理     UDP数据通讯分服务端(软件)和客户端端:     服务端(软件)(服务器)先运行,服务端,不需要事先知道客户端IP和port     客户端(软件)(客户端机器)后运行, ...

  8. MCS-51系列特殊功能寄存器(摘抄)

    1. P0 (80H) P0.7 P0.6 P0.5 P0.4 P0.3 P0.2 P0.1 P0.0 2.SP 栈指针(81H) 3.DPTR 数据指针(由DPH和DPL组成) DPL 数据指针低八 ...

  9. java实现smtp邮件发送

    一.准备工作 首先你需要已一个发送邮箱,一般的邮箱都有SMTP.POP3服务,比如QQ邮箱,登陆QQ邮箱开启SMTP服务,开启是服务器会提示你设置独立密码,这个密码是跟邮箱正常登陆的密码不同的,这个是 ...

  10. oracle删除数据恢复

    分为两种方法:scn和时间戳两种方法恢复. 一.通过scn恢复删除且已提交的数据 1.获得当前数据库的scn号 select current_scn from v$database; (切换到sys用 ...