整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

纯干货,前端学者的福音!如何使用css滤镜改变图片颜色

到对图片进行处理,我们经常会想到PS,美图秀秀这类的图像处理工具。作为前端,全栈开发者,我们经常会需要处理一些特效,例如根据不同的状态,让图片显示不同的颜色。或者是hover的时候,对图片的对比度,阴影进行处理。

你以为这些是经过PS软件处理出来的?不不不,只有一张图片,纯粹的是用css写出来的。

本文的目标就是:手把手教大家学习CSS滤镜(filter)属性,CSS滤镜提供的图形特效,像模糊,锐化或元素变色。过滤器通常被用于调整图片,背景和边界的渲染。

使用CSS滤镜只需要如下5步:

1. 准备工作

2. 使用sublime快速书写HTML结构

3. 使用CSS选择器选中目标标签

4. CSS滤镜的基本用法

5. CSS滤镜实例演示

一、第一步 —— 准备工作

目标 : 下载并安装sublime以及准备一张图片素材

下载对应你操作系统的sublime编辑器,http://www.sublimetext.com/3

图片素材:

小结 : 准备好代码编辑器,比如sublime,hbuilder,vscode等编辑,都是可以的,再准备一张图片素材

二、第二步 —— 书写HTML结构

目标 : 使用sublime编辑器快速生成HTML5结构的页面

1. 安装sublime以后,并打开sublime.exe

2. 在电脑的某个目下新建一个空目录code,将我们的图片素材放一个images文件夹下,并把这个images文件夹也放在code中

3. 使用sublime打开我们刚准备好的code文件夹

4. 使用sublime新建一个HTML网页文件,后缀名需要为html

5. 接着输入一个英文输入状态下的!再按tab键,即可快速生成HTML5的基本结构!

6. 在网页中插入内容

小结 : 使用代码编辑器新建网页文件,并加入两张img图片标签,正确引入图片

三、第三步 —— 使用CSS选择器选中目标标签

目标:使用CSS类选择器选中我们页面中的目标图片标签, 格式 .类名

小结 : 使用 css类选择 格式: .类名 选中对应的目标标签

四、第四步 —— CSS滤镜的基本用法

目标:了解CSS滤镜的基本用法以及各方法之间效果差异

1. CSS滤镜基本语法

filter: function(param);

filter: none | blur() | brightness() | contrast() | drop-shadow() | grayscale() | hue-rotate() | invert() | opacity() | saturate() | sepia() ;

提示:允许同时使用多个滤镜,多个滤镜效果之间使用空格分隔。

2. CSS滤镜支持的方法(function)有

– grayscale 灰度

– sepia 褐色

– saturate 饱和度

– hue-rotate 色相旋转

– invert 反色

– opacity 透明度

– brightness 亮度

– contrast 对比度

– blur 模糊

– drop-shadow 阴影

了::before 和::after,CSS 的伪元素还有::first-line、::first-letter 和::selection 这三个,这三个相对来说就简单得多,用法也较为纯粹。没看过前两篇文章的,笔者建议大家看看:

CSS 伪元素基础知识:before 与after (一)、CSS 伪元素基础知识:content 与counter 实用技巧(二)

::first-line

::first-line顾名思义就是「第一行」,通过这个伪元素可以轻松指定文字的第一行,需要注意的是::first-line 「不能」作用于display:inline的元素。以下面的例子,html里有一段文字如下所示:

<p> 前端达人公众号,已经有五年的历史啦,目前有几千名前端开发者订阅,公众号的宗旨是:分享当下最实用的前端技术。关注前端达人,与数千名达人们一起进步!期待你的订阅和关注!
</p>

CSS 只要这样写,页面呈现出来的第一行就会是绿色的,不论视窗如何缩放,只有第一行会是绿色的。

p::first-line{
 color:green;
}

::first-letter

::first-letter顾名思义就是「第一个字」,通过这个伪元素,可以做出许多文章第一个字放大或变色的效果,我们这里就用刚刚上面那段文字为例,把第一个字用下段的CSS 来做变化,就可以看到第一个字放大且变色了的效果。

p::first-letter{
 font-weight:bold;
 font-size:38px;
 color:red;
}

