鍍金池/ 問答/HTML/ 使用原生js通過改變元素節(jié)點類名的方式實現(xiàn)切換不同的css樣式。

使用原生js通過改變元素節(jié)點類名的方式實現(xiàn)切換不同的css樣式。

問題在于:嘗試多種方法,只有一種可以達(dá)到效果,但不是我想要的只通過類名改變css樣式,為什么前幾種方法失???可以直接看js代碼最后一部分,為了不影響判斷,把全部代碼貼上。
js代碼如下:

var aqiData = [
  ["北京", 90],
  ["上海", 50],
  ["福州", 10],  
  ["廣州", 50],
  ["成都", 90],
  ["西安", 100]
];

//第一步:數(shù)組排序
function sortWay(a,b){
  var a = a[1];
  var b = b[1];
  return a-b;
}
aqiData.sort(sortWay);
//第二步:刪除aqiDate>60的數(shù)據(jù)
//方法1:for循環(huán)
 /*
 for(var i=0;i<aqiData.length;i++){
    if(aqiData[i][1]>60){
      aqiData.splice(i,1);
      i--;
    }
  }
console.log(aqiData);
*/

//方法2:forEach
/*aqiData.forEach(function(aqi){
  if(aqi[1]>60) {
    aqi[1].aplice;
   }
});
console.log();*/
//方法3:filter
function isenoughsmall(value){
  return value[1]<=60;
}
var newaqi = aqiData.filter(isenoughsmall);
//console.log(newaqi);
//第三步:拆分?jǐn)?shù)組,組合輸出語句
//第四步:輸出對應(yīng)數(shù)據(jù)到頁面指定位置
for(var j=0;j<newaqi.length;j++){
  //拆分組合輸出的li語句
  var aqitext = "第"+ parseInt(j+1) + "名:" + newaqi[j][0] + "," + newaqi[j][1];
  //獲取父元素節(jié)點
  var ul = document.getElementById("aqi-list");
  var li = document.createElement("li");
  var text = document.createTextNode(aqitext);
  //給新創(chuàng)建的li標(biāo)簽添加文本節(jié)點
  li.appendChild(text);
  //給指定的父元素添加新創(chuàng)建的li標(biāo)簽,實現(xiàn)網(wǎng)頁出現(xiàn)數(shù)據(jù)
  ul.appendChild(li);
  //diy練習(xí)
  //鼠標(biāo)事件,懸移ok;
  li.onmouseover = function(){
    this.setAttribute("style","background:black;color:green;border:1px solid white");
  }
  *//鼠標(biāo)事件,通過更改li類名來達(dá)到移開樣式恢復(fù)的效果失?。。。。?!原因未知?
  li.onmouseout = function(){
    //this.setAttribute("class","listyle");更改屬性也不行
    //this.className = "listyle";不成功
   // document.li.classList.add("listyle");依然不行
    //this.setAttribute("style","background:white;color:black;border:1px dashed grey");這種可以但不是我想要的方法
  }*
}

html部分代碼:

#aqi-list li{
  background:white;
  width:150px;  
  list-style:none;
  line-height:30px;
  border:1px dashed grey;
  text-align:center;
  margin-bottom:-1px;
  
}
  .listyle{
  background:white;
  width:150px;  
  list-style:none;
  line-height:30px;
  border:1px dashed grey;
  text-align:center;
  margin-bottom:-1px;
}

css部分代碼:

<h3>污染城市列表</h3>
  <ul id="aqi-list">
    <a class="listyle"></a>
  </ul>
回答
編輯回答
絯孑氣

一開始改變元素的style屬性,后來想通過添加class改變,你這種寫法肯定是不可以的,行內(nèi)樣式權(quán)重高于類的,行內(nèi)樣式會覆蓋類上面的樣式。

三種方法:

  1. 設(shè)置class里面的樣式!important
  2. 一開始移入的時候就通過加class的方式改變
  3. 之后通過改變style的形式。

按你的意思肯定是想要第二種,兩個簡單的hasClassaddClass方法。


// 判斷類是否在該元素中存在
funtion hasClass (elm, cls) {
  var reg = new RegExp('(^|\\s)' + className + '(\\s|$)')
  return reg.test(element.className)
}

// 添加類
function addClass (elm, cls) {
  if (hasClass(elm, cls)) {
    return;
  }
  var newClass = elm.className.split(' ');
  newClass.push(cls);
  element.className = newClass.join(' ');
}
2017年3月5日 02:06
編輯回答
初心

因為你一開始給li添加樣式的時候,是添加的行內(nèi)樣式,鼠標(biāo)移開的時候,添加的是一個class類,最后編譯解析的時候,還是以行內(nèi)樣式為主,因為行內(nèi)樣式的權(quán)值更高。樣式的權(quán)值百度一下就能了解,順便推薦個方法removeClass()addClass()

2018年5月3日 16:20