热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Sass中半透明颜色的Mixins

在TheSassWay上看到一篇JohnW.Long写的《MixinsforSemi-TransparentColors》文章。文章中详细的介绍

在 The Sass Way 上看到一篇 John W. Long 写的《Mixins for Semi-Transparent Colors》文章。文章中详细的介绍了如何使用 Sass 来定义一个半透明颜色的 mixins,觉得很有意思,认真学习之后,结合CSS中的半透明,以及 Sass 中的半透明做了一点总结,与大家分享。

CSS 中透明实现

回想CSS中实现透明的属性主要是opacity,这个属性可以控制元素的透明度,包括其后代元素都会受到一定的影响。

opacity: .5;
filter:alpha(opaity=50);

这或许不是我们想要的效果,因为opacity属性不但是控制了颜色,而且还控制了所有元素的的透明度,是个非常BT的东东。不早期常用于制作浮层背景透明效果。

除了opacity属性之外,在CSS中控制颜色的透明的还有一个transparent值,他可以让颜色完全透明化:

color: transparent;
border-color: transparent;
background-color: transparent;

如此一来,始终无法帮助我们实现需要的半透明效果。

CSS3 中半透明实现

随着CSS3的出现,实现颜色的半透明效果就变得轻松多了,其中CSS3为颜色的半透明增加了rgbahsla属性。通过这两个属性可以对任何颜色控制他的半透明效果。

color: rgba(0,0,0,.3);
border-color: hsla(20,3%,90%,.3);

Sass 中颜色半透明实现

Sass 给我们提供了很多有意思的 颜色函数功能。可以在其他颜色的基础上计算出一个新的颜色。常见的就是使用darken()saturate()adjust-color()函数来调整颜色,最常见使用的地方就是用在按钮上,用来突出按钮的颜色和阴影。

很多Web设计师都比较喜欢使用半透明的颜色,这样可以让设计更好的容入到元素中。在Sass中使用rgba()函数就变得更加轻松与简单:

.button {
background-color: rgba(black,.5);
}

大家都知道,CSS3 中的 rgba 是具有四个参数的:red红色、green绿色、blue蓝色和alpha通道。而Sass中的rgba()函数仅接受两个参数,第一个参数是指定的颜色,第二个参数像CSS3中rgba属性中的alpha通道,用来控制颜色的透明度。但是Sass中rgba()函数编译出的也是使用CSS3的rgba格式,具有四个参数:

$ sass -i
>> rgba(black,.5)
rgba(0, 0, 0, 0.5)

不过使用rgba具有一定的代价,在早期的IE浏览器不识别这个属性,详情请点击 这里。当浏览器访问到这个属性时,不识别的浏览器会直接忽略他。这意味着不支持的浏览器会完全透明,不过有一个方法可以避免这类现象,就是在rgba格式的前面先写一个所有浏览器都支持的颜色格式:

.button {
background-color: #7f7f7f;
background-color: rgba(black,.5);
}

如果你有一个颜色选择工具,例如 Color Schemer Online 或者说使用PSD这样的制作软件,你可以获取一个颜色的R,G,B值,或者手动修改这些值,但这并不是最好的方法。大家为何不尝试使用Sass中的mix()函数来帮助我们完成类似这样的工作呢?

.button {
background-color: mix(black,white);// mix(black,white)-> #7f7f7f
background-color: rgba(black,.5);
}

这样虽然完成了功能效果,但每次都需要这样操作。不过我们可以做得比这个更好。可以引入一些更强大的Sass功能,可以将一个颜色的aplha值提取出来,并将其转换成百分比,然后通过mix()函数将一个rgba()函数的颜色与一个背景色按一定的比例混合在一起,生成一个新的颜色,并将这整个功能定义为一个mixins,实现一个功能模块:

//定义一个半透明颜色mixin
@mixin semi-transparent-colors($color,$background){
$percent: alpha($color) * 100%; //获取颜色透明度值,并转换成百分比
$opaque: opacify($color,1); //使颜色不透明
$solid-color: mix($opaque,$background,$percent);
background-color: $solid-color; //设置不透明的颜色,为不支持rgba颜色的浏览器服务
background-color: $color;//设置透明颜色,为支持rgba颜色的浏览器服务
}

