javascript与CSS复习(《精通javascript》)

如:elem.style.height 或者 elem.style.height = '100px', 这里要注意的是设置任何几何属性必须明确尺寸单位(如px),同时任何几何属性返回的是表示样式的字符串而非数值(如'100px'而非100)。另外像elem.style.height这样的操作,也能获取元素style属性中设置的样式值,如果你把样式统一放在css文件中,上述方法只会返回一个空串。为了获取元素真实、最终的样式,书中给出了一个函数


代码如下:

//get a style property (name) of a specific element (elem)
function getStyle(elem, name) {
  // if the property exists in style[], then it's been set
  //recently (and is current)
if(elem.style[name]) return elem.style[name];
//otherwise, try to use IE's method
else if (elem.currentStyle) return elem.currentStyle[name];
//Or the W3C's method, if it exists
else if (document.defaultView && document.defaultView.getComputedStyle) {
      //it uses the traditional 'text-align' style of rule writing
      //instead of textAlign
name = name.replace(/[A-Z]/g, '-$1');
name = name.toLowerCase();
//get the style object and get the value of the property ( if it exists)
      var s = document.defaultView.getComputedStyle(elem,'');
return s && s.getPropertyValue(name);
  } else return null;
}

理解如何获取元素的在页面的位置是构造交互效果的关键。先复习下css中position属性值的特点。
static:静态定位,这是元素定位的默认方式,它简单的遵循文档流。但元素静态定位时,top和left属性无效。
relative:相对定位,元素会继续遵循文档流,除非受到其他指令的影响。top和left属性的设置会引起元素相对于它的原始位置进行偏移。
absolute:绝对定位,绝对定位的元素完全摆脱文档流,它会相对于它的第一个非静态定位的祖先元素而展示,如果没有这样的祖先元素,它的定位将相对于整个文档。
fixed:固定定位把元素相对于浏览器窗口而定位。它完全忽略浏览器滚动条的拖动。
作者封装了一个跨浏览器的获取元素页面位置的函数
其中有几个重要元素的属性:offsetParent,offsetLeft,offsetTop(可直接点击到Mozilla Developer Center的相关页面)


代码如下:

//find the x (horizontal, Left) position of an element
function pageX(elem) {
  //see if we're at the root element, or not
return elem.offsetParent ?
//if we can still go up, add the current offset and recurse upwards
      elem.offsetLeft + pageX(elem.offsetParent) :
      //otherwise, just get the current offset
      elem.offsetLeft;
}
//find the y (vertical, top) position of an element
function pageY(elem) {
  //see if we're at the root element, or not
  return elem.offsetParent ?
//if we can still go up, add the current offset and recurse upwards
   elem.offsetTop + pageY(elem.offsetParent) :
//otherwise, just get the current offset
elem.offsetTop;
}

我们接着要获得元素相对于它父亲的水平和垂直位置,使用元素相对于父亲的位置,就可以为DOM增加额外的元素,并相对定位于它的父亲。


代码如下:

//find the horizontal position of an element within its parent
function parentX(elem) {
  //if the offsetParent is the element's parent, break early
  return elem.parentNode == elem.offsetParent ?
elem.offsetLeft :
// otherwise, we need to find the position relative to the entire
// page for both elements, and find the difference
pageX(elem) - pageX(elem.parentNode);
}
//find the vertical positioning of an element within its parent
function parentY(elem) {
  //if the offsetParent is the element's parent, break early
return elem.parentNode == elem.offsetParent ?
    elem.offsetTop :
// otherwise, we need to find the position relative to the entire
// page for both elements, and find the difference
pageY(elem) - pageY(elem.parentNode);
}

元素位置的最后一个问题,获取元素当对于css定位(非static)容器的位置,有了getStyle这个问题很好解决


代码如下:

//find the left position of an element
function posX(elem) {
  //get the computed style and get the number out of the value
return parseInt(getStyle(elem, 'left'));
}
//find the top position of an element
function posY(elem) {
  //get the computed style and get the number out of the value
return parseInt(getStyle(elem, 'top'));
}

接着是设置元素的位置,这个很简单。


代码如下:

//a function for setting the horizontal position of an element
function setX(elem, pos) {
  //set the 'left' css property, using pixel units
  elem.style.left = pos + 'px';
}
//a function for setting the vertical position of an element
function setY(elem, pos) {
  //set the 'top' css property, using pixel units
  elem.style.top = pos + 'px';
}

再来两个函数,用于调准元素的当前位置,在动画效果中很实用


代码如下:

//a function for adding a number of pixels to the horizontal
//position of an element
function addX(elem, pos) {
  //get the current horz. position and add the offset to it
setX(elem, posX(elem) + pos);
}
//a function that can be used to add a number of pixels to the
//vertical position of an element
function addY(elem, pos) {
  //get the current vertical position and add the offset to it
setY(elem, posY(elem) + pos);
}

知道如何获取元素位置之后,我们再来看看如何获取元素的尺寸,
获取元素当前的高度和宽度


代码如下:

function getHeight(elem) {
  return parseInt(getStyle(elem, 'height'));
}
function getWidth(elem) {
  return parseInt(getStyle(elem, 'width'));
}

大多数情况下,以上的方法够用了,但是在一些动画交互中会出现问题。比如以0像素开始的动画,你需要事先知道元素究竟能有多高或多宽,其二当元素的display属性为none时,你会得不到值。这两个问题都会在执行动画的时候发生。为此作者给出了获得元素潜在高度和宽度的函数。


代码如下:

//查找元素完整的、可能的高度
function fullHeight(elem) {
  //如果元素是显示的,那么使用offsetHeight就能得到高度,如果没有offsetHeight,则使用getHeight()
  if(getStyle(elem, 'display') != 'none')
      return elem.offsetHeight || getHeight(elem);
//否则,我们必须处理display为none的元素,所以重置它的css属性以获得更精确的读数
var old = resetCSS(elem, {
  display:'',
visibility:'hidden',
position:'absolute'
});
//使用clientHeigh找出元素的完整高度,如果还不生效,则使用getHeight函数
var h = elem.clientHeight || getHeight(elem);
//最后,恢复其css的原有属性
restoreCSS(elem, old);
//并返回元素的完整高度
return h;
}
//查找元素完整的、可能的宽度
function fullWidth(elem) {
  //如果元素是显示的,那么使用offsetWidth就能得到宽度,如果没有offsetWidth,则使用getWidth()
if(getStyle(elem, 'display') != 'none')
    return elem.offsetWidth || getWidth(elem);
//否则,我们必须处理display为none的元素,所以重置它的css以获取更精确的读数
var old = resetCSS(elem, {
   display:'',
visibility:'hidden',
position:'absolute'
});
//使用clientWidth找出元素的完整高度,如果还不生效,则使用getWidth函数
var w = elem.clientWidth || getWidth(elem);
//最后,恢复原有CSS
 restoreCSS(elem, old);
//返回元素的完整宽度
return w;
}
//设置一组CSS属性的函数
function resetCSS(elem, prop) {
  var old = {};
//遍历每个属性
for(var i in prop) {
  //记录旧的属性值
old[i] = elem.style[i];
    //设置新的值
    elem.style[i] = prop[i];
}
return old;
}
//恢复原有CSS属性
function restoreCSS(elem, prop) {
  for(var i in prop)
    elem.style[i] = prop[i];
}

还有不少内容,明天继续,写写效率低下了,笔记本屏幕太小,开个pdf,写着文章老来回切换,真是。。。是时候弄个双显了!

(0)