虽然把第一个字放大了,但排版上仍然有点乱没有美感,这时你可以加入line-height、float或padding等属性进行修正,经过修正后,你会惊喜的发现很像报纸杂志会出经常用的效果(第一个字会跨行显示)。

p::first-letter{
 font-weight:bold;
 font-size:38px;
 color:red;
 line-height:26px;
 float:left;
 padding:10px 5px 0 0;
}

不过很有趣的是,在实际应用的过程里,发现「有一些符号」是无法套用::first-letter 的,例如「『 {} [] 都不行,但如果后方加上其他文字或符号,又会跟着一起放大...( 到底是怎样? )

经过查询W3C的官网,发现了下面这段话,意思大概就是说网页里面有定义一些所谓「包覆式、点缀式的标点符号」,如果是这些包覆式的标点符号,基本上就无法放大,反而需要搭配其它字符进行使用,因此,在使用第一个字进行特殊变化时,就要注意有这种特殊状况会发生。

参考:https://www.w3.org/TR/CSS21/selector.html#first-letter

::selection

::selection 是个十分常见的伪元素,它就是负责一段选取文字的效果,以下面这段CSS来说,选取后的文字,就会是深色背景,黄色文字。

p::selection{
 color:yellow;
 background:#543;
}

延伸阅读——用JavaScript操控伪元素

虽然我们能用CSS操控伪元素,但因为伪元素不存在于网页元素内,所以无法通过JavaScript常规操控DOM的方式来修改或控制,不过JavaScript身为一个神通广大的编程语言,仍然是有方法可以办到的。

读取伪元素属性

一般来说使用JavaScript读取某个元素DOM里的属性不难,但相对来说要读取一个不存在网页里的元素就不容易,如果要读取伪元素属性,可以通过getComputedStyle来获得,getComputedStyle是个可以获取当前元素「所有的CSS属性值」,读取后会返回一个Object CSSStyleDeclaration,而这个属性是只读的,无法进行修改。

使用方法:window.getComputedStyle('元素', '伪元素')

举例来说html 放入一个div 以及一个span,待会会用这个span 来显示div 的::before 属性。

<div id="d">我是 div</div>
<span id="s"></span>

CSS 的部分指定伪元素的content和color。

#d::before{
 content:'伪元素的content ';
 color:red;
}

JavaScript使用window.getComputedStyle(d,'::before')获取div里头伪元素使用的style,然后显示在span里面。

var d = document.getElementById('d');
var s = document.getElementById('s');
var b = window.getComputedStyle(d,'::before');
s.innerHTML = b.content +'<br/>'+b.color;

最后页面呈现的结果,第一段就是原本的div加上红色的伪元素文字,下方第一段是content的内容,紧接着是伪元素的颜色属性。

修改伪元素属性

我们可以读取属性值也就一定要尝试修改,不过修改伪元素的属性其实比想像中的难,必须通过insertRule这个方法在指定的style里插入「预设的规则」,让这个规则去影响伪元素的属性表现。

用法:style 标签元素.insertRule(样式规则, 0)

举例来说我们的网页布局如下,一开始开头的部分有两组style,第一组是我们赋予元素的样式属性,第二组则是要来定义规则的style,因为要加入规则,所以让第二组style有一个id。至于html就放入一个div。

<!DOCTYPE html>
<html>
<head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width">
 <title>JS Bin</title>
 <style>
 #d::before{
 content:'伪元素的 content ';
 color:red;
 }
 </style>
 <style id="css"></style>
</head>
<body>
 <div id="d">我是div</div>
</body>
</html>

在完全没有编写JavaScript的状态,应该会呈现如下图的样子:

JavaScript开声明一个变量css,通过id获取style,然后使用在指定一个变量给css.sheet,就可以通过insertRule的方法修改了。需要注意的是,由于规则加入时会放在整串style的开头(第二个值预设0 ),所以纯粹使用一个#d是无法覆盖原本的属性( CSS权重问题),所以这边使用#d#d两次,就可以在权重上压过原本的属性。(当然如果要用!important也是可以)

var css = document.getElementById('css');
var d = document.getElementById('d');
var c = css.sheet;
c.insertRule("#d#d::before{content:'我是修改的 content ';}", 0);
c.insertRule("#d#d::before{color:blue;}", 0);

如此一来,呈现出来的效果就是通过JavaScript修改的。

修改伪元素content

