【问题标题】:Change the background image property of body depending on which ID and class is active根据激活的 ID 和类更改 body 的背景图像属性
【发布时间】:2018-12-08 03:53:35
【问题描述】:

我正在开发一个网站,它的所有页面基本上都在主着陆页上“滑动”。所以你基本上从一个 ID 为“main”的 div 开始,它也有一个类“currentpage”。如果单击导航菜单项,则内容会滑开,而下一页的内容会滑入到位。这个新内容的主 div 将有一个新的 id(比如说#about),现在“currentpage”类也被添加到这个 div 中。

问题是,body 标签附加了一个背景图像(它曾经有一个全屏视频,但我将其设置为隐藏,然后在它后面有这个 bg 图像)。我想根据您所在的“页面”更改背景图像。起初,我设置它以便 #about 设置背景图像,以此类推其余的页面 ID。关于这个的事情是主 div 的内容被填充了一大堆,所以你会看到指定的 #about 背景图像,但实际上你仍然会从它后面的 body 标签中看到原始图像。

因此,我想根据您使用的 ID 更改实际 body 标记的背景图像属性。

我想出了一些方法来检查您是否在指定的 ID 上,以及该 div 的类是否设置为“currentpage”将是第 1 步,然后在第 2 步更改背景图像,如果该条件是真的。

这是我迄今为止尝试过的,但无济于事:

尝试 1:

if ($this.is('#about')) { 
$('.bgimage').css({"background":"url(imageurlhere)"});

}

这没有做任何事情。

接下来,我找到了this old SO thread 并尝试对其进行修改,以查看它的运行情况,以了解我是否走在正确的道路上。这是我使用的:

尝试2:

if ($("#about").hasClass("currentpage")) {
$('#about').css({"background-color":"red"});

}

不幸的是,当我去 About 时,这也没有造成任何不同。

是的,我每次都清除缓存,甚至手动转到 JS 文件以确保它每次都有新的代码块。

编辑
这是基本的页面格式:

<body class="video">
<div class="preload">Whole lot of stuff in here for a preload overlay</div>
<nav>Nav is here</nav>
<main>
    <div id="pt-main" class="pt-perspective ">
        <div class="page-1 currentpage" id="main"></div>
        <div class="page-2" id="about"></div>
        <div class="page-3" id="services"></div>
        <div class="page-4" id="portfolio"></div>
        <div class="page-5" id="contact"></div>
    </div>
</main>

如果点击导航中的相应链接,“currentpage”类将转到不同的 div。因此,单击导航中的 About,currentpage 类从#main 中删除,并与#about 出现在相同的 div 中

然后body标签的CSS如下:

.video {
background: url(../img/video_bg.jpg);
background-size: cover;

}

我基本上想让 .video 的背景(图像)在您最终访问 #about、#services、#portfolio 等时发生变化。

TL;DR
谁能帮我解决这个代码块?如何检查具有特定ID的div是否也有类,然后修改.bgimage CSS以更改其背景?

编辑 2
我想出了一个解决方法。这是我所做的:
1)我将整体背景颜色设置为#000,完全删除了原始的bg-image,实际上恢复了我之前隐藏的全屏视频
2) 我编辑了每个导航菜单项以具有一个 hidevid 类,除了 Home 链接,我制作了 showvid
3) 我为每个“页面”ID 创建了 CSS(即 #about {background-image: url(image);}
4) 我创建了一个新的 CSS 类:.hidethis {display: none;}
5)然后我实现了以下jquery:

$(document).ready(function(){
$(".hidevid").click(function(){
    $("video").addClass("hidethis");
});
$(".showvid").click(function(){
    $("video").removeClass("hidethis");
});

});

它的作用是将背景设置为黑色,但这在登录(“主页”)页面上看不到,只有视频。但是,单击导航菜单项会将下一个“页面”“滑动”到视图中,显示其背景图像并将视频更改为具有 display: none 属性,基本上隐藏它并且额外的内容(导航)只有黑色背后的背景。

【问题讨论】:

  • 你能展示一下这个的html和css吗?
  • 什么不起作用? $('body').css({backgroundImage: 'url(...)'});
  • @MiriamSalzer - 我用 html 和 css 更新了原始帖子

标签: javascript jquery css


【解决方案1】:

使用 vanilla JavaScript(纯 JavaScript),您可以检查 div 是否具有特定的类名,并根据结果,通过执行以下操作更改 css:

var x = document.getElementById('about');
var y = document.querySelector('.bgimage');

