style.width获取的元素宽度只是div的宽度,不包括border、和padding所占的宽度,且宽度值是带单位px的。
offsetWidth 获取的元素宽度为width+border+padding的值(不包括margin),且返回值只为一个数值,不带单位。
哪一句?还是说是这一整段?
有没有看完那节课?课程后面讲了,是因为盒子的原因,真正的宽度是设置的width值再加上边框的值*2(因为有左右边框)。offsetWidth读取的是width加上border的值,而style.width只是width的值。原先来说是oDiv.style.width + 2 = oDiv.offsetWidth(这里不是赋值,而是普通的相等)。实际oDiv.offsetWidth比oDiv.style.width大2像素,赋值运算的时候,虽然offsetWidth - 1了,也还是比style.width大1像素,真正算下来就是style.width不断的加。
var rotate=document.getElementById('id').style.transform
rotate.substring(rotate.indexOf("(")+1,rotate.indexOf("d"))
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>多物体动画</title>
<style>
*{padding:0; margin:0; list-style: none;font-size: 36px;}
ul li{
width:150px;
height:80px;
line-height: 80px;
background-color: #ff8040;
margin-bottom:20px;
border:4px #c0c0c0 solid;
text-align: center;
}
</style>
<script>
window.onload=function(){
var lis=document.getElementsByTagName("li");
for(var i=0;i<lis.length;i++)
{
lis[i].timer=null; //多物体运动所有参数不能共用,包括定时器,必须给各物体都加一个定时器
lis[i].onmouseover=function(){
move(this,300);
}
lis[i].onmouseout=function(){
move(this,150);
}
}
}
function getStyle(obj,attr){
if(obj.currentStyle){
return obj.currentStyle[attr];
}else{
return getComputedStyle(obj,false)[attr];
}
}
function move(obj,target){
clearTimeout(obj.timer);
obj.timer=setInterval(function(){
var atr=parseInt(getStyle(obj,'width'));
var speed=(target-atr)/10;
speed=speed>0?Math.ceil(speed):Math.floor(speed);
if(atr==target){
clearTimeout(obj.timer);
}
else{
obj.style.width=atr+speed+'px';
}
},50);
}
</script>
</head>
<body>
<ul >
<li width="150px">1</li>
<li width="150px">2</li>
<li width="150px">3</li>
</ul>
</body>
</html>
。。明明是去掉px的好吗。。。返回像素的是什么鬼?
parseFloat() 解析一个字符串并返回一个浮点数。
parseInt() 解析一个字符串并返回一个整数。
var iNum1 = parseInt("12345red"); //返回 12345
var iNum1 = parseInt("0xA"); //返回 10
var iNum1 = parseInt("56.9"); //返回 56
var iNum1 = parseInt("red"); //返回 NaN
var fNum1 = parseFloat("12345red"); //返回 12345
var fNum2 = parseFloat("0xA"); //返回 NaN
var fNum3 = parseFloat("11.2"); //返回 11.2
var fNum4 = parseFloat("11.22.33"); //返回 11.22
var fNum5 = parseFloat("0102"); //返回 102
var fNum1 = parseFloat("red"); //返回 NaN
```js
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>任意属性值2</title>
<style>
body, ul, li {
margin: 0;
padding: 0;
}
ul,li {
list-style: none;
}
ul li {
width: 200px;
height: 100px;
background: yellow;
margin-bottom: 20px;
border: 4px solid #000;
filter: alpha(opacity: 30);
opacity: 0.3;
}
</style>
<script>
window.onload = function() {
/*var aLi = document.getElementsByTagName('li');
for(var i=0;i<aLi.length;i++){
aLi[i].timer = null;
aLi[i].onmouseover = function() {
startMove(this,400);
}
aLi[i].onmouseout = function() {
startMove(this,200);
}
}*/
var Li1 = document.getElementById('li1');
var Li2 = document.getElementById('li2');
Li1.onmouseover = function() {
startMove(this,'opacity',100);
}
Li1.onmouseout = function() {
startMove(this,'opacity',30);
}
}
// var timer = null;
function getStyle(obj,attr) {
if(obj.currentStyle) {
// IE
return obj.currentStyle[attr];
}else{
// Firefox
return getComputedStyle(obj,false)[attr];
}
}
var alpha = 30;
function startMove(obj,attr,iTarget){
clearInterval(obj.timer);
obj.timer = setInterval(function(){
var icur = 0;
if(attr == 'opacity') {
icur = Math.round(parseFloat(getStyle(obj,attr))*100);
}else{
icur = parseInt(getStyle(obj,attr));
}
var speed = (iTarget-icur)/8;
speed = speed>0?Math.ceil(speed):Math.floor(speed);
if(icur == iTarget) {
clearInterval(obj.timer);
}else{
if(attr == 'opacity') {
obj.style.filter = 'alpha(opacity:'+(icur+speed)+')';
obj.style.opacity = (icur+speed)/100;
}else{
obj.style[attr] = icur + speed + 'px';
}
}
},30)
}
</script>
</head>
<body>
<ul>
<li id="li1"></li>
</ul>
</body>
</html>
```
外部嵌入取的是offserWidth的值 而offserWidth的值是包括padding和border的 不仅仅是div本身的width。
内部嵌入时候通过getStyle那个函数取的行内样式 取的是DIv本身的宽 不加padding和border
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>无标题文档</title>
</head>
<body>
<style>
*{
margin:0;
padding:0;
}
div{
width:200px;
height:200px;
background:red;
border:4px solid black;
}
</style>
<script>
window.onload=function(){
var odiv=document.getElementById("div1");
odiv.onmouseover=function(){
startMove();
}
}
var timer=null;
function startMove(){
clearInterval(timer);
var odiv=document.getElementById("div1");
timer=setInterval(function(){
if(odiv.offsetWidth==0){
clearInterval(timer);
}else{
// odiv.style.width=odiv.offsetWidth-9+'px';
odiv.style.width=parseInt(getStyle(odiv,"width"))-1+'px';
}
},30)}
function getStyle(obj,attr){
if(obj.currentStyle){
return obj.currentStyle[attr];
}else{
return getComputedStyle(obj,false)[attr];
}
}
</script>
</head>
<body>
<div id="div1" ></div>
</body>
</html>
以上,你的错误好多啊,自己对比吧
不是没有效果,而是该值为空,可能你并没有用 JS 显式设置过
oDiv.style.width = xxx;
这样设置过,才能取到值。
你的意思是为什么不用getAttribute获取CSS样式中的属性值吗?
首先,想要获取外部/嵌入式CSS样式中的属性,getAttribute是做不到的。
getAttribute是用来获取元素上的属性的,比如id、class、用户自定义属性等等。
虽然getAttribute可以获取到内联式CSS样式的属性(返回的是整个字符串,如"color:red;"),但是获取内联式CSS样式有更好的Element.styel.xxx属性(返回的是属性的值,如"red")。
所以获取属性值不用getAttribute不是不兼容,而是getAttribute不是用在这些的地方的。
var speed=(iTarget-obj.offsetWidth)/10;和 if(iTarget==obj.offsetWidth)中的 obj.offsetWidth 也要改成parseInt(getStyle(obj,'width'))
加了边框 obj.offsetWidth的值肯定会增加border*2
想了想应该会影响吧 例子是bottom 下边界 如果是left和right 应该就会影响输出结果
获取元素宽的时候不能直接用style.width去获取;要用offsetWidth;
oDiv1.style.width=parseInt(oDiv1.style.width)-1+'px';
你把这句改成oDiv1.style.width=parseInt(oDiv1.offsetWidth)-1+'px'; 就会动了。
样式有这俩句:其他样式不写了,主要看这俩个。
#div1{ width:200px; ***** **** border:1px solid #000; }
setInterval(function(){ //这是个定时器,30毫秒执行一次里面的函数. var oDiv = document.getElementById('div1'); //获取id是div1的元素。 oDiv.style.width = oDiv.offsetWidth - 1 + 'px'; //获取oDiv的宽,这时候的宽是200px+2px。因为border给俩边加了1px,实际获取到的是202px; //所以202px-1px=201px赋给了oDiv,这时oDiv的宽是201px;再过30毫秒执行这句,获取的oDiv的宽是 //201px + 2px = 203px; 再203px-1px=202px赋给了oDiv。就这样。 },30);
不好意思,又试了一下,object.style.width这样才是对的,也不知道刚是怎么回事。只需要在26行的width加上'’就行了
getstyle封装方法两个参数之间你用的是中文输入法的“,”,改成英文输入法“,”。
getComputedStyle方法里已经有了对象参数而且此方法是定义在window下的而不是元素对象下,你前面又在元素对象下调用,所以报错;(前面"obj."去掉)
定义全局变量是方便下面做清理操作,不用定义成null,定义成啥都行,或者直接var timer;都可以的好嘛?定义成null,个人觉得更规范!
首先css样式表有三种样式,
一、内联样式
在HTML标签用style属性设置,如 :
<p style="color:#f90;">这是内联样式</p>
二、嵌入样式
通过<head>标签内通过<style>标签设置。如:
<style type="text/css">
/*这是嵌入样式*/
.stuff{color:#f90}
</style>
三、外部样式
通过<link>标签设置。如:
<link rel="stylesheet" href="path/style.css" type="text/css">
而在javascript中,获取这三种样式表的方法是有限制的,style只能获取元素的内联样式,
嵌入样式和外部样式使用style是获取不到的,javascript提供了另外的获取方式,嵌入样式和外部样式可以通过currentStyle(IE浏览器)、getComputedStyle(Firefox、opera、safari、chrome浏览器)的方式获取。
使用方法分别是window.currentStyle["attr']和window.getComputedStyle(ob, pseudoElt)["attr']。
哈,其实刚开始的时候小白也不怎么懂,可能小白说的你也不是很明白,你可以参照这篇学习笔记
人家理解得可比我这半吊子水平透彻多了
( ╯□╰ )好吧,小白承认好像抄袭了,逃。。。
因为oDiv.style.width=200px,结果是一个字符串,parseInt()方法可以强制将字符串转换为number类型变成200,之后再进行后面的加减操作,最后加上字符串“px”成了字符串“199px” “198px”。并不是楼上说的为了不必要的错误,而是必须要这样.
区别在于边框的有无,offset获取的是整个元素的宽度包括边框和内边距,而style.width获取的是元素内容的宽度 就是样式表设置的width。
我的代码在IE能运行,在chrome不能
offsetWidth的值等于style.width的值加上边框的值,而函数里这样写的 oDiv.style.width=oDiv.offsetWidth-1+'px';后者是比前者多2px的,只要减去的数值小于2,那么前者就相当于一直增大,而后者包含前者,所以后者也一直增大,导致的结果就是图像越来越宽。希望对你有所帮助~
获取整点样式
先明确两个概念:obj.offsetWidth是盒子模型中盒子的宽度(content+2*padding+2*border)。obj.style.width只是content的宽度(即写在CSS样式中的width的值)。假设padding=0,如果设置了宽度为1px的border,那么obj.offsetWidth的值就是content的宽+2px,obj.offsetWidth-1的值就是content的宽+1px.因此会变长。而obj.style.width-1,的值就是content长度减1,所以越来越短。
随机产生一个6位数
var rand=Math.round(Math.random()*1000000); /* 如果不够六位数前面补0; slice() 方法可从已有的数组中返回选定的元素。 arrayObject.slice(start,end) */ rand = rand<1000000?(rand+1000000 +'').slice(1):rand; div.style.backgroundColor = "#"+rand;