【问题标题】:Duplicate a CSS rule using JavaScript only仅使用 JavaScript 复制 CSS 规则
【发布时间】:2015-11-19 06:25:32
【问题描述】:

我有一个在其他地方生成的列表,我无法更改它。 缩进级别是通过  ,但是每个缩进的字体大小是相同的,我想根据缩进级别更改字体大小。 因此,我需要复制一个 css 规则并更改新的 id 和 font-size。

以下是 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;
}

【问题讨论】:

  • 屏幕阅读器无法捕捉通过这种方式表达的层次结构。在需要层次结构的地方应使用嵌套列表。
  • 为什么需要复制 CSS 类?为什么不使用相同的 CSS 类而只覆盖字体大小?
  • 你确定你不能修改生成代码的代码吗...因为那是 100% 简单的
  • 我无法更改 HTML 代码,我无法更改现有样式,我需要使用现有样式创建新样式并应用它。这是我专门问的。我只能使用 JavaScript,因为 jQuery 没有空间,这不是我的要求,它就是这样。
  • 顺便说一句,这实际上比上面要复杂得多,我只需要能够在现有样式的基础上创建一个新样式,然后更改我需要的内容。一旦给出一个示例,我将能够将其带到下一个更复杂的步骤。 TIA

标签: javascript css


【解决方案1】:

有关通过 JavaScript 编辑 CSS 的参考,请参阅本文底部的更新

你能在包含li 的项目中添加一个带有Javascript 的CSS 类吗? 您可以计算每个li&amp;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

【讨论】:

  • 我不想这样做,我想使用现有的规则创建一个新的 CSS 规则,更改新名称/id 并更改字体。这不是我问的吗?我不能使用 jQuery,这就是为什么我在标题中有 JavaScript。
  • G'day Gerrit,这正是我所需要的,谢谢。我现在有一个函数可以检查规则是否存在,如果存在则使用该规则,如果不存在则获取我想要复制的规则。 (相同的函数:-) - 函数 findCSS_Rule(classID),返回规则对象或 false。因此,使用“text12Font1” .cssText 更改字体大小我创建了一个新样式并设置 .cssText - 简单。顺便说一句,这个项目的 js 文件有 700 行长,它需要一个相对简单的列表并将其转换为 PowerPoint 列表,其中包含 80 多种不同的动画、延迟和 HTML5 音频。这太复杂了,无法完整解释。谢谢。
  • 嗨,我用我在评论中发布的链接更新了我的答案。
  • 仅供参考,该链接已关闭。
【解决方案2】:

AFAIK,您不能使用 javascript 复制 CSS 规则。您只能在元素上应用某种样式,但这将应用于内联样式。因此,您可以通过应用内联样式来更改它或尝试其他方式。

我只知道 jquery 的做法,那就是使用 $('.className').css('font', 'somefont')

【讨论】:

  • 这是如何创建一个新的 CSS 的?它只是改变一个现有的。我需要创建一个与现有 CSS 相同的新 CSS,但我需要一个新名称/ID 和不同的字体大小。这不是我问的吗?
  • 抱歉,我没有解决您的“AFAIK”,是的,您可以,您需要做的就是更改包含“
    AFAIK = 据我所知,这意味着我可能是错的并且超出了我的认知。对此我深表歉意,但我想我误解了你的问题。
【解决方案3】:

我现在有以下内容:

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。

【讨论】:

    猜你喜欢
    • 2019-11-13
    • 2012-11-11
    • 1970-01-01
    • 2015-02-03
    • 2012-11-06
    • 2014-01-02
    • 1970-01-01
    • 2016-01-19
    • 1970-01-01
    相关资源
    最近更新 更多