file-type

蓝色横向导航条特效的纯CSS代码实现

RAR文件

1星 | 16KB | 更新于2025-04-08 | 87 浏览量 | 2 下载量 举报 收藏
download 立即下载
在现代网页设计中,纯CSS打造的漂亮蓝白色横向导航条是一种常见的UI元素,它不仅为用户提供了一种清晰的导航方式,还能增强网站的视觉吸引力。以下是关于如何使用纯CSS实现蓝白色横向导航条的设计与特效代码的详细知识点。 ### CSS基础知识点 1. **选择器**:在CSS中,选择器用来定位HTML文档中的元素。常见的选择器包括元素选择器、类选择器、ID选择器等。 2. **盒模型**:盒模型是CSS布局的基础,它定义了元素框处理元素内容(content)、内边距(padding)、边框(border)和外边距(margin)的方式。 3. **布局技术**:CSS提供了多种布局方法,比如浮动(float)、定位(position)、弹性盒子(flexbox)和网格(grid)等。 4. **伪类和伪元素**:伪类用于定义元素的特殊状态,如:hover、:active、:focus。伪元素用于创建不在文档树中的元素,并且可以作为一些特殊效果的钩子,比如::before、::after。 5. **过渡和动画**:CSS过渡可以创建元素状态改变时的动画效果。使用过渡属性(transition),开发者可以指定哪些属性改变时应用动画效果,以及动画的持续时间。 ### 蓝白色横向导航条的CSS特效实现 1. **导航条结构**:首先,我们需要一个无序列表`<ul>`来存放导航链接`<li>`。每个列表项`<li>`将对应一个导航链接。 2. **清除默认样式**:通过CSS重置或清除浏览器对`<ul>`和`<li>`元素的默认样式,确保导航条的一致性和清洁的外观。 3. **基础样式设置**:使用类选择器为导航条和列表项设置基础样式。包括宽度、背景色(蓝白色渐变)、列表的显示方式(inline-block或flex)、内边距和外边距等。 4. **链接样式**:为`<a>`标签设置字体大小、颜色、文本装饰(去除下划线)以及鼠标悬停时的颜色变化。 5. **响应式设计**:为了适应不同屏幕尺寸,使用媒体查询(Media Queries)来调整导航条的宽度、字体大小等样式,确保导航条在移动设备上也能保持良好的可用性。 6. **悬停特效**:利用CSS的`:hover`伪类给用户交互提供视觉反馈。例如,当鼠标悬停在某个列表项上时,可以改变背景颜色或增加边框效果,以突出显示当前导航项。 7. **动画效果**:为了增加用户体验,可以给导航条添加简单的过渡动画,如平滑的颜色渐变或尺寸变化。 8. **高级特效**:可选的高级特效包括使用阴影(box-shadow)、边框圆角(border-radius)以及添加背景图像等,以增强视觉效果。 ### 实际代码示例 ```css /* 基础样式 */ .horizontal-nav { list-style-type: none; margin: 0; padding: 0; overflow: hidden; background-color: #333; /* 深蓝背景 */ box-shadow: 0 2px 3px rgba(0,0,0,0.5); /* 轻微的阴影效果 */ } .horizontal-nav > li { float: left; } .horizontal-nav li a { display: block; color: white; /* 白色文字 */ text-align: center; padding: 14px 20px; text-decoration: none; } .horizontal-nav li a:hover { background-color: #ddd; /* 鼠标悬停时的背景色 */ color: black; /* 文字颜色 */ } /* 响应式设计 */ @media screen and (max-width: 600px) { .horizontal-nav li { float: none; } } ``` ```html <ul class="horizontal-nav"> <li><a href="#home">首页</a></li> <li><a href="#news">新闻</a></li> <li><a href="#contact">联系</a></li> <li><a href="#about">关于</a></li> </ul> ``` 综上所述,通过纯CSS实现一个漂亮且具有特效的蓝白色横向导航条,需要综合运用CSS选择器、盒模型、布局技术、伪类伪元素、过渡动画等知识。这不仅能够提高用户界面的美观度,而且还能提升用户的交互体验。

相关推荐

filetype

