(11)使用DOM操作CSS

1、DOM操作内联样式

  • 通过JS修改元素的样式
    语法:元素.style.样式名 = 样式值

  • 注意,如果CSS的样式名中含有-
    这种名称在JS中是不合法的,如background-color
    需要将这种样式名修改为驼峰命名法,去掉-,然后将-后的首字母大写

  • 我们通过style属性设置的样式都是内联样式(在html结构标签中写的)
    而内联样式有较高的优先级,所以通过JS修改的样式往往会立即显示
    但是如果在样式中写了!important,则此时样式会有最高的优先级
    即使通过JS也不能覆盖该样式,此时将会导致JS修改样式失效
    所以尽量不要为样式添加!important

  • 通过style属性设置和读取的都是内联样式
    无法读取样式表中的样式

<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
		<title></title>
		<style type="text/css">
			#box1{
				width:200px;
				height: 200px;
				background-color: red;
			}
		</style>
		<script type="text/javascript">
			window.onload = function(){
				/*
				 * 点击按钮1,修改box1的大小
				 */
				//获取box1
				var box1 = document.getElementById("box1");
				//为按钮绑定单击响应函数
				var btn01 = document.getElementById("btn01");
				btn01.onclick = function(){
					//修改box1的大小
					/*
					 * 通过JS修改元素的样式
					 * 		语法:元素.style.样式名 = 样式值
					 * 
					 * 	注意,如果CSS的样式名中含有-
					 * 		这种名称在JS中是不合法的,如background-color
					 * 		需要将这种样式名修改为驼峰命名法,去掉-,然后将-后的首字母大写
					 * 
					 * 我们通过style属性设置的样式都是内联样式(在html结构标签中写的)
					 * 		而内联样式有较高的优先级,所以通过JS修改的样式往往会立即显示
					 * 		但是如果在样式中写了!important,则此时样式会有最高的优先级
					 * 		即使通过JS也不能覆盖该样式,此时将会导致JS修改样式失效
					 * 		所以尽量不要为样式添加!important
					 * 
					 */
					box1.style.width = "300px";
					box1.style.height = "300px";
					box1.style.backgroundColor = "yellow";
				}
				
				//点击按钮2,读取元素的样式
				var btn02 = document.getElementById("btn02");
				btn02.onclick = function(){
					//读取box1的样式
					/*
					 * 语法:元素.style.样式名
					 * 
					 * 通过style属性设置和读取的都是内联样式
					 * 		无法读取样式表中的样式
					 */
					alert(box1.style.backgroundColor);
				}
			};
			
			
		</script>
	</head>
	<body>
		<button id="btn01">点我一下1</button>
		<button id="btn02">点我一下2</button><br /><br />
		<div id="box1"></div>
	</body>
</html>

2、读取元素样式

  • 通过currentStyle和getComputedStyle()读取到的样式都是只读的
    不能修改,如果要修改必须通过Style属性

  • 获取元素的当前显示的样式
    语法: 元素.currentStyle.样式名;
    它可以用来读取当前元素正在显示的样式
    如果当前元素没有设置样式,则获取它的默认值

  • 获取元素的当前显示的样式
    语法: getComputedStyle(元素,null).样式名;
    这个方法是window的方法,可以直接使用
    需要两个参数:
    第一个:要获取样式的元素
    第二个:可以传递一个伪元素,一般都传null
    它可以用来读取当前元素正在显示的样式
    该方法会返回一个对象,对象中封装了当前元素对应的样式
    可以通过对象.样式名来读取样式
    比如:没有设置width,它不会获取到auto,而是一个长度
    但是该方法不支持IE及以下

<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
		<title></title>
		<style type="text/css">
			#box1{
			
				height: 200px;
				background-color: red;
			}
		</style>
		<script type="text/javascript">
			window.onload = function(){
				/*
				 * 点击按钮1,修改box1的大小
				 */
				//获取box1
				var box1 = document.getElementById("box1");
				//为按钮绑定单击响应函数
				var btn01 = document.getElementById("btn01");
				btn01.onclick = function(){
					/*
					 * 通过currentStyle和getComputedStyle()读取到的样式都是只读的
					 * 不能修改,如果要修改必须通过Style属性
					 */
					
					/*
					 * 获取元素的当前显示的样式
					 * 		语法: 元素.currentStyle.样式名;
					 * 		它可以用来读取当前元素正在显示的样式
					 * 		如果当前元素没有设置样式,则获取它的默认值
					 * 		currentStyle只支持IE浏览器,其他的浏览器不支持
					 */ 
					 //alert(box1.currentStyle.width);
					
					/*
					 * 获取元素的当前显示的样式
					 * 		语法: getComputedStyle(元素,null).样式名;
					 * 		这个方法是window的方法,可以直接使用
					 * 		需要两个参数:
					 * 			第一个:要获取样式的元素
					 * 			第二个:可以传递一个伪元素,一般都传null
					 * 		它可以用来读取当前元素正在显示的样式
					 * 		该方法会返回一个对象,对象中封装了当前元素对应的样式
					 * 		可以通过对象.样式名来读取样式
					 * 		如果获取的样式没有设置,则会获取到真实的值,而不是默认值
					 * 		比如:没有设置width,它不会获取到auto,而是一个长度
					 * 		但是该方法不支持IE及以下
					 */     
					var obj = getComputedStyle(box1,null);
					alert(obj.width);
				};
			};	
		</script>
	</head>
	<body>
		<button id="btn01">点我一下1</button><br /><br />
		<div id="box2" style="position:relative;">
			<div id="box1"></div>
		</div>
	</body>
