写blog菜单样式

This commit is contained in:
expressgy 2025-04-25 18:02:03 +08:00
parent 54c35687c9
commit 235ba88620
24 changed files with 2405 additions and 57 deletions

View File

@ -1,8 +1,4 @@
/* 默认字体大小(桌面端) */
body {
font-size: 16px;
color: var(--color-text);
}
h1 {
font-size: 24px;
@ -13,11 +9,11 @@ h2 {
}
h3 {
font-size: 18px;
font-size: 16px;
}
h4 {
font-size: 16px;
font-size: 14px;
}
/* * 手机端-手机端-手机端-手机端-手机端-手机端-手机端-手机端-手机端 * */
@ -59,6 +55,9 @@ h4 {
}
}
/* * 平板端-平板端-平板端-平板端-平板端-平板端-平板端-平板端-平板端 * */
/* 平板端 */
@media (min-width: 768px) and (max-width: 1024px) {
body {
@ -82,8 +81,6 @@ h4 {
}
}
/* * 平板端-平板端-平板端-平板端-平板端-平板端-平板端-平板端-平板端 * */
/* 平板端(竖屏) */
@media (min-width: 768px) and (max-width: 1024px) and (orientation: portrait) {
.container {

View File

@ -1,3 +1,4 @@
@import "../icon/cocoIconFont/iconfont.css";
@import "../icon/sxIconFont/iconfont.css";
@import "../icon/starIconFont/iconfont.css";
@import "../icon/star-blogIconFont/iconfont.css";

View File

@ -5,4 +5,49 @@ html, body {
margin: 0;
padding: 0;
overflow: hidden;
font-size: 16px;
}
a {
/*去除默认下划线*/
text-decoration: none;
/*设置初始颜色*/
color: #333;
/*统一内边距和外边距*/
margin: 0;
padding: 0;
/*去除默认的点击高亮*/
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
/*处理不同状态的样式*/
:link {
color: #333;
}
:visited {
color: #333;
}
:hover {
color: #333;
}
:active {
color: #333;
}
}
/*单行唱出隐藏显示省略号*/
.oneLineOverMore{
white-space: nowrap; /* 确保文本在一行内显示 */
overflow: hidden; /* 隐藏超出部分 */
text-overflow: ellipsis; /* 显示省略号 */
}
/*宽高比*/
.a11{
aspect-ratio: 1;
}
/*全居中*/
.allCenter{
display: flex;
justify-content: center;
align-items: center;
}

View File

@ -11,12 +11,12 @@
.slide-enter-active,
.slide-leave-active {
transition: all 0.5s ease;
transition: all 0.3s ease;
}
.slide-enter-from,
.slide-leave-to {
opacity: 0;
transform: translate(100%, 0);
/*transform: translate(100%, 0);*/
}
.slide-left-enter-active,
@ -27,17 +27,17 @@
}
.slide-left-enter-from {
opacity: 0;
transform: translate(50px, 0);
/*transform: translate(50px, 0);*/
}
.slide-left-leave-to {
opacity: 0;
transform: translate(-50px, 0);
/*transform: translate(-50px, 0);*/
}
.slide-right-enter-from {
opacity: 0;
transform: translate(-50px, 0);
/*transform: translate(-50px, 0);*/
}
.slide-right-leave-to {
opacity: 0;
transform: translate(50px, 0);
/*transform: translate(50px, 0);*/
}

View File

@ -24,7 +24,7 @@
/*字体颜色*/
--color-text: #333;
--bg-opacity: 0.5;
--header-bg-color: #dddddd99;
--header-bg-color: rgb(254, 255, 252); /*#fefffc*/
/*主要着重颜色*/
--main-strong-color: #333;
@ -32,4 +32,16 @@
--nav-length: 5rem;
/*圆角*/
--border-radius: 0.5rem;
/*blog菜单背景色*/
--blog-menu-background-color: var(--header-bg-color);
/*blog菜单默认宽度*/
--blog-menu-default-width: calc((100% - var(--main-width-auto)) / 2);
/*字体颜色*/
--font-color-top3-h1: #37352f; /*#37352f*/
--font-color-top3-h2: #5f5e5b; /*1b1b1b*/
--font-color-top3-h3: #91918e; /*1b1b1b*/
--font-color-top3-active: rgb(232, 232, 231); /*#e8e8e7*/
--font-color-top3-hover: rgb(239, 239, 237); /*#EFEFED*/
}

View File

@ -0,0 +1,539 @@
/* Logo 字体 */
@font-face {
font-family: "iconfont logo";
src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834');
src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834#iefix') format('embedded-opentype'),
url('https://at.alicdn.com/t/font_985780_km7mi63cihi.woff?t=1545807318834') format('woff'),
url('https://at.alicdn.com/t/font_985780_km7mi63cihi.ttf?t=1545807318834') format('truetype'),
url('https://at.alicdn.com/t/font_985780_km7mi63cihi.svg?t=1545807318834#iconfont') format('svg');
}
.logo {
font-family: "iconfont logo";
font-size: 160px;
font-style: normal;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
/* tabs */
.nav-tabs {
position: relative;
}
.nav-tabs .nav-more {
position: absolute;
right: 0;
bottom: 0;
height: 42px;
line-height: 42px;
color: #666;
}
#tabs {
border-bottom: 1px solid #eee;
}
#tabs li {
cursor: pointer;
width: 100px;
height: 40px;
line-height: 40px;
text-align: center;
font-size: 16px;
border-bottom: 2px solid transparent;
position: relative;
z-index: 1;
margin-bottom: -1px;
color: #666;
}
#tabs .active {
border-bottom-color: #f00;
color: #222;
}
.tab-container .content {
display: none;
}
/* 页面布局 */
.main {
padding: 30px 100px;
width: 960px;
margin: 0 auto;
}
.main .logo {
color: #333;
text-align: left;
margin-bottom: 30px;
line-height: 1;
height: 110px;
margin-top: -50px;
overflow: hidden;
*zoom: 1;
}
.main .logo a {
font-size: 160px;
color: #333;
}
.helps {
margin-top: 40px;
}
.helps pre {
padding: 20px;
margin: 10px 0;
border: solid 1px #e7e1cd;
background-color: #fffdef;
overflow: auto;
}
.icon_lists {
width: 100% !important;
overflow: hidden;
*zoom: 1;
}
.icon_lists li {
width: 100px;
margin-bottom: 10px;
margin-right: 20px;
text-align: center;
list-style: none !important;
cursor: default;
}
.icon_lists li .code-name {
line-height: 1.2;
}
.icon_lists .icon {
display: block;
height: 100px;
line-height: 100px;
font-size: 42px;
margin: 10px auto;
color: #333;
-webkit-transition: font-size 0.25s linear, width 0.25s linear;
-moz-transition: font-size 0.25s linear, width 0.25s linear;
transition: font-size 0.25s linear, width 0.25s linear;
}
.icon_lists .icon:hover {
font-size: 100px;
}
.icon_lists .svg-icon {
/* 通过设置 font-size 来改变图标大小 */
width: 1em;
/* 图标和文字相邻时,垂直对齐 */
vertical-align: -0.15em;
/* 通过设置 color 来改变 SVG 的颜色/fill */
fill: currentColor;
/* path stroke 溢出 viewBox 部分在 IE 下会显示
normalize.css 中也包含这行 */
overflow: hidden;
}
.icon_lists li .name,
.icon_lists li .code-name {
color: #666;
}
/* markdown 样式 */
.markdown {
color: #666;
font-size: 14px;
line-height: 1.8;
}
.highlight {
line-height: 1.5;
}
.markdown img {
vertical-align: middle;
max-width: 100%;
}
.markdown h1 {
color: #404040;
font-weight: 500;
line-height: 40px;
margin-bottom: 24px;
}
.markdown h2,
.markdown h3,
.markdown h4,
.markdown h5,
.markdown h6 {
color: #404040;
margin: 1.6em 0 0.6em 0;
font-weight: 500;
clear: both;
}
.markdown h1 {
font-size: 28px;
}
.markdown h2 {
font-size: 22px;
}
.markdown h3 {
font-size: 16px;
}
.markdown h4 {
font-size: 14px;
}
.markdown h5 {
font-size: 12px;
}
.markdown h6 {
font-size: 12px;
}
.markdown hr {
height: 1px;
border: 0;
background: #e9e9e9;
margin: 16px 0;
clear: both;
}
.markdown p {
margin: 1em 0;
}
.markdown>p,
.markdown>blockquote,
.markdown>.highlight,
.markdown>ol,
.markdown>ul {
width: 80%;
}
.markdown ul>li {
list-style: circle;
}
.markdown>ul li,
.markdown blockquote ul>li {
margin-left: 20px;
padding-left: 4px;
}
.markdown>ul li p,
.markdown>ol li p {
margin: 0.6em 0;
}
.markdown ol>li {
list-style: decimal;
}
.markdown>ol li,
.markdown blockquote ol>li {
margin-left: 20px;
padding-left: 4px;
}
.markdown code {
margin: 0 3px;
padding: 0 5px;
background: #eee;
border-radius: 3px;
}
.markdown strong,
.markdown b {
font-weight: 600;
}
.markdown>table {
border-collapse: collapse;
border-spacing: 0px;
empty-cells: show;
border: 1px solid #e9e9e9;
width: 95%;
margin-bottom: 24px;
}
.markdown>table th {
white-space: nowrap;
color: #333;
font-weight: 600;
}
.markdown>table th,
.markdown>table td {
border: 1px solid #e9e9e9;
padding: 8px 16px;
text-align: left;
}
.markdown>table th {
background: #F7F7F7;
}
.markdown blockquote {
font-size: 90%;
color: #999;
border-left: 4px solid #e9e9e9;
padding-left: 0.8em;
margin: 1em 0;
}
.markdown blockquote p {
margin: 0;
}
.markdown .anchor {
opacity: 0;
transition: opacity 0.3s ease;
margin-left: 8px;
}
.markdown .waiting {
color: #ccc;
}
.markdown h1:hover .anchor,
.markdown h2:hover .anchor,
.markdown h3:hover .anchor,
.markdown h4:hover .anchor,
.markdown h5:hover .anchor,
.markdown h6:hover .anchor {
opacity: 1;
display: inline-block;
}
.markdown>br,
.markdown>p>br {
clear: both;
}
.hljs {
display: block;
background: white;
padding: 0.5em;
color: #333333;
overflow-x: auto;
}
.hljs-comment,
.hljs-meta {
color: #969896;
}
.hljs-string,
.hljs-variable,
.hljs-template-variable,
.hljs-strong,
.hljs-emphasis,
.hljs-quote {
color: #df5000;
}
.hljs-keyword,
.hljs-selector-tag,
.hljs-type {
color: #a71d5d;
}
.hljs-literal,
.hljs-symbol,
.hljs-bullet,
.hljs-attribute {
color: #0086b3;
}
.hljs-section,
.hljs-name {
color: #63a35c;
}
.hljs-tag {
color: #333333;
}
.hljs-title,
.hljs-attr,
.hljs-selector-id,
.hljs-selector-class,
.hljs-selector-attr,
.hljs-selector-pseudo {
color: #795da3;
}
.hljs-addition {
color: #55a532;
background-color: #eaffea;
}
.hljs-deletion {
color: #bd2c00;
background-color: #ffecec;
}
.hljs-link {
text-decoration: underline;
}
/* 代码高亮 */
/* PrismJS 1.15.0
https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript */
/**
* prism.js default theme for JavaScript, CSS and HTML
* Based on dabblet (http://dabblet.com)
* @author Lea Verou
*/
code[class*="language-"],
pre[class*="language-"] {
color: black;
background: none;
text-shadow: 0 1px white;
font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
text-align: left;
white-space: pre;
word-spacing: normal;
word-break: normal;
word-wrap: normal;
line-height: 1.5;
-moz-tab-size: 4;
-o-tab-size: 4;
tab-size: 4;
-webkit-hyphens: none;
-moz-hyphens: none;
-ms-hyphens: none;
hyphens: none;
}
pre[class*="language-"]::-moz-selection,
pre[class*="language-"] ::-moz-selection,
code[class*="language-"]::-moz-selection,
code[class*="language-"] ::-moz-selection {
text-shadow: none;
background: #b3d4fc;
}
pre[class*="language-"]::selection,
pre[class*="language-"] ::selection,
code[class*="language-"]::selection,
code[class*="language-"] ::selection {
text-shadow: none;
background: #b3d4fc;
}
@media print {
code[class*="language-"],
pre[class*="language-"] {
text-shadow: none;
}
}
/* Code blocks */
pre[class*="language-"] {
padding: 1em;
margin: .5em 0;
overflow: auto;
}
:not(pre)>code[class*="language-"],
pre[class*="language-"] {
background: #f5f2f0;
}
/* Inline code */
:not(pre)>code[class*="language-"] {
padding: .1em;
border-radius: .3em;
white-space: normal;
}
.token.comment,
.token.prolog,
.token.doctype,
.token.cdata {
color: slategray;
}
.token.punctuation {
color: #999;
}
.namespace {
opacity: .7;
}
.token.property,
.token.tag,
.token.boolean,
.token.number,
.token.constant,
.token.symbol,
.token.deleted {
color: #905;
}
.token.selector,
.token.attr-name,
.token.string,
.token.char,
.token.builtin,
.token.inserted {
color: #690;
}
.token.operator,
.token.entity,
.token.url,
.language-css .token.string,
.style .token.string {
color: #9a6e3a;
background: hsla(0, 0%, 100%, .5);
}
.token.atrule,
.token.attr-value,
.token.keyword {
color: #07a;
}
.token.function,
.token.class-name {
color: #DD4A68;
}
.token.regex,
.token.important,
.token.variable {
color: #e90;
}
.token.important,
.token.bold {
font-weight: bold;
}
.token.italic {
font-style: italic;
}
.token.entity {
cursor: help;
}

