【问题标题】:Change CSS of class in Javascript?在Javascript中更改类的CSS?
【发布时间】:2011-04-22 08:33:28
【问题描述】:

我有一个显示设置为 none 的课程我想在 Javascript 中现在将它设置为 inline 我知道我可以使用 idgetElementById 来做到这一点,但是什么上课最干净的方法是什么?

【问题讨论】:

标签: javascript css


【解决方案1】:

你可能想利用/重写这个函数:

function getStyleRule(ruleClass, property, cssFile) {
    for (var s = 0; s < document.styleSheets.length; s++) {
        var sheet = document.styleSheets[s];
        if (sheet.href.endsWith(cssFile)) {
            var rules = sheet.cssRules ? sheet.cssRules : sheet.rules;
            if (rules == null) return null;
            for (var i = 0; i < rules.length; i++) {
                if (rules[i].selectorText == ruleClass) {
                    return rules[i].style[property];
                    //or rules[i].style["border"]="2px solid red";
                    //or rules[i].style["boxShadow"]="4px 4px 4px -2px rgba(0,0,0,0.5)";
                }
            }
        }
    }
    return null;
}
  • 扫描所有附加的样式表传递“”作为第三个参数,否则类似于“index.css”
  • ruleClass 包含起始“.”
  • if (rules[i].selectorText && rules[i].selectorText.split(',').indexOf(property) !== -1) 在这里找到条件改进https://stackoverflow.com/a/16966533/881375
  • 不要忘记在 css 属性上使用 javascript 语法,例如box-shadow 与 boxShadow

【讨论】:

  • 最后,一个很好的答案:) 我编辑了它并添加了一个“值”输入以立即更改规则
  • 这也是我的答案。更改元素的样式不起作用,因为某些元素是通过媒体查询添加到 dom 的(在更改元素的事件之后)。我在一个 React JS 项目中,所以 CSS 被转译成 html。所以我不得不终止对 href 的测试。
【解决方案2】:

可以做到这一点 - 实际上更改与类相关的样式规则 - 使用 styleSheets 数组 (MDN link),但坦率地说,你可能会更好(如变更日志所述)拥有定义 display: none 的单独样式,然后在您希望元素不再隐藏时从元素中删除该样式。

【讨论】:

    【解决方案3】:

    您可以改为创建新的样式规则。

    var cssStyle = document.createElement('style');
    cssStyle.type = 'text/css';
    var rules = document.createTextNode(".YOU_CLASS_NAME{display:hidden}");
    cssStyle.appendChild(rules);
    document.getElementsByTagName("head")[0].appendChild(cssStyle);
    
    $("#YOUR_DOM_ID").addClass("YOUR_CLASS_NAME");
    

    【讨论】:

      【解决方案4】:

      要更改 CLASS,您需要编辑文档样式表

      [...document.styleSheets[0].cssRules].find(x=> x.selectorText=='.box')
          .style.display='inline';
      

      [...document.styleSheets[0].cssRules].find(x=> x.selectorText=='.box')
          .style.display='inline';
      .box {
        margin: 10px;
        padding: 10px;
        background: yellow;
        display: none
      }
      <div class="box" >My box 1</div>
      <div class="box" >My box 2</div>
      <div class="box" >My box 3</div>

      【讨论】:

        【解决方案5】:

        你的意思是这样的吗?

        var elements = document.getElementsByClassName('hidden-class');
        for (var i in elements) {
          if (elements.hasOwnProperty(i)) {
            elements[i].className = 'show-class';
          }
        }
        

        然后是 CSS

        .hidden-class { display: none; }
        .show-class { display: inline; }
        

        【讨论】:

        • 声称没有getElementsByClassName for document这样的方法
        • Hrm,older IE 不支持。老实说,我会推荐 jQuery 之类的东西,但每次我推荐它都会受到抨击。
        • @Zharkus:建议使用库作为不需要的答案的 附件 或后记没有害处(其中一位抨击者说);当有人用纯 jQuery 答案回答非 jQuery 问题时,它是合适的。 @Skizit:库 ilke jQueryPrototypeYUIClosureany of several others 可以为您消除浏览器差异,并提供许多有用的实用程序。
        • @Skizit:你可以在不支持的浏览器中添加getElementsByClassNameejohn.org/blog/getelementsbyclassname-speed-comparison
        【解决方案6】:

        最好的方法是有一个隐藏的类,像这样:

        .hidden { display: none; }
        

        之后,JavaScript 中的每个元素都有一个className 属性。您可以操纵该字符串以删除出现的 hidden 类并添加另一个。

        一条建议:使用 jQuery。让处理这类事情变得更容易,你可以这样做:

        $('#element_id').removeClass('hidden').addClass('something');
        

        【讨论】:

        • 噗!什么不是关于 jQuery 的 Javascript? ;-)
        • 如果不包含 jQuery,jQuery 特定代码在普通 JS 中不起作用的事实? “使用 jQuery”并不总是对所有关于 JS 的问题的有效答案,我相信有些人已经厌倦了听到它。
        • 一般来说,如果问题中没有提到 jQuery,你的答案就不应该引入 jQuery。如果你真的想包含 jQuery,应该在 vanilla JavaScript 中回答并添加一个“......然而,在 jQuery 中,它看起来像这样:”
        • 如果您费心阅读答案,您会看到我去解释如何在 vanilla JavaScript 中做到这一点,然后,only 然后我推荐 jQuery。
        • 我在答案中看到的唯一 JS 是特定于 jQuery 的。如果您展示了如何以其他方式执行此操作的示例,那么我可能会赞成答案。 (我没有投反对票,但主要是因为我觉得 -1 就足够了。)
        【解决方案7】:

        您可以使用getElementsByClassName,在其中您将获得一个元素数组。然而,这并没有在旧浏览器中实现。在这些情况下,getElementsByClassNameundefined 所以 the code has to iterate through elements and check which ones have the desired class name

        为此,您应该使用 jQuery、mootools、原型等 javascript 框架。

        在 jQuery 中,它可以使用单行来完成,如下所示:

        $('.theClassName').css('display', 'inline')
        

        【讨论】:

        • 错了,应该是$('.theClassName').css('display', 'inline')
        【解决方案8】:

        虽然这已经过去很久了,但这里有几点说明:

        • 使用display: inline 使事物再次可见可能会破坏 页面流。有些元素是内联显示的,有些是块状的,等等。这个 应该保留。因此,只定义一个 .hidden 样式并将其删除 让事物再次可见。

        • 如何隐藏:有(至少)两种隐藏元素的方法,一种是 上面提到的display: none,它基本上使元素 表现得好像它不存在一样,visibility: hidden 使元素不可见,但保留其占用的空间。 根据您要隐藏的内容,可见性可能会更好 选择,因为其他元素在显示/隐藏时不会移动 元素。

        • 添加/删除类与操作 CSS 规则:结果是 很不一样。如果你操纵 CSS 规则,所有元素都有 某个 CSS 类受到影响 - 现在和将来,即新的 动态添加到 DOM 的元素也被隐藏,而当 您添加/删除一个类,您必须确保新添加的元素 还添加/删除了类。所以,我会说添加/删除 类适用于静态 HTML,而操纵 CSS 规则 可能是动态创建的 DOM 元素的更好选择。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-12-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-07-14
          • 2014-11-08
          • 1970-01-01
          相关资源
          最近更新 更多