摘要:開始之前寫的個人博客確實有點太丑了,最近重寫了一番。一圖勝千言,且看如下效果個人博客地址項目地址自定義滾動條目前對于自定義滾動條支持情況比較好的也就只有了,所以針對有必要把滾動條的樣式改造一下。典型的多對多關系。
開始
之前寫的個人博客確實有點太丑了,最近重寫了一番。做了移動端適配,增加了文章標簽以及做了相冊等功能。
看著很不錯。talk is cheap,show me you code。一圖勝千言,且看如下效果:
個人博客地址:http://www.baijiawei.top
項目GitHub地址:https://github.com/bjw1234/bl...
自定義滾動條目前對于自定義滾動條支持情況比較好的也就只有Chrome了,所以針對Chrome有必要把滾動條的樣式改造一下。
雖然有jQuery插件可以完成各個瀏覽器下的自定義滾動條樣式,但是由于整個項目都是用原生JS開發完成的,
未使用jQuery,所以也沒必要為了一個滾動條引入一個庫和一個插件了。
::-webkit-scrollbar { width: 10px; height: 10px; } /*不要水平滾動條*/ ::-webkit-scrollbar:horizontal { height: 0; } /*主干樣式*/ ::-webkit-scrollbar-track { background-color: rgba(0, 0, 0, .1); -webkit-box-shadow: inset 1px 1px 0 rgba(0, 0, 0, .1); } /*鼠標懸浮時主干樣式*/ ::-webkit-scrollbar-track:hover { background-color: rgba(0, 0, 0, .2); -webkit-box-shadow: inset 1px 1px 0 rgba(0, 0, 0, .1); } /*滑塊樣式*/ ::-webkit-scrollbar-thumb { border-radius: 10px; background-color: rgba(0, 0, 0, .3); -webkit-box-shadow: inset 1px 1px 0 rgba(0, 0, 0, .1); } /*鼠標懸浮時滑塊樣式*/ ::-webkit-scrollbar-thumb:hover { border-radius: 10px; background-color: rgba(0, 0, 0, .4); -webkit-box-shadow: inset 1px 1px 0 rgba(0, 0, 0, .1); } :hover::-webkit-scrollbar-thumb { border-radius: 10px; background-color: rgba(0, 0, 0, .4); -webkit-box-shadow: inset 1px 1px 0 rgba(0, 0, 0, .1); } /*上端按鈕樣式*/ ::-webkit-scrollbar-button:start { width: 10px; height: 10px; background: url(./image/scrollbar_arrow.png) no-repeat 0 0; } ::-webkit-scrollbar-button:start:hover { background: url(./image/scrollbar_arrow.png) no-repeat -15px 0; } /*下端按鈕樣式*/ ::-webkit-scrollbar-button:end { background: url(./image/scrollbar_arrow.png) no-repeat 0 -18px; } ::-webkit-scrollbar-button:end:hover { background: url(./image/scrollbar_arrow.png) no-repeat -15px -18px; }
webkit提供的還有更多的偽類,可以定制更豐富滾動條樣式。
詳細內容參考:https://www.webkit.org/blog/3...
這里給出原作者的地址:https://codepen.io/iamfronten...
起初想著自己實現這個效果,大概寫完之后發現人家的背景是用SVG做的,
還有一點點隨風飄動的趕腳,索性就直接用的人家的代碼。 ^_^||
原理:通過window對象上的requestAnimationFrame方法不斷地重繪canvas,實現小星星,流星等的位移、透明度的變化。
寫一點偽碼:
let canvas = document.getElementById("canvas"); let ctx = canvas.getContext("2d"); // 初始化 init(); // 繪制 draw(); function draw(){ // 清空畫板 ctx.clearRect(0,0,canvasW,canvasH); // 繪制小星星 for(var i = 0; i < stars.length; i++) { stars[i].move(); // 位移 stars[i].changAlpha(); // 改變透明度 stars[i].drawSelf(); // 畫出自己 stars[i].checkBound(); // 邊界檢測 } // 繪制流星同理 ... // 不斷地重繪 window.requestAnimationFrame(draw); } // 星星類 function star(){ // 很多自己的屬性 .... this.move = function(){} this.changAlpha = function(){} this.drawSelf = function(){} this.checkBound = function(){} }
如果流星出現的概率是3%,我們怎么精準的控制它呢?
// 獲取概率(Boolean) function getProbability(percent) { return Matth.floor(Math.random()*100+1) < percent; } getProbability(3); // 當返回true的時候再去添加彗星流暢的返回頂部
原理:也是使用requestAnimationFrame這個函數不斷改變scrollTo(滾動到)的位置。
使用setTimeout函數調整容器的scrollTop值雖然也能實現返回頂部的效果,但沒有上面這種方法流暢。
// 返回頂部 function smoothScroll() { var currentScroll = document.documentElement.scrollTop || document.body.scrollTop; if (currentScroll > 0) { window.requestAnimationFrame(smoothScroll); window.scrollTo(0, currentScroll - (currentScroll / 5)); } }關于文章標簽
一篇文章對應多個標簽。
一個標簽也可以被多篇文章使用。
典型的多對多關系。
后端數據庫使用的是MongoDB,實現這種多對多關系的數據表索引有點不知從何下手的感覺。
索性就使用了子文檔的方式實現這樣的效果。
(ps: 如果您有思路的話,希望可以不吝賜教,非常感謝。)
const mongoose = require("mongoose"); const Category = require("./categorySch"); // Article module.exports = new mongoose.Schema({ // 關聯字段 children: [ // 子文檔標簽數組 Category ], // 作者 user: { type: mongoose.Schema.Types.ObjectId, ref: "User" }, // 內容 content: { type: String, default: "" } .... });
使用這種方式添加、查詢標簽都很容易。
// 將用戶提交的標簽用空格切分返回一個對象 let categoryArr = category.split(" ").map(item => { return { category_name: item }; }); // 將用戶提交的數據加入數據庫 return new Article({ title: title, // 直接就可以添加 children: categoryArr, }).save(); // 查詢就更簡單了 article.children;
在模板中使用一個for循環就可以直接渲染數據:
{% for category in art.children %}
至于根據標簽查詢對應文章,起初想著向后端傳遞標簽的ID,但是,發現每篇文章下相同類別的標簽對應的ID不同。
(這就是使用子文檔的代價),索性就直接傳遞標簽名了,雖說這樣的方式不優雅,但也能實現想要的效果了。
let prev = function () { return Article.find({"_id": {"$gt": id}}).sort({_id: 1}).limit(1).then(result => { data.prev = null; if (result.length >= 0) { data.prev = result[0]; } }); }; let next = function () { return Article.find({"_id": {"$lt": id}}).sort({_id: -1}).limit(1).then(result => { data.next = null; if (result.length >= 0) { data.next = result[0]; } }); };相冊功能開發
圖片存儲使用了圖床(路過圖床),后端只需要存儲markdown語法的字符串,
前端就可以解析成img標簽,還是蠻好用的。
至于像是服務器搭建、模板引擎、markdown語法高亮、分頁等功能就不重復說了。
詳細內容可以看我之前的文章。
https://segmentfault.com/a/11...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/96374.html
摘要:開始之前寫的個人博客確實有點太丑了,最近重寫了一番。一圖勝千言,且看如下效果個人博客地址項目地址自定義滾動條目前對于自定義滾動條支持情況比較好的也就只有了,所以針對有必要把滾動條的樣式改造一下。典型的多對多關系。 開始 之前寫的個人博客確實有點太丑了,最近重寫了一番。做了移動端適配,增加了文章標簽以及做了相冊等功能。看著很不錯。talk is cheap,show me you cod...
摘要:近期,又迎來了一次重大升級,主要包括如下重點功能新增華南區域節點擴展包,推出合規解決方案,新增中國內地體驗版。后續將進一步支持回源多區域部署等功能,助力政府金融企業快速安全的實現改造。Web系統承載著各企事業單位的門戶、注冊登錄、業務執行等職責,很容易遭受各種類型的惡意流量攻擊,影響應用可用性、損害安全性或消耗過多的資源,UCloud Web應用防火墻UWAF則可以有效保護用戶的 Web 應...
摘要:關于中國制造業轉型升級,業界一直存在兩種常見誤區。因此,對于中國制造業的轉型升級,該當摒棄局部優化的技術改造思路,無論是消費品還是工業品生產制造,只需從市場需求生產選購的供應鏈全體效益角度動身,才可能探究出正確的路徑 互聯網對制造業的影響不該當以割裂的視角單獨來看,而該當放在整個產業互聯網化...
摘要:微信小游戲推出已有幾天了,這個功能對小程序和小游戲的推動影響不用多說,大家趕緊摩拳擦掌往上擼就可以了。打飛機小游戲使用無模式創建一個微信小游戲后可以看到官方,其中入口文件和配置文件和。 微信小游戲推出已有幾天了,這個功能對小程序和小游戲的推動影響不用多說,大家趕緊摩拳擦掌往上擼就可以了。關于如何開發官方文檔已經說明了,這篇則是對官方的打飛機demo一些小改造。 開發預備式 下載最新版...
閱讀 1259·2021-09-22 15:18
閱讀 2589·2021-09-22 15:17
閱讀 2218·2019-08-30 15:55
閱讀 1567·2019-08-30 15:54
閱讀 1032·2019-08-30 13:12
閱讀 619·2019-08-30 13:12
閱讀 1673·2019-08-29 11:33
閱讀 1433·2019-08-26 17:04