给出css,js文件代码,实现页面导航条横向二级菜单,导航条菜单背景颜色为灰蓝色 菜单项文本居中,鼠标移动到导航条菜单项时,该菜单项字体颜色变为白色,同时正下方弹出一个二级菜单,下拉菜单的背景颜色也是灰蓝色,当鼠标移动到二级菜单项时候背景颜色变为白色

filetype

任务分发看板UI参考图 页面整体为桌面端Web后台管理界面,适配设备为1920px宽桌面端,页面容器宽度1200px,居中显示,左右边距360px,背景色#FFFFFF。 顶部导航栏 位置:页面最顶部,宽度100%(1920px),高度60px,背景色#FFFFFF,底部边框1px solid #E5E7EB。 内容:左侧有蓝色汉堡菜单图标(尺寸24x24px),右侧横向排列多个标签页文字,包括“首页”“项目立项管理”“项目计划管理”“项目验收管理”“任务分发管理”“任务开发管理”“任务分发看板”,当前选中标签为“任务分发看板”,文字颜色#1E40AF,下方有2px宽、8px高的蓝色下划线(#3B82F6),未选中标签文字颜色#4B5563,字体大小14px,字体为Inter,各标签间距24px。 筛选区域 位置:导航栏下方,距离顶部导航栏20px,宽度100%(1200px),高度48px。 内容:从左到右依次排列筛选按钮组、日期输入框、确定按钮。 筛选按钮组:包含“本月”“本季度”“本年”“自定义”4个按钮,按钮为圆角矩形(圆角6px),未选中按钮背景色#F3F4F6,文字颜色#4B5563,选中按钮背景色#3B82F6,文字颜色#FFFFFF,按钮高度36px,宽度64px(“自定义”按钮宽度72px),字体大小14px,Inter字体,按钮间距12px。 日期输入框:“开始日期”和“结束日期”输入框,左侧有日历图标(尺寸16x16px,颜色#9CA3AF),输入框为白色背景,边框1px solid #E5E7EB,圆角6px,宽度140px,高度36px,内边距12px,文字颜色#1F2937,字体大小14px,Inter字体,两个输入框之间有“至”文字(颜色#6B7280,字体大小14px),间距12px。 确定按钮:蓝色圆角矩形按钮(#3B82F6),文字“确定”,白色字体,字体大小14px,Inter字体,高度36px,宽度80px,圆角6px,右侧距筛选区域边缘0px。 统计图表区域 位置:筛选区域下方,距离筛选区域24px,宽度100%(1200px),高度320px,包含三个图表,从左到右横向排列,各图表宽度占比32%、32%、32%,图表之间间距24px。 左侧:任务完成情况统计(柱状图) 容器:白色背景,圆角8px,边框1px solid #E5E7EB,内边距16px,高度320px。 标题:“任务完成情况统计”,文字颜色#1F2937,字体大小16px,Inter字体,加粗,位于容器顶部左侧,距离顶部内边距16px,距离左侧内边距16px。 图例:位于标题下方,距离标题12px,横向排列“未完成”(文字颜色#1E40AF,左侧有8x8px深蓝色方块#1E40AF)、“已完成”(文字颜色#3B82F6,左侧有8x8px浅蓝色方块#3B82F6),文字大小12px,Inter字体,间距16px。 柱状图:位于图例下方,距离图例20px,宽度100%,高度200px。X轴标签为“30日”“2日”“4日”“6日”“8日”“10日”“12日”“14日”“16日”“18日”“20日”“22日”“24日”“26日”“28日”“30日”,字体大小12px,颜色#6B7280;Y轴刻度0-100,间隔20,字体大小12px,颜色#6B7280;柱子为圆角矩形(顶部圆角4px),未完成柱子颜色#1E40AF,已完成柱子颜色#3B82F6,柱子宽度12px,柱子间距8px;每个柱子顶部居中显示具体数值(如“80”“75”等),字体大小12px,颜色#1F2937。 中间:责任人完成情况(条形图) 容器:白色背景,圆角8px,边框1px solid #E5E7EB,内边距16px,高度320px。 标题:“责任人完成情况”,文字颜色#1F2937,字体大小16px,Inter字体,加粗,位于容器顶部左侧,距离顶部内边距16px,距离左侧内边距16px。 图例:与左侧柱状图图例一致,位于标题下方,距离标题12px。 条形图:位于图例下方,距离图例20px,宽度100%,高度200px。Y轴标签为“吴十”“周九”“孙八”“钱七”“赵六”“王五”“李四”“张三”,字体大小12px,颜色#6B7280,右对齐;X轴刻度0-80,间隔20,字体大小12px,颜色#6B7280;条形为圆角矩形(右侧圆角4px),未完成条形颜色#1E40AF,已完成条形颜色#3B82F6,条形高度24px,条形间距8px;每个条形右侧显示具体数值(如“80”“70”等),字体大小12px,颜色#1F2937。 右侧:任务状态分布(饼图) 容器:白色背景,圆角8px,边框1px solid #E5E7EB,内边距16px,高度320px。 标题:“任务状态分布”,文字颜色#1F2937,字体大小16px,Inter字体,加粗,位于容器顶部左侧,距离顶部内边距16px,距离左侧内边距16px。 饼图:位于标题下方,距离标题32px,居中显示,直径160px。未完成区域占比约40%,颜色#1E40AF;已完成区域占比约60%,颜色#3B82F6;饼图中心显示两行文字,上行“已完成:60%”,下行“未完成:40%”,字体大小14px,颜色#1F2937,Inter字体,文字居中对齐。 图例:位于饼图下方,距离饼图20px,横向排列“已完成”(文字颜色#3B82F6,左侧有8x8px浅蓝色方块#3B82F6)、“未完成”(文字颜色#1E40AF,左侧有8x8px深蓝色方块#1E40AF),文字大小12px,Inter字体,间距24px,居中显示。 任务列表区域 位置:统计图表区域下方,距离统计图表区域32px,宽度100%(1200px),高度自适应(根据内容,当前显示5条任务,高度约280px),背景色#FFFFFF,边框1px solid #E5E7EB,圆角8px。 标题:“任务列表”,文字颜色#1F2937,字体大小16px,Inter字体,加粗,位于列表容器顶部左侧,距离顶部内边距16px,距离左侧内边距16px。 表格:位于标题下方,距离标题16px,宽度100%,边框-collapse,单元格无内边距。 表头:高度40px,背景色#F3F4F6,包含“任务号”“名称”“成果物”“责任人”“计划完成时间”5列,每列表头文字颜色#4B5563,字体大小14px,Inter字体,居中对齐,各列宽度占比15%、25%、20%、15%、25%,表头底部边框1px solid #E5E7EB。 表体:每行高度48px,边框底部1px solid #E5E7EB,hover时行背景色#F9FAFB。 第1行:任务号“TASK-1001”,名称“任务名称1”,成果物“文档”,责任人“李四”,计划完成时间“2025/8/5”,文字颜色#1F2937,字体大小14px,Inter字体,居中对齐。 第2行:任务号“TASK-1002”,名称“任务名称2”,成果物“报告”,责任人“钱七”,计划完成时间“2025/8/10”,文字颜色#1F2937,字体大小14px,Inter字体,居中对齐。 第3行:任务号“TASK-1003”,名称“任务名称3”,成果物“代码”,责任人“王五”,计划完成时间“2025/8/26”,文字颜色#1F2937,字体大小14px,Inter字体,居中对齐。 第4行:任务号“TASK-1004”,名称“任务名称4”,成果物“设计图”,责任人“李四”,计划完成时间“2025/8/27”,文字颜色#1F2937,字体大小14px,Inter字体,居中对齐。 第5行:任务号“TASK-1005”,名称“任务名称5”,成果物“测试用例”,责任人“张三”,计划完成时间“2025/8/27”,文字颜色#1F2937,字体大小14px,Inter字体,居中对齐。 滚动条:表格右侧有纵向滚动条,宽度6px,背景色#E5E7EB,滑块颜色#9CA3AF,圆角3px,滑块高度根据内容自适应。

