Typecho Mirages 主题自定义公告样式
使用步骤
将以下代码加入到 <head> 标签中。对于本主题,依次进入 控制台 - 外观 - 设置外观 - 主题自定义扩展,将代码加入到 自定义 HTML 元素拓展 - 标签: head 头部 (meta 元素后),也可直接加入到主题对应的 header.php 中的 </head> 标签前。
当前版本
<script>
    // 自定义公告显示
    document.addEventListener('DOMContentLoaded', initNotice2);
    document.head.append(document.createRange().createContextualFragment(
        `<style>
            .blog-notice {
                display: none;
            }
            @media screen and (max-device-width: 767px) {
                .el-notification.right {
                    margin: 0 auto;
                    left: 0;
                    right: 0 !important;
                }
            }
        </style>`
    ).firstElementChild);
    function initNotice2() {
        const common = {
            loadResource: function (id, resource, type) {
                return new Promise(function (resolve, reject) {
                    let loaded = document.head.querySelector('#' + id);
                    if (loaded) {
                        resolve('success: ' + resource);
                        return;
                    }
                    const element = document.createElement(type);
                    element.onload = element.onreadystatechange = () => {
                        if (!loaded && (!element.readyState || /loaded|complete/.test(element.readyState))) {
                            element.onload = element.onreadystatechange = null;
                            loaded = true;
                            resolve('success: ' + resource);
                        }
                    }
                    element.onerror = function () {
                        reject(Error(resource + ' load error!'));
                    };
                    if (type === 'link') {
                        element.rel = 'stylesheet';
                        element.href = resource;
                    } else {
                        element.src = resource;
                    }
                    element.id = id;
                    document.getElementsByTagName('head')[0].appendChild(element);
                });
            },
            loadResources: function () {
                const initVue = this.initVue;
                const loadResource = this.loadResource;
                const host = '//s0.pstatp.com/cdn/expire-1-M/';
                const resources = [
                    'vue/2.6.10/vue.min.js',
                    'element-ui/2.8.2/index.js',
                    'element-ui/2.8.2/theme-chalk/index.css'
                ];
                const loadPromises = [];
                resources.forEach(resource => {
                    loadPromises.push(loadResource(btoa(resource).replace(/[=+\/]/g, ''), host + resource,
                        ({
                            'css': 'link',
                            'js': 'script'
                        })[resource.split('.').pop()]
                    ));
                });
                Promise.all(loadPromises).then(
                    function () {
                        let flag = false;
                        const waitVue = setInterval(() => {
                            if (!flag && typeof Vue === 'function') {
                                flag = true;
                                initVue();
                                clearInterval(waitVue);
                            }
                        }, 100);
                    }
                );
            },
            initVue: function () {
                var blog = new Vue({
                    el: document.createElement('div'),
                    created() {
                        this.sayHello();
                        if (this.notice) {
                            this.showNotice();
                        }
                        window.alert = this.alert;
                    },
                    computed: {
                        notice: function () {
                            const blgNotice = document.querySelector('.blog-notice p');
                            if (blgNotice) {
                                const oldNotice = localStorage.getItem('BLOG-NOTICE');
                                const newNotice = blgNotice.innerText;
                                if (!oldNotice || oldNotice !== newNotice) {
                                    return newNotice;
                                }
                            }
                            return ''
                        },
                        hello: function () {
                            var hours = (new Date()).getHours()
                            var t
                            if (hours < 5) {
                                t = '凌晨好,注意休息哦!'
                            } else if (hours >= 5 && hours < 8) {
                                t = '早上好,新的一天又是元气满满呢!'
                            } else if (hours >= 8 && hours < 12) {
                                t = '上午好!'
                            } else if (hours === 12) {
                                t = '中午好!'
                            } else if (hours > 12 && hours <= 18) {
                                t = '下午好!'
                            } else if (hours > 18 && hours <= 22) {
                                t = '晚上好!'
                            } else if (hours > 22 && hours < 24) {
                                t = '夜深了,注意休息哦!'
                            }
                            return t
                        }
                    },
                    methods: {
                        alert: function (message, title, type, duration, showClose, offset, onClose) {
                            if (duration !== 0) {
                                duration = 4500;
                            }
                            this.$notify({
                                message: message,
                                type: type || 'error',
                                title: title || '警告',
                                duration: duration,
                                showClose: showClose || false,
                                offset: offset || 0,
                                onClose: onClose
                            })
                        },
                        showNotice: function () {
                            setTimeout(() => {
                                const notice = this.notice;
                                this.alert(notice, '公告', 'info', 0, true, null, function () {
                                    localStorage.setItem('BLOG-NOTICE', notice);
                                });
                            }, 1000);
                        },
                        sayHello: function () {
                            setTimeout(() => {
                                this.alert('欢迎来到 季春二九 的博客!', this.hello, 'success');
                            }, 1000);
                        }
                    },
                })
            }
        };
        common.loadResources();
    }
