Javascript CSS:仅当存在后续同级时才选择元素

Javascript CSS:仅当存在后续同级时才选择元素,javascript,html,css,css-selectors,Javascript,Html,Css,Css Selectors,在我的HTML结构中,我将其设置为: <body> <main> <section> ... </section> <aside> ... </aside> </main> </body> ... ; 用户[问问题]总是想用样式“B”。此外,在这个问题中,用户希望选择“B”(而不是“A”) 只有当存在时,我才

在我的HTML结构中,我将其设置为:

<body>
   <main>
      <section>
      ...
      </section>

      <aside>
      ...
      </aside>
   </main>
</body>

...
; 用户[问问题]总是想用样式“B”。此外,在这个问题中,用户希望选择“B”(而不是“A”)


  • 只有当
    存在时,我才需要设置
    样式

  • 我不能改变HTML>的顺序,即使这不是最整洁的方式,你也可以运行准备文档的javascript函数,检查是否存在旁白标记,并相应地向节标记注入一个内联css。

    没有javascript 如果可以将html元素的顺序更改为:
    用JavaScript实现这一点相当简单

    例如,这将起作用:

    <script>
        window.onload = function() {
            if (document.getElementsByTagName('aside')[0]) {
               document.getElementsByTagName('section')[0].style.max-width = '500px';
            } else {
                document.getElementsByTagName('section')[0].style.max-width = '1000px';
            }
        }
    </script>
    
    
    window.onload=函数(){
    if(document.getElementsByTagName('aside')[0]){
    document.getElementsByTagName('section')[0].style.max-width='500px';
    }否则{
    document.getElementsByTagName('section')[0].style.max-width='1000px';
    }
    }
    
    在CSS中有相邻的兄弟选择器:

    包括IE8在内的所有现代浏览器都支持这一点+ 注意:如果section和aside在文档树中共享同一父级,并且section立即位于aside之前,则选择器匹配

    如果这对您不起作用,您可以使用jQuery尝试JavaScript:

    if($('aside').length)) $('section').addClass('specificSection');
    

    然后将所有样式添加到class'.specificSeciton'.

    如果您可以将元素放在第一节之前,可以使用:


    试试这个,我相信这只能用一些javascript来完成

    if ($('main').find('aside').length>0)
    {
        $('main').find('section').addClass('specificSection');
    }
    

    使用jQuery,您可以尝试以下操作:

    if($('aside')) $('section').css('max-width','500px');
    
    仅使用CSS,您可以为包含旁白的页面类型使用不同的样式,并且以某种方式仅在这些页面上包含该样式。您可以将该样式放入自己的小样式表中,并在需要时包含它,这可能比呈现页面然后使用JavaScript更改页面更干净。

    一个简洁的小技巧 如果
    中只有
    元素,则可以通过使用技巧检查来实现所需的功能。如果存在任何其他元素,则此操作将不起作用。在您的情况下,它应该是这样工作的():

    如本代码笔所示:


    兄弟选择器上的常规内容 有一个
    +
    选择器,它将选择紧跟在元素()之后的同级

    还有
    ~
    选择器,它选择以下所有同级()

    您可以通过放置

    快速展望未来
    很快这将成为可能,有了一个新的
    :has
    伪类()

    您可以调用像
    main:has(>aside)>section{…}
    这样的函数,但不幸的是,我们不得不等待:(

    您可以使用jQuery将类
    .haveSidebar
    切换到body标记,并使
    部分的CSS标记取决于body标记上是否存在此类:

    HTML

    <main>
        <section>
        </section>
    
        <aside>
        </aside>
    </main>
    
    JS

    main {
        width:100%;
    }
    main aside {
        width:300px;
        background:red;
        min-height:300px;
        float:left;
    }
    main section {
        width:100%;
        background:green;
        min-height:300px;
        float:left;
    }
    body.haveSidebar main section {
        width: calc(100% - 300px);
    }
    
    var sideBar = $('body > main > aside');
    if (sideBar.length > 0) {
        $('body').addClass('haveSidebar');
    } else {
        $('body').removeClass('haveSidebar');
    }
    

    更新

    不使用
    calc()
    的解决方案,方法是使用
    左边距
    属性

    main aside {
        width:300px;
        background:red;
        min-height:300px;
        position:relative;
    }
    main section {
        width:100%;
        background:green;
        min-height:300px;
        float:left;
    }
    .haveSidebar main section {
        margin-left:301px;
    }
    

    只能用CSS完成吗?---不幸的是,不可能重复的是,您基本上要求CSS中以前不存在的同级选择器。可能重复的:并且无需重新编辑您的标题,以包含标签中已给出的前缀。信不信由你,“我希望它是什么”以前和你一样-包括标题中的前缀。但是-so 1)需要删除它2)这不是我想要的,而是社区政策想要的。我不会再编辑你的问题,但我不能保证其他人也不会重新编辑它。我不能改变顺序>\u-Hmm这个怎么样:从IE9开始工作。。。它依赖于这样一个事实,
    元素是它工作的
    @wsws中唯一的元素。编辑您的答案作为解决方案,使用jsFiddle=)Man,检查这个想法:独生子女很好!救了我一天!谢谢,这将选择并应用样式。OP希望将样式应用于if,并且仅当side也存在时才应用。正确且非常好地支持IE7。使用~和not+也是一种很好的方法,因为这样元素就不需要彼此相邻+1如果他能改变DOM,这个解决方案就行了。不幸的是,他写道:
    我不能改变HTML>的顺序,你说“仅CSS”,但你接着说“改变HTML元素的顺序”。这毫无意义。我的意思是这个解决方案不需要javascript,我可以理解标题不是100%正确,但我是说OP真的不想使用javascript,只需要CSS解决方案。这是javascript还是jQuery?jQuery是javasript库,使用
    calc()
    是否可以保存?我喜欢它,但因为它只是一个候选人推荐,我想知道我们是否应该使用它。。。()有一些人在使用它,但是没有兼容性的保证,而且它在一些浏览器中仍然有缺陷。我试过了,但有些地方不对劲。。。
    section {
         max-width: 500px;
    }
    /* The STAR of the show */
    section:only-child {
         max-width: 1000px;
    }
    
    <main>
        <section>
        </section>
    
        <aside>
        </aside>
    </main>
    
    main {
        width:100%;
    }
    main aside {
        width:300px;
        background:red;
        min-height:300px;
        float:left;
    }
    main section {
        width:100%;
        background:green;
        min-height:300px;
        float:left;
    }
    body.haveSidebar main section {
        width: calc(100% - 300px);
    }
    
    var sideBar = $('body > main > aside');
    if (sideBar.length > 0) {
        $('body').addClass('haveSidebar');
    } else {
        $('body').removeClass('haveSidebar');
    }
    
    main aside {
        width:300px;
        background:red;
        min-height:300px;
        position:relative;
    }
    main section {
        width:100%;
        background:green;
        min-height:300px;
        float:left;
    }
    .haveSidebar main section {
        margin-left:301px;
    }