filetype

<template> <view class="container"> <view class="swiper_area"> <SCSwiper :images="bannerImages"></SCSwiper> </view> <view class="category_area"> <view v-if="loadingCategories" class="loading">加载分类中...</view> <uni-segmented-control v-else :values="categoryNames" @clickItem="changeCategory" styleType="text" :current="currentCategoryIndex"></uni-segmented-control> </view> <view class="appeal_list"> <view v-if="loadingAppeals" class="loading">加载诉求中...</view> <view v-else> <uni-list> <uni-list-item v-for="item in currentAppeals" :key="item.id" :title="item.title" :note="`${item.appealCategoryName || '未分类'} | ${item.stateText}`" :thumb="item.imgUrl ? (ip + item.imgUrl) : ''" thumb-size="lg" :right-text="item.stateText" @click="viewAppealDetail(item.id)"> <template v-slot:footer> <view class="list-footer"> <text class="time">{{ formatDate(item.createTime) }}</text> </view> </template> </uni-list-item> </uni-list> <view v-if="currentAppeals.length === 0" class="no_data"> 暂无诉求数据 </view> </view> </view> <view class="nav_actions"> <button class="create_btn" @click="createAppeal">创建诉求</button> <button class="my_btn" @click="viewMyAppeals">我的诉求</button> </view> </view> </template> <script setup> import { ref, onMounted } from 'vue' import { ip, getHttp } from '../../utils/http.js' // 轮播图数据 const bannerImages = ref([]) // 诉求分类数据 const appealCategories = ref([]) const categoryNames = ref([]) const currentCategoryIndex = ref(0) // 当前显示的诉求列表 const currentAppeals = ref([]) // 加载状态 const loadingCategories = ref(true) const loadingAppeals = ref(true) // 状态码转文本函数 const getStateText = (state) => { const stateMap = { '0': '待处理', '1': '处理中', '2': '已解决', '3': '已关闭' } return stateMap[state] || '未知状态' } // 格式化日期 const formatDate = (timestamp) => { if (!timestamp) return ''; const date = new Date(timestamp); return `${date.getFullYear()}-${(date.getMonth() + 1).toString().padStart(2, '0')}-${date.getDate().toString().padStart(2, '0')}`; } // 获取广告轮播图 async function getBanners() { try { const res = await getHttp({ url: '/prod-api/api/gov-service-hotline/ad-banner/list' }) // 统一处理响应结构 const data = res.data?.code === 200 ? res.data.data : res.code === 200 ? res.data : []; if (Array.isArray(data)) { bannerImages.value = data.map(item => ip + item.imgUrl) } } catch (error) { console.error('获取轮播图失败:', error) } } // 获取诉求分类 async function getAppealCategories() { try { loadingCategories.value = true const res = await getHttp({ url: '/prod-api/api/gov-service-hotline/appeal-category/list' }) // 统一处理响应结构 const data = res.data?.code === 200 ? (res.data.rows || res.data.data) : res.code === 200 ? (res.rows || res.data) : []; if (Array.isArray(data)) { appealCategories.value = data categoryNames.value = data.map(item => item.name) // 默认加载第一个分类的诉求 if (data.length > 0) { getAppealsByCategory(data[0].id) } } } catch (error) { console.error('获取诉求分类失败:', error) uni.showToast({ title: '获取分类失败', icon: 'none' }) } finally { loadingCategories.value = false } } // 根据分类获取诉求 async function getAppealsByCategory(categoryId) { try { loadingAppeals.value = true const res = await getHttp({ url: '/prod-api/api/gov-service-hotline/appeal/list', data: { appealCategoryId: categoryId, pageNum: 1, pageSize: 10 } }) // 统一处理响应结构 const data = res.data?.code === 200 ? (res.data.rows || res.data.data) : res.code === 200 ? (res.rows || res.data) : []; if (Array.isArray(data)) { currentAppeals.value = data.map(item => ({ ...item, stateText: getStateText(item.state) })) } } catch (error) { console.error('获取诉求列表失败:', error) uni.showToast({ title: '获取诉求列表失败', icon: 'none' }) } finally { loadingAppeals.value = false } } // 分类切换处理 - 修复事件处理 function changeCategory(e) { const index = e.currentIndex; if (index >= 0 && index < appealCategories.value.length) { currentCategoryIndex.value = index const category = appealCategories.value[index] getAppealsByCategory(category.id) } } // 查看诉求详情 function viewAppealDetail(id) { uni.navigateTo({ url: `/pages/index/AppealDetail?id=${id}` }) } // 创建诉求 function createAppeal() { uni.navigateTo({ url: '/pages/index/CreateAppeal' }) } // 查看我的诉求 function viewMyAppeals() { uni.navigateTo({ url: '/pages/index/MyAppeals' }) } onMounted(() => { getBanners() getAppealCategories() }) </script> <style lang="scss" scoped> .container { padding: 20rpx; background-color: #f5f5f5; .loading { padding: 30rpx; text-align: center; color: #888; font-size: 28rpx; } .swiper_area { height: 350rpx; margin-bottom: 30rpx; border-radius: 15rpx; overflow: hidden; box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.1); } .category_area { margin-bottom: 30rpx; background: #fff; border-radius: 15rpx; padding: 20rpx 10rpx; min-height: 80rpx; box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.05); } .appeal_list { margin-bottom: 120rpx; :deep(.uni-list-item__container) { padding: 24rpx 30rpx; } :deep(.uni-list-item__content-title) { font-size: 32rpx; font-weight: bold; margin-bottom: 10rpx; } :deep(.uni-list-item__content-note) { color: #666; font-size: 26rpx; margin-top: 8rpx; } :deep(.uni-list-item__extra-text) { font-size: 26rpx; color: #007AFF; } .list-footer { margin-top: 10rpx; .time { font-size: 24rpx; color: #999; } } .no_data { text-align: center; padding: 80rpx 40rpx; color: #999; font-size: 30rpx; background: #fff; border-radius: 15rpx; } } /* 固定在导航栏上方的按钮 */ .nav_actions { bottom: 0; left: 0; right: 0; display: flex; flex-direction: row; /* 明确设置为行布局 */ align-items: center; justify-content: space-between; /* 使用空间分布对齐 */ padding: 15rpx 30rpx; background: #fff; border-top: 1rpx solid #e0e0e0; border-radius: 10rpx; box-shadow: 0 -4rpx 12rpx rgba(0, 0, 0, 0.05); /* 安全区域适配 */ padding-bottom: calc(15rpx + constant(safe-area-inset-bottom)); padding-bottom: calc(15rpx + env(safe-area-inset-bottom)); z-index: 1000; box-sizing: border-box; /* 确保内边距包含在宽度内 */ /* 安全区域占位 */ &::after { content: ''; position: absolute; bottom: 0; left: 0; right: 0; height: constant(safe-area-inset-bottom); height: env(safe-area-inset-bottom); background: #fff; } button { flex: 1; /* 等分空间 */ min-width: 0; /* 允许内容收缩 */ margin: 0 15rpx; /* 左右间距 */ font-size: 30rpx; height: 80rpx; line-height: 80rpx; border-radius: 50rpx; position: relative; z-index: 2; box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.1); transition: all 0.2s; display: flex; /* 内部使用flex */ align-items: center; /* 垂直居中 */ justify-content: center; /* 水平居中 */ /* 安全区域适配 */ margin-bottom: constant(safe-area-inset-bottom); margin-bottom: env(safe-area-inset-bottom); overflow: hidden; /* 防止内容溢出 */ /* 创建诉求按钮 - 蓝色风格 */ &.create_btn { background: #007AFF; /* 纯蓝色背景 */ color: white; border: none; /* 点击效果 */ &:active { background: #0062cc; transform: scale(0.98); box-shadow: 0 2rpx 6rpx rgba(0, 0, 0, 0.1); } } /* 我的诉求按钮 - 白色风格 */ &.my_btn { background: #ffffff; color: #333; border: 1rpx solid #e0e0e0; /* 点击效果 */ &:active { background: #f8f8f8; transform: scale(0.98); box-shadow: 0 2rpx 6rpx rgba(0, 0, 0, 0.1); } } } } } </style> 把 诉求分类栏 改成文字横向显示

weixin_38683193
  • 粉丝: 2
上传资源 快速赚钱