</script>
初始版本
<script>
    // 修正公告显示
    document.addEventListener('DOMContentLoaded', initNotice);
    document.head.append(document.createRange().createContextualFragment(`
    <style>
        .blog-notice {
            display: none;
            z-index: 9999 !important;
        }
        .blog-notice .blog-notice-close {
            line-height: 2.2em !important;
        }
    </style>`.trim()).firstElementChild);
    function initNotice() {
        const blgNotice = document.querySelector('.blog-notice');
        if (blgNotice) {
            const oldNotice = localStorage.getItem('BlogNotice');
            const newNotice = blgNotice.querySelector('p').innerText;
            if (!oldNotice || oldNotice !== newNotice) {
                blgNotice.style.display = 'initial';
                blgNotice.querySelector('.blog-notice-close').addEventListener('click',
                    () => localStorage.setItem('BlogNotice', newNotice));
            }
        }
    }
</script>
Typecho Mirages 主题自定义公告样式的更多相关文章
- [android] 练习样式主题自定义activity切换动画
		主要练习了自定义样式和主题,继承android系统默认的样式并修改,练习xml定义淡入淡出动画 anim/fade_in.xml <?xml version="1.0" en ... 
- CARDS主题 & 导航栏样式修改
		每个人对于主题样式的感觉是不一样的,譬如字体大小,间距,高宽,距离,颜色等,我们可以一定程度内很直观地去修改主题的某些样式. 首先,在浏览器中利用开发者工具进行调试,找到我们所要改动的那部分结构,写入 ... 
- Siteserver-stl:searchOutput(搜索结果)自定义显示样式
		stl:searchOutput 自定义显示样式 自定义搜索提交表单需要在<stl:searchOutput>中嵌入显示搜索结果的标签,必须包含的标签 有<stl:pageConte ... 
- 044. asp.net主题之二为主题添加CSS样式和动态加载主题
		1. 新建任意一个网站, 默认主页为Default.aspx, 增加一个App_Themes目录, 用于存储主题, 添加一个MyTheme的主题, 在MyTheme主题下添加一个样式表文件, 默认名称 ... 
- jQuery自定义滚动条样式插件mCustomScrollbar
		如果你构建一个很有特色和创意的网页,那么肯定希望定义网页中的滚动条样式,这方面的 jQuery 插件比较不错的,有两个:jScrollPane 和 mCustomScrollbar. 关于 jScro ... 
- 自定义plain 样式的 tableview,模拟器上不显示分割线,真机上却显示分割线.
		一, 经历 1> 自定义plain 样式的 tableview,模拟器上不显示分割线,真机上却显示cell 下面的分割线. 2> 尝试使用表格的separatorStyle属性,尝试失败. ... 