简单的来看一下这个mixin

semi-transparent-colors中传了两个参数:$color$background,其中第一个参数是一个rgba()函数获取的一个颜色,如rgba(black,.5);第二个参数主要是用来和另一个颜色做mix()函数计算的颜色。

整个semi-transparent-colors的功能实现大致分为以下几个过程:

第一步,首先获取$color中的透明值,并将其转换成百分数。在这里使用了Sass中Opacity透明函数中的alpha()函数,也可以换成opacity()函数。例如:

$color: rgba(black,.5);
//在终端命令中进行测试转换
$ sass -i
>> alpha(rgba(black,.5))
0.5

得到了$color中的透明值.5,并且将其转换成一个百分值,并且将此值赋予给变量$percent

>> alpha(rgba(black,.5)) * 100%
50%

第二步也非常简单,同样是使用Opacity透明函数中的opacify($color,$amount)函数,所$amount直接设置为1,使$color函数变成一个不透明的函数,如:

$color: rgba(black,.5);
$ sass -i
>> opacify(rgba(black,.5),1)
#000000

同样将这个新得到的不透明颜色赋予给一个变量$opaque。 这个功能除了能使用opacify()函数之外,也可以使用fade-in($color,$amount)函数代替,使用方法都是一样的。

第三步,使用mix()函数,将$opauergba()函数去透明化得到的颜色)和$background颜色按$percent(取rgba()函数中颜色透明值的百分数),混合在一起得到的一个新颜色,并赋予给变量$solid-color

$solid-color: mix($opaque, $background, $percent);
>> mix(opacify(rgba(black,.5),1),white,alpha(rgba(black,.5)) * 100%)
#7f7f7f

最后一步就是将两个颜色分别定义给相应的属性上:

background-color: $solid-color; //设置不透明的颜色,为不支持rgba颜色的浏览器服务
background-color: $color;//设置透明颜色,为支持rgba颜色的浏览器服务

接下来,可以通过@include调用这个semi-transparent-colorsmixin,如:

.button {
@include semi-transparent-colors(rgba(black,.5),white);
}

编译出来的CSS:

.button {
background-color: #7f7f7f;
background-color: rgba(0, 0, 0, 0.5); }

虽然这样可以轻松的使用半透明颜色,但在上面的mixin中还存有一定的缺陷,仅能将半透明颜色运用在背景颜色上,没办法使用在其他颜色属性上面。不过不用担心,我们只需要使用Sass的#{}功能,我们就可以解决上述的问题,将半透明颜色运在大部分颜色属性上,比如:colorbackground-colorborder-color等等,但类似box-shadowtext-shadow这种属性上的颜色,这种方法还不能解决。

@mixin semi-transparent-colors($attribute,$color,$background){
$percent: alpha($color) * 100%; //获取颜色透明度值,并转换成百分比
$opaque: opacify($color,1); //使颜色不透明
$solid-color: mix($opaque,$background,$percent);
#{$attribute}: $solid-color; //设置不透明的颜色,为不支持rgba颜色的浏览器服务
#{$attribute}: $color;//设置透明颜色,为支持rgba颜色的浏览器服务
}

这个时候,我们就可以这样调用了:

