分类目录归档:感悟

「问题解决」MongoDB dbexit: really exiting now

如果你在启动MongoDB的时候,出现以下错误:

Wed Apr 27 10:02:41 [initandlisten] shutdown: going to close listening sockets…
Wed Apr 27 10:02:41 [initandlisten] shutdown: going to flush diaglog…
Wed Apr 27 10:02:41 [initandlisten] shutdown: going to close sockets…
Wed Apr 27 10:02:41 [initandlisten] shutdown: waiting for fs preallocator…
Wed Apr 27 10:02:41 [initandlisten] shutdown: closing all files…
Wed Apr 27 10:02:41 closeAllFiles() finished
Wed Apr 27 10:02:41 [initandlisten] shutdown: removing fs lock…
Wed Apr 27 10:02:41 [initandlisten] couldn’t remove fs lock errno:9 Bad file descriptor
Wed Apr 27 10:02:41 dbexit: really exiting now

理论来说,是因为缺乏写权限,无法向/data/db/文件夹写入数据。

修复方法:

sudo chown id -u /data/db

sudo mongo

如果还有问题:

sudo mongo –repaire

从导航开始

现在让我们来用刚学会的Responsive技巧来制作一个blog前端。

一切从导航开始,例子的Demo大概是这样的:点击查看例子 请尝试拖拽窗口大小,查看响应式效果。

第一步:HTML和CSS实现导航

index.html:

从导航开始

注意:index.css 的宽度要用百分比来计算,这样在页面大小变化的时候,整个框架也会按比例放缩。

