From 42e0fe9139261d1af929d3ce82816143a95738eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=94=E8=90=BD?= <45323514+BigCoke233@users.noreply.github.com> Date: Sat, 6 Apr 2019 15:01:25 +0800 Subject: =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/css/mark.min.css | 188 +++++++------------ assets/css/nprogress.css | 74 ++++++++ assets/js/nprogress.js | 480 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 624 insertions(+), 118 deletions(-) create mode 100644 assets/css/nprogress.css create mode 100644 assets/js/nprogress.js diff --git a/assets/css/mark.min.css b/assets/css/mark.min.css index e1e7195..af46a7f 100644 --- a/assets/css/mark.min.css +++ b/assets/css/mark.min.css @@ -12,14 +12,26 @@ body{ p{ font-size:1.1em; } +.post-content a{ + color:#4D90FE; + border-bottom:1px solid #4D90FE; + display:inline-block; + padding-bottom:0!important; +} a{ color:black; +} +a,.post-content a{ transition:all 0.3s; } a:hover,a:active{ opacity:0.9; text-decoration:none; - color:#808080; + color:#4D90FE; +} +.gallery-link{ + border:none!important; + padding:0!important; } /* 各种css */ .item{ @@ -28,6 +40,12 @@ a:hover,a:active{ -webkit-box-shadow:0 0 8px #ccc; padding:15px; } +.item-hr{ + margin-left:-15px; + margin-right:-15px; + margin-bottom:5px; + margin-top:5px; +} /* 文章及文章列表 */ .post-item{ transition:all 0.5s; @@ -35,7 +53,7 @@ a:hover,a:active{ } .post-item:hover{ box-shadow:0 2px 12px #ccc; - -webkit-box-shadow:0 2px 12px #ccc; + -webkit-box-shadow:0 2px 16px #ccc; } .post-header{ margin-top:20px; @@ -61,7 +79,7 @@ a:hover,a:active{ margin-bottom:-15px; } .post-banner{ - margin-bottom:10px; + margin-bottom:20px!important; margin:-15px; padding:0; } @@ -100,7 +118,7 @@ a:hover,a:active{ padding:10px; } .item{ - font-family:华文细黑,微软雅黑; + font-family:微软雅黑; } .post-content,.page-content{ margin-top:30px; @@ -129,7 +147,7 @@ a:hover,a:active{ margin-top:26px; margin-bottom:26px; padding:12px; - font-weight:bold; + font-weight:normal; } .post-content blockquote{ background:#F8F8FF; @@ -179,14 +197,22 @@ a:hover,a:active{ .read-more{ margin-top:-36px; } +/* 社会图标及打赏 */ +.social-share{ + display:inline-block; + font-size:28px; + color:#bababa; + letter-spacing:20px; +} + /* Nb首页大图 */ .jumbotron{ - height:50vh; + height:60vh; box-shadow:0 0 10px #808080; color:white; text-align:Center; - padding-top:20vh; + padding-top:25vh; text-shadow:0 0 10px #bababa; } /* 评论 */ @@ -203,11 +229,9 @@ a:hover,a:active{ resize:none; padding:10px; } -.comment-body{ - background-color:#fff; - box-shadow:0 0 8px #ccc; - -webkit-box-shadow:0 0 8px #ccc; - padding:15px; +.comment-list-wrap{ + margin-left:-40px; + padding:20px; } .comment-list-wrap ol{ list-style-type:none; @@ -222,6 +246,18 @@ a:hover,a:active{ } .comment-reply{ text-align:right; + visibility:hidden; + margin-top:-20px; +} +.comment-body:hover .comment-reply{ + visibility:visible!important; +} +.comment-parent{ + border-bottom:1px solid #F5F5F5; + margin-top:20px; +} +.comment-child .comment-child{ + margin-left:-40px; } .comment-reply a{ font-size:1em; @@ -241,24 +277,10 @@ a:hover,a:active{ -webkit-box-shadow:0 0 0.55em #bababa; margin-right:0.3em; } -.comment-body{ - padding:1em; - -webkit-box-shadow:0 0 0.5em #bababa; - background:white; - margin-left:-40px; - margin-top:0.5em; - transition:box-shadow 0.4s; -} -.comment-body:hover{ - -webkit-box-shadow:0 0 1em #bababa; - opacity:1 -} .comment-meta a{ color:#bababa; font-size:10px; } - - /* owo */ .OwO-logo{ display:inline-block; @@ -334,6 +356,12 @@ a:hover,a:active{ .sidebar li,.sidebar li>a{ color:gray; } +.sidebar .list-group>li{ + transition:background 0.4s; +} +.sidebar .list-group>li:hover{ + background:#F6F6EF; +} .avatar-bg{ background-repeat:no-repeat; background-size:cover; @@ -439,6 +467,7 @@ a:hover,a:active{ /* 友链 */ .links-box{ margin:10px; + margin-top:30px; } .links-box h2{ text-align:Center; @@ -451,15 +480,20 @@ a:hover,a:active{ } .links-item{ background:#fff; - border:1px solid #dcdcdc; - box-shadow:0 0 26px #bababa; - -webkit-box-shadow:0 0 26px #bababa; + box-shadow:0 2px 1px #ddd; + -webkit-box-shadow:0 1px 2px #ddd; overflow:hidden; transition:all 0.2s!important; - margin-bottom:15px; + margin-bottom:20px; } .links-item:hover{ - transform:scale(0.95) + transform:scale(1.05); + box-shadow:0 6px 22px #ddd; + -webkit-box-shadow:0 6px 22px #ddd; + transform:translateY(-6px); +} +.link-box a{ + color:black; } .links-title{ text-align:Center; @@ -468,7 +502,6 @@ a:hover,a:active{ font-weight:bold; letter-spacing:2px; white-space: nowrap; - text-shadow:0 0 1px #808080; } /* 归档 */ .archive-list ul{ @@ -490,7 +523,7 @@ a:hover,a:active{ /* pjax */ .pjax-loading{ - opacity:0.8; + opacity:0.4; } .pjax-loadend{ opacity:1; @@ -499,87 +532,6 @@ a:hover,a:active{ transition:opacity 0.5s; } -.unvisible{ - display:none;!important; -} - -.spinner { - margin: 100px auto; - width: 50px; - height: 60px; - text-align: center; - font-size: 10px; - z-index:9999; - position: fixed; - margin: 100px auto; - top:30vh; - bottom:30vh; - left:30vw; - right:30vw; -} - -.spinner > div { - background-color: #00BFFF; - height: 100%; - width: 6px; - display: inline-block; - - -webkit-animation: stretchdelay 1.2s infinite ease-in-out; - animation: stretchdelay 1.2s infinite ease-in-out; -} - -.spinner .rect2 { - -webkit-animation-delay: -1.1s; - animation-delay: -1.1s; -} - -.spinner .rect3 { - -webkit-animation-delay: -1.0s; - animation-delay: -1.0s; -} - -.spinner .rect4 { - -webkit-animation-delay: -0.9s; - animation-delay: -0.9s; -} - -.spinner .rect5 { - -webkit-animation-delay: -0.8s; - animation-delay: -0.8s; -} - -@-webkit-keyframes stretchdelay { - 0%, 40%, 100% { -webkit-transform: scaleY(0.4) } - 20% { -webkit-transform: scaleY(1.0) } -} - -@keyframes stretchdelay { - 0%, 40%, 100% { - transform: scaleY(0.4); - -webkit-transform: scaleY(0.4); - } 20% { - transform: scaleY(1.0); - -webkit-transform: scaleY(1.0); - } -} -.unvisible-cover{ - opacity:0; - display:none; - transition:opacity 0.5s; -} -.viewport-cover{ - height:100vh; - width:100vw; - background:#fff; - opacity:0.5; - z-index:100; - position:fixed; - top:0; - bottom:0; - right:0; - left:0; - transition:opacity 0.5s; -} /* 文章内短代码 */ .tip{ display:block; @@ -587,7 +539,7 @@ a:hover,a:active{ background-color:rgb(250,250,250); border-left:5px solid #ddd; border-radius:2px; - color:#A9A9A9; + color:#332244; } .tip.lblue{ border-color:#4D90FE!important; @@ -614,9 +566,9 @@ a:hover,a:active{ border-radius:4px; box-shadow:0 0 1px #bababa inset; } -.post-content .list-group{ - width:100%; - margin-left:-20px; +.post-content a.btn{ + padding-bottom:6px!important; + color:white; } diff --git a/assets/css/nprogress.css b/assets/css/nprogress.css new file mode 100644 index 0000000..6752d7f --- /dev/null +++ b/assets/css/nprogress.css @@ -0,0 +1,74 @@ +/* Make clicks pass-through */ +#nprogress { + pointer-events: none; +} + +#nprogress .bar { + background: #29d; + + position: fixed; + z-index: 1031; + top: 0; + left: 0; + + width: 100%; + height: 2px; +} + +/* Fancy blur effect */ +#nprogress .peg { + display: block; + position: absolute; + right: 0px; + width: 100px; + height: 100%; + box-shadow: 0 0 10px #29d, 0 0 5px #29d; + opacity: 1.0; + + -webkit-transform: rotate(3deg) translate(0px, -4px); + -ms-transform: rotate(3deg) translate(0px, -4px); + transform: rotate(3deg) translate(0px, -4px); +} + +/* Remove these to get rid of the spinner */ +#nprogress .spinner { + display: block; + position: fixed; + z-index: 1031; + top: 15px; + right: 15px; +} + +#nprogress .spinner-icon { + width: 18px; + height: 18px; + box-sizing: border-box; + + border: solid 2px transparent; + border-top-color: #29d; + border-left-color: #29d; + border-radius: 50%; + + -webkit-animation: nprogress-spinner 400ms linear infinite; + animation: nprogress-spinner 400ms linear infinite; +} + +.nprogress-custom-parent { + overflow: hidden; + position: relative; +} + +.nprogress-custom-parent #nprogress .spinner, +.nprogress-custom-parent #nprogress .bar { + position: absolute; +} + +@-webkit-keyframes nprogress-spinner { + 0% { -webkit-transform: rotate(0deg); } + 100% { -webkit-transform: rotate(360deg); } +} +@keyframes nprogress-spinner { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(360deg); } +} + diff --git a/assets/js/nprogress.js b/assets/js/nprogress.js new file mode 100644 index 0000000..beb9d2c --- /dev/null +++ b/assets/js/nprogress.js @@ -0,0 +1,480 @@ +/* NProgress, (c) 2013, 2014 Rico Sta. Cruz - http://ricostacruz.com/nprogress + * @license MIT */ + +;(function(root, factory) { + + if (typeof define === 'function' && define.amd) { + define(factory); + } else if (typeof exports === 'object') { + module.exports = factory(); + } else { + root.NProgress = factory(); + } + +})(this, function() { + var NProgress = {}; + + NProgress.version = '0.2.0'; + + var Settings = NProgress.settings = { + minimum: 0.08, + easing: 'linear', + positionUsing: '', + speed: 200, + trickle: true, + trickleSpeed: 200, + showSpinner: true, + barSelector: '[role="bar"]', + spinnerSelector: '[role="spinner"]', + parent: 'body', + template: '
' + }; + + /** + * Updates configuration. + * + * NProgress.configure({ + * minimum: 0.1 + * }); + */ + NProgress.configure = function(options) { + var key, value; + for (key in options) { + value = options[key]; + if (value !== undefined && options.hasOwnProperty(key)) Settings[key] = value; + } + + return this; + }; + + /** + * Last number. + */ + + NProgress.status = null; + + /** + * Sets the progress bar status, where `n` is a number from `0.0` to `1.0`. + * + * NProgress.set(0.4); + * NProgress.set(1.0); + */ + + NProgress.set = function(n) { + var started = NProgress.isStarted(); + + n = clamp(n, Settings.minimum, 1); + NProgress.status = (n === 1 ? null : n); + + var progress = NProgress.render(!started), + bar = progress.querySelector(Settings.barSelector), + speed = Settings.speed, + ease = Settings.easing; + + progress.offsetWidth; /* Repaint */ + + queue(function(next) { + // Set positionUsing if it hasn't already been set + if (Settings.positionUsing === '') Settings.positionUsing = NProgress.getPositioningCSS(); + + // Add transition + css(bar, barPositionCSS(n, speed, ease)); + + if (n === 1) { + // Fade out + css(progress, { + transition: 'none', + opacity: 1 + }); + progress.offsetWidth; /* Repaint */ + + setTimeout(function() { + css(progress, { + transition: 'all ' + speed + 'ms linear', + opacity: 0 + }); + setTimeout(function() { + NProgress.remove(); + next(); + }, speed); + }, speed); + } else { + setTimeout(next, speed); + } + }); + + return this; + }; + + NProgress.isStarted = function() { + return typeof NProgress.status === 'number'; + }; + + /** + * Shows the progress bar. + * This is the same as setting the status to 0%, except that it doesn't go backwards. + * + * NProgress.start(); + * + */ + NProgress.start = function() { + if (!NProgress.status) NProgress.set(0); + + var work = function() { + setTimeout(function() { + if (!NProgress.status) return; + NProgress.trickle(); + work(); + }, Settings.trickleSpeed); + }; + + if (Settings.trickle) work(); + + return this; + }; + + /** + * Hides the progress bar. + * This is the *sort of* the same as setting the status to 100%, with the + * difference being `done()` makes some placebo effect of some realistic motion. + * + * NProgress.done(); + * + * If `true` is passed, it will show the progress bar even if its hidden. + * + * NProgress.done(true); + */ + + NProgress.done = function(force) { + if (!force && !NProgress.status) return this; + + return NProgress.inc(0.3 + 0.5 * Math.random()).set(1); + }; + + /** + * Increments by a random amount. + */ + + NProgress.inc = function(amount) { + var n = NProgress.status; + + if (!n) { + return NProgress.start(); + } else if(n > 1) { + return; + } else { + if (typeof amount !== 'number') { + if (n >= 0 && n < 0.2) { amount = 0.1; } + else if (n >= 0.2 && n < 0.5) { amount = 0.04; } + else if (n >= 0.5 && n < 0.8) { amount = 0.02; } + else if (n >= 0.8 && n < 0.99) { amount = 0.005; } + else { amount = 0; } + } + + n = clamp(n + amount, 0, 0.994); + return NProgress.set(n); + } + }; + + NProgress.trickle = function() { + return NProgress.inc(); + }; + + /** + * Waits for all supplied jQuery promises and + * increases the progress as the promises resolve. + * + * @param $promise jQUery Promise + */ + (function() { + var initial = 0, current = 0; + + NProgress.promise = function($promise) { + if (!$promise || $promise.state() === "resolved") { + return this; + } + + if (current === 0) { + NProgress.start(); + } + + initial++; + current++; + + $promise.always(function() { + current--; + if (current === 0) { + initial = 0; + NProgress.done(); + } else { + NProgress.set((initial - current) / initial); + } + }); + + return this; + }; + + })(); + + /** + * (Internal) renders the progress bar markup based on the `template` + * setting. + */ + + NProgress.render = function(fromStart) { + if (NProgress.isRendered()) return document.getElementById('nprogress'); + + addClass(document.documentElement, 'nprogress-busy'); + + var progress = document.createElement('div'); + progress.id = 'nprogress'; + progress.innerHTML = Settings.template; + + var bar = progress.querySelector(Settings.barSelector), + perc = fromStart ? '-100' : toBarPerc(NProgress.status || 0), + parent = document.querySelector(Settings.parent), + spinner; + + css(bar, { + transition: 'all 0 linear', + transform: 'translate3d(' + perc + '%,0,0)' + }); + + if (!Settings.showSpinner) { + spinner = progress.querySelector(Settings.spinnerSelector); + spinner && removeElement(spinner); + } + + if (parent != document.body) { + addClass(parent, 'nprogress-custom-parent'); + } + + parent.appendChild(progress); + return progress; + }; + + /** + * Removes the element. Opposite of render(). + */ + + NProgress.remove = function() { + removeClass(document.documentElement, 'nprogress-busy'); + removeClass(document.querySelector(Settings.parent), 'nprogress-custom-parent'); + var progress = document.getElementById('nprogress'); + progress && removeElement(progress); + }; + + /** + * Checks if the progress bar is rendered. + */ + + NProgress.isRendered = function() { + return !!document.getElementById('nprogress'); + }; + + /** + * Determine which positioning CSS rule to use. + */ + + NProgress.getPositioningCSS = function() { + // Sniff on document.body.style + var bodyStyle = document.body.style; + + // Sniff prefixes + var vendorPrefix = ('WebkitTransform' in bodyStyle) ? 'Webkit' : + ('MozTransform' in bodyStyle) ? 'Moz' : + ('msTransform' in bodyStyle) ? 'ms' : + ('OTransform' in bodyStyle) ? 'O' : ''; + + if (vendorPrefix + 'Perspective' in bodyStyle) { + // Modern browsers with 3D support, e.g. Webkit, IE10 + return 'translate3d'; + } else if (vendorPrefix + 'Transform' in bodyStyle) { + // Browsers without 3D support, e.g. IE9 + return 'translate'; + } else { + // Browsers without translate() support, e.g. IE7-8 + return 'margin'; + } + }; + + /** + * Helpers + */ + + function clamp(n, min, max) { + if (n < min) return min; + if (n > max) return max; + return n; + } + + /** + * (Internal) converts a percentage (`0..1`) to a bar translateX + * percentage (`-100%..0%`). + */ + + function toBarPerc(n) { + return (-1 + n) * 100; + } + + + /** + * (Internal) returns the correct CSS for changing the bar's + * position given an n percentage, and speed and ease from Settings + */ + + function barPositionCSS(n, speed, ease) { + var barCSS; + + if (Settings.positionUsing === 'translate3d') { + barCSS = { transform: 'translate3d('+toBarPerc(n)+'%,0,0)' }; + } else if (Settings.positionUsing === 'translate') { + barCSS = { transform: 'translate('+toBarPerc(n)+'%,0)' }; + } else { + barCSS = { 'margin-left': toBarPerc(n)+'%' }; + } + + barCSS.transition = 'all '+speed+'ms '+ease; + + return barCSS; + } + + /** + * (Internal) Queues a function to be executed. + */ + + var queue = (function() { + var pending = []; + + function next() { + var fn = pending.shift(); + if (fn) { + fn(next); + } + } + + return function(fn) { + pending.push(fn); + if (pending.length == 1) next(); + }; + })(); + + /** + * (Internal) Applies css properties to an element, similar to the jQuery + * css method. + * + * While this helper does assist with vendor prefixed property names, it + * does not perform any manipulation of values prior to setting styles. + */ + + var css = (function() { + var cssPrefixes = [ 'Webkit', 'O', 'Moz', 'ms' ], + cssProps = {}; + + function camelCase(string) { + return string.replace(/^-ms-/, 'ms-').replace(/-([\da-z])/gi, function(match, letter) { + return letter.toUpperCase(); + }); + } + + function getVendorProp(name) { + var style = document.body.style; + if (name in style) return name; + + var i = cssPrefixes.length, + capName = name.charAt(0).toUpperCase() + name.slice(1), + vendorName; + while (i--) { + vendorName = cssPrefixes[i] + capName; + if (vendorName in style) return vendorName; + } + + return name; + } + + function getStyleProp(name) { + name = camelCase(name); + return cssProps[name] || (cssProps[name] = getVendorProp(name)); + } + + function applyCss(element, prop, value) { + prop = getStyleProp(prop); + element.style[prop] = value; + } + + return function(element, properties) { + var args = arguments, + prop, + value; + + if (args.length == 2) { + for (prop in properties) { + value = properties[prop]; + if (value !== undefined && properties.hasOwnProperty(prop)) applyCss(element, prop, value); + } + } else { + applyCss(element, args[1], args[2]); + } + } + })(); + + /** + * (Internal) Determines if an element or space separated list of class names contains a class name. + */ + + function hasClass(element, name) { + var list = typeof element == 'string' ? element : classList(element); + return list.indexOf(' ' + name + ' ') >= 0; + } + + /** + * (Internal) Adds a class to an element. + */ + + function addClass(element, name) { + var oldList = classList(element), + newList = oldList + name; + + if (hasClass(oldList, name)) return; + + // Trim the opening space. + element.className = newList.substring(1); + } + + /** + * (Internal) Removes a class from an element. + */ + + function removeClass(element, name) { + var oldList = classList(element), + newList; + + if (!hasClass(element, name)) return; + + // Replace the class name. + newList = oldList.replace(' ' + name + ' ', ' '); + + // Trim the opening and closing spaces. + element.className = newList.substring(1, newList.length - 1); + } + + /** + * (Internal) Gets a space separated list of the class names on the element. + * The list is wrapped with a single space on each end to facilitate finding + * matches within the list. + */ + + function classList(element) { + return (' ' + (element && element.className || '') + ' ').replace(/\s+/gi, ' '); + } + + /** + * (Internal) Removes an element from the DOM. + */ + + function removeElement(element) { + element && element.parentNode && element.parentNode.removeChild(element); + } + + return NProgress; +}); -- cgit v1.2.3