JavaScript_04 快速入门 JS与CSS的交互

目录

一、JS获取与CSS交互

             问题:

            1.1 行内样式

            1.2 非行内样式

            1.3 案例大全

二、JavaScript 特效之四大家族(offset/scroll/client/event)  

               三大系列:offset、scroll、client               事件对象:event(事件被触动时,鼠标和键盘的状态)(通过属性控制)               2.1 offset 系列

                2.2 client 系列  

                2.3 Scroll 系列

         2.4 event 事件对象

         2.5 三大家族区别(总结)

        2.6 获得屏幕宽高

三、JavaScript 获取特定的 CSS属性值

四、兼容问题 

五、案例

                1.获取鼠标指针的坐标:

                2.球窗口滚动:


一、JS获取与CSS交互

             问题:

                        (1)CSS样式有三种类型:行内样式内部样式外部样式
                        (2)JavaScript获取CSS样式时分为两种情况:行内样式获取法 和 非行内样式获取法。

            1.1 行内样式

                        通过element.style.attr(元素.style.属性)即可获取可设置

            1.2 非行内样式

                        获取法,因浏览器的不同又分为两种,即基于IE浏览器的 和 非IE浏览器的如谷歌火狐等。
                        基于IE浏览器的非行内获取法:通过 element.currentStyle['attr']
                        基于非IE如火狐谷歌等非行内获取法:通过 getComputedStyle(element.null/伪类)[attr]
                     【注意事项】非行内样式获取法,只能获取不能设置。

                            函数封装,方便多次调用:兼容所有的浏览器,包括IE6  7

            1.3 案例大全

                        (1)实现鼠标移入移除改变图片的边框颜色----导航效果

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
	<style type="text/css">
		*{margin: 0px;padding: 0px}
		ul{list-style: none}
		#oDiv{
			margin: 0 auto;
			width: 80%;
		}
		ul li{
			float: left
		}
		ul li a{
			display: inline-block;
			width: 103px;
			height: 30px;
			text-decoration: none;
			background-image: url('img/bg1.gif');
			margin-left: 1px;
			font-size: 12px;
			text-align: center;
			line-height: 30px;
			color: white;
		}
	</style>
	<script type="text/javascript">
		window.onload = function(){
			var aa = document.getElementsByTagName("a");
			for(var i = 0;i<aa.length;i++){
				aa[i].onmouseover = function(){
					this.style.color = 'yellow';
					this.style.backgroundImage = 'url(img/bg2.gif)';
				};

				aa[i].onmouseout = function(){
					this.style.color = 'white';
					this.style.backgroundImage = 'url(img/bg1.gif)';
				};
			}
		};
	</script>
</head>
<body>
	<div id="oDiv">
		<ul>
			<li><a href ="">我的空间</a></li>
			<li><a href ="">我的照片</a></li>
			<li><a href ="">我的说说</a></li>
			<li><a href ="">我的日志</a></li>
			<li><a href ="">我的朋友</a></li>
		</ul>
	</div>
</body>
</html>

二、JavaScript 特效之四大家族(offset/scroll/client/event)
  

               三大系列:offset、scroll、client
               事件对象:event(事件被触动时,鼠标和键盘的状态)(通过属性控制)
               2.1 offset 系列

                         offset:偏移量,使用offset系列相关属性可以动态的得到该元素的位置(偏移)、大小等。
                        a.获得元素距离带有定位父元素的位置
                        b.获得元素自身的大小(宽度高度)


                        (1) offsetWidth offsetHeight (检测盒子自身宽高+padding+border)
                                            ** offsetWidth = width + padding + border;
                                            ** offsetHeight = Height + padding + border;


                        (2) offsetLeft 和 offsetTop  (检测距离父盒子有定位的左/上面的距离)
                            返回距上级盒子中带有定位的盒子左边和上边的距离。和盒子本身有无定位无关。
                            如果父级都没有定位则以 body 为准。
                            offsetLeft 从父级的 padding 开始算,父级的 border 不算。
                            在父盒子有定位的情况下,offsetLeft == style.left (去掉px)


                        (3) offsetLeftstyle.left 区别

                                    ① 最大区别在于offsetLeft 可以返回没有定位盒子的距离左侧的位置。 而 style.left不可以。
                                    ② offsetLeft 返回的是数字,而 style.left 返回的是字符串,除了数字外还带有单位:px。
                                    ③ offsetTop 只读,而 style.top 可读写。(只读是获取值,可写是赋值)
                                    ④ 如果没有给 HTML 元素指定过 top 样式,则style.top 返回的是空字符串。
                (style.left在等号的左边和右边还不一样。左边的时候是属性,右边的时候是值。)


                2.2 client 系列  

                             client 翻译过来就是客户端,我们使用 client 系列的相关属性来获取元素可视区的相关信息。通过 client 系列的相关属性可以动态的得到该元素的边框大小、元素大小等。    

                        (1)clientWidthclientHeight
                                    clientWidth:获取网页可视区域宽度(两种用法)
                                    clientHeight:获取网页可视区域高度(两种用法)
                                    调用者不同,意义不同:
                                    盒子调用,指盒子本身;body/html调用,指可视区域大小。 


                         (2)clientXclientY