.container{ width:90%; height: auto; margin:0 auto; margin-top:20px; background-color: #fff; -webkit-box-shadow: 0 0 10px rgba( 0, 0, 0, .1 ); -moz-box-shadow: 0 0 10px rgba( 0, 0, 0, .1 ); box-shadow: 0 0 10px rgba( 0, 0, 0, .1 ); } div#logo{ float: left; padding-top: 7px; width:25%; } div.navigation{ height: 80px; } div#nav{ width: 75%; float:right; } #nav ul{ margin-top:25px; list-style: none; } #nav ul li{ float: left; width:20%; text-align: center; font-size:1.5rem; }

第二步:实现Responsive.css:

要实现响应式的布局,就要监测当屏幕大小变化时,重新调整一些元素的位置,大小,样式。

而在这个例子中,我们需要:

  1. 重新调整Logo位置,使其居中。
  2. 重新调整导航位置,使其在下行占满。
  3. 取消掉logo和ul > li的浮动,防止页面出现错误。

@media screen and (max-width: 480px){ div#logo{ width: 100%; text-align: center; margin-left: 0; padding-left: 0; } div#nav{ width: 100%; } div#nav ul{ float:none; margin-left: 0; padding-left: 0; width: 100%; } div#nav ul li{ float: none; width: 100%; margin-right: 0; margin-left: 0; padding-top:10px; padding-bottom: 10px; background-color: #fff; } }

【Android问题解决】The application’s PagerAdapter changed the adapter’s contents without calling PagerAdapter#notifyDataSetChanged

首先不得不说,ADT22就是个大坑,一旦更新,过去稍不符合规定的代码,统统会现出原形来。(其实就是ADT22变得严格了)

FATAL EXCEPTION: main java.lang.IllegalStateException: The application’s PagerAdapter changed the adapter’s contents without calling PagerAdapter#notifyDataSetChanged! 

出这个错,是因为你的PagerAdapter中的数据变了,但是没有调用adapter.notifyDataSetChanged方法。

如果你的代码逻辑是这样的:

class XXX extends asynctask

doInBackground(…){

1、获取数据

2、添加到数据池

3、publicProgress()

}

onPublicProgress(…){

4、调用adapter的notifydatasetchanged方法

}

在ADT22中,上面的代码肯定会报错的。为什么?

看下官方文档对 support/v4/view/PagerAdapter 的一个解释:

PagerAdapter supports data set changes. Data set changes must occur on the main thread and must end with a call to <a href="http://developer.android.com/reference/android/support/v4/view/PagerAdapter.html#notifyDataSetChanged()">notifyDataSetChanged()</a> similar to AdapterView adapters derived from <a href="http://developer.android.com/reference/android/widget/BaseAdapter.html">BaseAdapter</a>.

出错原因:数据更新必须在main thread进行更新!!结束前还得调用 notifyDataSetChanged() !!

也就是说,必须得把上面的2步骤,移动到onPublicProgress中才正常。

【Android问题解决】Unable to resolve superclass of Landroid/support/v4/app/Watson

之前一直在Eclipse上开发小熊词典,Google I/O上推出Android Studio后,就转到Studio上了,但是项目依赖的文件太多,配置总是失败(因为尝试的Git方式管理),就打算重新在Eclipse上配置好再导入到Android Studio中。但是…Eclipse编译通过了,当在手机上运行的时候就出问题了。问题很传统,就是ClassNotFound,这种问题普遍是由于Android.manifest文件中的类名或者包名写错的原因。网上解决方案一大堆,我再三检查根本不是这个问题,我还总是不相信自己的眼睛,删掉ANdorid:name 认真粘贴的路径。。。

但是,这种屌丝的作法根本不解决问题,依然爆出如下错误:(橘黄色是Warning 红色是Error)

  1. Unable to resolve superclass of Landroid/support/v4/app/Watson; (149)
  2. Link of class ‘Landroid/support/v4/app/Watson;’ failed
  3. Unable to resolve superclass of Lcom/actionbarsherlock/app/SherlockFragmentActivity; (161)

….直到最后:

  1.  java.lang.RuntimeException: Unable to instantiate activity ComponentInfo  java.lang.ClassNotFoundException

连续搜索了很多此 Unable to instantiate activity ComponentInfo ClassNotFoundException (因为总觉得Warning是不足轻重的!)… 看了一堆stackoverflow的帖子,都类似类名出错….最后看到那个warning抱着试一试的态度搜了一下 Unable to resolve superclass of Landroid/support/v4/app/WatsonGitHub的ActionBarSherlock的issue中终于找到了答案,而后百感交集啊。。。总结如下:

问题原因:更新到了SDK 22    具体看此处: GoogleCode GitHub Issue

问题解决:

  1. 右键项目,选择属性
  2. Java Build Path – > Order and Export
  3. 选中 Android Private Libraries

教训:不要忽略warning!

回望

这里记载着我的发展,是我努力从屌丝的蜕变:

  • 2014年12月27日:GitHub Follower 突破2.4K。「稀土-掘金」上线。
  • 2014年12月19日:「稀土」天使轮完成,更多故事可以看Kalasoo的Timeline
  • 2014年11月24日:「稀土」开启Alpha内测。
  • 2014年10月21日:「impressive」流产,开启新项目「稀土 – 发现每一个特别的人」。
  • 2014年09月23日:  开始和kalasoo / 明泽 / 宋只羊 / 江江一起做「impressive」。
  • 2014年09月04日:参观豆瓣,收到实习Offer,不过感觉距离太远拒掉了,不想每天花两个小时在路上。
  • 2014年08月25日:AndroidSwipeLayout发布。
  • 2014年08月08日:AndroidViewHover发布。
  • 2014年06月25日:参加北京GDG Google I/O直播之夜,并且做了关于开源的Speech。
  • 2014年06月22日:AndroidViewAnimations发布。
  • 2014年06月02日:开源了一个Android上的Slider库。AndroidImageSlider,当然很果断的上了GitHub Trending榜。
  • 2014年05月29日:收到一封硅谷来的工作
  • 2014年05月22日:收到一封法国来的实习
  • 2014年05月06日:NumberProgressBar上了GitHub Trending啦。
  • 2014年05月01日:开源了一个性感的ProgreeBar,NumberProgressBar
  • 2014年03月16日:开源的「bleed-baidu-white」服务,请求量达到35.76万次。
  • 2014年03月07日:收到Hulu实习邀请
  • 2014年03月05日:「联手对抗臭长广告」Revenge 开源。
  • 2014年02月13日:收到饿了么入职邀请,不过还是感觉在学校轻松。
  • 2014年02月12日:收到杭州阿里内推邀请(需笔试面试)。
  • 2014年01月06日:收到 世界邦 伍业雄同学的职位邀请
  • 2014年01月22日:EverMemo for Android开源
  • 2013年12月03日:EverMemo for Android用户量到达10万。
  • 2013年10月20日:EverMemo for Android发布。
  • 2013年09月18日:AnimeTaste For Android开源
  • 2013年09月15日:在北京师范大学计算机系报道。
  • 2013年09月10日:EverMemo开发过半,改名EverMemo为抹茶,预计Android版本9月中下旬可以发布。
  • 2013年09月05日:开始开发EverMemo Android。
  • 2013年09月03日:AnimeTaste全球动画精选正式上线,点此下载体验
  • 2013年08月31日:AnimeTaste Android客户端开发完成,准备上线。
  • 2013年08月16日:开始为AnimeTaste开发Android客户端,故事背景
  • 2013年08月16日:结束了为期一月的实习,拿到了公司激励期权,以及未来研究生阶段公司每月3000块的实习工资。具体可以看 关于我 2013年9月2日版本。
  • 2013年08月03日:开源「bleed-baidu-white」榨干百度网盘计划
  • 2013年07月16日:开始在创新工场实习。微博
  • 2013年07月XX日:微博私信收到淘宝杭州研发部的职位邀请(需面试),不过要读研。
  • 2013年06月07日:微博私信收到友盟的实习邀请,不过时间有些错不开。
  • 2013年06月05日:将 Java-multithread-downloader push 到了GitHub
  • 2013年05月22日:上午接到创新工场上海区2层志精网络的Joyplus李永庆的电话,大致聊了些小熊词典的技术实现,还有一些NodeJs问题和他们公司的事情,也包括一些小问题(是否能去上海)。最后,我很有幸得到他们的Free Desk实习机会。感谢JoyPlus~  感谢李永庆
  • 2013年5月21日:向志精网络发出Email实习申请。当时的邮件内容是这样的:查看
  • 2013年4月27日:开始写Java-MultiThread-Downloader库,目前(2013年5月22日)尚未发布,很快完工,这是一个Java多线程,支持断点续传的下载库。
  • 2013年04月25日:香港中文大学人事处发来邮件,依据我目前情况及香港的签证法规,无法顺利得到签证,因而实习被延迟到14年暑假。
  • 2013年03月19日:我重新创建了这个Blog,起因于前端观察–神飞的一个加分项:有个人博客。
  • 2013年03月17日:收到Pili的邮件,祝贺我通过面试,得到在香港中文大学为期两个月的实习机会,随后开始奔走签证和一些繁琐文件的事情。和我同去的有还有两个人,在这里得隆重介绍下:一个是QiJiang Fan (人人小黄鸡的作者之一,2013年他大一,华科大) 另一个是Ray Guo(2013年他大三,哈工大)
  • 2013年03月15日:香港中文大学Prof.Lau用Skype对我进行了面试,大概就是谈了谈我所做的东西以及他们所在做的东西,我用着蹩脚的英语和他谈了谈。
  • 2013年2–3月:参加了香港中文大学的开源项目:snsapi official page 中文主页 (official page 由HuPili维护 中文主页由维护) ,当时的原文大致如此:42qu
  • 2013年3月07日:收到新浪寄来的《sae中级开发者证书》。
  • 2013年2月13日:在GoDaddy注册了littlebear.me域名,为小熊词典做准备。
  • .
  • .
  • 2012年10月26日:出发去西藏。
  • 2012年09月17日:去北京师范大学参加了研究生免推生笔试和面试,9月19日晚上返回西安,在返回路上,电话通知通过了测试。
  • 2012年09月XX日:开始动手写小熊词典
  • .
  • 2012年06月XX日:做了一些词典相关的数据采集。
  • .
  • 2012年04月XX日:开始为西北大学国际交流学院开发站点(基于WordPress)。目前已经上线,点击查看 开发时长:15日左右。
  • .
  • 2010年07月04日:注册了zhan-dui.com的域名,决定开始做个人站长。
  • 2009年09月01日:在西北大学新生报道。

Responsive系列之知识储备 – Media Query – 熊孩子的故事

Media Query

1、Media Query是什么?

Media Query 是CSS3中用来查询设备类型(Media Type),并且通过条件语句,加载满足条件的样式表。

2、关于设备类型:

–Media Query可以检测出以下设备–

设备名称 指代
all 匹配所有设备
braille 匹配触觉反馈设备
embossed 凸点字符印刷设备
handheld 手持设备(尤其是小屏幕,有限带宽,不过注意:现在的Android,iPhone都不是Handheld设备,他们都是screen设备。所以,不要试图用handheld来识别iphone或者ipad,android等设备)PSP,NDS这种规格一般可以叫作Handheld,不过没有测试过,如有疏漏还请指正)
print 打印机设备
projection 投影仪设备
screen 彩色计算机显示器设备
speech 语音合成器设备
tty 栅格设备(终端,或者电传打字机)
tv 电视设备

3、Media Query的语法:

用法1:

@media 设备类型 { //…满足该设备条件的css属性… }

用法2:

[逻辑表达式only或者not] 设备类型{ …//如果逻辑表达式是only:代表只有这一种设备,调用如下css …//如果逻辑表达式是not : 代表除此之外的设备,调用如下css }

用法3:

@media [逻辑表达式only或者not] 设备类型 [and 设备特征表达式]{ …//用法3比用法2多了一个[and 媒体特征表达式],@media的强大之处在于, …//他不但能选择设备类型,还能对设备的不同配置(如屏幕宽度,色彩等的)进行选择。 //(这就是设备特征表达式所做的事情) …//这个用法,就是对相同设备的不同属性进行选择,而后条用满足条件的css表达式 …//现在你可能还不明白[and 媒体特征表达式],不过没有关系,后面我将认真介绍 //媒体特征表达式的用法,你一定会惊叹@media query的强大。 }

用法4:

@media 设备特征表达式 | 设备特征表达式 |….{ …//满足所给出的媒体特征表达式后,调用以下css代码块 …//注意:只要满足设备特征就可以了,不一定要是相同设备。 }

下面,我们用一个例子,来一步一步介绍这四种表达式的用法。

熊孩子的故事

想想这一种场景,你开发了个小有名气的在线阅读网站,不过后来有小孩子吐槽说:“我常常在NDS上看电子书,能不能在NDS上,将背景变为深色,字变成白色,夜里看小说,背景太亮很刺眼。”
这时,你有两种做法:
1、对设备UA进行检测,完全为NDS重新做一个适合手机的站点。(这是传统的做法,虽然现在多数站点都在用,在现在看来,很不聪明了!)
2、利用css3的强大特性,轻松完成(我们当然要选择这种聪明些的做法!)
让我们来考虑考虑实现思路:

首先利用media query检查是否是手持设备 如果是: 背景为黑色,字为白色 如果不是: 不做处理

我们现在来看media query的第一种用法:

@media 设备类型 { //…满足该设备条件的css属性… }

用法1正好符合我们在此情形下的筛选条件,那么我们书写的css如下:

@media handheld{ body{ color:white; background-color:black; } }

我们的html页面便类似这个样子:

代码家
我们来测试Handheld,手持设备和screen显示器设备。

用chrome打开该html,发现如下图:

好像没有看到黑底白字啊?当然啦,你现在是在用电脑显示器来访问的页面,也就是满足了screen设备特征,handheld设备所书写的css都被忽略了。

那我们要如何测试在手持设备中的样式呢?难道一定要用NDS访问么,可是我没有NDS啊?!
当然不是,我们这里要用Chrome的一个设置功能,来覆盖一些属性,模拟手持设备,按照如下操作,便可以调用Chrome中模拟各种设备的功能。
1.首先,点击右键->审查元素

2.而后,在弹出的控制窗口中,点下设置按钮

3.左上角切到overrides中,寻找Emulate选项,勾上后,选中HandHeld,你就会惊奇的发现,网页整个变了个风格。正如我们预期的那样,黑底白字。

做到此处,是否已经对media query有些了解,而且有很强的成就感,不过先按捺住不要激动,这才是media query功能的一部分,还有一些更为实用的用法还没有接触到。还需慢下心来继续看下去。

后来,过了一段时间,上次的那个小盆友又发来吐槽反馈,说:“哈哈哈哈,我买了个iPad2,可是我发现iPad2在横屏看书的时候字体有点儿小啊,能不能在横屏的时候把字改大一点儿?”。
这时候,技术人员抓狂了,这可怎么改啊,iPad2也是screen设备,电脑显示器也是screen设备?! 让我怎么识别!

冷静

我们下面介绍的东西就能很好的处理这种情形:那就是 设备特征表达式

设备特征表示 看起来是是这个样子的:设备特征:设备特征值

留意一下用法3:

@media [逻辑表达式only或者not] 设备类型 [and 设备特征表达式]{ …//我们现在就要用用法3来识别iPad2 }

现在考虑一下,虽然iPad2和电脑显示器都是screen设备,可是他们之间还是有不同之处的。比如说,ipad是有横屏特征的设备,电脑却没有。
这个问题先搁浅到这里,我们先来研究一下设备表达式究竟是什么,等弄懂后,你自然就知道该怎么做了。

前面说到过,media query是可以识别设备特征的,可是设备特征是什么?想想,屏幕宽度算不算设备特征?设别分辨率算不算设备特征呢?设备色彩支持情况,横竖屏情况?
没错,这些都是我们在使用电子设备时候的设备特征。Media query支持很多种设备特征的识别属性。

媒体特性 说明/值 可用媒体类型 接受min/max
width 长度正数值(单位一般为px下同) 视觉屏幕/触摸设备
heigth 长度正数值 视觉屏幕/触摸设备
device-width 长度正数值 视觉屏幕/触摸设备
device-heigth 长度正数值 视觉屏幕/触摸设备
orientation 设备手持方向(portait横向/landscape竖向) 位图介质类型
aspect-ratio 浏览器、纸张长宽比 位图介质类型
device-aspect-ratio 设备屏幕长宽比 位图介质类型
color 颜色模式(例如旧的显示器为256色)整数 视觉媒体
color-index 颜色模式列表整数 视觉媒体
monochrome 整数 视觉媒体
resolution 解析度 位图介质类型
scan progressive逐行扫描/interlace隔行扫描 电视类
grid 整数,返回0或1 栅格设备

扫了一眼表格发现不明白min/max?没有关系,后面会说到。
这张表格来自:zzjyingzi,尊重原创,转载请保留。

留意一下那个蓝色的orientation,这不正是我们可以用来识别ipad横屏的状态么?

我们在原来的html中加上:

@meida screen and (orientation:landscape){ font-size:25px; }

这样,你可以测试一下,在ipad横屏时。会正如我们所预料的那样,25px字体展示。一切都太完美了。
在此之前,你或许需要用js去获取,而后调整属性。现在,只需简单几行就能实现,css3的强大之处当然不止如此,以后我也会给大家介绍更多关于css3的新特性。

正在我们说话之际,小盆友又发来消息:“我最近买了个iPhone,我也要黑底白字,保护眼睛。”

我想你也猜到了,我们这次需要识别的是同为screen设备的iPhone….

Here we go!

先来考虑iPhone与台式机显示器的不同之处:最大的区别就是屏幕大小。

那我们这次就要介绍一个属性,device-width,指代的是设备的宽度,注意,这可不是网页渲染的区域宽度。这个是与设备相关的。

iPhone的device-width就是320px,那么我们继续补充一个media-query在css中。

@media screen and (device-width:320px){ body{ background-color:black; color:white; } }

好啦,加上以后,那个小盆友就每天很happy的看上了小数,可是过了几日,我们又收到了这个倒霉孩子的来信:“我的iPhone坏了…555555….我妈给我买了个小手机先用着,屏幕可小了,烦。。。能不能把这个小屏幕的手机也让黑体白字、”。

忽然觉得技术部门就是为他开的。

好吧,冷静。

这个时候,就要介绍min/max属性了。device-width:320px 其实类似于divice-width==320px;
min/max 其实就是 >= 和 <=
min-device-width : 320px; 等价于 device-width >= 320px;
max-device-width : 320px; 等价于 device-width <= 320px;
明白了吧,我们只要在device-width前加个max 就能轻松解决这个熊孩子的要求了(让iPhone或者iPhone屏幕小的设备都能黑底白字)。来自Apple官方

@media screen and (max-device-width:320px){ body{ background-color:black; color:white; } }

从此之后,这个熊孩子就成了网站的忠实用户。。

关于Media Query的初步介绍就随着这个熊孩子安静下来而在此结束,不过我们的教程还未完结,熊孩子或许有一天又会发信来吐槽。

你可以在这个gist中查看目前多数设备的Media Query语句:点此

作者:代码家
来源:代码家的博客
你可以订阅我的Blog以获取最新的知识文章。
请尊重版权,转载请注明来源!

Responsive系列之知识储备 – SASS高阶教程(2)

在上一篇Responsive系列之知识储备 – SASS高阶教程(1)中,我带大家介绍了一些sass的高级特性。在这篇中,我将介绍另外一些比较常用的@指令。

如果你还不知道什么是sass,可以看Responsive系列之知识储备 – SASS基础教程

@extend

@extend 是一种扩展功能,通常用在有一定递进关系的样式中。
比如说有两个class,一个叫 .error ,一个叫 .seriousError。很明显 .seriousError应该是 .error的一个扩展。

假设所有的 .error 都用红体字显示:

.error{ color:red; }

.seriousError不但要红体字,还要粗体!

.seriousError{ font-weight:bold; }

过去,我们通常是这样来表现这个seriousError的

其实这种写法并不合理,有语义学上的重叠。 seriousError本身就是一种error,而我们重复的写下error 和 seriousError 是不合理的,并且当一个div有两个class样式同时作用时,我们在维护的时候就得小心翼翼了,无疑增加了维护负担。
我们如果能写成如下,就显得合理和精简了许多

但是想要写成这样,我们就得对css做一番修改。

.error, .seriousError{ color:red; } .seriousError{ font-weight:bold; }

很明显seriousError扩展了error样式。我们前面说到的@extend指令便实现了这种开发逻辑。

.error{ color:red; } .seriousError{ @extend .error; /请留意此处的语法/ font-weight:bold; }

生成的css:

.error, .seriousError{ color:red; } .seriousError{ font-weight:bold; }

@extend不但可以扩展class,也可以扩展伪类。

.hoverlink { @extend a:hover; } a:hover { text-decoration: underline; }

生成的css如下:

a:hover, .hoverlink { text-decoration: underline; }

@extend还能保持被扩展元素的父子关系。
假使 error类下还有个 instruction 类用来显示错误的说明信息,因为字比较多的原因,为了让他能放得下,我们指定他的字体是小号的字体。

.error{ color:red; } .error.instruction{ font-size:small }

.seriousError下自然也有关于错误的说明,也就是instruction.
sass对此考虑周到,对父类的子类在扩展的时候也考虑了进来。

.error{ color:red; } .error .instruction{//instruction可以理解为error的子类 font-size:small; } .seriousError{ @extend .error; font-weight:bold; }

请留意生成的css:

.error, .seriousError { color: red; } .error .instruction, .seriousError .instruction { //.seriousError也包含了.instruction font-size: small; } .seriousError { font-weight: bold; }

@extend同样支持多重扩展
前面我们有了一个error和seriousError的例子,想想后来,我们又生成了一种attention的样式,为了提起人们的注意,为此我们设置了边框为红色。

.error{ color:red; } .attention{ border:1px solid red; }

现在,我们相对seriousError进行一番修改,毕竟是serious,一定要确保引起了用户的注意,因此,我们也需要将attention样式集成进来,这时多重扩展便起了作用。

.error{ color:red; } .attention{ border:1px solid red; } .seriousError{ @extend .error; @extend .attention; /* 当然,也可以这样书写 @extend .error, .attention; */ font-weight:bold; }

生成的css如下:

.error, .seriousError { color: red; } .attention, .seriousError { border: 1px solid red; } .seriousError { font-weight: bold; }

这样的样式用着用着,有一天发现又有一种更危险的error出现了,情况极其严重,一旦出现,就一定要引起用户注意并且修改,如果不改,简直要天崩地裂。

好吧,我们姑且叫他 criticalError ,他依旧用鲜艳的红色,粗体,并且要有像attention一样的红色边框,只不过他需要更大,达到40px才解气。

很显然,criticalError是seriousError情况的加深。因此我们选择extend seriousError。

这样,便形成了一种链式extend结构。

.error{ color:red; } .attention{ border:1px solid red; } .seriousError{ @extend .error, .attention; font-weight:bold; } .criticalError{ @extend .seriousError; font-size:40px; }

生成的css如下:

.error, .seriousError, .criticalError { color: red; } .attention, .seriousError, .criticalError { border: 1px solid red; } .seriousError, .criticalError { font-weight: bold; } .criticalError { font-size: 40px; }

现在,这个error系统用着很棒,但是忽然有一天,技术总监说:“上面又发了一个新的error系统我们需要完成,我认为我们应当用现在的sass错误系统建立一个快速的error开发框架
这时,问题来了,如何用sass建立一个error开发框架呢?这时,让我们引出extend的另一个特性,这个特性就是为建立框架而生的。

让我们先来做个简单的实验,粘贴下面的sass代码然后编译看看:

%baseError{ color:red; }

是不是发现生成的css空空如也。
现在 试试这个

%baseError{ color:red; } .Error{ @extend %baseError; }

生成的css是否如下:

.Error { color: red; }

这便是一个最最简单的框架结构。%Name 告诉sass这时框架结构,不要输出这些。 @extend %name告诉sass我要扩展这个name选择器样式,调用一下这个框架。

框架在书写的时候,需要debug,在用户使用的时候需要对错误的输入警告,这时就需要@debug和@warn

@debug

用在测试时候的输出,可以在控制台看到。

@debug 10em + 12em;
你就会在控制台看到:
Line 1 DEBUG: 22em

@warn

看个例子:

@mixin adjust-location($x, $y) { @if unitless($x) { @warn “没有赋予单位,假设#{$x}按像素来算”; $x: 1px * $x; } @if unitless($y) { @warn “没有赋予单位,假设#{$y}按像素来算”; $y: 1px * $y; } position: relative; left: $x; top: $y; } .box{ @include adjust-location(10,20);//我们在这里故意不加入像素值 }

生成的css如下:

.box { position: relative; left: 10px; top: 20px; }

但是这不是重点,请留意你的控制台。

WARNING: 没有赋予单位,假设10按像素来算 on line 3 of style.scss, in adjust-location' from line 13 of style.scss WARNING: 没有赋予单位,假设20按像素来算 on line 7 of style.scss, inadjust-location’ from line 13 of style.scss

至此,我大致介绍了大致85%左右关于sass的常用知识,随后我将推荐和分析几个sass框架,来带着大家一起摸索sass的开发模式。
在探索过程中,我们将一起来制作一个基于Responsive和SASS的站点。

作者:代码家
来源:代码家的博客
你可以订阅我的Blog以获取最新的知识文章。
请尊重版权,转载请注明来源!

SASS系列:
Responsive系列之知识储备 – SASS基础教程
Responsive系列之知识储备 – SASS高阶教程(1)
Responsive系列之知识储备 – SASS高阶教程(2)

Responsive系列之知识储备 – SASS高阶教程(1)

如果你还不了解什么是sass,请点击Responsive系列之知识储备 – SASS基础教程

SASS中的控制指令

sass支持一些基本的控制指令,通过条件判断来输出某些特定的样式。

1、@if :

@if 条件语句 {…(返回的样式)}

如;

p { @if 1 + 1 2 { border: 1px solid; } @if 5 < 3 { border: 2px dotted; } @if null { border: 3px double; } }

生成的css如下:

p { border: 1px solid; }

@if 同样可以跟 @else if
如:

$type: monster; p { @if $type ocean { color: blue; } @else if $type matador { color: red; } @else if $type monster { color: green; } @else { color: black; } }

生成的css如下:

p { color: green; }

2、@for
@for指令用来重复输出一系列的样式,通过一个循环语句,指定一个变量名,一个开始和一个结尾,而后在执行体中写入想要输出的样式格式,sass会自动循环的输出一系列的样式结构。
注:sass的循环 包含 开始和结尾
如:

@for $i from 1 through 3 { .item-#{$i} { width: 2em * $i; } }

生成的css如下:

.item-1 { width: 2em; } .item-2 { width: 4em; } .item-3 { width: 6em; }

3、@each
@each指令用来遍历一个序列,每次将序列中的一个值设为声明的一个变量,并且进行特定操作,操作完成后,循环到下一个值,直到结束。
如:

@each $animal in dog, cat, bird { .#{$animal}-icon { background-image: url(‘/images/#{$animal}.png’); } }

生成的css如下:

.dog-icon { background-image: url(‘/images/dog.png’); } .cat-icon { background-image: url(‘/images/cat.png’); } .bird-icon { background-image: url(‘/images/bird.png’); }

设想如果有很多重复性的css要生成,sass多么的方便。
4、@while
@while语句首先判断是否满足给定条件,满足条件的情况下重复输出某一样式表达式,直到条件为false为止。
@while是一个比较少用的表达式,通常用来实现@for语句难以实现的复杂循环结构.
如:

$i: 6; @while $i > 0 { .item-#{$i} { width: 2em * $i; } $i: $i – 2; }

生成的css如下:

.item-6 { width: 12em; } .item-4 { width: 8em; } .item-2 { width: 4em; }

Mixins高级用法

Responsive系列之知识储备 – SASS基础教程中,介绍了Mixins的基础用法,@include以及传递参数。
现在我将介绍一下关于Mixins的更多功能:
1、Mixins的声明内部可以@include其他的Mixins
如:

@mixin compound { @include highlighted-background; @include header-text; } @mixin highlighted-background { background-color: #fc0; } @mixin header-text { font-size: 20px; }

2、Mixins的参数传递功能可以有默认值
如:

@mixin sexy-border($color, $width: 1in) { border: { color: $color; width: $width; style: dashed; } } p { @include sexy-border(blue); } h1 { @include sexy-border(blue, 2in); }

生成的css如下:

p { border-color: blue; border-width: 1in; border-style: dashed; } h1 { border-color: blue; border-width: 2in; border-style: dashed; }

3、Mixins同样可以显式声明要传递的参数/也可以叫作关键字传参 (Keyword arguments)
如:

p { @include sexy-border($color: blue); } h1 { @include sexy-border($color: blue, $width: 2in); }

显式传递会让sass代码更加易读,而且在有很多参数的情况下,不用过多的在意参数传递的顺序,建议多用这种方式去传递参数。

4、Mixins也支持不定参数传递
在某些情况下,我们可能无法确定一个Mixins要传递的参数个数,这个时候,我们就可以利用这一特性来传递参数。参数书写规则类似其他语言,在参数变量后加 代表不定参数。
如我们要实现shadow效果,而shadow的参数往往比较多样,无法确定:

@mixin box-shadow($shadows…) { -moz-box-shadow: $shadows; -webkit-box-shadow: $shadows; box-shadow: $shadows; } .shadows { @include box-shadow(0px 4px 5px #666, 2px 6px 10px #999); }

生成的css如下:

.shadowed { -moz-box-shadow: 0px 4px 5px #666, 2px 6px 10px #999; -webkit-box-shadow: 0px 4px 5px #666, 2px 6px 10px #999; box-shadow: 0px 4px 5px #666, 2px 6px 10px #999; }

5、调用Mixins,也可以用类似不定参数的方法调用。
可以提前声明一个数值List,而后在调用时传入这个List+,sass会自动分配List中的value给每个参数。
如下:

@mixin colors($text, $background, $border) { color: $text; background-color: $background; border-color: $border; } $values: #ff0000, #00ff00, #0000ff; .primary { @include colors($values…);/留意这里/ }

生成的css如下:

.primary { color: #ff0000; background-color: #00ff00; border-color: #0000ff; }

6、如果你想扩展一个已有的Mixins(如:添加某些新的属性),又不希望打破旧的结构,这时新的Mixins可以包装旧的Mixins,并且可以利用不定参数的方式来实现参数传递,是不是听起来略微抽象,没有关系,看个例子就明白了。
假如有个Mixins叫stylish-mixin,我们现在想扩展出一个新的Mixins,让他的字体变为bold

@mixin stylish-mixin($color,$width){ color:$color; font-size:$width; } @mixin wrapped-stylish-mixin($args…) { font-weight: bold; @include stylish-mixin($args…); } .stylish { @include wrapped-stylish-mixin(#eeeeee,$width: 100px); }

生成的css如下:

.stylish { font-weight: bold; color: #eeeeee; font-size: 100px; }

7、传递内容块(content blocks)给Mixins
这个比较抽象,我会从一个例子下手,而后讲解此功能的用法。
首先,我们在此引入一个@指令,即@content,@content表示一个未来要被替换的文本。
看如下scss文件:

@mixin apply-to-ie6-only { * html { @content; /这个@content,表示未来此处会被传递的值重新替换的样式文本/ } } /而后,我们利用@include指令来调用 apply-to-ie6-only mixins/ /但是在调用的时候,我们得考虑到替换@content , 因而我们要使用 @include 的另一种使用方式 ,如下:/ @include apply-to-ie6-only {/*这个代码段内的文本将替换 apply-to-ie6-only中的@content部分 */ #logo { background-image: url(/logo.gif); } }

而后sass在编译后的文本内容其实如下:

@mixin apply-to-ie6-only { * html { #logo { background-image: url(/logo.gif); } } } @include apply-to-ie6-only;

最终生成的 css文件如下:

  • html #logo { background-image: url(/logo.gif); }

这种看似麻烦的方法是用来做什么的呢?
实际上是用来提供抽象接口的,看看这种结构像不像C++中的abstract类(抽象类)。想想C++的抽象类是用来干什么的?

函数指令

sass允许你定义自己的函数。
使用方法:
@function 函数名(参数1,参数2…){
…一些处理语句;
@return 返回的内容;
}
举个例子:

$grid-width: 40px; $gutter-width: 10px; @function grid-width($n) { @return $n * $grid-width + ($n – 1) * $gutter-width; } #sidebar { width: grid-width(5); }

生成如下css:

sidebar { width: 240px; }

函数跟mixin的传参方法很类似,同样支持关键字传参,如上面的grid-width也可以如下调用:

sidebar { width: grid-width($n: 5); }

同样函数也支持不定参数的传递方式。
注意:为了不发生命名冲突或者为了不使阅读你代码的人误以为函数是sass内部提供的函数,建议在属于你自己的函数上加入前缀,如你在google工作,可以在grid-width前加入google,变成为google-grid-width

下一节,我将补充介绍一些@规则指令,并且介绍一些常用的css格式。
也会补充介绍一些平台下的便利开发工具。

作者:代码家
来源:代码家的博客
你可以订阅我的Blog以获取最新的知识文章。
请尊重版权,转载请注明来源!

SASS系列:
Responsive系列之知识储备 – SASS基础教程
Responsive系列之知识储备 – SASS高阶教程(1)
Responsive系列之知识储备 – SASS高阶教程(2)

手头

这里记载着我常用的一些工具,以及常关注的一些站点。

手头在用的是

一台Nexus 5 16G白色 购于2014年3月29日

一发SanDisk CZ80 16G 3.0 U盘 购于2014年3月18日

一个SAMSUNG 840 Pro 256G SSD 购于2014年3月18日

一台iPhone5s (Gold) 32G 购于2014年2月20日

一台Sony 1R耳机 购于2013年11月

一台华硕VX239H显示器 购于2013年10月

一台N828 购于2013年4月

一台树莓派 购于2012年11月

一台Macbook Pro 15′ (自己更换了16G内存),购于2012年3月

一台IPad2 购于2011年X月

一台G7 购于2010年3月

一台M8 购于2009年10月

一台hp 4411s 购于2009年6月

钟爱的语言: Java , PHP , Python , CSS , Javascript , NodeJs

钟爱的库: JQuery, Laravel, CasperJS, gMap.js, Bootstrap, FlatUI, Ink, JSoup,express….(too much…)

钟爱的平台: Mac >>>>> Windows > Ubuntu

钟爱的技术平台:Android , Web , OS X ,  SASS , Responsive

钟爱的前端开发工具:

钟爱的前端插件:当年的Zen Coding ,  现在的Emmet

钟爱的Android开发工具:

  1. Eclipse
  2. Android Studio

钟爱的Eclipse插件:

  • Color Theme : 集成了很多编辑器主题的插件。

钟爱的浏览器排序:

Chrome (75%) > Firefox (10%) >  Safari (10%) > Opera (5%)

钟爱的浏览器插件:

  • AdBlock : 屏蔽广告用
  • RegExp Tester App : 测试正则表达式
  • Post man : REST Api工具
  • Edit This Cookie : 编辑Cookies工具
  • Evernote , Pocket , Readability :收集知识剪辑,随后再读
  • XMarks : 书签同步服务

钟爱的搜索服务:Only Google

钟爱的问答社区:StackOverFlow

钟爱的Git社区:     GitHub BitBucket

钟爱的GTD服务:WunderList

钟爱的稍后阅读服务: Pocket , Readability

钟爱的科技资讯集中服务: CnBeta , ReadWise , Google Reader(默泪) , Feedly , Reeder

钟爱的壁纸服务:Desktoppr

钟爱的同步服务:Dropbox , 快盘

钟爱的分享服务:Droplr JumpShare ZeoSpace Evernote

钟爱的新技术:Riak,Unqlite,WebRTC ,Sails , Firebase , PeerCDN,Node-Webkit,ejdb , appjspeerkit(不定期更新或者改变…)

期待的小玩意:GitHub Shop的小零碎