- Winform自定义窗体样式,实现标题栏可灵活自定义
		最近在编写C/S结构应用程序时,感觉窗体的标题栏样式太死板了,标题文字不能更改大小.颜色.字体等,按钮不能隐藏等问题,在网上也查找了许多相关的资料,没有找到合适的解决方案,发现许多人也在寻求这个问题, ... 
- ASP.NET加载主题和皮肤样式的各种方式
		一.加载主题(皮肤.样式表)的多种方式 除了在页面指令中采用Theme或者StylesheetTheme为单个页面加载主题外,还可以通过配置文件为多个页面批量加载主题,另外,还可以通过改变页面的The ... 
- WPF 自定义滚动条样式
		先看一下效果: 先分析一下滚动条有哪儿几部分组成: 滚动条总共有五部分组成: 两端的箭头按钮,实际类型为RepeatButton Thumb 两端的空白,实际也是RepeatButton 最后就是Th ... 
- Android设置选项开发及自定义Preference样式
		一个完整的Android应用程序都应该提供选项(或者叫偏好设置等等)让用户对APP的表现形式能够进行设置,比如说是否加入用户体验计划,或者是否自动升级.定时提醒.开启自启动.后台运行等等.提供一个好的 ... 
随机推荐
- .NET周刊【12月第2期 2024-12-08】
			国内文章 终于解决了.net在线客服系统总是被360误报的问题(对软件进行数字签名) https://www.cnblogs.com/sheng_chao/p/18581139 升讯威在线客服与营销系 ... 
- Log4j2的JNDI注入漏洞(CVE-2021-44228)原理分析与思考
			https://www.freebuf.com/vuls/316143.html 前言 最近Log4j2的JNDI注入漏洞(CVE-2021-44228)可以称之为"核弹"级别.L ... 
- Could not retrieve transation read-only status server 的解决办法
			问题描述: 在项目开发的过程中,使用Hibernate的ORM进行建表时,出现 " Could not retrieve transation read-only status server ... 
- java 实现N进制转M进制
			1. 把10进制转成N进制:除N取余,逆序排列 这里逆序排列使用StringBuilder类的reverse()函数来实现. /** * 10进制整数转换为N进制整数. 10进制转换为N进制 ... 
- Qt编写物联网管理平台32-表格数据
			一.前言 用表格来展示采集到的数据,是很多组态系统中最常见的方法,一个表格能够展示的数据特别多,在本系统中,默认做的也是通过表格的形式来展示数据,目前是将所有的设备放在一个表格中,后期可能按照不同控制 ... 
- Qt编写安防视频监控系统20-录像机管理
			一.前言 录像机管理模块,在本系统中除了用来存储NVR信息以外,方便生成对应的摄像机树状列表,目前没有其他用处,一个考虑是为了方便后期拓展,比如改成SDK内核加载视频流和回放视频等,甚至还需要做一些人 ... 
- [转]【Qt-license】误操作qt下载导致只能安装商业版试用十天,无法安装社区版
			背景:原本是为了学习qml,需要下载一个design studio,而这个需要比较新版的安装程序,但新版的安装程序官方都是online安装.于是从官网找下载链接.毕竟是英文的,又心急,误打误撞中我选择 ... 
- 基于开源IM即时通讯框架MobileIMSDK:RainbowChat-iOS端v9.0版已发布
			关于MobileIMSDK MobileIMSDK 是一套专门为移动端开发的开源IM即时通讯框架,超轻量级.高度提炼,一套API优雅支持 UDP .TCP .WebSocket 三种协议,支持 iOS ... 
- API 风格选对了,文档写好了,项目就成功了一半!
			在前后端开发中,API文档和API风格设计是提高开发效率.减少沟通成本.确保系统稳定性的关键环节.一个清晰.易用的API文档可以帮助前端开发者快速理解接口的使用方法,而完善的测试则能尽早发现潜在问题, ... 
- H5播放音频和视频
			H5播放音频和视频: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> &l ... 