View File

@ -0,0 +1,832 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>iconfont Demo</title>
<link rel="shortcut icon" href="//img.alicdn.com/imgextra/i4/O1CN01Z5paLz1O0zuCC7osS_!!6000000001644-55-tps-83-82.svg" type="image/x-icon"/>
<link rel="icon" type="image/svg+xml" href="//img.alicdn.com/imgextra/i4/O1CN01Z5paLz1O0zuCC7osS_!!6000000001644-55-tps-83-82.svg"/>
<link rel="stylesheet" href="https://g.alicdn.com/thx/cube/1.3.2/cube.min.css">
<link rel="stylesheet" href="demo.css">
<link rel="stylesheet" href="iconfont.css">
<script src="iconfont.js"></script>
<!-- jQuery -->
<script src="https://a1.alicdn.com/oss/uploads/2018/12/26/7bfddb60-08e8-11e9-9b04-53e73bb6408b.js"></script>
<!-- 代码高亮 -->
<script src="https://a1.alicdn.com/oss/uploads/2018/12/26/a3f714d0-08e6-11e9-8a15-ebf944d7534c.js"></script>
<style>
.main .logo {
margin-top: 0;
height: auto;
}
.main .logo a {
display: flex;
align-items: center;
}
.main .logo .sub-title {
margin-left: 0.5em;
font-size: 22px;
color: #fff;
background: linear-gradient(-45deg, #3967FF, #B500FE);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
</style>
</head>
<body>
<div class="main">
<h1 class="logo"><a href="https://www.iconfont.cn/" title="iconfont 首页" target="_blank">
<img width="200" src="https://img.alicdn.com/imgextra/i3/O1CN01Mn65HV1FfSEzR6DKv_!!6000000000514-55-tps-228-59.svg">
</a></h1>
<div class="nav-tabs">
<ul id="tabs" class="dib-box">
<li class="dib active"><span>Unicode</span></li>
<li class="dib"><span>Font class</span></li>
<li class="dib"><span>Symbol</span></li>
</ul>
<a href="https://www.iconfont.cn/manage/index?manage_type=myprojects&projectId=4905744" target="_blank" class="nav-more">查看项目</a>
</div>
<div class="tab-container">
<div class="content unicode" style="display: block;">
<ul class="icon_lists dib-box">
<li class="dib">
<span class="icon star-blog">&#xe669;</span>
<div class="name">通知</div>
<div class="code-name">&amp;#xe669;</div>
</li>
<li class="dib">
<span class="icon star-blog">&#xe66a;</span>
<div class="name">首页</div>
<div class="code-name">&amp;#xe66a;</div>
</li>
<li class="dib">
<span class="icon star-blog">&#xe66c;</span>
<div class="name">定位</div>
<div class="code-name">&amp;#xe66c;</div>
</li>
<li class="dib">
<span class="icon star-blog">&#xe66d;</span>
<div class="name">日历</div>
<div class="code-name">&amp;#xe66d;</div>
</li>
<li class="dib">
<span class="icon star-blog">&#xe66e;</span>
<div class="name">邮件</div>
<div class="code-name">&amp;#xe66e;</div>
</li>
<li class="dib">
<span class="icon star-blog">&#xe66f;</span>
<div class="name">标签</div>
<div class="code-name">&amp;#xe66f;</div>
</li>
<li class="dib">
<span class="icon star-blog">&#xe670;</span>
<div class="name">统计</div>
<div class="code-name">&amp;#xe670;</div>
</li>
<li class="dib">
<span class="icon star-blog">&#xe671;</span>
<div class="name">收藏</div>
<div class="code-name">&amp;#xe671;</div>
</li>
<li class="dib">
<span class="icon star-blog">&#xe672;</span>
<div class="name">文件</div>
<div class="code-name">&amp;#xe672;</div>
</li>
<li class="dib">
<span class="icon star-blog">&#xe673;</span>
<div class="name">设置</div>
<div class="code-name">&amp;#xe673;</div>
</li>
<li class="dib">
<span class="icon star-blog">&#xe674;</span>
<div class="name">喜爱</div>
<div class="code-name">&amp;#xe674;</div>
</li>
<li class="dib">
<span class="icon star-blog">&#xe675;</span>
<div class="name">指针</div>
<div class="code-name">&amp;#xe675;</div>
</li>
<li class="dib">
<span class="icon star-blog">&#xe676;</span>
<div class="name">分类</div>
<div class="code-name">&amp;#xe676;</div>
</li>
<li class="dib">
<span class="icon star-blog">&#xe677;</span>
<div class="name">购物包</div>
<div class="code-name">&amp;#xe677;</div>
</li>
<li class="dib">
<span class="icon star-blog">&#xe678;</span>
<div class="name">文档</div>
<div class="code-name">&amp;#xe678;</div>
</li>
<li class="dib">
<span class="icon star-blog">&#xe679;</span>
<div class="name">搜索</div>
<div class="code-name">&amp;#xe679;</div>
</li>
<li class="dib">
<span class="icon star-blog">&#xe67a;</span>
<div class="name">游戏</div>
<div class="code-name">&amp;#xe67a;</div>
</li>
<li class="dib">
<span class="icon star-blog">&#xe67b;</span>
<div class="name">统计分析</div>
<div class="code-name">&amp;#xe67b;</div>
</li>
<li class="dib">
<span class="icon star-blog">&#xe67c;</span>
<div class="name">我的</div>
<div class="code-name">&amp;#xe67c;</div>
</li>
<li class="dib">
<span class="icon star-blog">&#xe67d;</span>
<div class="name">钱包</div>
<div class="code-name">&amp;#xe67d;</div>
</li>
<li class="dib">
<span class="icon star-blog">&#xe67e;</span>
<div class="name">消息</div>
<div class="code-name">&amp;#xe67e;</div>
</li>
<li class="dib">
<span class="icon star-blog">&#xe680;</span>
<div class="name">数据动态</div>
<div class="code-name">&amp;#xe680;</div>
</li>
<li class="dib">
<span class="icon star-blog">&#xe681;</span>
<div class="name">二维码</div>
<div class="code-name">&amp;#xe681;</div>
</li>
<li class="dib">
<span class="icon star-blog">&#xe73a;</span>
<div class="name">更多</div>
<div class="code-name">&amp;#xe73a;</div>
</li>
<li class="dib">
<span class="icon star-blog">&#xe608;</span>
<div class="name">添加</div>
<div class="code-name">&amp;#xe608;</div>
</li>
<li class="dib">
<span class="icon star-blog">&#xe668;</span>
<div class="name">添加</div>
<div class="code-name">&amp;#xe668;</div>
</li>
<li class="dib">
<span class="icon star-blog">&#xe606;</span>
<div class="name">更多</div>
<div class="code-name">&amp;#xe606;</div>
</li>
<li class="dib">
<span class="icon star-blog">&#xe67f;</span>
<div class="name">折叠-收起</div>
<div class="code-name">&amp;#xe67f;</div>
</li>
</ul>
<div class="article markdown">
<h2 id="unicode-">Unicode 引用</h2>
<hr>
<p>Unicode 是字体在网页端最原始的应用方式,特点是:</p>
<ul>
<li>支持按字体的方式去动态调整图标大小,颜色等等。</li>
<li>默认情况下不支持多色,直接添加多色图标会自动去色。</li>
</ul>
<blockquote>
<p>注意:新版 iconfont 支持两种方式引用多色图标SVG symbol 引用方式和彩色字体图标模式。(使用彩色字体图标需要在「编辑项目」中开启「彩色」选项后并重新生成。)</p>
</blockquote>
<p>Unicode 使用步骤如下:</p>
<h3 id="-font-face">第一步:拷贝项目下面生成的 <code>@font-face</code></h3>
<pre><code class="language-css"
>@font-face {
font-family: 'star-blog';
src: url('iconfont.woff2?t=1745569316996') format('woff2'),
url('iconfont.woff?t=1745569316996') format('woff'),
url('iconfont.ttf?t=1745569316996') format('truetype');
}
</code></pre>
<h3 id="-iconfont-">第二步:定义使用 iconfont 的样式</h3>
<pre><code class="language-css"
>.star-blog {
font-family: "star-blog" !important;
font-size: 16px;
font-style: normal;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
</code></pre>
<h3 id="-">第三步:挑选相应图标并获取字体编码,应用于页面</h3>
<pre>
<code class="language-html"
>&lt;span class="star-blog"&gt;&amp;#x33;&lt;/span&gt;
</code></pre>
<blockquote>
<p>"star-blog" 是你项目下的 font-family。可以通过编辑项目查看默认是 "iconfont"。</p>
</blockquote>
</div>
</div>
<div class="content font-class">
<ul class="icon_lists dib-box">
<li class="dib">
<span class="icon star-blog star-blog-tongzhi"></span>
<div class="name">
通知
</div>
<div class="code-name">.star-blog-tongzhi
</div>
</li>
<li class="dib">
<span class="icon star-blog star-blog-shouye"></span>
<div class="name">
首页
</div>
<div class="code-name">.star-blog-shouye
</div>
</li>
<li class="dib">
<span class="icon star-blog star-blog-dingwei"></span>
<div class="name">
定位
</div>
<div class="code-name">.star-blog-dingwei
</div>
</li>
<li class="dib">
<span class="icon star-blog star-blog-rili"></span>
<div class="name">
日历
</div>
<div class="code-name">.star-blog-rili
</div>
</li>
<li class="dib">
<span class="icon star-blog star-blog-youjian"></span>
<div class="name">
邮件
</div>
<div class="code-name">.star-blog-youjian
</div>
</li>
<li class="dib">
<span class="icon star-blog star-blog-biaoqian"></span>
<div class="name">
标签
</div>
<div class="code-name">.star-blog-biaoqian
</div>
</li>
<li class="dib">
<span class="icon star-blog star-blog-tongji"></span>
<div class="name">
统计
</div>
<div class="code-name">.star-blog-tongji
</div>
</li>
<li class="dib">
<span class="icon star-blog star-blog-shoucang"></span>
<div class="name">
收藏
</div>
<div class="code-name">.star-blog-shoucang
</div>
</li>
<li class="dib">
<span class="icon star-blog star-blog-wenjian"></span>
<div class="name">
文件
</div>
<div class="code-name">.star-blog-wenjian
</div>
</li>
<li class="dib">
<span class="icon star-blog star-blog-shezhi"></span>
<div class="name">
设置
</div>
<div class="code-name">.star-blog-shezhi
</div>
</li>
<li class="dib">
<span class="icon star-blog star-blog-xiai"></span>
<div class="name">
喜爱
</div>
<div class="code-name">.star-blog-xiai
</div>
</li>
<li class="dib">
<span class="icon star-blog star-blog-zhizhen"></span>
<div class="name">
指针
</div>
<div class="code-name">.star-blog-zhizhen
</div>
</li>
<li class="dib">
<span class="icon star-blog star-blog-fenlei"></span>
<div class="name">
分类
</div>
<div class="code-name">.star-blog-fenlei
</div>
</li>
<li class="dib">
<span class="icon star-blog star-blog-gouwubao"></span>
<div class="name">
购物包
</div>
<div class="code-name">.star-blog-gouwubao
</div>
</li>
<li class="dib">
<span class="icon star-blog star-blog-wendang"></span>
<div class="name">
文档
</div>
<div class="code-name">.star-blog-wendang
</div>
</li>
<li class="dib">
<span class="icon star-blog star-blog-sousuo"></span>
<div class="name">
搜索
</div>
<div class="code-name">.star-blog-sousuo
</div>
</li>
<li class="dib">
<span class="icon star-blog star-blog-youxi"></span>
<div class="name">
游戏
</div>
<div class="code-name">.star-blog-youxi
</div>
</li>
<li class="dib">
<span class="icon star-blog star-blog-tongjifenxi"></span>
<div class="name">
统计分析
</div>
<div class="code-name">.star-blog-tongjifenxi
</div>
</li>
<li class="dib">
<span class="icon star-blog star-blog-wode"></span>
<div class="name">
我的
</div>
<div class="code-name">.star-blog-wode
</div>
</li>
<li class="dib">
<span class="icon star-blog star-blog-qianbao"></span>
<div class="name">
钱包
</div>
<div class="code-name">.star-blog-qianbao
</div>
</li>
<li class="dib">
<span class="icon star-blog star-blog-xiaoxi"></span>
<div class="name">
消息
</div>
<div class="code-name">.star-blog-xiaoxi
</div>
</li>
<li class="dib">
<span class="icon star-blog star-blog-shujudongtai"></span>
<div class="name">
数据动态
</div>
<div class="code-name">.star-blog-shujudongtai
</div>
</li>
<li class="dib">
<span class="icon star-blog star-blog-erweima"></span>
<div class="name">
二维码
</div>
<div class="code-name">.star-blog-erweima
</div>
</li>
<li class="dib">
<span class="icon star-blog star-blog-gengduo"></span>
<div class="name">
更多
</div>
<div class="code-name">.star-blog-gengduo
</div>
</li>
<li class="dib">
<span class="icon star-blog star-blog-tianjia"></span>
<div class="name">
添加
</div>
<div class="code-name">.star-blog-tianjia
</div>
</li>
<li class="dib">
<span class="icon star-blog star-blog-tianjia1"></span>
<div class="name">
添加
</div>
<div class="code-name">.star-blog-tianjia1
</div>
</li>
<li class="dib">
<span class="icon star-blog star-blog-gengduo1"></span>
<div class="name">
更多
</div>
<div class="code-name">.star-blog-gengduo1
</div>
</li>
<li class="dib">
<span class="icon star-blog star-blog-zhedie-shouqi"></span>
<div class="name">
折叠-收起
</div>
<div class="code-name">.star-blog-zhedie-shouqi
</div>
</li>
</ul>
<div class="article markdown">
<h2 id="font-class-">font-class 引用</h2>
<hr>
<p>font-class 是 Unicode 使用方式的一种变种,主要是解决 Unicode 书写不直观,语意不明确的问题。</p>
<p>与 Unicode 使用方式相比,具有如下特点:</p>
<ul>
<li>相比于 Unicode 语意明确,书写更直观。可以很容易分辨这个 icon 是什么。</li>
<li>因为使用 class 来定义图标,所以当要替换图标时,只需要修改 class 里面的 Unicode 引用。</li>
</ul>
<p>使用步骤如下:</p>
<h3 id="-fontclass-">第一步:引入项目下面生成的 fontclass 代码:</h3>
<pre><code class="language-html">&lt;link rel="stylesheet" href="./iconfont.css"&gt;
</code></pre>
<h3 id="-">第二步:挑选相应图标并获取类名,应用于页面:</h3>
<pre><code class="language-html">&lt;span class="star-blog star-blog-xxx"&gt;&lt;/span&gt;
</code></pre>
<blockquote>
<p>"
star-blog" 是你项目下的 font-family。可以通过编辑项目查看默认是 "iconfont"。</p>
</blockquote>
</div>
</div>
<div class="content symbol">
<ul class="icon_lists dib-box">
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#star-blog-tongzhi"></use>
</svg>
<div class="name">通知</div>
<div class="code-name">#star-blog-tongzhi</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#star-blog-shouye"></use>
</svg>
<div class="name">首页</div>
<div class="code-name">#star-blog-shouye</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#star-blog-dingwei"></use>
</svg>
<div class="name">定位</div>
<div class="code-name">#star-blog-dingwei</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#star-blog-rili"></use>
</svg>
<div class="name">日历</div>
<div class="code-name">#star-blog-rili</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#star-blog-youjian"></use>
</svg>
<div class="name">邮件</div>
<div class="code-name">#star-blog-youjian</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#star-blog-biaoqian"></use>
</svg>
<div class="name">标签</div>
<div class="code-name">#star-blog-biaoqian</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#star-blog-tongji"></use>
</svg>
<div class="name">统计</div>
<div class="code-name">#star-blog-tongji</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#star-blog-shoucang"></use>
</svg>
<div class="name">收藏</div>
<div class="code-name">#star-blog-shoucang</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#star-blog-wenjian"></use>
</svg>
<div class="name">文件</div>
<div class="code-name">#star-blog-wenjian</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#star-blog-shezhi"></use>
</svg>
<div class="name">设置</div>
<div class="code-name">#star-blog-shezhi</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#star-blog-xiai"></use>
</svg>
<div class="name">喜爱</div>
<div class="code-name">#star-blog-xiai</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#star-blog-zhizhen"></use>
</svg>
<div class="name">指针</div>
<div class="code-name">#star-blog-zhizhen</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#star-blog-fenlei"></use>
</svg>
<div class="name">分类</div>
<div class="code-name">#star-blog-fenlei</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#star-blog-gouwubao"></use>
</svg>
<div class="name">购物包</div>
<div class="code-name">#star-blog-gouwubao</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#star-blog-wendang"></use>
</svg>
<div class="name">文档</div>
<div class="code-name">#star-blog-wendang</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#star-blog-sousuo"></use>
</svg>
<div class="name">搜索</div>
<div class="code-name">#star-blog-sousuo</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#star-blog-youxi"></use>
</svg>
<div class="name">游戏</div>
<div class="code-name">#star-blog-youxi</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#star-blog-tongjifenxi"></use>
</svg>
<div class="name">统计分析</div>
<div class="code-name">#star-blog-tongjifenxi</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#star-blog-wode"></use>
</svg>
<div class="name">我的</div>
<div class="code-name">#star-blog-wode</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#star-blog-qianbao"></use>
</svg>
<div class="name">钱包</div>
<div class="code-name">#star-blog-qianbao</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#star-blog-xiaoxi"></use>
</svg>
<div class="name">消息</div>
<div class="code-name">#star-blog-xiaoxi</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#star-blog-shujudongtai"></use>
</svg>
<div class="name">数据动态</div>
<div class="code-name">#star-blog-shujudongtai</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#star-blog-erweima"></use>
</svg>
<div class="name">二维码</div>
<div class="code-name">#star-blog-erweima</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#star-blog-gengduo"></use>
</svg>
<div class="name">更多</div>
<div class="code-name">#star-blog-gengduo</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#star-blog-tianjia"></use>
</svg>
<div class="name">添加</div>
<div class="code-name">#star-blog-tianjia</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#star-blog-tianjia1"></use>
</svg>
<div class="name">添加</div>
<div class="code-name">#star-blog-tianjia1</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#star-blog-gengduo1"></use>
</svg>
<div class="name">更多</div>
<div class="code-name">#star-blog-gengduo1</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#star-blog-zhedie-shouqi"></use>
</svg>
<div class="name">折叠-收起</div>
<div class="code-name">#star-blog-zhedie-shouqi</div>
</li>
</ul>
<div class="article markdown">
<h2 id="symbol-">Symbol 引用</h2>
<hr>
<p>这是一种全新的使用方式,应该说这才是未来的主流,也是平台目前推荐的用法。相关介绍可以参考这篇<a href="">文章</a>
这种用法其实是做了一个 SVG 的集合,与另外两种相比具有如下特点:</p>
<ul>
<li>支持多色图标了,不再受单色限制。</li>
<li>通过一些技巧,支持像字体那样,通过 <code>font-size</code>, <code>color</code> 来调整样式。</li>
<li>兼容性较差,支持 IE9+,及现代浏览器。</li>
<li>浏览器渲染 SVG 的性能一般,还不如 png。</li>
</ul>
<p>使用步骤如下:</p>
<h3 id="-symbol-">第一步:引入项目下面生成的 symbol 代码:</h3>
<pre><code class="language-html">&lt;script src="./iconfont.js"&gt;&lt;/script&gt;
</code></pre>
<h3 id="-css-">第二步:加入通用 CSS 代码(引入一次就行):</h3>
<pre><code class="language-html">&lt;style&gt;
.icon {
width: 1em;
height: 1em;
vertical-align: -0.15em;
fill: currentColor;
overflow: hidden;
}
&lt;/style&gt;
</code></pre>
<h3 id="-">第三步:挑选相应图标并获取类名,应用于页面:</h3>
<pre><code class="language-html">&lt;svg class="icon" aria-hidden="true"&gt;
&lt;use xlink:href="#icon-xxx"&gt;&lt;/use&gt;
&lt;/svg&gt;
</code></pre>
</div>
</div>
</div>
</div>
<script>
$(document).ready(function () {
$('.tab-container .content:first').show()
$('#tabs li').click(function (e) {
var tabContent = $('.tab-container .content')
var index = $(this).index()
if ($(this).hasClass('active')) {
return
} else {
$('#tabs li').removeClass('active')
$(this).addClass('active')
tabContent.hide().eq(index).fadeIn()
}
})
})
</script>
</body>
</html>

View File

@ -0,0 +1,127 @@
@font-face {
font-family: "star-blog"; /* Project id 4905744 */
src: url('iconfont.woff2?t=1745569316996') format('woff2'),
url('iconfont.woff?t=1745569316996') format('woff'),
url('iconfont.ttf?t=1745569316996') format('truetype');
}
.star-blogIconFont {
font-family: "star-blog" !important;
font-size: 16px;
font-style: normal;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.star-blog-tongzhi:before {
content: "\e669";
}
.star-blog-shouye:before {
content: "\e66a";
}
.star-blog-dingwei:before {
content: "\e66c";
}
.star-blog-rili:before {
content: "\e66d";
}
.star-blog-youjian:before {
content: "\e66e";
}
.star-blog-biaoqian:before {
content: "\e66f";
}
.star-blog-tongji:before {
content: "\e670";
}
.star-blog-shoucang:before {
content: "\e671";
}
.star-blog-wenjian:before {
content: "\e672";
}
.star-blog-shezhi:before {
content: "\e673";
}
.star-blog-xiai:before {
content: "\e674";
}
.star-blog-zhizhen:before {
content: "\e675";
}
.star-blog-fenlei:before {
content: "\e676";
}
.star-blog-gouwubao:before {
content: "\e677";
}
.star-blog-wendang:before {
content: "\e678";
}
.star-blog-sousuo:before {
content: "\e679";
}
.star-blog-youxi:before {
content: "\e67a";
}
.star-blog-tongjifenxi:before {
content: "\e67b";
}
.star-blog-wode:before {
content: "\e67c";
}
.star-blog-qianbao:before {
content: "\e67d";
}
.star-blog-xiaoxi:before {
content: "\e67e";
}
.star-blog-shujudongtai:before {
content: "\e680";
}
.star-blog-erweima:before {
content: "\e681";
}
.star-blog-gengduo:before {
content: "\e73a";
}
.star-blog-tianjia:before {
content: "\e608";
}
.star-blog-tianjia1:before {
content: "\e668";
}
.star-blog-gengduo1:before {
content: "\e606";
}
.star-blog-zhedie-shouqi:before {
content: "\e67f";
}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,205 @@
{
"id": "4905744",
"name": "star-blog",
"font_family": "star-blog",
"css_prefix_text": "star-blog-",
"description": "",
"glyphs": [
{
"icon_id": "23027728",
"name": "通知",
"font_class": "tongzhi",
"unicode": "e669",
"unicode_decimal": 58985
},
{
"icon_id": "23027729",
"name": "首页",
"font_class": "shouye",
"unicode": "e66a",
"unicode_decimal": 58986
},
{
"icon_id": "23027731",
"name": "定位",
"font_class": "dingwei",
"unicode": "e66c",
"unicode_decimal": 58988
},
{
"icon_id": "23027732",
"name": "日历",
"font_class": "rili",
"unicode": "e66d",
"unicode_decimal": 58989
},
{
"icon_id": "23027733",
"name": "邮件",
"font_class": "youjian",
"unicode": "e66e",
"unicode_decimal": 58990
},
{
"icon_id": "23027734",
"name": "标签",
"font_class": "biaoqian",
"unicode": "e66f",
"unicode_decimal": 58991
},
{
"icon_id": "23027735",
"name": "统计",
"font_class": "tongji",
"unicode": "e670",
"unicode_decimal": 58992
},
{
"icon_id": "23027736",
"name": "收藏",
"font_class": "shoucang",
"unicode": "e671",
"unicode_decimal": 58993
},
{
"icon_id": "23027737",
"name": "文件",
"font_class": "wenjian",
"unicode": "e672",
"unicode_decimal": 58994
},
{
"icon_id": "23027738",
"name": "设置",
"font_class": "shezhi",
"unicode": "e673",
"unicode_decimal": 58995
},
{
"icon_id": "23027739",
"name": "喜爱",
"font_class": "xiai",
"unicode": "e674",
"unicode_decimal": 58996
},
{
"icon_id": "23027740",
"name": "指针",
"font_class": "zhizhen",
"unicode": "e675",
"unicode_decimal": 58997
},
{
"icon_id": "23027741",
"name": "分类",
"font_class": "fenlei",
"unicode": "e676",
"unicode_decimal": 58998
},
{
"icon_id": "23027742",
"name": "购物包",
"font_class": "gouwubao",
"unicode": "e677",
"unicode_decimal": 58999
},
{
"icon_id": "23027743",
"name": "文档",
"font_class": "wendang",
"unicode": "e678",
"unicode_decimal": 59000
},
{
"icon_id": "23027744",
"name": "搜索",
"font_class": "sousuo",
"unicode": "e679",
"unicode_decimal": 59001
},
{
"icon_id": "23027745",
"name": "游戏",
"font_class": "youxi",
"unicode": "e67a",
"unicode_decimal": 59002
},
{
"icon_id": "23027746",
"name": "统计分析",
"font_class": "tongjifenxi",
"unicode": "e67b",
"unicode_decimal": 59003
},
{
"icon_id": "23027747",
"name": "我的",
"font_class": "wode",
"unicode": "e67c",
"unicode_decimal": 59004
},
{
"icon_id": "23027748",
"name": "钱包",
"font_class": "qianbao",
"unicode": "e67d",
"unicode_decimal": 59005
},
{
"icon_id": "23027749",
"name": "消息",
"font_class": "xiaoxi",
"unicode": "e67e",
"unicode_decimal": 59006
},
{
"icon_id": "23027750",
"name": "数据动态",
"font_class": "shujudongtai",
"unicode": "e680",
"unicode_decimal": 59008
},
{
"icon_id": "23027751",
"name": "二维码",
"font_class": "erweima",
"unicode": "e681",
"unicode_decimal": 59009
},
{
"icon_id": "577338",
"name": "更多",
"font_class": "gengduo",
"unicode": "e73a",
"unicode_decimal": 59194
},
{
"icon_id": "18799718",
"name": "添加",
"font_class": "tianjia",
"unicode": "e608",
"unicode_decimal": 58888
},
{
"icon_id": "23027730",
"name": "添加",
"font_class": "tianjia1",
"unicode": "e668",
"unicode_decimal": 58984
},
{
"icon_id": "24990207",
"name": "更多",
"font_class": "gengduo1",
"unicode": "e606",
"unicode_decimal": 58886
},
{
"icon_id": "36594927",
"name": "折叠-收起",
"font_class": "zhedie-shouqi",
"unicode": "e67f",
"unicode_decimal": 59007
}
]
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -1,6 +1,5 @@
<script setup lang="ts">
//
import Menu from "~/components/Home/Menu.vue";
const route = useRoute()
const router = useRouter()
const {$isMobile} = useNuxtApp()
@ -48,7 +47,7 @@ onMounted(() => {
</div>
<nav>
<div class="menuBarIcon" @click="handleMenuExpandCilck"/>
<Menu @click="handleMenuExpandCilck" :menuExpandStatus/>
<HomeMenu @click="handleMenuExpandCilck" :menuExpandStatus/>
</nav>
<div class="infoContainer">
<div class="menuBarIcon"></div>
@ -119,14 +118,14 @@ onMounted(() => {
display: flex;
height: 4rem;
background: var(--header-bg-color);
border-bottom: 1px solid var(--bg-color-be);
& > * {
position: relative;
height: 100%;
}
div.logoContainer{
flex: 1;
//flex: 1;
}
nav{

View File

@ -0,0 +1,20 @@
<script setup lang="ts">
</script>
<template>
<div class="homePageFramework">
<slot name="left"/>
<slot name="default"/>
<slot name="right"/>
</div>
</template>
<style scoped>
div.homePageFramework{
position: relative;
width: 100%;
height: 100%;
display: flex;
}
</style>

View File

@ -0,0 +1,142 @@
<script setup>
import { ref, onMounted, onBeforeUnmount } from 'vue'
// =====================
//
// =====================
const resizableElement = ref(null) //
const width = ref(240) //
const isDragging = ref(false) //
const startX = ref(0) // X
const startWidth = ref(0) //
let rafId = null // requestAnimationFrame ID
// =====================
//
// =====================
const startDrag = (e) => {
isDragging.value = true
//
const clientX = e.clientX ?? e.touches[0].clientX
startX.value = clientX
startWidth.value = width.value
// 使 passive
document.addEventListener('mousemove', handleDrag, { passive: true })
document.addEventListener('touchmove', handleDrag, { passive: true })
document.addEventListener('mouseup', stopDrag)
document.addEventListener('touchend', stopDrag)
}
const handleDrag = (e) => {
if (!isDragging.value) return
// 使 requestAnimationFrame
cancelAnimationFrame(rafId)
rafId = requestAnimationFrame(() => {
//
const clientX = e.clientX ?? e.touches?.[0]?.clientX
const deltaX = clientX - startX.value
const newWidth = startWidth.value + deltaX
// 100px
const clampedWidth = Math.max(100, newWidth)
// CSS
resizableElement.value.style.setProperty('--width', `${clampedWidth}px`)
//
width.value = clampedWidth
})
}
const stopDrag = () => {
isDragging.value = false
//
document.removeEventListener('mousemove', handleDrag)
document.removeEventListener('touchmove', handleDrag)
document.removeEventListener('mouseup', stopDrag)
document.removeEventListener('touchend', stopDrag)
}
// =====================
//
// =====================
onMounted(() => {
// CSS
resizableElement.value.style.setProperty('--width', `${width.value}px`)
})
onBeforeUnmount(() => {
//
cancelAnimationFrame(rafId)
})
</script>
<template>
<div class="resizable-element" :style="{ '--width': width + 'px' }" ref="resizableElement">
<slot/>
<!-- 拖拽手柄支持触摸事件 -->
<div class="dargContainer">
<div class="dargBar" @mousedown="startDrag" @touchstart.passive="startDrag"/>
</div>
</div>
</template>
<style scoped>
.resizable-element {
--width: 300px; /* 默认值,会被 JS 覆盖 */
position: relative;
height: 100%;
background: #f8f9fa;
width: var(--width);
transition: width 0.15s ease; /* 平滑过渡效果 */
will-change: width; /* 提示浏览器优化重绘 */
}
.dargContainer{
position: absolute;
width: 6px;
//background: red;
height: calc(100% - 10px);
right: 0;
top: 0;
bottom: 0;
margin: auto 0;
}
.dargBar {
position: relative;
margin: 0 auto;
width: 2px;
height: 100%;
cursor: col-resize;
border-radius: 2px;
opacity: 0;
background: #00000000;
transition: opacity 0.1s ease, background 0.1s ease;
transform: translateZ(0); /* 触发 GPU 加速 */
z-index: 1;
}
/* 悬停状态 */
.dargBar:hover, .dargContainer:hover .dargBar{
opacity: 1;
background: #495057cc;
}
/* 拖拽激活状态 */
.dargBar:active {
background: #212529;
}
/* 移动端优化 */
@media (hover: none) {
.dargBar {
opacity: 0.5; /* 移动端保持可见 */
width: 12px; /* 增大触摸区域 */
}
}
</style>

View File

@ -0,0 +1,221 @@
> deepseek
>
> 以下是在 Vue3 中实现高性能拖拽调整宽度的 **完整代码**,包含详细注释和优化策略:
```vue
<template>
<div class="container">
<!-- 可拖拽元素:使用 CSS 变量控制宽度 -->
<div
class="resizable-element"
:style="{ '--width': width + 'px' }"
ref="resizableElement"
>
<!-- 拖拽手柄(支持触摸事件) -->
<div
class="drag-handle"
@mousedown="startDrag"
@touchstart.passive="startDrag"
></div>
内容区域 (宽度: {{ width }}px)
</div>
</div>
</template>
<script setup>
import { ref, onMounted, onBeforeUnmount } from 'vue'
// =====================
// 响应式数据
// =====================
const resizableElement = ref(null) // 元素引用
const width = ref(300) // 显示的宽度值
const isDragging = ref(false) // 拖拽状态标识
const startX = ref(0) // 拖拽起始X坐标
const startWidth = ref(0) // 拖拽起始宽度
let rafId = null // requestAnimationFrame ID
// =====================
// 核心方法
// =====================
const startDrag = (e) => {
isDragging.value = true
// 获取初始坐标(同时支持鼠标和触摸事件)
const clientX = e.clientX ?? e.touches[0].clientX
startX.value = clientX
startWidth.value = width.value
// 添加事件监听(使用 passive 提升滚动性能)
document.addEventListener('mousemove', handleDrag, { passive: true })
document.addEventListener('touchmove', handleDrag, { passive: true })
document.addEventListener('mouseup', stopDrag)
document.addEventListener('touchend', stopDrag)
}
const handleDrag = (e) => {
if (!isDragging.value) return
// 使用 requestAnimationFrame 进行节流
cancelAnimationFrame(rafId)
rafId = requestAnimationFrame(() => {
// 获取当前坐标(兼容触摸事件)
const clientX = e.clientX ?? e.touches?.[0]?.clientX
const deltaX = clientX - startX.value
const newWidth = startWidth.value + deltaX
// 应用约束示例最小100px可根据需要扩展
const clampedWidth = Math.max(100, newWidth)
// 优化:直接操作 CSS 变量减少响应式更新
resizableElement.value.style.setProperty('--width', `${clampedWidth}px`)
// 低频更新响应式数据(用于显示数值)
width.value = clampedWidth
})
}
const stopDrag = () => {
isDragging.value = false
// 清理事件监听
document.removeEventListener('mousemove', handleDrag)
document.removeEventListener('touchmove', handleDrag)
document.removeEventListener('mouseup', stopDrag)
document.removeEventListener('touchend', stopDrag)
}
// =====================
// 生命周期
// =====================
onMounted(() => {
// 初始化 CSS 变量
resizableElement.value.style.setProperty('--width', `${width.value}px`)
})
onBeforeUnmount(() => {
// 组件卸载时取消未执行的动画帧
cancelAnimationFrame(rafId)
})
</script>
<style scoped>
.container {
padding: 2rem;
background: #fff;
}
.resizable-element {
--width: 300px; /* 默认值,会被 JS 覆盖 */
position: relative;
height: 200px;
background: #f8f9fa;
border: 1px solid #dee2e6;
border-radius: 4px;
padding: 1rem;
transition: width 0.15s ease; /* 平滑过渡效果 */
will-change: width; /* 提示浏览器优化重绘 */
}
.drag-handle {
position: absolute;
right: -4px; /* 微调手柄位置 */
top: 0;
bottom: 0;
width: 8px;
background: #868e96;
cursor: col-resize;
opacity: 0;
transition:
opacity 0.2s ease,
background 0.2s ease;
transform: translateZ(0); /* 触发 GPU 加速 */
}
/* 悬停状态 */
.drag-handle:hover,
.resizable-element:hover .drag-handle {
opacity: 1;
background: #495057;
}
/* 拖拽激活状态 */
.drag-handle:active {
background: #212529;
}
/* 移动端优化 */
@media (hover: none) {
.drag-handle {
opacity: 0.5; /* 移动端保持可见 */
width: 12px; /* 增大触摸区域 */
}
}
</style>
```
### 关键优化注释说明:
1. **性能优化策略**
```javascript
// 使用 CSS 变量直接操作样式
resizableElement.value.style.setProperty('--width', ...)
// 通过 RAF 节流高频事件
cancelAnimationFrame(rafId)
rafId = requestAnimationFrame(...)
// passive 事件监听提升滚动性能
{ passive: true }
```
2. **跨平台支持**
```javascript
// 统一处理鼠标/触摸事件
const clientX = e.clientX ?? e.touches[0].clientX
```
3. **内存管理**
```javascript
onBeforeUnmount(() => {
cancelAnimationFrame(rafId) // 避免内存泄漏
})
```
4. **渲染优化**
```css
will-change: width; /* 提前告知浏览器变化属性 */
transform: translateZ(0); /* 强制开启 GPU 加速 */
```
### 扩展建议用法:
1. **添加约束条件**
```javascript
// 在 handleDrag 中扩展
const maxWidth = 800 // 或通过 props 传入
const clampedWidth = Math.max(100, Math.min(maxWidth, newWidth))
```
2. **持久化存储**
```javascript
// 在 stopDrag 中添加
localStorage.setItem('savedWidth', width.value)
// 初始化时读取
width.value = Number(localStorage.getItem('savedWidth')) || 300
```
3. **性能监控(开发环境)**
```javascript
import { usePerf } from '@vueuse/core'
const { fps } = usePerf()
// 在拖拽时观察 fps 值
```
该方案经过测试在以下场景表现良好:
- 2000px 快速拖拽(平均 58fps
- 低端移动设备Redmi 9A45fps
- 复杂页面环境(多图表+动画场景52fps
建议根据实际需求调整过渡动画时间和手柄样式,可在不影响性能的前提下提升视觉体验。

View File

@ -6,7 +6,7 @@
<HomeHeader class="homeHeader"/>
<div class="homeMain">
<main class="homeMainContent">
<slot name="default" class="homeMainContent"/>
<slot name="default"/>
</main>
</div>
</div>
@ -25,30 +25,16 @@
flex-shrink: 0;
}
.homeMain {
div.homeMain {
position: relative;
overflow-y: hidden;
flex: 1;
width: 100%;
overflow: hidden;
display: flex;
& > * {
position: relative;
overflow-y: auto;
}
& > .homeMainLeft {
flex: 1;
}
& > main.homeMainContent {
flex-shrink: 0;
width: var(--main-width-auto);
background-color: var(--bg-color-be);
}
& > .homeMainRight {
flex: 1;
position: relative;
width: 100%;
height: 100%;
overflow: auto;
}
}
}

View File

@ -8,5 +8,10 @@
</template>
<style scoped>
.startLayout{
position: relative;
width: 100vw;
height: 100vh;
overflow: hidden;
}
</style>

View File

@ -8,7 +8,7 @@ import type {AddressInfo} from "node:net";
export default defineNuxtConfig({
compatibilityDate: '2024-11-01',
devtools: { enabled: true },
modules: ['@nuxt/eslint', '@nuxtjs/tailwindcss'],
modules: ['@nuxt/eslint', /*'@nuxtjs/tailwindcss'*/],
devServer: {
host: '0.0.0.0',
port: 3000,

View File

@ -6,12 +6,209 @@ definePageMeta({
mode: 'out-in',
},
})
const {data} = useFetch('/api/blog/blogMenu')
const menuList = ref([]);
const getMenuListFetch = async () => {
const { data, pending, error } = await useFetch('/api/blog/blogMenu');
if (error.value) {
consola.error('数据获取失败:', error.value);
}
menuList.value = data.value?.filter(i => i.pid === '0')
}
// SSR
await getMenuListFetch()
onMounted(() => {
consola.log(menuList.value)
})
</script>
<template>
<div>内容SS{{data}}</div>
<div class="homeBlog">
<ResizeContent class="left">
<div class="blogMenuContainer">
<header class="contentBox">
<div class="title">博客目录</div>
<div class="bar star-blogIconFont awaitShow">&#xe67f;</div>
</header>
<div class="line"/>
<div class="blogMenuContent">
<div class="contentBox blogMenuItem" v-for="(item, index) in menuList" :key="item.id">
<div class="addIcon star-blogIconFont a11 allCenter hoverBar">&#xe608;</div>
<div class="text oneLineOverMore">{{item.name}}</div>
<div class="bar" :class="item.pid === '0' && 'awaistShows'">
<div class="star-blogIconFont a11 allCenter hoverBar">&#xe73a;</div>
<div class="star-blogIconFont a11 allCenter hoverBar">&#xe608;</div>
</div>
</div>
</div>
<footer></footer>
</div>
</ResizeContent>
<div class="main"></div>
<div class="right"></div>
</div>
</template>
<style scoped>
<style scoped lang="scss">
.homeBlog {
position: relative;
display: flex;
width: 100%;
height: 100%;
overflow: hidden;
& > div{
position: relative;
height: 100%;
overflow: auto;
}
& > div.left{
flex-shrink: 0;
overflow: hidden;
background: var(--blog-menu-background-color);
border-right: 1px solid var(--bg-color-be);
.blogMenuContainer{
position: relative;
width: 100%;
height: 100%;
overflow: hidden;
font-family: sans-serif;
display: flex;
flex-direction: column;
box-sizing: border-box;
padding: .5rem;
& > *{
position: relative;
width: 100%;
}
.awaitShow{
height: 0;
width: 0;
opacity: 0;
transition: opacity .3s;
overflow: hidden;
}
&:hover{
.awaitShow{
height: 100%;
width: auto;
opacity: 1;
}
}
& > header{
flex-shrink: 0;
display: flex;
width: 100%;
& > div.title{
position: relative;
flex: 1;
color: var(--font-color-top3-h1);
}
& > div.bar{
position: relative;
flex-shrink: 0;
height: 100%;
aspect-ratio: 1;
display: flex;
align-items: center;
justify-content: center;
font-size: 1.3rem;
color: var(--font-color-top3-h2);
transform: rotate(180deg);
transition: color .5s, opacity .5s;
&:hover{
color: var(--font-color-top3-h1);
}
}
}
& > footer{
flex-shrink: 0;
}
& > div.line{
position: relative;
width: 100%;
height: 3px;
margin: 0.5rem auto;
background-color: var(--bg-color-be);
border-radius: .25rem;
}
& > div.blogMenuContent{
position: relative;
flex: 1;
overflow: hidden;
& > div.blogMenuItem{
position: relative;
font-size: 0.9rem;
display: flex;
& > div{
position: relative;
}
& > div.addIcon{
font-size: 1rem;
margin-right: .5rem;
}
& > div.text{
height: 100%;
flex: 1;
}
& > div.bar{
margin-left: .2rem;
height: 100%;
//height: 0;
//width: 0;
//opacity: 0;
transition: opacity .3s;
overflow: hidden;
display: flex;
}
&:hover div.bar{
height: 100%;
width: auto;
opacity: 1;
}
}
}
.hoverBar{
border-radius: .25rem;
transition: background-color .3s;
&:hover{
background-color: #00000015;
}
}
.contentBox{
position: relative;
height: 2rem;
box-sizing: border-box;
padding: .2rem .5rem;
border-radius: .25rem;
color: var(--font-color-top3-h2);
user-select: none;
cursor: pointer;
&:hover{
background: var(--font-color-top3-hover);
}
&.active{
color: var(--font-color-top3-h1);
background: var(--font-color-top3-active);
}
}
}
}
& > div.right{
flex-shrink: 0;
}
& > div.main{
flex: 1;
}
}
@media (max-width: 767px){
}
@media (min-width: 768px){
}
</style>

View File

@ -7,7 +7,6 @@ definePageMeta({
},
})
const {data} = await useFetch('/api/hello')
consola.info(toValue(data))
</script>
<template>

View File

@ -16,10 +16,10 @@ onBeforeRouteLeave((to, from, next) => {
</script>
<template>
<div class="relative w-screen h-screen overflow-hidden flex items-center justify-center">
<div class="myFace top-0" :class="leaveTime ? 'myFaceLeave' : ''"></div>
<div class="myFace bottom-0" :class="leaveTime ? 'myFaceLeave' : ''"></div>
<div class="myContainer text-center font-bold">
<div class="INDEX">
<div class="myFace" :class="leaveTime ? 'myFaceLeave' : ''"></div>
<div class="myFace" :class="leaveTime ? 'myFaceLeave' : ''"></div>
<div class="myContainer">
<div class="content">
<span :class="leaveTime ? 'leaveBack' : ''"></span><span><div class="myMask"></div></span>
</div>
@ -27,19 +27,34 @@ onBeforeRouteLeave((to, from, next) => {
<span :class="leaveTime ? 'leaveBack' : ''">star writ</span>
</div>
<div class="entry" :class="leaveTime ? 'entryGo' : ''">
<nuxt-link to="/home" class="cursor-pointer">Entry</nuxt-link>
<nuxt-link to="/home" class="pointer">Entry</nuxt-link>
</div>
</div>
</div>
</template>
<style scoped lang="scss">
.INDEX{
position: relative;
width: 100%;
height: 100%;
overflow: hidden;
display: flex;
align-items: center;
justify-content: center;
}
.myFace {
position: absolute;
width: 100%;
animation: HalfScreen 1s ease-in-out forwards;
background: #000;
left: 0;
&:first-child{
top: 0;
}
&:nth-child(2){
bottom: 0;
}
}
.myFaceLeave {
@ -52,12 +67,14 @@ onBeforeRouteLeave((to, from, next) => {
color: #000;
font-size: 3rem;
letter-spacing: 4px;
text-align: center;
font-weight: bold;
& > div.content > span {
position: relative;
display: inline-block;
margin: 0;
padding: 0 20px;
padding: 0 10px;
animation: ChangeColor 1s ease-in-out 0.65s forwards;
font-family: KingHwa_OldSong, sans-serif;
font-weight: bold;
@ -97,7 +114,7 @@ onBeforeRouteLeave((to, from, next) => {
box-sizing: border-box;
width: 100%;
height: 100%;
padding: 0 20px;
padding: 0 10px;
text-align: center;
left: 0;
font-size: inherit;
@ -152,6 +169,9 @@ onBeforeRouteLeave((to, from, next) => {
}
}
}
.pointer{
cursor: pointer;
}
@keyframes gradient {
0% {