属性

描述

clientX  

返回当事件被触发时,鼠标指针的水平坐标。

clientY

返回当事件被触发时,鼠标指针的垂直坐标。

        clientX 事件属性返回当事件被触发时鼠标指针向对于浏览器页面(或客户区)的水平坐标。

客户区指的是当前窗口。语法:

                                                event.clientX

        clientY 事件属性返回当事件被触发时鼠标指针向对于浏览器页面(客户区)的垂直坐标。

客户区指的是当前窗口。语法

                                                event.clientY
                        (3) clientTop clientLeft  
                                     获取盒子的 border 宽高
                
                        (4)获取屏幕的可视区

   var width =
                 (document.documentElement.clientWidth || document.body.clientWidth
   var height = 
            (document.documentElement.clientHeight || document.body.clientHeight)
             

                2.3 Scroll 系列

                        scroll 翻译过来就是滚动的,我们使用 scroll 系列的相关属性可以动态的得到该元素的大小、滚动距离等。

                (1)ScrollWidthscrollHeight(不包括border)
                            检测盒子的宽高。(调用者:节点元素。属性。)
                            盒子内容的宽高。(如果有内容超出了,显示内容的高度)
                            IE567可以比盒子小。 IE8+火狐谷歌不能比盒子小
                 (2)scrollTopscrollLeft
                            网页,被浏览器遮挡的头部和左边部分。
                            被卷去的头部和左边部分。

​
<script type="text/javascript">
var va;
var vb;
//得到ID的位置
function myload(){
  var da=document.getElementById("id");
  va=da.currentStyle.top;
  vb=da.currentStyle.left;
  alert(va+"   "+vb);  
}
//得到滚动
function mymove(){
  var ga=document.documentElement.scrollTop;
  var gb=document.documentElement.scrollLeft;
  alert(ga+"   "+gb);
}

​


                 (3)有兼容性问题
                            ① 未声明 DTD 时(谷歌只认识他)
                            document.body.scrollTop
                            ② 已经声明DTD 时(IE678只认识他)
                            document.documentElement.scrollTop
                            ③ 火狐/谷歌/ie9+以上支持的
                            window.pageYOffset


                (4)

var top = 
    window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop;
var top = 
            document.documentElement.scrollTop + document.body.scrollTop;  

         2.4 event 事件对象

                (1)概述
                        在触发DOM上的某个事件时,会产生一个事件对象event,这个对象中包含着所有与事件有关的信息。
                        所有浏览器都支持event对象,但支持的方式不同。
                        比如鼠标操作时候,会添加鼠标位置的相关信息到事件对象中。(类似Date)
                        普通浏览器支持 event(带参,任意参数)
                        ie 678 支持 window.event(无参,内置)
        总结:他是一个事件中的内置对象。内部装了很多关于鼠标和事件本身的信息。

                (2) 事件对象 event 的获取

                        IE678中,window.event 
                        在火狐谷歌中,event或者,在事件绑定的函数中,加参,这个参数就是event.
                        Box.onclick = function (aaa){   aaa就是event     }
 
                (3) 兼容获取方式有两种:
                        不写参数直接使用event;
                        写参数,但是参数为event
                         var event  = event || window.event;(主要用这种)

                 (4) screenX、pageX 和 clientX 的区别

                         pageY/pageX: 鼠标位于整个网页页面的顶部和左侧部分的距离。(页面)
                        pcreenY/screenX: 鼠标位于屏幕的上方和左侧的距离。(屏幕)
                        clientX/clientY: 鼠标位于浏览器的左侧和顶部的距离。(浏览器大小和位置)
 
                  (5) pageY 和 pageX 的兼容写法
                                在页面的位置 = 看得见的 + 看不见的
                        pageY/pageX=event.clientY/clientX+scroll().top/scroll().left 


         2.5 三大家族区别(总结)

                (1) Width 和 height
                            clientWidth  = width  + padding
                            clientHeight  = height + padding
                            offsetWidth  = width  + padding + border
                            offsetHeight  = height + padding + border
                            scrollWidth   = 内容宽度(不包含border)
                            scrollHeight  = 内容高度(不包含border)


                 (2) top 和 left
                            offsetTop/offsetLeft :


                                 调用者:任意元素。(盒子为主)  作用:距离父系盒子中带有定位的距离。scrollTop/scrollLeft:(盒子也可以调用,必须有滚动条)

调用者:document.body.scrollTop/.....(window)
                 作用:浏览器无法显示的部分(被卷去的部分)
                            clientY/clientX:(clientTop/clientLeft 值的是border)
                 调用者:event.clientX(event)
                 作用:鼠标距离浏览器可视区域的距离(左、上)

        2.6 获得屏幕宽高

                 window.screen.width  
                window.screen.height  

                分辨率是屏幕图像的精密度,指显示器所能显示的像素有多少。

三、JavaScript 获取特定的 CSS属性值

               JavaScript代码获得CSS文件声明特定样式某属性值。如:
  这样情况,直接通过JS进行getElementById(’myArticle’).style.width无法获取400px值,因这数值定CSS里,所,必须其方法,写函数:

 Example Source Code
<link id="system_style" type="text/css" href="global.css" rel="stylesheet"/>
global.css声明
 Example Source Code
#myArticle{
width:400px;
height:300px;
}

