javascript - 如何提前获取元素属性(不是在我调用函数时)
问题描述
这里有一些代码,比如旋转木马。
问题是我第一次按右箭头时无法切换到第二张卡。我认为这是因为该函数不知道 cardStack left属性等于-20px。但是当我将这段代码添加var l = cardStack.left;
到一个函数中时,它工作正常。但是 afaikdocument.
每次调用函数时都不要提及。我需要你的建议
var cardStack = document.getElementById('allCards');
var l = cardStack.left;
document.onkeydown = cardsShifting;
function cardsShifting(e) {
switch (e.keyCode) {
case 37:
shiftCard('left');
break;
case 39:
shiftCard('right');
break;
}
}
function shiftCard(direction) {
if (direction === 'right') {
l = l - 640;
if (l >= -5780) {
cardStack.style.left = l + 'px';
} else {
l = -20;
cardStack.style.left = l + 'px';
}
}
}
#allCards {
position: relative;
width: 6400px;
height: 400px;
left: -20px;
display: inline-block;
}
#currentCardWindow {
position: absolute;
width: 600px;
height: 420px;
top: 50%;
left: 50%;
margin-top: -200px;
margin-left: -300px;
overflow: hidden;
box-sizing: border-box;
}
.card {
position: relative;
width: 600px;
height: 400px;
float: left;
margin: 0 20px;
}
<div id="currentCardWindow">
<div id="allCards">
<div class="card">card 1</div>
<div class="card">card 2</div>
<div class="card">card 3</div>
<div class="card">card 4</div>
<div class="card">card 5</div>
<div class="card">card 6</div>
<div class="card">card 7</div>
<div class="card">card 8</div>
<div class="card">card 9</div>
<div class="card">card 10</div>
</div>
</div>
解决方案
当您这样做时,cardStack.style.left
您实际上并不是在查看 CSS,而是在查看元素的样式属性。幸运的是,有一种方法可以查看 CSS!我们可以使用getComputedStyle。
该
window.getComputedStyle()
方法返回一个对象,该对象在应用活动样式表并解决这些值可能包含的任何基本计算后报告元素的所有 CSS 属性的值。通过对象提供的 API 或简单地使用 CSS 属性名称进行索引来访问各个 CSS 属性值。
有了这个,你可以window.getComputedStyle(cardStack)
得到所有的 CSS 样式,然后你可以添加getPropertyValue("left")
到只是查看left
属性。这会返回-20px
,但我们想忽略可以使用 px 执行此操作的 px parseInt
。
我已经把它放在了这个片段中。
var cardStack = document.getElementById('allCards');
var l = parseInt(window.getComputedStyle(cardStack).getPropertyValue("left"));
document.onkeydown = cardsShifting;
function cardsShifting(e) {
switch (e.keyCode) {
case 37:
shiftCard('left');
break;
case 39:
shiftCard('right');
break;
}
}
function shiftCard(direction) {
if (direction === 'right') {
l = l - 640;
if (l >= -5780) {
cardStack.style.left = l + 'px';
} else {
l = -20;
cardStack.style.left = l + 'px';
}
}
}
#allCards {
position: relative;
width: 6400px;
height: 400px;
left: -20px;
display: inline-block;
}
#currentCardWindow {
position: absolute;
width: 600px;
height: 420px;
top: 50%;
left: 50%;
margin-top: -200px;
margin-left: -300px;
overflow: hidden;
box-sizing: border-box;
}
.card {
position: relative;
width: 600px;
height: 400px;
float: left;
margin: 0 20px;
}
<div id="currentCardWindow">
<div id="allCards">
<div class="card">card 1</div>
<div class="card">card 2</div>
<div class="card">card 3</div>
<div class="card">card 4</div>
<div class="card">card 5</div>
<div class="card">card 6</div>
<div class="card">card 7</div>
<div class="card">card 8</div>
<div class="card">card 9</div>
<div class="card">card 10</div>
</div>
</div>
我希望你觉得这有帮助。
推荐阅读
- android - 科特林。删除文本并将其复制到剪贴板
- android - 当是电子邮件输入并且为空时更改提示大小
- performance - 如何使用 Cypress 或任何其他 UI 自动化工具捕获性能监视器和 Javascript Profiler
- javascript - Typeahead 中的更改事件不起作用
- python - 我是流光框架的初学者,我使用流光制作了第一个程序,它显示错误:
- cuda - 为什么访问两个连续元素的线程会导致“银行冲突”?
- python - 如何在 SQLAlchemy 中正确加载列参数
- sql - BigQuery 事件的数据总和
- arrays - 从数组列表和列表生成数据框?
- php - WooCommerce 自定义插件:检查客户完成的订单问题