if (x.classList.contains('currentpage')){ // if #about has "currentpage" class, run the following
    x.style.background = 'red';               //change background-color of #about to red
    y.style.background = 'url(imageurlhere)'; // change background-image of .bgimage
}

jsFiddle: http://jsfiddle.net/AndrewL64/nqjypevh/10/


【讨论】:

  • 这看起来非常好,对我来说很有意义,但它并没有最终在我的网站上工作。
  • Hmm.... 不太确定发生了什么,但是您可以/可以尝试将上述代码保留在页面底部的结束正文标记上方吗?如果这样做后仍然无法正常工作,请刷新页面并按 F12 检查浏览器控制台。如果console有错误,能不能复制到这里的cmets中。
  • 我在 end body 标记上方尝试过,但没有成功。控制台中没有任何与此相关的错误(只有错误与缺少其 API 密钥的地图插件有关)
  • 您的网站上线了吗?如果是的话,你能给我一个链接,我去看看。
  • 我找到了一种解决方法 - 我在原始帖子中发布了我最终所做的事情。不过,谢谢!
【解决方案2】:

您的代码错误。真正的用法是这样的。

css('background-color','red')

【讨论】:

    【解决方案3】:

    我想出了一个解决方法。这是我所做的: 1)我将整体背景颜色设置为#000,完全删除了原始的bg-image,实际上恢复了我之前隐藏的全屏视频 2)我编辑了每个导航菜单项以具有一个 hidevid 类,除了 Home 链接,我制作了 showvid 3)我为每个“页面”ID创建了CSS(即#about {background-image: url(image);} 4) 我创建了一个新的 CSS 类:.hidethis {display: none;} 5)然后我实现了以下jquery:

    $(document).ready(function(){
    $(".hidevid").click(function(){
        $("video").addClass("hidethis");
    });
    $(".showvid").click(function(){
        $("video").removeClass("hidethis");
    });
    });
    

    它的作用是将背景设置为黑色,但这在登录(“主页”)页面上看不到,只有视频。但是,单击导航菜单项会将下一个“页面”“滑动”到视图中,显示其背景图像并将视频更改为具有 display: none 属性,基本上隐藏它并且额外的内容(导航)只有黑色背后的背景。

    【讨论】:

      【解决方案4】:

      我做了很多假设和猜测。你只展示了一个 CSS 类。从描述上看,问题实际上是使用 CSS 来覆盖背景,如果不是这样,就不需要更改 body 上的类。基本解决方案,将初始背景从正文移动到#main div,将填充移动到.page-1、.page-2 等div。此外,如果背景图像是透明的,也可以给出背景颜色。

      我假设导航没有背景图像并保持不变。我还假设你已经有了滑动部分,我没有展示它,而只是一个简单的 display none/block 只是为了保持简单。我也没有显示 js(但你应该不需要更改 body 类。)我也单独留下了 html。

      body {
        margin: 0;
        height: 100%;
      }
      
      nav {
        height: 50px;
        background-color: #ccc;
      }
      
      main {
        background-image: url(https://picsum.photos/200/300?image=0);
        background-size: cover;
      }
      
      .pt-perspective > div {
        height: calc(100vh - 50px);
        padding: 50px;
        background-repeat: no-repeat;
        background-color: aqua;
        background-size: cover;
        background-image: url(https://picsum.photos/200/300?image=0);
        display: none; /* or positioned off screen, wherever you already have it */
      }
      
      .pt-perspective .currentpage {
        display: block;
      }
      
      .pt-perspective .page-1 {
        background-image: url(https://picsum.photos/800?image=1);
      }
      .pt-perspective .page-2 {
        background-image: url(https://picsum.photos/800?image=2);
      }
      .pt-perspective .page-3 {
        background-image: url(https://picsum.photos/800?image3);
      }
      .pt-perspective .page-4 {
        background-image: url(https://picsum.photos/800?image=4);
      }
      .pt-perspective .page-5 {
        background-image: url(https://picsum.photos/600?image=5);
      }
      <body class="video">
      <!-- <div class="preload">Whole lot of stuff in here for a preload overlay</div> -->
      <nav>Nav is here</nav>
      <main>
          <div id="pt-main" class="pt-perspective ">
              <div class="page-1 currentpage" id="main"></div>
              <div class="page-2" id="about"></div>
              <div class="page-3" id="services"></div>
              <div class="page-4" id="portfolio"></div>
              <div class="page-5" id="contact"></div>
          </div>
      </main>

      【讨论】:

        猜你喜欢
        • 2019-06-18
        • 1970-01-01
        • 1970-01-01
        • 2012-12-07
        • 2023-03-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多