在网站导航栏中,我有一些逻辑可以确定用户当前正在查看的页面,并为该菜单项提供.active
类。
我提出的代码确实有效,但感觉不是很优雅。你能想出一种更好的方法吗?如何将逻辑移出视图并进入控制器?我怎么能停止重复自己?
控制器:
<?php
class Pages extends CI_Controller {
public function view ($page = 'home') {
if (!file_exists('application/views/pages/'.$page.'.php'))
show_404();
$data['active'] = $page;
$this->load->view('templates/header', $data);
$this->load->view('pages/'.$page, $data);
$this->load->view('templates/footer', $data);
}
}
?>
观点:
<ul class="nav">
<li class="<?php echo($active=='home')?'active':''; ?>"><a href="./">blog</a></li>
<li class="<?php echo($active=='about')?'active':''; ?>"><a href="about">about</a></li>
<li class="<?php echo($active=='projects')?'active':''; ?>"><a href="projects">projects</a></li>
<li class="<?php echo($active=='lab')?'active':''; ?>"><a href="lab">lab</a></li>
<li class="<?php echo($active=='contact')?'active':''; ?>"><a href="contact">contact</a></li>
</ul>
答案 0 :(得分:1)
也许更优雅?
function is_active($item) {
return strpos(uri_string(), $item)!==FALSE ? 'active':'';
}
<li class="<?=is_active('blog')?>"><a href="./">blog</a></li>
这种方式取决于你的uris的复杂性。
答案 1 :(得分:1)
您可以尝试使用CSS。例如。如果您在“关于”页面上,其正文标记为<body id="about">
。你的CSS:
#about .nav li.about, #contact .nav li.contact, /* etc */ { color: red; }
这意味着你的每个.nav li都有一个与之相关的类名(在本例中为“about”)。你的CSS文件中会有一些重复(虽然这只是在属性声明之前用逗号分隔所有li类名称的问题),但是视图会保持干净。