<div id="myArticle">
...
</div>
 Example Source Code

    function getStyleValue(css_file_id,labname,param) 
    { 
        var tar; 
        var rss; 
        var style; 
        var value; 
        
        tar = document.styleSheets[css_file_id]; 
  
        rss = tar.cssRules?tar.cssRules:tar.rules 
        
        for(i=0;i<rss.length;i++) 
        { 
            style = rss[i]; 
            if(style.selectorText.toLowerCase() == labname.toLowerCase()) 
            { 
                value = style.style[param]; 
            } 
        } 
        return value; 
    }

          现只通过:
                         Example Source Code
                                getStyleValue(0,'#myArticle','width')
                                        获得400px

                CSSStyleSheet对象

                        通过 document.styleSheets 访问到CSSStyleSheet的集合。其中每一个元素是一个CSSStyleSheet,就是从样式文件引入或用<style type="text/css"></style>定义的一个样式列表。

                        属性disabled : true or false ,该样式是否可用。

                        属性cssRules : 所有样式的列表,在ie中要用rules 

                         useage : document.styleSheets[0].cssRules[0].selectorText

                CSSStyleRule对象

                        上面的cssRules 取到的就是CSSStyleRule对象的集合,每一个CSSStyleRule对象就是一条css样式。

                        cssText属性:以字符串形式表示了当前状态的全部规则(ie不支持)。

                        useage : document.styleSheets[0].cssRules[0].cssText

                        selectorText 属性: 规则的选择符。(.className)

                        style属性 : 与HTMLElement.style取得的对象类似,取得了一个CSSStyleDeclaration对象的引用。

                  CSSStyleDeclaration对象

                        上面style属性取到的就是一个CSSStyleDeclaration对象,包含了一条样式的所有样式属性。

                        cssText属性:以字符串形式表示了当前状态的全部规则(ie可以支持这个)。

                        useage : document.styleSheets[0].cssRules[0].style.cssText

