【问题标题】:css no longer responsive after changed with javascript用javascript更改后css不再响应
【发布时间】:2013-12-07 21:28:47
【问题描述】:

我有一个使用媒体查询具有响应式 css 的网站。

有一个div,叫“map”

对于宽度 500px 及以上的容器内有地图

//html stucture
//header, menu

<div id="conteiner">
   //texts , images, forms, etc
   <div id="map"></div>
   <input type="button" id="showpage"...
   <input type="button" id="showmap"...
</div>

//footer

@media screen and (max-width: 500px) {
//other divs style here
#map {width:100%; text-align:center; position:relative; padding-left:0.1%; padding-right:0.1%; padding-bottom:60%;}
#showpage #showmap {display:none;}
}

对于宽度 500 像素及以下,地图变为“全屏”,只需设置除地图和显示页面按钮之外的所有内容 display:none

@media screen and (min-width: 500px) {
//other divs style here, set to display none
#map {width:100%; heigth:100%; text-align:center; position:relative; margin:0; padding:0;}
#showpage {display:block; position: absolute;}// floats over map
#showmap {display : none;}
}

到目前为止,好的,如果我调整浏览器的大小,我会看到地图全屏显示,并在浏览器的宽度超过 500 或不超过 500 时返回到容器 div 中。所以一切都是响应式的。

问题:

当地图全屏时(浏览器低于 500 像素)我使用显示地图/显示页面按钮,以便用户可以从全屏地图切换到页面并返回到地图。

显示地图按钮在用户看到页面时可见,并且可以单击它再次查看全屏地图。

按钮使用 javascript 为 div 设置/取消设置 style.display:none

如果用户点击按钮,css 不再响应。如果我单击显示页面按钮以“关闭”全屏地图,我会看到该页面。然后我将浏览器调整为更大,但地图永远不会重新出现在容器 div 中

我猜当 javascript 更改 css 时,更改是永久性的

我该如何解决这个问题?

谢谢

【问题讨论】:

  • 当您更新元素“样式”对象时,这些设置会覆盖 CSS。您可以添加/删除 CSS 类,而不是直接修改“样式”对象。这样,您的 CSS 仍处于控制之中。
  • @Pointy。快速响应和有趣的解决方案。你能提供一个例子/链接吗?谢谢

标签: javascript css responsive-design media-queries


【解决方案1】:

您可以添加/删除一个类,而不是直接通过影响 DOM 中的“样式”来隐藏元素。

在您的 CSS 中(某处;可能在媒体查询之前):

.hidden { display: none; }

然后在你的 JavaScript 代码中:

function whatever() {
  // ...
  var theDiv = document.getElementById("something");
  if (time_to_hide( theDiv )) {
    theDiv.className += " hidden";
  }
  else {
    theDiv.className = theDiv.className.replace(/\bhidden\b/g, "");
  }
  // ...
}

现在您可以利用普通 CSS 规则来了解不同规则如何相互覆盖。如果您的“隐藏”规则位于 CSS 文件的顶部,则媒体查询中的任何内容都会覆盖它。 (在这种情况下,这可能无关紧要,因为您只想“隐藏”表示该元素不显示。)

因为您没有更改 DOM 中的样式,所以当“隐藏”类不存在时,旧规则的应用与添加该类之前的完全一样。

【讨论】:

  • 那么,点击按钮调用whatever函数?而something 是一个div? “你的潜规则”是什么意思?很抱歉,但这对我来说仍然有点不清楚
  • 是的;抱歉,这应该只是一个例子。这个想法是,不是操纵yourDomEement.style.display,而是从“className”属性中添加或删除一个类名。然后,您使用 CSS 规则来表示具有该类名称的元素应该是 display: none。具体如何在您的代码中发挥作用取决于您的页面的工作方式。 (“隐藏”规则是“隐藏”类的 CSS 规则;以“.hidden”选择器开头的规则。)
  • @slevin - 只是想;如果您的媒体查询中有“显示”css 属性的规则,您可能希望“.hidden”规则在之后,而不是之前。您可能会遇到 CSS 特异性规则的问题;如果是这样,请再问一个问题,我会留意的:)
  • 好的,我明白了。测试它,为一个简单的 div 和工作。我将规则放在 CSS 文件的末尾。最后一个问题。如果地图是全屏的并且浏览器变大了,地图如何才能恢复到原来的大小并适合它的容器而不是全屏呢?再次感谢
  • @slevin 那是你删除“隐藏”类的时候。在我的示例中,我使用.replace() 和一个正则表达式完成了它。如果您使用的是 jQuery 之类的库或其他库,则可以使用更简单的方法。
猜你喜欢
  • 2019-06-07
  • 1970-01-01
  • 2011-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-13
  • 2018-02-01
相关资源
最近更新 更多