我们知道::before和::after的content可以通过attr获取父元素的属性,因此通过改变这个属性,就能间接连带改变content的内容,举例来说有个div,我们指定它的data-text="我是预设文字",然后放两个按钮,期望点选不同的按钮,会更换content不同的内容。

<button id="b1">显示 ABC</button>
<button id="b2">显示 123</button>
<div data-text="我是预设文字">我是 div</div>

接着设定CSS,关键在使用content的attr,让伪元素直接显示父元素属性的内容。

button{
 font-size:16px;
}
div{
 margin:10px;
 font-size:20px;
}
div::before{
 content: attr(data-text) ',';
}

最后就是JavaScript的部分,通过setAttribute更改div的属性,就会看到content的内容修改了。

var b1 = document.getElementById('b1');
var b2 = document.getElementById('b2');
var d = document.querySelector('div');
b1.addEventListener('click',function(){
 d.setAttribute('data-text','ABC');
});
b2.addEventListener('click',function(){
 d.setAttribute('data-text','123');
});

虽然说我们可以通过JavaScript 来操控伪元素,但伪元素终究不是真正的网页元素,也因此操作起来也不如基本操作网页元素DOM 来的简便,所以如果可以,还是尽量用正常的操控模式吧。

文章来源:https://www.oxxostudio.tw/articles/201706/pseudo-element-3.html

https://www.oxxostudio.tw/articles/201706/pseudo-element-4.html

原文作者:oxxostudio

由于网页为繁体内容,术语描述和话术与我们有差异的问题,笔者在保证不改变原意的基础上做了调整,把上述两篇文章合成了一篇,并在此基础上进行了错误校正,如发现问题,欢迎你的指正

小结

关于伪元素的系列文章就介绍到这里,如果你喜欢此系列文章,麻烦各位点赞和转发,谢谢啦。关于伪元素的用法,虽然说大部分的时候用不太到,但某些时候也不失为强化网页效果、或是优化网页结构的好方法。

、选中去除文本框文字,离开后显示原有文字:

 <input name="key" type="text" id="key" value="关键词" size="30"   

          onmouseover=this.focus();this.select();  

          onclick="if(value==defaultValue){value='';this.style.color='#000'}"   

          onBlur="if(!value){value=defaultValue;this.style.color='#999'}" style="color:#999" />

2、选中后方可编辑:

<input type="checkbox" name="tpbox" value="1" onclick="if(this.checked) {txtNo.disabled=false}else{txtNo.disabled=true}">你一定要幸福,我会好好的!

你的姓名:<input type="text" name="txtNo" size="20" value="选中前面的选项方可编辑" disabled>

3、点击链接后方可编辑:

<a href="#" onclick="username.readOnly=false;alert('你好,欢迎使用!')">先点击我哦!</a>

你的姓名:<input id="username" value="--请输入--" size="30" readOnly>

4、输入框从中间输入:从中间输入:

<input type="text" name="mid"style="text-align:center;">

5、输入框变色:输入框改变变色:

<input type="text" size="20" style="background-color:#FFFFFF"

            onfocus="style.backgroundColor='#FFFF00'"

            onblur="style.backgroundColor='#FFFFFF'">

6、输入框只能输入数字(用的是正则表达式):你 的年龄:

<input onkeyup="value=value.replace(/[^\d]/g,'') "

        onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))">

7、输入框只能输入中文(用的是正则表达式):你的中文名:

<input onkeyup="value=value.replace(/[ -~]/g,'')" onkeydown="if(event.keyCode==13)event.keyCode=9">

8、只能输入英文和数字(用的是正则表达式):

你 的昵称:<input onkeyup="value=value.replace(/[\W]/g,'') "

        onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))"

        onkeydown="if(event.keyCode==13)event.keyCode=9">

9、输入框不能编辑,但表单可以获得输入框内的值:

<input type="text" value="afreon" onclick="alert('总和不能编辑!');" onfocus="this.blur()" />

<input type="text" value="afreon" onclick="alert(this.value);" readonly />

<input value="不可修改"  readonly= "true" type="text"/>//:字体颜色为黑体

10、输入框不能编辑,并且表单不能获得输入框内的值

<input value="不可修改" disabled="disabled"  type="text"/>//:字体颜色为灰体

11、输入框禁止输入法:

<input onpaste="return false" style="ime-mode:disabled">