四、兼容问题 

                4.1.关于获取行外样式 currentStyle 和 getComputedStyle 出现的兼容性问题
                          我们都知道js通过style不可以获取行外样式,当我们需要获取行外样式时:
                          我们一般通过这两个方法获取行外样式:
                                  IE下: currentStyle
                                  Chrome,FF下: getComputedStyle(oDiv,false)

   兼容两个浏览器的写法:
        if(oDiv.currentStyle){
            alert(oDiv.currentStyle.width);
        }else{
            alert(getComputedStyle(oDiv,false).width);
        }
    *注:在解决很多兼容性写法时,都是用if..else..

    封装一个获取行外样式的函数:(兼容所有浏览器,包括低版本IE6,7)
        function getStyle(obj,name){
            if(obj.currentStyle){
                //IE
                return obj.currentStyle[name];
            }else{
                //Chrom,FF
                return getComputedStyle(obj,false)[name];
            }
        }
	var oDiv = document.getElementById("id")
    调用:getStyle(oDiv,'width');

                4.2.关于用“索引”获取字符串每一项出现的兼容性问题:
                          对于字符串也有类似于 数组 这样的通过 下标索引 获取每一项的值

  var str="abcde";
    aletr(str[1]);
    但是低版本的浏览器IE6,7不兼容
    兼容方法:str.charAt(i)    //全部浏览器都兼容
    var str="abcde";
    for(var i=0;i<str.length;i++){
      alert(str.charAt(i));   //放回字符串中的每一项
    }

                4.3.关于DOM中 childNodes 获取子节点出现的兼容性问题
                          childNodes:获取子节点,
                    --IE6-8:获取的是元素节点,正常
                    --高版本浏览器:但是会包含文本节点和元素节点(不正常)
                  解决方法: 使用nodeType:节点的类型,并作出判断
                      --nodeType=3-->文本节点
                      --nodeTyPE=1-->元素节点 

例: 获取ul里所有的子节点,让所有的子节点背景色变成红色
  获取元素子节点兼容的方法:
  var oUl=document.getElementById('ul');
  for(var i=0;i<oUl.childNodes.length;i++){
    if(oUl.childNodes[i].nodeType==1){
      oUl.childNodes[i].style.background='red';
    }
  }

          注:上面childNodes为我们带来的困扰完全可以有children属性来代替。
              children属性:只获取元素节点,不获取文本节点,兼容所有的浏览器,
              比上面的好用所以我们一般获取子节点时,最好用children属性。
                      var oUl=document.getElementById('ul');
                      oUl.children.style.background="red";

                4.4.关于使用 firstChild,lastChild 等,获取第一个/最后一个元素节点时产生的问题
  --IE6-8下: firstChild,lastChild,nextSibling,previousSibling,获取第一个元素节点 

   (高版本浏览器IE9+,FF,Chrome不兼容,其获取的空白文本节点)
  --高版本浏览器下: firstElementChild,lastElementChild,nextElementSibling,previousElementSibling
      (低版本浏览器IE6-8不兼容)
  --兼容写法: 找到ul的第一个元素节点,并将其背景色变成红色
    var oUl=document.getElementById('ul');
    if(oUl.firstElementChild){
      //高版本浏览器
      oUl.firstElementChild.style.background='red';
    }else{
      //IE6-8
      oUl.firstChild.style.background='red';
    }

                 4.5.关于使用 event对象,出现的兼容性问题

 如: 获取鼠标位置
            IE/Chrom: event.clientX;event.clientY
            FF/IE9以上/Chrom: 传参ev--> ev.clientX;ev.clientY
    获取event对象兼容性写法: var oEvent==ev||event;
        document.oncilck=function(ev){
            var oEvent==ev||event;
            if(oEvent){
                alert(oEvent.clientX);
            }
        }

                4.6.关于为一个元素绑定两个相同事件:attachEvent/attachEventLister 出现的兼容问题
    事件绑定:(不兼容需要两个结合做兼容if..else..)

                    IE8以下用: attachEvent('事件名',fn);
                    FF,Chrome,IE9-10用: attachEventLister('事件名',fn,false);
                    多事件绑定封装成一个兼容函数: 

  function myAddEvent(obj,ev,fn){
      if(obj.attachEvent){
        //IE8以下
        obj.attachEvent('on'+ev,fn);
      }else{
        //FF,Chrome,IE9-10
        obj.attachEventLister(ev,fn,false);
      }
    }
    myAddEvent(oBtn,'click',function(){
      alert(a);
    });
    myAddEvent(oBtn,'click',function(){
      alert(b);
    });

                4.7.关于获取滚动条距离而出现的问题
                  当我们获取滚动条滚动距离时: 

  IE,Chrome: document.body.scrollTop
        FF: document.documentElement.scrollTop