</html>

3、读取元素样式(不限浏览器类型

<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
		<title></title>
		<style type="text/css">
			#box1{
			
				height: 200px;
				background-color: red;
			}
		</style>
		<script type="text/javascript">
			window.onload = function(){
				/*
				 * 点击按钮1,修改box1的大小
				 */
				//获取box1
				var box1 = document.getElementById("box1");
				//为按钮绑定单击响应函数
				var btn01 = document.getElementById("btn01");
				btn01.onclick = function(){

					var w = getStyle(box1,"width");
				};
			};
			/*
			 * 定义一个函数,用来获取指定元素的当前的样式
			 * 参数
			 * 		obj: 要获取的样式的元素
			 * 		name:要获取的样式名
			 */
			function getStyle(obj,name){
				//方法一
				if(window.getComputedStyle){
					//正常浏览器方式
					return getComputedStyle(obj,null)[name];
				}else{
					//IE8方式
					return obj.currentStyle[name];
				}
				
				//方法二
//				if(obj.currentStyle){
//					//IE8方式
//					return obj.currentStyle[name];
//				}else{
//					//正常浏览器方式
//					return getComputedStyle(obj,null)[name];
//				}
			}
		</script>
	</head>
	<body>
		<button id="btn01">点我一下1</button><br /><br />
		<div id="box1"></div>
	</body>