相关推荐

  • 精通Javascript系列之数据类型 字符串

    js一共有9种数据类型,分别是:未定义(undefined).空(null).布尔型(boolean).字符串(string).数值(number).对象(object).引用(reference).列表(completion).其中后3种仅仅作为JS运行中间结果的数据类型,因此不能在代码中使用,下面先讲一下字符串String: 字符串由零个或者多个字符构成.字符可以包括字母.数字.标点符号和空格.字 符串必须放在单引号或双引号内: -------------------------------

  • 精通JavaScript 纠正 cleanWhitespace函数

    复制代码 代码如下: function cleanWhitespace(element){ //如果不提供参数,则处理整个HTML文档 element = element || document; //使用第一个子节点作为开始指针 var cur = element.firstChild; //临时变量用来保存当前节点的下个节点 var tmp; //一直到没有子节点为止 while (cur != null){ //保存当前节点的下个节点 tmp=cur.nextSibling //如果节点为

  • 精通Javascript系列之Javascript基础篇

    javascrpit的基本概念: 1)区分大小写 与JAVA一样,JS中的变量,函数,运算符以及其他的一切东西都是区分大小写的,例如:变量MyTag与MYTAG是两个不同的变量. 2)弱类型变更.所以谓弱类型变量指的是JS中变量无特定类型,不像C那样.定义变量只用"var",并可以将其初始化为任意的值,这样就可以随便的改变变量所存储数据的类型,不般不推荐: 例:var age=25; var myName="zhangsan"; 3) 每行结尾的分号可有可无: 例:

  • 精通Javascript+jQuery 视频教程 在线观看

    JavaScript/CSS/DOM基础 第0课 - 内容概述 第1课 - JavaScript背景知识 第2课 - JavaScript基础 第3课 - CSS基础 第4课 - CSS进阶 第5课 - DOM模型 JavaScript开发进阶 第6课 - JavaScript事件 第7课 - 表格与表单 第8课 - Javascript调试与优化 第9课 - Ajax jQuery应用 第10课 - jQuery基础 第11课 - jQuery控制页面 第12课 - jQuery动画特效 第1

  • 精通Javascript系列之数值计算

    更直观一点: --------------------- 例:var a=32.6; var b=67; var c=9e5; --------------------- 对于数值类型,如果希望转换为科学计数法,可以采用toExponential()方法,该方法接受一个参数,表示要输出小数倍数: --------------------- 例: var a=78.9; alert(a.toExponential(1)); --------------------- js 中对数值的格式化问题 对

  • javascript与CSS复习(三)

    我们先来看看如何获取光标相对于整个页面的位置,因为光标位置变量x,y一般通过鼠标事件获取(如mousemove或者mousedown),下面两个通用函数,用于获取光标相对于整个页面的当前位置. 复制代码 代码如下: //获取光标的水平位置 function getX(e) { //通用化事件对象 e = e || window.event; //先检查非IE浏览器的位置,在检查IE的位置 return e.pageX || e.clientX + document.body.scrollLeft

  • javascript与CSS复习(《精通javascript》)

    如:elem.style.height 或者 elem.style.height = '100px', 这里要注意的是设置任何几何属性必须明确尺寸单位(如px),同时任何几何属性返回的是表示样式的字符串而非数值(如'100px'而非100).另外像elem.style.height这样的操作,也能获取元素style属性中设置的样式值,如果你把样式统一放在css文件中,上述方法只会返回一个空串.为了获取元素真实.最终的样式,书中给出了一个函数 复制代码 代码如下: //get a style pr

  • javascript与CSS复习(二)

    visibility:在切换元素可见性的同时会保持元素在普通流中的位置和空间.它有两个值:visible(默认的)和hidden(不可见的), 例如: 复制代码 代码如下: <p>Hello <b>John</b>, how are you today?</p> 浏览器中是:Hello John, how are you today? 接着我们把John所在b的visibility设置为hidden后,就会变成这样 Hello , how are you t

  • 你未必知道的JavaScript和CSS交互的5种方法

    随着浏览器不断的升级改进,CSS和JavaScript之间的界限越来越模糊.本来它们是负责着完全不同的功能,但最终,它们都属于网页前端技术,它们需要相互密切的合作.我们的网页中都有.js文件和.css文件,但这并不意味着CSS和js是独立不能交互的.下面要讲的这五种JavaScript和CSS共同合作的方法你也许未必知道! 用JavaScript获取伪元素(pseudo-element)属性 大家都知道如何通过一个元素的style属性获取它的CSS样式值,但能获取伪元素(pseudo-eleme

  • 多浏览器兼容的动态加载 JavaScript 与 CSS第1/2页

    在介绍ensure内部的实现之前,让我们先来看看其功能: ensure({ html: "popup.html", javascript: "popup.js", css: "popup.css" }, function() { Popup.show("hello world"); } ); 在这段代码中,ensure首先会确保popup.html.popup.js.popup.css这3个文件的加载,如果都没加载过ensur

  • ASP.NET MVC Bundles 用法和说明(打包javascript和css)

    在网页中,我们经常需要引用大量的javascript和css文件,在加上许多javascript库都包含debug版和经过压缩的release版(比如jquery),不仅麻烦还很容易引起混乱,所以ASP.NET MVC4引入了Bundles特性,使得我们可以方便的管理javascript和css文件. 原来,我们引用css和javascript文件我们需要这样一个一个的引用: 复制代码 代码如下: <scriptsrc="~/Scripts/jquery-1.8.2.js">

  • JavaScript获取css行间样式,内连样式和外链样式的简单方法

    [行间样式获取] <div id='div1' style="backgroud:red">测试</div> <script> var odiv=document.getElementById('div1'); //先获取到要获取样式的元素标签,也就是获取到div1 console.log(odiv.style.background); //这样我们就可以获取到了行间的样式了 </script> [内连样式获取] <html>

  • JavaScript访问CSS属性的几种方式介绍

    JavaScript访问CSS属性的方式总体说来有两种:"通过元素访问"."直接访问样式表".另外访问样式的时候有一个不可忽略的问题--运行时样式. 1.通过元素访问 既然是要通过元素访问样式表,那么就应该先确定是哪个元素.这是DOM的内容,在此先不多说.获取引用之后就可以通过 "引用.style.要访问的属性" ,来访问某个属性.举个例子,看如下代码. <pre name="code" class="html

  • JavaScript和CSS通过expression实现Table居中显示

    上篇博客说的是将div设置为居中显示,今天来分享一下如何将表格居中的显示.至于居中的原理就不说了,可以看一下我的上篇博客,这次没有使用window的两个事件,而是使用一个叫expression的函数.现在多数的浏览器都支持这个函数.在写上一篇博客的时候,我脑里想能不能把计算后的值赋给css的left和top属性呢?后来查阅资料找到了这个函数.这个函数用来把CSS属性和JavaScript表达式关联起来,这里的CSS属性可以是元素固有的属性,也可以是自定义的属性.就是说CSS属性后面可以是一段Ja

  • JavaScript和CSS交互的方法汇总

    用JavaScript获取伪元素(pseudo-element)属性 大家都知道如何通过一个元素的style属性获取它的CSS样式值,但能获取伪元素(pseudo-element)的属性值吗?可以的,使用JavaScript也可以访问页面中的伪元素. 复制代码 代码如下: // Get the color value of .element:before var color = window.getComputedStyle( document.querySelector('.element')

随机推荐