Bootstrap Studio - 我的 `<div>` 元素的样式 属性 在我的 JS 函数期间没有改变

Bootstrap Studio - The style property of my `<div>` element is not changing during my JS function

我正在使用 Bootstrap(在 Bootstrap Studio 中)和纯 JavaScript。我通过将 CSS 颜色设置为默认颜色来为 <div> 元素的背景着色。现在,我正在尝试通过在选择新选项卡时设置新值来更改 CSS 颜色。

目标是更改选项卡的背景颜色及其相应的内容。例如,选项卡 1 的背景为蓝色,选项卡 2 的背景为橙色;当您在它们之间切换时,背景颜色会发生变化。我通过设置 parent div 背景的样式来设置基色。 (我没有特别为 tab-content 和活动选项卡着色的原因是着色区域不够大)。

下面是我目前拥有的JS函数

window.addEventListener('load', startup);
async function startup(){
    // other functions 
    await toggleColor();
}
async function toggleColor(){
    var menuItm = document.getElementsByName('tabGroup').forEach(item =>{
        item.addEventListener('click', event=>{
            var bg= document.getElementById('tabDiv');
            var bgColor = bg.style.background;
            console.log("Old Color: "+bgColor);
            bgColor = 'linear-gradient(to bottom right, #ec7429, #843f1d)'; 
            console.log("New Color: "+bgColor);
                
        })
    });
}

波纹管是 parent <div id= ‘tabDiv’> 和活动选项卡上的 CSS 样式。

#tabDiv {
    background: linear-gradient(to bottom right, #8c3a83, #682b61); 
}
#tabList .nav-link.active {
  color: #E7E8E9; 
  background: linear-gradient(to bottom right, #8c3a83, #682b61); 
}

下面是我的HTML的一般结构。

<div id='tabDiv'>
    <ul id='tabList' class='nav nav-tabs flex-column' role='tablist'>
         <li id='tabID' class='nav-item' role='presentation' name='’tabGroup'>
            <a class='nav-link' role='tab' datta-toggle='tab' href='#tab-1'> TabText </a>
        </li>
    </ul>
    <div class='tab-content'>
        <div id='tab-1' class='tab-pane' role='tabpanel'>
            <p> Tab Content <p>
        </div>
    </div>
</div>

当我 运行 控制台打印出这样的代码时:

Old Color:                                  
New Color: linear-gradient(to bottom right, #ec7429, #843f1d)       
Old Color: 
New Color: linear-gradient(to bottom right, #ec7429, #843f1d)

所以,我将最初的 CSS 样式移动到 HTML div 看起来像 <div id=’tabDiv’ style=”background: linear-gradient(144deg, #8c3a83, #682b61);”>。我正在使用 Bootstrap Studio(我的工作场所需要),它为我提供了新的内联样式格式。

当 运行 在 HTML 而不是 CSS 文件中使用样式设置代码时,我得到这个:

Old Color: linear-gradient(144deg, rgb(140, 58, 131), rgb(104, 43, 97))
New Color: linear-gradient(to bottom right, #ec7429, #843f1d)
Old Color: linear-gradient(144deg, rgb(140, 58, 131), rgb(104, 43, 97))
New Color: linear-gradient(to bottom right, #ec7429, #843f1d)

我还尝试更改 HTML 样式声明的格式和颜色类型(十六进制或 RGB),并在我设置新颜色的 JS 函数中进行更改。但同样的基本问题是,在我的 JS 函数中,旧颜色实际上并没有 update/change。我也尝试在 JS 中将 !important 添加到我的新颜色中。

我了解到这可能是首先呈现的内容的问题。由于我是 Bootstrap Studio 的新手,所以我在此处标记了它。我知道你可以 change the order of the same file types 但有没有办法改变 CSS 与 JS 的顺序?但是,我不确定这是不是因为在另一个函数中我成功地将 style.display 从‘none’更新为‘blocked’。

Whosebug 提出了与我的标题措辞相似的问题。其中一些涉及正确检索元素,并将函数包装在 window.onload 中。我认为两者都有效。在我的 JS 文件顶部有一个 window.addEventListener('load', function); 调用,从中调用的其他函数正常工作。我还登录了控制台,以检查我正在监听的选项卡是否被成功且正确地选择,对于 <div id=’tabDib’> 我想更改的 属性 也是如此。我也尝试过在我的 JS 函数中没有默认颜色和 changing/adding 新颜色。

问题出在代码或逻辑上吗?任何意见,将不胜感激。我知道这很长,感谢您的阅读。

tl;dr 尝试使用 js 函数更改 HTML 元素的样式,但颜色没有改变。这听起来像是一个基本问题,但我还没有找到任何有用的东西。

首先,如果你想设置属性(在你的例子中背景颜色作为内联样式)你可以使用setAttribute方法。

其次,当您在控制台登录 Old color 时得到空值的原因是 bg.style.background 正在寻找内联 style 属性。如果你想使用 css 外部文件,你应该在你的脚本中使用 getComputedStyle 方法。

所以:

item.addEventListener('click', event=> { 
  var bg = document.getElementById('tabDiv');
  var bgColor = bg.style.background; // this will work if you use inline-style
  var bgColor2 = bg.getPropertyValue('background'); // this will work if you use stylesheet
  console.log("Inline Color: "+bgColor + "Stylesheet Color: "+bgColor2);
  bgColor = 'linear-gradient(to bottom right, #ec7429, #843f1d)'; // this doesn't set any property to the element, it just assign a value to a variable.
bg.setAttribute('style', 'background:' + bgColor); // this will set inline style to the element with the color in the variable you declared above.
  console.log("New Color: "+bgColor);
})

谢谢@a-meshu 的帮助! Bellow 是我的 JS 函数的工作版本。

 async function toggleColor(){
    var menuItm = document.getElementsByName('tabLeft').forEach(item =>{
        item.addEventListener('click', event=>{
            var bg = document.getElementById('tabDiv');
            var bgColor =  window.getComputedStyle(bg);
            bg.setAttribute('style', 'background: linear-gradient(to bottom right, #ec7429, #843f1d)');
            console.log("New Color: "+ bgColor);
                
        })
    });
}