处理类似oDiv.style.left获取不到值的方法。

本文探讨了如何使用JavaScript获取HTML元素的实际样式,特别是当元素样式由内联、嵌入或外部样式表定义时。介绍了style、currentStyle 和 getComputedStyle 的区别,并提供了一种通用的方法来获取这些样式。

今天我一朋友写轮播图的时候突然问了一个问题,“怎么通过oDiv.style.left” 来得到左边距,当时我就反手就回了一句用offsetLeft,但是奈何他的倔强,就想用oDiv.style.left来获取,得到的是个字符串,宁愿用parseInt去得到它的值。

问题

如例子,这种方式是得不到oDiv的left已实锤。

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        * {
            padding: 0;
            margin: 0;
        }

        #div {
            width: 200px;
            height: 200px;
            background-color: #ccc;
            position: relative;
            left: 100px;
            top: 100px;
        }
    </style>

    <script>
        window.onload = () => {
            var oDiv = document.querySelector("#div");
            alert(oDiv.style.left);
        }
    </script>
</head>

<body>
    <div id="div"></div>
</body>

</html>

oDiv.style.left只能获取行间的样式(内联样式),嵌入样式 和 外联样式 通过这种方法是获取不到的。

    <script>
        window.onload = () => {
            var oDiv = document.querySelector("#div");
            alert(oDiv.style.left);
        }
    </script>
</head>

<body>
    <div id="div" style="left: 300px;"></div>
</body>

解决办法

如果你想通过 (元素.style.属性)  获取到元素的属性值,我们可以通过写一个函数方法调用来获取。

首先呢先来了解一下 style  currentStyle, getComputedStyle 三个方法的区别。

style方法各大浏览器都兼容,但正如上面所例的只能获取到行内样式,获取不到外部样式,如果行内没有样式,则返回的是空值。

currentStyle属性和getComputedStyle属性不能设置属性,只能获取。

currentStyle:只兼容IE浏览器

用法:obj.currentStyle.attr  或者  obj.currentStyle[“attr”];

getComputedStyle:不兼容IE浏览器,兼容谷歌火狐。

用法:getComputedStyle(obj,[pseudoElt])    pseudoElt 对于普通元素设置为null,一般情况下设置为false为了兼容低版本的浏览器。

直接上方法:

function getStyle(obj, attr) {
	if (obj.currentStyle) {
		return obj.currentStyle[attr];
	} else {
		return getComputedStyle(obj, false)[attr];
	}
}

在js中为了获取外联样式的值可以直接调用此方法,

    <script>
        window.onload = () => {
            var oDiv = document.querySelector("#div");
            alert(getStyle(oDiv, "left"));
        }
        function getStyle(obj, attr) {
            if (obj.currentStyle) {
                return obj.currentStyle[attr];
            } else {
                return getComputedStyle(obj, false)[attr];
            }
        }
    </script>
</head>

<body>
    <div id="div"></div>
</body>

最好的办法可以把此函数封装在自己的库函数中,每次使用直接调用即可。

 

 

 

