1,CSS简介
(1)从内容分离样式
在CSS出现之前,HTML页面的大多数形式是由HTML标签及其属性实现的。比如,为了设置一段文本的字体颜色,会使用类似的代码
<p><font color="red">这段字体颜色是红色</font></p>
这种方式有不少问题:
- 页面中每段想设置为红色的文本都需要使用这些额外的标签。
- 建立的样式不能用于其他页面,其他页面还需要使用额外的HTML。
- 如果想要修改页面的样式,需要编辑每个页面,审查HTML代码,逐个修改所有与样式相关的标签和属性。
- 由于这些额外的标签,HTML变得难以阅读与维护。
CSS致力于把HTML的样式与其标签功能分离,方法是定义单独的"样式声明",然后把他们应用于HTML元素或元素的集合。
可以使用CSS设置元素可视属性的样式(比如颜色,字体和大小)以及与格式有关的属性(比如位置,页边距,填充和对齐)。
样式与内容分离会带来一些好处:
- 样式声明可以应用于多个元素甚至多个页面
- 修改样式声明就可以影响全部相关的HTML元素,使更新站点样式更加准确,迅速和高效。
- 共用样式能够提高站点的样式一致性
- HTML标签更加清晰,易读和可维护
(2)CSS样式声明
CSS样式声明部分可看: /qq_39263663/article/details/80258229
2,DOM的style属性
HTML页面在浏览器里以DOM树的形式表现,组成DOM树的分支与末端称为节点。它们都是一个一个对象,都具有自己的属性和方法。
有多种方法可以选择单个的DOM节点或节点集合,比如().
每个DOM节点都有一个style属性,这个属性本身也是个对象,包含了应用于节点的CSS样式信息。下面我们来举例说明。
<div style="width:200px;">Welcome back to my site.</div>
<script>
var myNode = ("id1");
alert();
</script>
这段代码会显示"200px"
在上述的例子中,事实上除了这一语法,也可以使用其对等的形式["width"]。有时候,这样做是有必要的,例如,当把属性的名称作为一个变量传递的时候:
var myProperty = "width";
[myProperty]="200px";
遗憾的是,虽然这种方式在用于内联样式时很正常,但如果是在页面<head>部分里使用<style>元素,或是使用外部样式表来设置页面元素的样式,DOM的style对象就不能访问它们了。
CSS的很多属性名称包含连字符,比如background-color,sont-size,text-align等。但javascript不允许在属性或方法名称里使用连字符,因此需要调整这些名称的书写方式。方法是删除其中的连字符,并且吧连字符后面的字母大写,于是font-size编程fontSize,其他类似。
一个设置style属性的例子
先编写一个函数,使用DOM的style对象让页面的背景颜色和字体颜色在两个值之间切换。
function toggle(){
var myElement = ("id1");
if ( == 'red'){
= 'yellow'
= 'black';
}
else{
= 'red'
}
这个函数首先读取页面元素当前的CSS属性background-color,把这个颜色与红色(red)进行比较。
如果属性background-color的当前值是red,就设置元素的style属性,以黄底白字显示文本;否则,就以红底白字显示文本。我们利用这个函数切换HTML文档里一个<span>元素的颜色,完整的代码如下所示。
<!DOCTYPE html>
<html>
<head>
<title>使用javascript修改CSS样式</title>
<style>
span{
font-size:20pt;
font-family:arial,helvetica,sans-serif;
padding:20px;
background-color: red;
color: yellow;
}
</style>
<script>
function toggle(){
var myElement = ("id1");
if ( == 'red' ){
= 'yellow';
= 'black';
}
else{
= 'red';
}
= function(){
("btn1").onclick = toggle;
}
</script>
</head>
<body>
<span >Welcome back to my site.</span>
<input type = "button" id = "btn1" value="Toggle" />
</body>
</html>
3,使用className访问类
本章前面介绍了样式与页面分离的好处。像前面这个练习使用javascript编辑style对象的属性,能够很好的工作,但却却可能影响样式与内容分离。如果javascript代码经常修改元素的样式声明,就会导致页面的样式不完全由CSS控制了。在这种情况下,如果需要修改javascript应用的样式,就必须编辑涉及的全部javascript函数。
好在我们可以让javascript调整页面样式时并不覆盖相应的样式声明。利用元素的classname属性,我们就可以通过修改class属性的值来调整应用于元素的样式。具体方法如下面的程序所示。
<!DOCTYPE html>
<html>
<head>
<title>Switching classes with javascript</title>
<style>
.classA{
width:180px;
border:3px solid black;
background-color:white;
color:red;
font:normal 24px arial,helvetica,sans-serif;
padding:20px;
}
.classB{
width:180px;
border:3px dotted white;
background-color:black;
color:yellow;
font:italic bold 24px "Times New Roman", serif;
padding:20px;
}
</style>
<script>
function toggleClass(){
var myElement = ("id1");
if( == "classA"){
= "classB";
}else{
= "classA";
}
}
= function(){
("btn1").onclick = toggleClass;
}
</script>
</head>
<body>
<div class="classA">An element with a touch of class.</div>
<input type="button" value="Toggle" />
</body>
</name>
4,DOM的styleSheets对象
document对象的styleSheets属性是一个数组,包含了页面上全部样式表(无论样式表是包含在外部文件中,还是在页面<head>部分里用<style>和</style>标签声明 )。styleSheets数组里的项目以数值索引,第一个出现的样式表索引为0。
启用,禁用和切换样式表
数组里的每个样式表都有一个属性disabled,其值为布尔值true或false。它是可读写的,可以在javascript里方便地启用或禁用某个样式表。
[0].disabled = true;
[1].disabled = false;
上面这两行代码"启用"页面里的第2个样式表(索引值为1),"禁用"第一个样式表(索引值为0)。
一个使用styleSheets的 程序清单
<!DOCTYPE html>
<html>
<head>
<title>Switching Stylesheets with JavaScript</title>
<style>
body{
background-color:white;
color:red;
font:normal 24px arial,helvetica,sans-serif;
padding:20px;
}
</style>
<style>
body{
background-color:black;
color:yellow;
font:italic bold 24px "Times New Roman",serif;
padding:20px;
}
</style>
<script>
var whichSheet = 0;
[1].disabled = true;
function sheet(){
[whichSheet].disabled = true;
whichSheet = ((whichSheet == 1)?0:1);
[whichSheet].disabled = false;
}
= function(){
("btn1").onclick = sheet;
}
</script>
</head>
<body>
Switch my stylesheet with the button below!<br />
<input type="button" value="Toggle">
</body>
</html>
选择特定样式表:
虽然样式表具有数值索引,但并不便于进行选择。如果给样式表设置标题,并且编写一个函数,根据title属性进行选择,就会容易得多。
如果调用的样式表不存在,我们希望函数以适当的方式进行响应,比如保持正在使用的样式表,并且向用户返回提示消息。
首先,声明几个变量并且初始化:
var change = false;
var oldSheet = 0;
布尔类型变量change的值表示是否找到了指定名称的样式表。如果找到了,就把它的hi设置为true,表示要改变样式了。
整形变量oldSheet的初始值为0,用于保存当前启用的样式表数量。如果没有找到与所请求的标题一致的一个新样式表,在从该函数放回之前,会设置为保持启用原来的样式表。
然后用一个循环遍历数组styleSheets:
for(var i = 0; i <;i++){
....
}
对于每个样式表:
如果判断是当前使用的样式表,就把它的索引值保存到变量oldSheet:
if([i].disabled == false){
oldSheet = i;
}
在循环的过程中,确保每个样式表都被禁用了:
[i].disabled = true;
如果当前样式表的标题符合要使用的标题,就把它的disabled值设置为false,从而启用这个样式,并且立即把变量change的值修改为true:
if([i].title == mySheet){
[i].disabled = false;
change = true;
}
在遍历全部样式表之后,可以根据遍历change和oldSheet的状态判断是否处于更换了样式表的状态,如果不是,就把以前使用的样式表再次启用:
if(!change)[oldSheet].disabled = false;
函数最后返回变量change的值。
完整的代码如下所示
<! DOCTYPE html>
<html>
<head>
<title>Switching stylesheets with JavaScript</title>
<style title="sheet1">
body{
background-color:white;
color:red;
}
</style>
<style title="sheet2">
body{
background-color:black;
color:yellow;
}
</style>
<style title="sheet3">
body{
background-color:pink;
color:green;
}
</style>
<script>
function ssEnable(mySheet){
var change = false;
var oldSheet = 0;
for (var i =0;i<;i++)
{
if([i].disabled == false){
oldSheet =i;
}
[i].disabled = true;
if([i].title == mySheet){
[i].disabled = false;
change = true;
}
}
if (!change)[oldSheet].disabled = false;
return change;
}
function sheet(){
var sheetName = prompt("Stylesheet Name?");
if(!ssEnable(sheetName))alert("Not found - original stylesheet retained.");
}
= function(){
("btn1").onclick = sheet;
}
</script>
</head>
<body>
Switch my stylesheet with the button below!<br />
<input type="button" value="Change Sheet" />
</body>
</html>