预算有限的公司,网站内容不太多的公司,都可以通过响应式实现一套代码覆盖PC到移动端,这也算是互联网从PC过渡到移动端的产物吧。
现在绝大部分页面都在移动端了,PC端的项目更多的是与专业工作技能有关的,与大众老百姓有关的生活娱乐等页面几乎都移动端化了。
做了很多响应式的页面,今天翻箱底,找到一个入门级的导航条案例,可以放出来。
用手机端查看是这样的,点击菜单图标可以显示隐藏下拉菜单。
PC端是这样的:
可以点击图片看效果。
核心代码:
.header-wrapper{
display: flex;
gap: 20px;
align-items: center;
height: 70px;
}
.logo-img{
height: 70px;
}
.nav{
display: block;
}
.nav-ul{
display: flex;
}
.nav-li{
position: relative;
}
@media (any-hover:hover) {
.nav-li.active .nav-a{
color: var(--theme-color);
}
}
.nav-a{
display: block;
height: 70px;
padding: 0 1.5em;
box-sizing: border-box;
width: max-content;
line-height: 70px;
font-size: 0.875rem;
border-top: 4px solid transparent;
border-left: 1px solid transparent;
border-right: 1px solid transparent;
color: var(--linkcolor);
}
.subnav-ul{
position: absolute;
min-width: 120px;
background-color: #fff;
display: none;
z-index: 100;
}
.subnav-a{
display: block;
padding: 0.8em 1.3em;
color: #7a8e9d;
font-size: 0.875rem;
}
.nav-a .icon-new{
position: absolute;
top: -10px;
right: 3px;
color: #f41330;
}
.nav-li-dot .nav-a::after{
content: '';
position: absolute;
width: 6px;
height: 6px;
border-radius: 50%;
background-color: #f41330;
top: 25px;
right: 10px;
}
.nav-a .icon-dot{
font-size: 1.5rem;
}
.nav-aside{
display: flex;
margin-left: auto;
}
.upload-ul{
right: 0;
}
.nav-a .icon-search{
font-size: 1.5rem;
color: #d4dce2;
}
.nav-a .icon-upload1{
color: #d4dce2;
}
.nav-a .icon-user{
font-size: 1.35rem;
vertical-align: middle;
color: var(--theme-color);
}
.user-a{
color: var(--theme-color);
}
.mobile-menu{
height: 70px;
padding:0 1em;
line-height: 70px;
}
.icon-menu{
font-size: 1.5rem;
cursor: pointer;
display: none;
}
.mobile-menu .icon-close{
font-size: 1.75rem;
display: none;
}
@media (any-hover:hover) {
.nav-a:hover,.nav-li:hover .nav-a{
border-left-color: #eee;
border-right-color: #eee;
border-top-color: var(--theme-color);
color: var(--linkcolor);
}
.nav-li:hover .subnav-ul{
display: block;
}
.subnav-a:hover{
background-color: #eff3f5;
}
.nav-a:hover .icon-search,.nav-a:hover .icon-upload1{
color: var(--theme-color);
}
}
@media screen and (max-width:1200px){
.nav-aside{
display: none;
}
}
@media screen and (max-width:1000px){
.icon-menu{
display: block;
}
.nav{
position: absolute;
z-index: 100;
width: 100%;
min-width: 375px;
right: 0;
top: 70px;
background-color: rgba(255, 255, 255, 0.5);
display: none;
}
.header-wrapper{
justify-content: space-between;
}
.nav .nav-ul{
flex-direction: column;
}
.subnav-ul{
position: static;
}
.nav-a{
position: relative;
line-height: 40px;
height: 40px;
}
.nav-li-dot .nav-a::after{
top: 8px;
right: 9px;
}
}用了一点点js实现点击图标显示隐藏下拉菜单以及子下拉菜单的切换。
const oMenu = document.querySelector('.mobile-menu');
const oIconMenu = document.querySelector('.icon-menu');
const oIconClose = document.querySelector('.icon-close');
const oNav = document.querySelector('.nav');
const oLis = document.querySelectorAll('.nav .nav-li');
// 主菜单开关
let isOn = true;
// 主菜单点击,显示或隐藏下拉菜单
oMenu.onclick = function () {
if (isOn) {
oNav.style.display = 'block';
oIconMenu.style.display = 'none';
oIconClose.style.display = 'block';
} else {
oNav.style.display = 'none';
oIconMenu.style.display = 'block';
oIconClose.style.display = 'none';
// 把所有子下拉菜单都隐藏
oLis.forEach(item => {
// 为每个li设置状态,下拉菜单默认关闭.
item.isOn = false;
const oSubMenu = item.querySelector('.subnav-ul');
if (oSubMenu) {
oSubMenu.style.display = 'none';
}
})
}
// 开关的状态每点击一次都要取反,true变成false,false变成true
isOn = !isOn;
}
// 子下拉菜单的显示隐藏
oLis.forEach(item => {
// 为每个li设置状态,下拉菜单默认关闭.
item.isOn = false;
showOrHideSubMenu(item, 'subnav-ul');
})
// 点击li,如果下面有子菜单,则显示或隐藏切换
function showOrHideSubMenu(title, submenu) {
if (title) {
title.addEventListener('touchend', function (e) {
// 因为这里下拉菜单还是嵌套结构,导致会冒泡,所以指定了事件对象
if (e.target.classList.contains('nav-li') || e.target.classList.contains('nav-a') || e.target.classList.contains('icon-dot')) {
const menu = title.querySelector(`.${submenu}`);
// console.log(e.target)
if (menu) {
if (title.isOn) {
menu.style.display = 'none';
} else {
menu.style.display = 'block';
}
}
title.isOn = !title.isOn;
}
})
}
}

发表评论:
◎请发表你卖萌撒娇或一针见血的评论,严禁小广告。