css - 滥用 :target to style multiple elements

标签 css

我的目标:

  • 使用我的所有输出生成一个 HTML 文档,以便可以将其作为一个单元进行复制。
  • 在该文档中有多个“页面”来显示数据的不同部分。
  • 让浏览器的后退按钮做正确的事,并支持深层链接。

使用 :target 伪类只显示我正在查看的页面(div {display: none} :target {display: block})相对容易。

我想添加两个改进:

  • 突出显示当前页面名称的导航栏。
  • 当 URL 中没有片段标识符(# 之后的东西)时出现的主页面。

我创建了一个使用空 div 和兄弟选择器的解决方案。 target元素(ID在URL片段标识符中的元素)是一个空的div,target,然后我的CSS说#target1 ~ #page1 { ... } #target1 ~ #link1 { ... } 。有关完整示例,请参阅此 Fiddle ;请注意,在点击导航栏中的链接后,后退和前进浏览器按钮的工作方式与人们合理预期的一样(我认为无法使用 jsfiddle 演示深层链接)。

此解决方案存在三个缺点:

  • 在我的 CSS 中,每个页面都有一个单独的选择器,如果页面很多,它会变得笨拙。
  • 后退按钮适用于 Chrome 和 Firefox,但 Edge 似乎不喜欢这个(我没有在其他地方测试过)。我的理解是 the spec is unclear关于 :target 和后退按钮(另见 Webkit bug )。
  • 正如问题的标题所说,感觉我在滥用……某样东西。

我的问题是,是否有更好的方法来完成我想做的事情?我稍微倾向于不使用 JavaScript(主要是因为这使得深层链接更明显地正确)。

最佳答案

@Seika85 链接(在评论中)到 Navigo,这是一个 Javascript 路由器,似乎专为执行此操作而构建。我已经更新了 fiddle而是使用它,这消除了我提到的所有缺点,而不得不使用(一小部分)Javascript 的(小)费用。谢谢!

new Navigo(null, false) 
.on(/target(.)/, function(x) {
  $('.active').removeClass('active');
  $('#page'+x).addClass('active');
  $('#link'+x).addClass('active');
})

关于css - 滥用 :target to style multiple elements,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38342392/

相关文章:

css - 需要帮助将 <ul> 列表式菜单居中

css - 背景大小包含 AND 长度

html - 为什么访问的链接之前没有出现复选标记?

html - 如何将下拉菜单直接移到父选项卡下?

css - 固定宽度的页面布局,但可随内容调整

javascript - IE8 中的绝对定位中断

html - uiwebview 和 CSS 文本阴影

javascript - 如何使多个选择结果/div 按照最近选择的顺序出现在顶部?

css - Bootstrap 3 网格没有间隙

javascript - 为什么我的 Owl Carousel 在我的第一组中不起作用?请问我的eero在哪里?