</html>```

4、其他样式相关的属性

a、 clientWidth, clientHeight

这两个属性可以获取元素的可见宽度和高度,包括内容区和内边距
这些属性都是不带px的,返回都是一个数字,可以直接进行计算
这些属性都是只读的,不能修改

<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
		<title></title>
		<style type="text/css">
			#box1{
				width: 200px;
				height: 200px;
				background-color: red;
			}
		</style>
		<script type="text/javascript">
			window.onload = function(){
				var box1 = document.getElementById("box1");
				var btn01 = document.getElementById("btn01");
				btn01.onclick = function(){
					/*
					 * clientWidth
					 * clientHeight
					 * - 这两个属性可以获取元素的可见宽度和高度,包括内容区和内边距
					 * - 这些属性都是不带px的,返回都是一个数字,可以直接进行计算
					 * - 这些属性都是只读的,不能修改
					 */
					alert(box1.clientWidth);
					alert(box1.clientHeight);
				};
			};
			
		</script>
	</head>
	<body>
		<button id="btn01">点我一下</button><br /><br />
		<div id="box1"></div>
	</body>
</html>

b、 offsetWidth, offsetHeight

获取元素的整个宽度和高度,包括内容区、内边距、边框

<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
		<title></title>
		<style type="text/css">
			#box1{
				width: 200px;
				height: 200px;
				background-color: red;
			}
		</style>
		<script type="text/javascript">
			window.onload = function(){
				var box1 = document.getElementById("box1");
				var btn01 = document.getElementById("btn01");
				btn01.onclick = function(){
					/*
					 * offsetWidth
					 * offsetHeight
					 * - 获取元素的整个宽度和高度,包括内容区、内边距、边框
					 */
					alert(box1.offsetWidth);
				};
			};
			
		</script>
	</head>
	<body>
		<button id="btn01">点我一下</button><br /><br />
		<div id="box1"></div>
	</body>
</html>

c、offsetParent

可以用来获取当前元素的定位父元素
会获取到离当前元素最近的开启了定位(position不是static)的祖先元素
如果所有的祖先元素都没有开启定位,则返回body

<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
		<title></title>
		<style type="text/css">
			#box1{
				width: 200px;
				height: 200px;
				background-color: red;
			}
		</style>
		<script type="text/javascript">
			window.onload = function(){
				var box1 = document.getElementById("box1");
				var btn01 = document.getElementById("btn01");
				btn01.onclick = function(){
					/*
					 * offsetParent
					 * - 可以用来获取当前元素的定位父元素
					 * - 会获取到离当前元素最近的开启了定位(position不是static)的祖先元素
					 * - 如果所有的祖先元素都没有开启定位,则返回body
					 */
					var op = box1.offsetParent;
					alert(op);
				};
			};
			
		</script>
	</head>
	<body>
		<button id="btn01">点我一下</button><br /><br />
		<div id="box1"></div>
	</body>
</html>

d、offsetLeft,offsetTop

offsetLeft:当前元素相对于其定位父元素的水平偏移量;
offsetTop:当前元素相对于其定位父元素的垂直偏移量

<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
		<title></title>
		<style type="text/css">
			#box1{
				width: 200px;
				height: 200px;
				background-color: red;
			}
		</style>
		<script type="text/javascript">
			window.onload = function(){
				var box1 = document.getElementById("box1");
				var btn01 = document.getElementById("btn01");
				btn01.onclick = function(){
					/*
					 * offsetLeft:当前元素相对于其定位父元素的水平偏移量
					 * offsetTop:当前元素相对于其定位父元素的垂直偏移量
					 */
					alert(box1.offsetLeft);
				};
			};
			
		</script>
	</head>
	<body>
		<button id="btn01">点我一下</button><br /><br />
		<div id="box1"></div>
	</body>
</html>

e 、scrollWidth、scrollHeight

可以获取元素整个滚动区域德宽度和高度,即滚动区域内原子元素的高度和宽度

<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
		<title></title>
		<style type="text/css">
			#box2{
				width:200px;
				height:200px;
				background-color: #bfa;
				overflow: auto;
			}
			#box3{
				width:150px;
				height:600px;
				background-color: yellow;
			}
		</style>
		<script type="text/javascript">
			window.onload = function(){
				var box2 = document.getElementById("box2");
				var btn01 = document.getElementById("btn01");
				btn01.onclick = function(){
					/*
					 * scrollWidth
					 * scrollHeight
					 * 可以获取元素整个滚动区域德宽度和高度,即滚动区域内原子元素的高度和宽度
					 */
					alert(box2.scrollHeight);
				};
			};
			
		</script>
	</head>
	<body>
		<button id="btn01">点我一下</button><br /><br />
		<div id="box2">
			<div id="box3"></div>
		</div>
	</body>
</html>

f、scrollLeft、scrollTop

可以获取水平滚动条和垂直滚动条移动的距离

<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
		<title></title>
		<style type="text/css">
			#box2{
				width:200px;
				height:200px;
				background-color: #bfa;
				overflow: auto;
			}
			#box3{
				width:150px;
				height:600px;
				background-color: yellow;
			}
		</style>
		<script type="text/javascript">
			window.onload = function(){
				var box2 = document.getElementById("box2");
				var btn01 = document.getElementById("btn01");
				btn01.onclick = function(){
					/*
					 * scrollLeft:
					 * scrollTop
					 * 可以获取水平滚动条和垂直滚动条移动的距离
					 */
					alert(box2.scrollTop);
				};
			};
			
		</script>
	</head>
	<body>
		<button id="btn01">点我一下</button><br /><br />
		<div id="box2">
			<div id="box3"></div>
		</div>
	</body>
</html>

g、滚动条是否滚动到底验证

  • 当满足scrollHeight - scrollTop == clientHeight
    说明垂直滚动条滚动到底了
  • 当满足scrollWidth - scrollLeft == clientWidth
    说明水平滚动条滚动到底了

5、案例 (注册协议页面制作)

协议不阅读完,不能点下面的注册按钮

<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
		<title></title>
		<style type="text/css">
		 	#info{
		 		width: 250px;
		 		height:300px;
		 		overflow: auto;
		 	}	
		</style>
		<script type="text/javascript">
			window.onload = function(){
				/*
				 * 当垂直滚动条滚动到底时,表单可用
				 * onscroll
				 * - 该事件会在元素的滚动条滚动时触发
				 */
				
				//获取id为info的p元素
				var info = document.getElementById("info");
				//根据标签名获取表单项
				var inputs = document.getElementsByTagName("input");
				info.onscroll = function(){
					//检查垂直滚动条是否滚动到底
					if(info.scrollHeight - info.scrollTop == info.clientHeight){
						//滚动条滚动到底,表单项可用
						inputs[0].disabled = false;
						inputs[1].disabled = false;
					}
					
				}
				
			};
			
			
		</script>
	</head>
	<body>
		<h3>欢迎亲爱的用户注册</h3>
		<p id="info">
			协议正文,</br><!--[if IE]>
				
			<![endif]-->条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,
			条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n
			条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n
			条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n
			条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n
			条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n
			条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n
			条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n
			条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n
			条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n
			条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n
			条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n
			条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n
			条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n
			条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n
			条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n
			
			条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n
			条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n,条款n
		</p>
<!--		如果为表单项添加disabled="disabled" 则表单项将变成不可用的状态-->
		<input type="checkbox" disabled="disabled"/>我已仔细阅读协议内容
		<input type="submit" value="注册" disabled="disabled"/>
	</body>
</html>

运行结果:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值