碎碎念 上班已经一个星期了,也算是正式踏入牛马生活啦。虽然每天都有点忙、有点累,但整体体验还是挺有意思的。工作节奏紧凑却充实,不仅能认识许多经验丰富、技术过硬的大佬们,还能在他们身上学到不少实用的知识与工作思维,感觉自己的成长速度也在加快。希望自己能稳步前进,顺利度过实习期,早日正式成为团队的一员!
前些天,发哥 催我赶紧做一个赞赏页。我本来一直拖着没动手,结果人家咖啡都先送过来了😂。于是想着既然承诺了,就得说到做到。趁着上周末有空,我花了点时间把赞赏页面打磨出来,不仅实现了预期的效果,还添加了一些小细节,让页面更有温度。这个页面既是对支持我的朋友们的一份感谢,也算是给博客增添了一点仪式感。
展示效果 本次魔改主要涉及两个部分。首先是侧边栏的轮播展示 ,可以循环显示所有赞赏者。侧边栏的数据为随机排序,最多显示20位赞赏者;如果超过这个数量,会在最后自动添加一个“更多”按钮,点击即可跳转至完整的赞赏页面。当鼠标悬停时,轮播会自动暂停。整个轮播效果未引入任何第三方库,对性能几乎没有影响。
第二个部分是赞赏页面 ,用于集中展示所有赞赏者。这个页面我没有使用任何 JS,完全是纯静态设计 ,不仅加载更快,还能为赞赏者带来一定的SEO加成,也算是我对他们的一点小小回馈。
不过由于没有使用 JS,所以暂时无法实现分页、动态加载等功能,如果人数过多可能导致列表过长。不过考虑到我的友链页面都已经挺长了(笑),这里应该问题不大——反正也不太可能有那么多人赞赏我吧QAQ。
效果早已上线本站,欢迎测试,如果有Bug欢迎指出呀!
教程 懒得废话了,直接上教程吧,教程也分为两部分实现,首先需要说明,在本主题中有一些博主自定义的变量,如果直接搬过去可能导致无法实现想要的功能,本次教程涉及到的样式表如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 :root { --liushen-nav-bg : rgba (255 , 255 , 255 , 0.8 ); --liushen-nav-shadow : rgba (133 , 133 , 133 , 0.6 ) 0px 5px 6px -5px ; --liushen-title-font-color : #0883b7 ; --liushen-maskbg : rgba (255 , 255 , 255 , 0.85 ); --liushen-ai-bg : conic-gradient ( from 1.5708rad at 50% 50% , #d6b300 0% , #42a2ff 54% , #d6b300 100% ); --liushen-card-bg : #fff ; --liushen-card-secondbg : #f1f3f8 ; --liushen-card-border : 1px solid #e3e8f7 ; --liushen-button-bg : #f1f3f8 ; --liushen-button-hover-bg : var (--theme-color); --liushen-text : #4c4948 ; --liushen-secondtext : #3c3c43cc ; } [data-theme='dark' ] { --liushen-nav-bg : rgba (18 , 18 , 18 , 0.8 ); --liushen-nav-shadow : rgba (133 , 133 , 133 , 0 ) 0px 5px 6px -5px ; --liushen-maskbg : rgba (0 , 0 , 0 , 0.85 ); --liushen-ai-bg : conic-gradient ( from 1.5708rad at 50% 50% , rgba (214 , 178 , 0 , 0.46 ) 0% , rgba (66 , 161 , 255 , 0.53 ) 54% , rgba (214 , 178 , 0 , 0.49 ) 100% ); --liushen-card-bg : #2d2d2d ; --liushen-card-secondbg : #3e3f41 ; --liushen-card-border : 1px solid #42444a ; --liushen-button-bg : #30343f ; --liushen-button-hover-bg : var (--theme-color); --liushen-text : #ffffffb3 ; --liushen-secondtext : #a1a2b8 ; }
可以按照要求自行添加到对应的blog\themes\liushen\source\css\_mode\darkmode.styl和blog\themes\liushen\source\css\_global\index.styl中,这两个部分对应暗色和亮色的配置:
下面开始正文。
赞赏数据 展示赞赏者的前提是,得有赞赏数据,所以我们先来构建该数据,创建文件[根目录]/source/_data/rewards.yml,写入以下格式的内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 donate: alipay: name: 支付宝收款码 image: /config/img/alipay.png wechat: name: 微信收款码 image: /config/img/wechat.png thank_img: https://p.liiiu.cn/i/2025/10/10/68e9199157351.webp page_url: /rewards/ list: - name: 银河香港 avatar: https://p.liiiu.cn/i/2025/02/26/67bec7d0eb734.webp website: date: 2025-03-15 amount: ¥100.00 description: 你我皆是生活银河中的闪耀星辰 - name: 周润发 avatar: https://p.liiiu.cn/i/2025/03/20/67dbe8c6a6221.webp website: https://blog.zrf.me date: 2025-08-01 amount: ¥30.00 description: 收录开源,好用的互联网项目~ - name: SXY avatar: https://p.liiiu.cn/i/2025/10/11/68e93a9ccee45.webp website: date: 2025-08-29 amount: ¥10.00 description: 地球与物理专业的大三学生 - name: Ljx avatar: https://p.liiiu.cn/i/2025/10/09/68e7d8ed2a70b.webp website: https://blog.ljx.icu/ date: 2025-10-09 amount: ¥8.88 description: 一个无聊无趣的人~ - name: AirTouch avatar: https://p.liiiu.cn/i/2025/07/18/687a369fc3610.webp website: https://www.xsl.im/ date: 2025-10-10 amount: ¥18.88 description: 岩间琉璃云间月 - name: 短巷与雨 avatar: https://p.liiiu.cn/i/2024/11/18/673ac90233753.webp website: https://space.xsl.im/ date: 2025-10-12 amount: ¥28.88 description: 为学日益,为道日损。 - name: 老罗博客 avatar: https://p.liiiu.cn/i/2025/06/01/683bc6062b113.webp website: https://www.luosir.cn date: 2025-10-12 amount: ¥8.88 description: 人生就是折腾 - name: 温柔鱼 avatar: https://p.liiiu.cn/i/2025/10/08/68e5e1f17ed12.webp website: https://blog.vrou.cn date: 2025-10-17 amount: ¥8.88 description: "NULL" - name: 不知名朋友 avatar: https://p.liiiu.cn/i/2025/10/11/68e93a9ccee45.webp website: date: 2025-10-19 amount: ¥2.00 description: 感谢朋友的赞助~
其中列表的时间顺序建议上面最早,下面最新,因为我懒得写排序了嘻嘻,所以直接倒序,方便实用(反正每次添加都是往文件底部添加啦)。
有了数据,我们就开始添加到页面上吧~
侧边栏 创建文件[根目录]\themes\liushen\layout\includes\widget\card_rewards.pug,写入以下内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 .card-widget.card-reward .item-headline .headline-content i.fa-solid.fa-person-praying span 能量榜 .show-more-inline - var pageUrl = site.data.rewards.donate.page_url || '/reward/' a(href=url_for(pageUrl) class="btn-show-more-inline") span 前往赞赏 .item-content if site.data.rewards && site.data.rewards.donate && site.data.rewards.donate.list.length > 0 - var allSponsors = site.data.rewards.donate.list.slice() - allSponsors.sort(function() { return Math.random() - 0.5 }) - var carouselSponsors = allSponsors.slice(0, 40) - var listSponsors = allSponsors.slice(0, 20) if carouselSponsors.length > 0 .top-sponsor-carousel .carousel-container .carousel-item a.sponsor-link-card(target="_blank" rel="nofollow noopener") .sponsor-avatar img.sponsor-avatar-img(src=url_for(carouselSponsors[0].avatar) alt=carouselSponsors[0].name onerror=`this.onerror=null;this.src='` + url_for(theme.error_img.flink) + `'`) .sponsor-info .sponsor-name= carouselSponsors[0].name .sponsor-desc= carouselSponsors[0].description if listSponsors.length > 1 .sponsors-list each sponsor in listSponsors if sponsor.website a.sponsor-item(href=sponsor.website target="_blank" rel="nofollow noopener") .sponsor-small-name= sponsor.name else .sponsor-item .sponsor-small-name= sponsor.name if allSponsors.length > 20 - var pageUrl = site.data.rewards.donate.page_url || '/reward/' a.sponsor-item.more-sponsor(href=url_for(pageUrl) target="_blank" rel="nofollow noopener") .sponsor-small-name | 查看更多 i.fa-solid.fa-angles-right .sponsors-note p 你们的赞赏是我最大的动力 p ※ 此处数据随机显示 script. if (!window.sponsorsData) { window.sponsorsData = !{JSON.stringify(carouselSponsors)}; } function initRewardCarousel() { const container = document.querySelector('.carousel-container'); const link = container.querySelector('.sponsor-link-card'); const avatar = container.querySelector('.sponsor-avatar-img'); const name = container.querySelector('.sponsor-name'); const desc = container.querySelector('.sponsor-desc'); if (!container || sponsorsData.length === 0) return; let currentIndex = 0; let intervalId = null; let isTransitioning = false; function updateSponsorInfo(sponsor) { if (sponsor.website) { link.href = sponsor.website; // 确保有链接时移除 pointer-events 样式 link.style.pointerEvents = ''; link.style.cursor = 'pointer'; } else { link.removeAttribute('href'); // 只有在没有链接时才添加 pointer-events: none link.style.pointerEvents = 'none'; link.style.cursor = 'default'; } avatar.src = sponsor.avatar; avatar.alt = sponsor.name; name.textContent = sponsor.name; desc.textContent = sponsor.description; } function showSponsor(index) { if (index < 0 || index >= sponsorsData.length || isTransitioning) return; isTransitioning = true; const sponsor = sponsorsData[index]; container.style.opacity = '0'; setTimeout(() => { updateSponsorInfo(sponsor); container.style.opacity = '1'; currentIndex = index; setTimeout(() => { isTransitioning = false; }, 300); }, 300); } function nextSponsor() { const nextIndex = (currentIndex + 1) % sponsorsData.length; showSponsor(nextIndex); } function startAutoPlay() { if (intervalId) clearInterval(intervalId); intervalId = setInterval(nextSponsor, 3000); } function stopAutoPlay() { if (intervalId) { clearInterval(intervalId); intervalId = null; } } const carousel = document.querySelector('.top-sponsor-carousel'); if (carousel) { carousel.addEventListener('mouseenter', stopAutoPlay); carousel.addEventListener('mouseleave', startAutoPlay); } container.style.transition = 'opacity 0.3s ease-in-out'; // 初始化第一个赞助者信息 updateSponsorInfo(sponsorsData[0]); startAutoPlay(); return { showSponsor, nextSponsor, startAutoPlay, stopAutoPlay }; } initRewardCarousel(); //- document.addEventListener("pjax:complete", function() { //- initRewardCarousel(); //- }); else .no-sponsors p 暂无赞助者,成为第一个支持本站的朋友吧! else .no-sponsors p 暂无赞助者数据
以上为PUG结构,下面添加样式,找到目录[根目录]/themes/liushen/source/css/_layout随便找个地方创建一个styl文件,因为这个文件夹下的所有styl均会被直接渲染到index.css文件中,创建文件后写入以下内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 #aside-content .card-widget .card-reward padding : 8px .item-headline margin : 4px 4px 0 4px display : flex justify-content : space-between align-items : center .headline-content i font-size : 1.1em span font-size : 1em font-weight : 600 color : var (--liushen-text) .show-more-inline .btn-show-more-inline display : inline-flex align-items : center padding : 4px 12px background-color : var (--liushen-card-bg) border : var (--liushen-card-border) color : var (--liushen-text) text-decoration : none border-radius : 15px font-size : 12px font-weight : 500 transition : all 0.3s ease span margin-left : 0 &:hover background-color : var (--default-bg-color) color : #fff transform : translateY (-1px ) box-shadow : 0 4px 8px rgba (0 , 0 , 0 , 0.15 ) .item-content margin : 0 4px 4px 4px .top-sponsor-carousel margin-bottom : 15px .carousel-container .carousel-item width : 100% display : flex !important align-items : center padding : 8px background-color : var (--liushen-card-bg) border-radius : 12px border : var (--liushen-card-border) &.carousel-item-new animation : slideIn 0.5s ease-out a display : flex align-items : center text-decoration : none color : var (--liushen-text) width : 100% .sponsor-avatar width : 60px height : 60px margin-right : 10px img width : 100% height : 100% border-radius : 50% object-fit : cover border : 4px solid var (--liushen-card-secondbg) .sponsor-info min-width : 0 .sponsor-name font-size : 18px font-weight : 600 line-height : 1 margin-bottom : 12px color : var (--liushen-text) overflow : hidden text-overflow : ellipsis white-space : nowrap .sponsor-desc font-size : 14px line-height : 1 color : var (--liushen-secondtext) overflow : hidden text-overflow : ellipsis white-space : nowrap .sponsors-list display : flex flex-wrap : wrap gap : 10px margin-bottom : 12px .sponsor-item display : flex align-items : center line-height : 1.2 text-decoration : underline text-underline-offset : 4px text-decoration-color : var (--liushen-text) text-decoration-style : dashed color : var (--liushen-text) transition : all 0.2s ease white-space : nowrap border : 1px solid transparent &:hover color : var (--default-bg-color) text-decoration-color : var (--default-bg-color) transform : translateY (-2px ) .sponsor-small-name font-size : 14px font-weight : 500 .sponsors-note text-align : center font-size : 12px color : var (--liushen-secondtext) opacity : 0.8 p margin : 0 .no-sponsors text-align : center padding : 20px color : var (--liushen-secondtext) p font-size : 14px @keyframes slideIn from opacity : 0 transform : translateX (20px ) to opacity : 1 transform : translateX (0 )
其中变量请看教程顶部的变量表,这里不再细说。
赞赏页面 如果不出所料,侧边栏应该实现了,下面实现赞赏页面,由于不涉及Javascript,所以实现起来可简单多了,还是一样,首先添加Pug页面结构文件,创建blog\themes\liushen\layout\includes\page\rewards.pug,写入以下内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 #article-container if top_img === false h1.page-title= page.title .reward-page // 感谢图片 .thank-image img.no-lightbox( src=site.data.rewards.donate.thank_img alt="感谢" onerror=`this.onerror=null;this.src='` + url_for(theme.error_img.post) + `'` ) // 收款码区域 .payment-codes .payment-item.alipay .payment-content .payment-image img(src=site.data.rewards.donate.alipay.image alt=site.data.rewards.donate.alipay.name) .payment-info .payment-name= site.data.rewards.donate.alipay.name //- .payment-desc 支付宝扫一扫 .payment-item.wechat .payment-content .payment-image img(src=site.data.rewards.donate.wechat.image alt=site.data.rewards.donate.wechat.name) .payment-info .payment-name= site.data.rewards.donate.wechat.name //- .payment-desc 微信扫一扫 // 赞赏者列表 .sponsors-list .sponsors-header .sponsors-description p 你的每一份支持都是对我的莫大鼓励 .sponsors-container if site.data.rewards && site.data.rewards.donate && site.data.rewards.donate.list.length > 0 // 反转列表,因为最新的在最后 - var sortedSponsors = site.data.rewards.donate.list.slice().reverse() // 计算统计数据 - var totalCount = sortedSponsors.length - var totalAmount = 0 - sortedSponsors.forEach(function(sponsor) { - var amount = parseFloat(String(sponsor.amount).replace('¥', '')); - if (!isNaN(amount)) { - totalAmount += amount; - } - }) each sponsor, index in sortedSponsors .sponsor-item if sponsor.website a.sponsor-card(href=sponsor.website target="_blank" rel="noopener noreferrer" style="text-decoration: none;") .background-img( style=`background-image:url(${sponsor.avatar});background-repeat:no-repeat;background-size:cover;background-position:right;mask-image:linear-gradient(to left, transparent, black);-webkit-mask-image:linear-gradient(to left, transparent, black);` onerror=`this.onerror=null;this.style.backgroundImage='url("` + url_for(theme.error_img.post_page) + `")'` ) .sponsor-card-left .sponsor-avatar-title img.no-lightbox( src=sponsor.avatar alt='' onerror=`this.onerror=null;this.src='` + url_for(theme.error_img.post_page) + `'` ) .sponsor-name= sponsor.name .sponsor-desc= sponsor.description .sponsor-card-right .sponsor-amount= sponsor.amount .sponsor-date= sponsor.date ? String(sponsor.date).slice(0, 10) : '' else .sponsor-card(style="pointer-events: none; cursor: default;") .background-img( style=`background-image:url(${sponsor.avatar});background-repeat:no-repeat;background-size:cover;background-position:right;mask-image:linear-gradient(to left, transparent, black);-webkit-mask-image:linear-gradient(to left, transparent, black);` onerror=`this.onerror=null;this.style.backgroundImage='url("` + url_for(theme.error_img.post_page) + `")'` ) .sponsor-card-left .sponsor-avatar-title img.no-lightbox( src=sponsor.avatar alt='' onerror=`this.onerror=null;this.src='` + url_for(theme.error_img.post_page) + `'` ) .sponsor-name= sponsor.name .sponsor-desc= sponsor.description .sponsor-card-right .sponsor-amount= sponsor.amount .sponsor-date= sponsor.date ? String(sponsor.date).slice(0, 10) : '' else .no-sponsors p 暂无赞赏者数据 // 统计信息 .statistics .total-count 共计 span.stat-number= totalCount | 笔打款 .total-amount 累计金额 span.stat-number ¥#{totalAmount.toFixed(2)} != page.content
然后修改blog\themes\liushen\layout\page.pug文件,添加上Rewards页面的布局:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 extends includes/layout.pug block content - const noCardLayout = ['shuoshuo', '404'].includes(page.type) ? 'nc' : '' - var commentsJsLoad = false mixin commentLoad if page.comments !== false && theme.comments.use - commentsJsLoad = true !=partial('includes/third-party/comments/index', {}, {cache: true}) #page(class=noCardLayout) if top_img page-title= page.title case page.type when 'tags' include includes/page/tags.pug +commentLoad when 'link' include includes/page/flink.pug +commentLoad + when 'rewards' + include includes/page/rewards.pug + +commentLoad when 'categories' include includes/page/categories.pug +commentLoad when 'devices' include includes/page/devices.pug when 'shuoshuo' include includes/page/shuoshuo.pug when 'about' include includes/page/about.pug when '404' include includes/page/404.pug default include includes/page/default-page.pug +commentLoad
删掉加号后自行注意缩进,这里缩进应该挺明显的吧,所以就不多说啦。
页面结构添加完成,下面实现样式,创建文件blog\themes\liushen\source\css\_page\rewards.styl,写入以下内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 #article-container .reward-page .thank-image img box-shadow : none height : 200px .img-alt display : none .payment-codes display : flex justify-content : center gap : 40px margin : 30px 0 flex-wrap : wrap @media screen and (max-width : 768px ) gap: 20px .payment-item text-align: center transition: transform 0.3s ease &:hover transform: translateY(-5px ) .payment-content display: flex flex-direction: column align-items: center gap: 15px .payment-image width : 180px height : 180px border-radius: 15px overflow: hidden box-shadow: 0 5px 20px rgba(0 , 0 , 0 , 0.1 ) @media screen and (max-width : 768px ) width : 150px height : 150px img width : 100% height : 100% object-fit: cover .payment-info .payment-name font-size: 16px color : var(--liushen-text) font-weight: 600 margin-bottom: 5px // 赞赏者列表 .sponsors-list margin-bottom: 30px // 头部区域 .sponsors-header display: flex flex-direction: row-reverse .sponsors-description p font-size: 16px color : var(--liushen-secondtext) font-style: italic .sponsors-container display: flex flex-wrap: wrap justify-content: flex-start margin: -8px // 抵消子元素的 margin .sponsor-item margin: 8px // 统一的 margin // 默认宽度 (1 列) width : "calc(100% - %s)" % (8px * 2 ) // 800px 及以上 (2 列) @media screen and (min-width : 800px ) width : "calc(100% / 2 - %s)" % (8px * 2 ) // 1200px 及以上 (3 列) @media screen and (min-width : 1200px ) width : "calc(100% / 3 - %s)" % (8px * 2 ) background-color: var(--liushen-card-bg) border: var(--liushen-card-border) border-radius: 12px transition: all 0.3s ease overflow: hidden &:hover transform: translateY(-2px ) .background-img opacity: 0.5 transform: translateX(-50% ) translateY(-50% ) scale(1.3 ) !important .sponsor-avatar-title opacity: 0 !important .sponsor-desc opacity: 1 !important .sponsor-card display: flex justify-content: space-between height : 52px width : 100% align-items: center padding: 10px transition: all 0.3s ease position: relative .background-img position: absolute transform: translateX(-50% ) translateY(-50% ) width : 400px height : 400px border-radius: 50% transition: all 0.3s ease opacity: 0.7 z-index: 0 top: 50% left: 10px .sponsor-card-left display: flex z-index: 1 align-items: center gap: 15px flex: 1 min-width : 0 .sponsor-avatar-title display: flex height : 100% align-items: center gap: 10px opacity: 1 transition: all 0.3s ease img width : 20px margin: 0 height : 20px border-radius: 50% object-fit: cover .sponsor-name font-size: 16px font-weight: 600 color : var(--liushen-text) transition: all 0.3s ease white-space: nowrap overflow: hidden text-overflow: ellipsis .sponsor-desc position: absolute transform: translateY(-50% ) z-index: 1 left: 20px top: 50% font-size: 16px font-weight: 600 color : var(--liushen-text) opacity: 0 transition: all 0.3s ease white-space: nowrap overflow: hidden text-overflow: ellipsis max-width : calc(100% - 180px ) .sponsor-card-right text-align: right display: flex gap:10px .sponsor-amount font-size: 16px font-weight: 600 line-height: 1 color : var(--default-bg-color) .sponsor-date font-size: 16px line-height: 1 color : var(--liushen-secondtext) .sponsor-card:hover & color : rgba(255 , 255 , 255 , 0.8 ) .statistics display: flex flex-direction: column gap: 5px font-size: 16px color : var(--liushen-text) margin-top: 20px .stat-number font-weight: 600 color : var(--default-bg-color) // 无数据提示 .no-sponsors text-align: center padding: 50px color : var(--liushen-secondtext) p font-size: 16px margin: 0 // 定义渐入动画 @keyframes fadeInUp from opacity: 0 transform: translateY(20px ) to opacity: 1 transform: translateY(0 )
页面渲染结构,页面样式均写完了,我们如何定位该页面的位置呢?在source文件夹下创建Rewards文件夹,内部创建index.md文件,写入以下内容:
1 2 3 4 5 6 7 8 9 10 11 12 --- title: 感谢赞助,每一份都是对我莫大的支持 date: 2018-06-07 22:17:49 type: "rewards" aside: false --- 感谢每一份慷慨的赞赏,它不仅是支持,更是我前行路上温暖的光。这份心意我已悉心珍藏,会化作动力,努力为大家创造更多价值💗 **【温馨提示】** 如果您在赞赏时,能留下备注或在下方评论区说一声,就能方便我将这份心意与您对应上,为您记录在专属的感谢名单里。期待与您相遇!
注意添加顶部的type: "rewards",这一句是关键!
再次渲染,访问对应目录,应该就可以看见啦,教程完结!
总结 总体来说,还是要由衷地感谢所有赞赏和支持我的朋友们。无论是否打赏过,我都会坚持把这个小站继续维护下去。如今已经踏入职场,我也更有能力去守护这片属于自己的“小破站”。我并不是为了任何回报,只是想在浩瀚的互联网中,留下一方属于自己的净土,一个可以静下心来书写、表达、交流的地方。更何况,这片净土让我结识了那么多温暖可爱的朋友们,这本身就是最珍贵的馈赠。
接下来,我可能会逐步放弃使用 Hexo,转向一个更加灵活的动态框架。Hexo 陪伴了我整个大学时光,它让我学会了搭建、调试、魔改,也记录了我成长的足迹。但静态博客的渲染速度和灵活性确实有些局限,而动态框架可以让我更专注于内容创作,少一些复杂的构建与运维。到那时,也许更新会更加自由,页面也能更加生动。配置服务器、调试环境这些小事,反而变得不再是负担,而是一种熟悉的乐趣。
步入工作后,总觉得自己还没来得及成熟,就已经被生活推着向前走。时间过得太快了,大学的日子仿佛还在昨天。那时虽有导师的催促与压榨,但终究单纯;如今身处企业,才真切体会到社会的残酷与竞争的无形压力。行如逆水行舟,不进则退。怀念归怀念,生活还得继续。现在的我,只能更加脚踏实地,同时不忘抬头仰望星空。愿我们都能在前路漫漫中,找到自己的光,拥有属于自己的方向,不留遗憾。
“愿你我在奔赴各自山海的路上,仍能心怀炽热,仍能目有星辰。”
每日一图 图片来自哲风壁纸