.button {
@include semi-transparent-colors("background-color",rgba(black,.5),white);
@include semi-transparent-colors("color",rgba(white,.8),#393);
@include semi-transparent-colors("border-color",rgba(black,.7),gray);
}

编译出来的CSS:

.button {
background-color: #7f7f7f;
background-color: rgba(0, 0, 0, 0.5);
color: #d6ead6;
color: rgba(255, 255, 255, 0.8);
border-color: #262626;
border-color: rgba(0, 0, 0, 0.7); }

上面主要介绍了如何使用Sass来定义一个半透明颜色的mixin,接下来,在此基础上来看一个实例,这个实例是由 John W. Long 写的一个 按钮 效果。

//定义半透明颜色
@mixin semi-transparent-colors($attribute,$color,$background){
$percent: alpha($color) * 100%; //获取颜色透明度值,并转换成百分比
$opaque: opacify($color,1); //使颜色不透明
$solid-color: mix($opaque,$background,$percent);
@if ($percent <100%) {
#{$attribute}: $solid-color; //设置不透明的颜色,为不支持rgba颜色的浏览器服务
}
#{$attribute}: $color;//设置透明颜色,为支持rgba颜色的浏览器服务
}
//定义按钮颜色
@mixin color-button($text,$color,$background:white) {
@include semi-transparent-colors("border-color",rgba(black,.7),$background);
@include semi-transparent-colors("background-color",$color,$background);
@include semi-transparent-colors("color",$text,$background);
&:hover,
&:focus {
@include semi-transparent-colors("background-color",transparentize($color,.2),$background);
@include semi-transparent-colors("color",opacify($text,1),$background);
}
&:active {
@include semi-transparent-colors("background-color",opacify($color,1),$background);
box-shadow: none;
}
}
//定义按钮基本样式
%button {
border: 1px solid;
box-shadow: inset 0 1px 0 rgba(white,.2);
text-shadow: 0 1px 1px rgba(255, 255, 255, 1);
font: {
size: 14px;
family: "HelveticaNeue-Light", "Helvetica Neue Light", "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif;
}
padding: .4em 1em .5em;
cursor: pointer;
}
//调用
.panel {
width: 220px;
padding: 50px;
text-align: center;
margin: 15px;
background: gray;
box-sizing: border-box;
float: left;
button{
@extend %button;
@include color-button(rgba(white, 0.8), rgba(black, 0.5), gray);
}
}
.green-panel {
background: #393;
button{
@include color-button(rgba(white, 0.8), rgba(black, 0.5), #393);
}
}
.orange-panel {
background: #f73;
button{
@include color-button(rgba(white, 0.8), rgba(black, 0.5), #f73);
}
}

编译出来的CSS:

.panel button {
border: 1px solid;
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2);
text-shadow: 0 1px 1px white;
font-size: 14px;
font-family: "HelveticaNeue-Light", "Helvetica Neue Light", "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif;
padding: .4em 1em .5em;
cursor: pointer;
}
.panel {
width: 220px;
padding: 50px;
text-align: center;
margin: 15px;
background: gray;
box-sizing: border-box;
float: left;
}
.panel button {
border-color: #262626;
border-color: rgba(0, 0, 0, 0.7);
background-color: #404040;
background-color: rgba(0, 0, 0, 0.5);
color: #e5e5e5;
color: rgba(255, 255, 255, 0.8);
}
.panel button:hover,
.panel button:focus {
background-color: #595959;
background-color: rgba(0, 0, 0, 0.3);
color: white;
}
.panel button:active {
background-color: black;
box-shadow: none;
}
.green-panel {
background: #393;
}
.green-panel button {
border-color: #0f2d0f;
border-color: rgba(0, 0, 0, 0.7);
background-color: #194c19;
background-color: rgba(0, 0, 0, 0.5);
color: #d6ead6;
color: rgba(255, 255, 255, 0.8);
}
.green-panel button:hover,
.green-panel button:focus {
background-color: #236b23;
background-color: rgba(0, 0, 0, 0.3);
color: white;
}
.green-panel button:active {
background-color: black;
box-shadow: none;
}
.orange-panel {
background: #f73;
}
.orange-panel button {
border-color: #4c230f;
border-color: rgba(0, 0, 0, 0.7);
background-color: #7f3b19;
background-color: rgba(0, 0, 0, 0.5);
color: #ffe3d6;
color: rgba(255, 255, 255, 0.8);
}
.orange-panel button:hover,
.orange-panel button:focus {
background-color: #b25323;
background-color: rgba(0, 0, 0, 0.3);
color: white;
}
.orange-panel button:active {
background-color: black;
box-shadow: none;
}

注:此处展示的案例源码与 John W. Long 的 案例 略有不同。

Sass基础——颜色函数

总结

在这节中主要根据 John W. Long 的《Mixins for Semi-Transparent Colors》文章为思路,从CSS中的透明度设置展开,引伸出CSS3的颜色透明属性,最后回到Sass中的颜色函数,并且将Sass的部分颜色函数与 @mixin 相结合,定制了给CSS中带有颜色的部分属性,如colorborder-colorbackground-color 等轻松实现颜色半透明效果。希望这篇文章能帮助大家对Sass的颜色函数有一个更深的了解。

最后非常感谢 John W. Long 给我们带来这么好的教程。最后声明,文中有关于 Sass 实现颜色半透明功能的 @mixin 以及相关代码来自于《Mixins for Semi-Transparent Colors》一文。


推荐阅读
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • Html5-Canvas实现简易的抽奖转盘效果
    本文介绍了如何使用Html5和Canvas标签来实现简易的抽奖转盘效果,同时使用了jQueryRotate.js旋转插件。文章中给出了主要的html和css代码,并展示了实现的基本效果。 ... [详细]
  • 使用Flutternewintegration_test进行示例集成测试?回答首先在dev下的p ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • 深入理解CSS中的margin属性及其应用场景
    本文主要介绍了CSS中的margin属性及其应用场景,包括垂直外边距合并、padding的使用时机、行内替换元素与费替换元素的区别、margin的基线、盒子的物理大小、显示大小、逻辑大小等知识点。通过深入理解这些概念,读者可以更好地掌握margin的用法和原理。同时,文中提供了一些相关的文档和规范供读者参考。 ... [详细]
  • iOS Swift中如何实现自动登录?
    本文介绍了在iOS Swift中如何实现自动登录的方法,包括使用故事板、SWRevealViewController等技术,以及解决用户注销后重新登录自动跳转到主页的问题。 ... [详细]
  • IOS开发之短信发送与拨打电话的方法详解
    本文详细介绍了在IOS开发中实现短信发送和拨打电话的两种方式,一种是使用系统底层发送,虽然无法自定义短信内容和返回原应用,但是简单方便;另一种是使用第三方框架发送,需要导入MessageUI头文件,并遵守MFMessageComposeViewControllerDelegate协议,可以实现自定义短信内容和返回原应用的功能。 ... [详细]
  • JavaScript和HTML之间的交互是经由过程事宜完成的。事宜:文档或浏览器窗口中发作的一些特定的交互霎时。能够运用侦听器(或处置惩罚递次来预订事宜),以便事宜发作时实行相应的 ... [详细]
  • C#多线程解决界面卡死问题的完美解决方案
    当界面需要在程序运行中不断更新数据时,使用多线程可以解决界面卡死的问题。一个主线程创建界面,使用一个子线程执行程序并更新主界面,可以避免卡死现象。本文分享了一个例子,供大家参考。 ... [详细]
  • Android源码中的Builder模式及其作用
    本文主要解释了什么是Builder模式以及其作用,并结合Android源码来分析Builder模式的实现。Builder模式是将产品的设计、表示和构建进行分离,通过引入建造者角色,简化了构建复杂产品的流程,并且使得产品的构建可以灵活适应变化。使用Builder模式可以解决开发者需要关注产品表示和构建步骤的问题,并且当构建流程发生变化时,无需修改代码即可适配新的构建流程。 ... [详细]
  • 我用Tkinter制作了一个图形用户界面,有两个主按钮:“开始”和“停止”。请您就如何使用“停止”按钮终止“开始”按钮为以下代码调用的已运行功能提供建议 ... [详细]
  • Visual C# TabControl中TabPage分离成若干个Form的小办法
    写Visual的同学们都会用到这个TabControl的控件,然后会分好几页的TabPage,每页都有很多控件和业务逻辑,但是每页的关系也 ... [详细]
  • ①页面初始化----------收到客户端的请求,产生相应页面的Page对象,通过Page_Init事件进行page对象及其控件的初始化.②加载视图状态-------ViewSta ... [详细]
  • Myappcrashedandthecodeisthefollowing:我的应用程序崩溃,代码如下:elseif(){CGDetailVie ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有