兼容处理:var scrollTop=document.documentElement.scrollTop||document.body.scrollTop

                4.8.获取屏幕的可视区 

var width = (document.documentElement.clientWidth || document.body.clientWidth)
var height = (document.documentElement.clientHeight || document.body.clientHeight)

                4.9.获得鼠标位置(兼容多浏览器ie,firefox) 

function mouseCoords(ev) {
    if (ev.pageX || ev.pageY) {
	return {
	    x: ev.pageX,
	    y: ev.pageY
	};
    }
    return {
	x: ev.clientX + document.body.scrollLeft - document.body.clientLeft,
 	y: ev.clientY + document.body.scrollTop - document.body.clientTop
    };
}

                 4.10.获取鼠标触碰页面的位置

ev = ev || window.event;
var mousePos = mouseCoords(ev);
// alert(ev.pageX); 
// alert(mousePos.x);
da.style.left = mousePos.x+"px";
// alert(getStyle(da,"left"));
da.style.top = mousePos.y+"px";

五、案例

                1.获取鼠标指针的坐标:

//下面的例子可显示出事件发生时鼠标指针的坐标:
<html>

<head>

<script type="text/javascript">

function show_coords(event)

  {

  x=event.clientX

  y=event.clientY

  alert("X coords: " + x + ", Y coords: " + y)

  }

</script>

</head>

<body onmousedown="show_coords(event)">

<p>Click in the document. An alert box will alert

the x and y coordinates of the mouse pointer.</p>

</body>

</html>

                2.球窗口滚动:

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
	<style type="text/css">
		#oDiv{
			width: 100px;
			height: 100px;
			background-color: red;
			position: absolute;
			top: 100px;
			left:0px;
			/*盒子的圆弧度*/
			border-radius: 100%;
		}
	</style>
	<script type="text/javascript">
		//方法:获取非行内式样式
		function getStyle(obj,name){//obj:操作哪一个标签 name:该标签的属性
		    if(obj.currentStyle){//兼容IE
				return obj.currentStyle[name];
		    }else{//兼容非IE浏览器---谷歌  火狐等等
				return getComputedStyle(obj,false)[name];
		    }
		}
		/**
		 * client浏览器窗口可视区域兼容性
		 */
		function client() {
			if (window.innerWidth != null) // ie9 +  最新浏览器
			{
				return {
					width: window.innerWidth,
					height: window.innerHeight
				}
			} else if (document.compatMode === "CSS1Compat") // 标准浏览器
			{
				return {
					width: document.documentElement.clientWidth,
					height: document.documentElement.clientHeight
				}
			}
			return { // 怪异浏览器
				width: document.body.clientWidth,
				height: document.body.clientHeight

			}
		}
	window.onload = function(){
		var oDiv = document.getElementById("oDiv");
		var flag = true;
		var flag2 = true;
		window.setInterval(function(){
			var left = parseInt(getStyle(oDiv,"left"));
			var top = parseInt(getStyle(oDiv,"top"));

			var width = (document.documentElement.clientWidth || document.body.clientWidth)-oDiv.offsetWidth;

			var height = (document.documentElement.clientHeight || document.body.clientHeight)-oDiv.offsetHeight;
			
			if(flag == true){
				left+=5;
			}
			if(left >= width){
				flag = false;
			}
			if(flag == false){
				left-=5;
			}
			if(left<=0){
				flag=true;
			}

			if(flag2 == true){
				top+=5
			}
			if(top >= height){
				flag2 = false;
			}
			if(flag2 == false){
				top-=5;
			}
			if(top<=0){
				flag2=true;
			}


			
			oDiv.style.left = left+'px';
			oDiv.style.top = top+'px';

		},50);
	};

	</script>
</head>
<body>
	<div id="oDiv">


	</div>
</body>
</html>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值