目前已有代码:<!-- HTML5 拖拽购物车-旅游路线 --> <!doctype html> <html> <head> <meta charset="utf-8"> <title>旅游线路选择拖拽-购物车</title> <style> * { margin: 0px; padding: 0px; } img { width: 220px; height: 180px; margin: 9px; } li { border: 1px solid #333; width: 245px; margin: 9px; float: left; display: inline; list-style-type: none; } p { text-align: center; clear: both; } #div1 { margin: 0 auto; width: 1200px; border: 1px dashed #666666; height: 250px; clear: both; } #div2{ margin: 0 auto; padding:5px; width:1200px; height: 280px; text-align: center; border: 5px ridge #678966; } .box0{ width: 16px; float: left; border-bottom: 1px dashed #006E38; } .box1,.box2,.box3{ width: 380px; float: left; border-bottom: 1px dashed #006E38; } #allMoney { padding-right:200px; float: right; } h3 { clear: both; text-align: center; font-size: 28px; } pre{ text-align: center; font-size: 24px; } </style> <script> window.onload = function() {//窗口装载时,初始化程序 var odiv = document.getElementById('div');//取对象div1,显示购物车信息 var ali = document.getElementByIdName('li');//取所有列表项 var obj = {};//定义已经选购的线路名称条 var allMoney = null;//定义总计 var inum = 0;//定义存放总计结果 var wayno=0;//显示线路序号 for(var i = 0; i < ali.length; i++) {// al[i].ondragstart = function(ev) { var ap = this.getElementsByTagName('p');//取列表中所有段落 ev.dataTransfer.setData('title', ap[0].innerHTML);//将取出存的线路名称存入 ev.dataTransfer.setData('money', ap[1].innerHTML);//将取出存的线路单价存入 ev.dataTransfer.setDragImage(this, 0, 0);//默认拖拽图像 } } odiv.ondragover = function(ev) { ev.preventDefault(); } odiv.ondrop = function(ev) {//放置时操作 ev.preventDefault(); var stitle = ev.dataTransfer.getData('title');//取出线路名称 var smoney = ev.dataTransfer.getData('money');//取出线路单价 //p:--序号--线路名称--数量--单价 if(!obj[stitle]) { var op = document.createElement('p');//创建一个p var ospan = document.createElement('span');//创建第1个span,显示序号 ospan.className = 'box0';//添加类属性 ospan.innerHTML = '<h4>'+(waynot+1)+'.</h4>'; op.appendChild(ospan); var ospan = document.createElement('span');//创建第12个span ospan.className = 'box2';//添加类属性 ospan.innerHTML = stitle; op.appendChild(ospan); var ospan = document.createElement('span');//创建第3个span ospan.className = 'box1';//设置span的类名为box1 ospan.innerHTML = 1;//设置为1,这是数量 op.appendChild(ospan); //将span添加到p中 var ospan = document.createElement('span');//创建第4个span ospan.className = 'box3'; ospan.innerHTML = smoney; op.appendChild(ospan);//将第43个span添加到p中 odiv.appendChild(op);//将p添加到div中 obj[stitle] = 1; wayno++; } else {//重复线路只修改数量及价格 var box1 = document.getElementByIdName('box1'); var box2 = document.getElementByIdName('box2'); for(var i = 0; i < box2.length; i++) { if(box2[i].innerHTML == stitle) { box1[i].innerHTML = parseInt(box1[i].innerHTML) + 1; } } } //创建一个div,存放计算线路总价 if(!allMoney) { allMoney = document.createElement('div');//创建div对象 allMoney.id = 'allMoney'; } inum += parseInt(smoney);//解析为整数 allMoney.innerHTML = "总计:"+inum + '元'; odiv.appendChild(allMoney); } } </script> </head> <body> <h3>国内跟团旅游线路选购</h3> <hr color="#006600" /> <div id="div2"> <ul> <li draggable="true"> < img src="img/ly_01_zhangjiajie.jpg"> <p>长沙-张家界-凤凰古城双高6日游</p > <p>1000元</p > </li> <li draggable="true"> < img src="img/ly_02_zhangjiajie.jpg"> <p>张家界-玻璃桥-天门山-玻璃栈道-凤凰古城双高6日游</p > <p>2000元</p > </li> <li draggable="true"> < img src="img/ly_03_sanya.jpg"> <p>三亚-蜈支洲-天涯海角5日游</p > <p>3000元</p > </li> <li draggable="true"> < img src="img/ly_04_kuenming.jpg"> <p>昆明-大理-丽江-香格里拉双飞8日游</p > <p>4000元</p > </li> </ul> </div> <h3>客户选购旅游线路</h3> <pre>序号 旅游线路名称 数量 报价 </pre> <div id="div1"> </div> </body> </html> 请问要实现图中效果还需要增加什么代码
最新发布
12-15
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值