2015-11-19 40 views
0

我有一個在別處生成的列表,我無法更改。 縮進級別通過& nbsp;,但是每個縮進的字體大小是相同的,我想根據縮進級別改變字體大小。 因此,我需要複製一個css規則並更改新的id和字體大小。僅使用JavaScript複製CSS規則

下面是HTM生成的代碼,這是我無法改變:

<style type="text/css"> 
    span.text12Font1 { 
     font-size:14px; 
     font-family:"Arial", sans-serif; 
     color:#010101; 
     font-weight:normal; 
     font-style:normal; 
     text-decoration:normal; 
    } 
</style> 

<div id="text12"> 
</a> 
<ul style="margin-left:4px;text-align:left;" > 
    <li> 
     <span class="text12Font1">Emphasize the beginning of the bullet point</span> 
    </li> 
    <li> 
     <span class="text12Font1">&nbsp;</span > 
     <span class="text12Font1">As in this list, when the first few words capture the main idea</span > 
    </li> 
    <li> 
     <span class="text12Font1">&nbsp;&nbsp;That way, readers can skim easily</span> 
    </li> 
</ul> 
</div> 

我可以得到每一個點,我可以找到所有在每個點的類名。 我需要的是能夠複製一個CSS類,給它一個新的ID,只是改變字體大小。

我見到目前爲止以下內容:

function getNewClassName(className, newName, fSize){ 
    var spanID = 'span.' + className; 
//e.g.: span.text12Font1 
    for(var i=0; i<document.styleSheets.length; i++){ 
     var sheet = document.styleSheets[i]; 
     var cssText = sheet.ownerNode.innerText; 
     var posn = cssText.indexOf(spanID); 
     if(posn!=-1){ 
      var oSheet = document.styleSheets[i]; 
      var oRules = oSheet.cssRules ? oSheet.cssRules : oSheet.rules; 
      for(var r=0; r<oRules.length; r++){ 
       if(oRules[r].cssText.indexOf(spanID)!=-1){ 
// Here I have the rule that I want to duplicate, change it's name to newName and change the font-size. 
// I must not change the existing rule and it must remain as it could be used elsewhere 
        return true; 
       } 
      } 
     } 
    } 
    return false; 
} 
+0

屏幕閱讀器無法捕獲由此類手段表達的層次結構。嵌套列表應在需要層次結構的地方使用。 – RobG

+0

爲什麼你需要複製CSS類?爲什麼不使用相同的CSS類,只是覆蓋字體大小? –

+0

是否確定無法修改生成代碼的代碼......因爲這將會100%簡化 – Seabizkit

回答

0

AFAIK,你不能重複使用javascript CSS規則。您只能在元素上應用某種樣式,但會在內聯樣式中應用。因此,您可以通過應用內聯樣式或嘗試其他方法來更改它。

我只知道這樣做的jQuery的方式,那就是通過使用$('.className').css('font', 'somefont')

+0

這是如何創建一個新的CSS?它只是改變現有的一個。我需要創建一個與現有相同的新CSS,除了我需要一個新的名稱/ ID和不同的字體大小。這不是我問的嗎? – Peter

+0

對不起,我沒有提到你的「AFAIK」,是的,你可以,你所需要做的就是改變包含「 Peter

+0

AFAIK =據我所知,這意味着我可能是錯的,超出了我的想象。我爲此道歉,但我想我誤解了你的問題。 –

1

請參閱本崗位的底部,通過JavaScript的一個參考編輯CSS更新

你能添加一個CSS類用Javascript加入包含 li項目。 您可以統計每個 li中出現的 &nbsp;的數量,並相應地給 li一個CSS類。

事情是這樣的: http://jsfiddle.net/ncdajzur/

CSS

span.text12Font1 { 
    font-size:14px; 
    font-family:"Arial", sans-serif; 
    color:#010101; 
    font-weight:normal; 
    font-style:normal; 
    text-decoration:normal; 
} 

.whitespace1 span.text12Font1 { 
    font-size: 12px; 
} 

.whitespace2 span.text12Font1 { 
    font-size: 8px; 
} 

的JavaScript(我使用jQuery的快速測試)

function formatText(id) { 
    var $list = $('#' + id); 

    $list.find('li').each(function(i) { 
     var numWhitespaces = ($(this).html().match(/&nbsp;/g) || []).length; 
     $(this).addClass('whitespace' + numWhitespaces); 
    });  
} 

formatText('text12'); 

更新

如何通過JavaScript操作樣式廣泛的解釋,請訪問: http://www.hunlock.com/blogs/Totally_Pwn_CSS_with_Javascript#quickIDX1

+0

我不想這樣做,我想用現有的規則創建一個新的CSS規則,更改新的名稱/ ID並更改字體。這不是我問的嗎?我無法使用jQuery,這就是爲什麼我在標題中使用JavaScript。 – Peter

+0

請看看這裏然後:http://www.hunlock.com/blogs/Totally_Pwn_CSS_with_Javascript#quickIDX1 –

+0

G'day Gerrit,這是我需要的,謝謝。我現在有一個函數,用於檢查規則是否存在,如果是,則使用該規則,如果沒有,則獲取我想要重複的規則。 (相同的函數:-) - 函數findCSS_Rule(classID),​​這將返回規則對象或false。因此,使用「text12Font1」.cssText更改字體大小,我創建了一個新的樣式並將.cssText設置爲簡單。順便說一下,這個項目的js文件長度爲700行,它需要一個相對簡單的列表,並將其轉換爲PowerPoint列表,其中包含80多種不同的動畫,延遲和HTML5音頻。這完全無法解釋。謝謝。 – Peter

0

我現在有以下幾點:

function duplicate_cssRule(passClassID, newClassID, fSize){ 
    var nClassID = 'span.' + newClassID; 
    if(findCSS_Rule(nClassID)) return true; // Must have already done this one 
    var classID = 'span.' + passClassID.split(' ')[0]; // Might have multiple classes, we always want the first 
    var ruleObj = findCSS_Rule(classID) 
    if(!ruleObj) return false; 
    var cssText = ruleObj.cssText ? ruleObj.cssText : ruleObj.style.cssText; 
    var posn = cssText.indexOf('{'); 
    cssText = cssText.substr(posn+1).trim().split(';'); 
    for(var i=0; i<cssText.length; i++){ 
     var fontData = cssText[i].toLowerCase().trim(); // IE is uppercase 
     if(fontData.substr(0,10)=='font-size:'){ 
      cssText[i] = 'font-size:' + fSize + 'px'; 
      break; 
     } 
    } 
    cssText = cssText.join(';'); 
    cssText = cssText.substr(0,cssText.length-1); 
    if(styleSheet.insertRule){ 
     cssText = nClassID + ' {' + cssText + '}'; 
     styleSheet.insertRule(cssText,styleSheet.cssRules.length); 
    }else if(styleSheet.addRule){ 
     styleSheet.addRule(nClassID,cssText); 
    } 
    return true; 
} 

var styleSheet; 
function findCSS_Rule(classID){ 
    var sheets = document.styleSheets; 
    for(var i=0; i<sheets.length; i++){ 
     styleSheet = sheets[i]; 
     var styleRules = styleSheet.cssRules ? styleSheet.cssRules : styleSheet.rules; 
     if(styleRules){ 
      for(var r=0; r<styleRules.length; r++){ 
       if(styleRules[r].selectorText&&styleRules[r].selectorText.toLowerCase()==classID.toLowerCase()) return styleRules[r]; 
      } 
     } 
    } 
    return false; 
} 

作品在所有瀏覽器,甚至IE8。