answer/ui/template/header.html

220 lines
6.8 KiB
HTML

{{define "header"}}
<!DOCTYPE html>
<html lang="{{.lang}}">
<head>
<meta charset="utf-8" />
<title>{{.title}}</title>
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
<meta name="theme-color" />
<meta name="description" content="{{.description}}" data-rh="true" />
<meta name="generator" content="Answer {{.Version}} - https://github.com/answerdev/answer version {{.Revision}}">
{{if .keywords }}<meta name="keywords" content="{{.keywords}}" data-rh="true" />{{end}}
<link rel="canonical" href="{{.siteinfo.Canonical}}" />
<link rel="manifest" href="/manifest.json" />
<link href="{{.cssPath}}" rel="stylesheet" />
<link href="/custom.css" rel="stylesheet" />
<link
rel="icon"
type="image/png"
href="{{if $.siteinfo.Branding.Favicon }}{{$.siteinfo.Branding.Favicon}}{{else}}/favicon.ico{{end}}"
data-rh="true"
/>
<link
rel="icon"
type="image/png"
sizes="192x192"
href="{{.siteinfo.Branding.SquareIcon}}"
data-rh="true"
/>
<link
rel="apple-touch-icon"
type="image/png"
href="{{.siteinfo.Branding.SquareIcon}}"
data-rh="true"
/>
<script defer="defer" src="{{.scriptPath}}"></script>
{{if $.siteinfo.JsonLD }}{{ .siteinfo.JsonLD | templateHTML}}{{end}}
</head>
<body>
<div id="root">
<div id="spin-mask">
<noscript>
<style>
#spin-mask {
display: none !important;
}
#protect-browser {
display: none;
}
</style>
</noscript>
<style>
@keyframes _doc-spin {
to { transform: rotate(360deg) }
}
#spin-mask {
position: fixed;
top: 0;
right: 0;
bottom: 0;
left: 0;
background-color: white;
z-index: 9999;
}
#spin-container {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
#spin-container .spinner {
box-sizing: border-box;
display: inline-block;
width: 2rem;
height: 2rem;
vertical-align: -.125em;
border: .25rem solid currentColor;
border-right-color: transparent;
color: rgba(108, 117, 125, .75);
border-radius: 50%;
animation: 0.75s linear infinite _doc-spin;
}
#protect-browser {
padding: 20px;
text-align: center;
}
</style>
<div id="spin-container">
<div class="spinner"></div>
</div>
<div id="protect-browser"></div>
</div>
<nav id="header" class="sticky-top navbar navbar-expand-lg navbar-dark">
<div class="d-flex align-items-center container">
<button
aria-controls="navBarContent"
id="navBarToggle"
type="button"
aria-label="Toggle navigation"
class="answer-navBar me-2 navbar-toggler collapsed"
>
<span class="navbar-toggler-icon"></span>
</button>
<div
class="d-flex justify-content-between align-items-center nav-grow flex-nowrap"
>
<a class="lh-1 me-0 me-sm-3 navbar-brand" href="/">
{{.siteinfo.General.Name}}
</a>
</div>
<div class="me-auto navbar-collapse collapse" id="navBarContent">
<hr class="hr lg-none mb-2" style="margin-top: 12px" />
<div class="col-md-4">
<div class="navbar-nav">
<a class="nav-link" href="/questions"
>{{translator $.language "ui.header.nav.question"}}</a
>
<a class="nav-link" href="/tags"
>{{translator $.language "ui.header.nav.tag"}}</a
>
</div>
</div>
<hr class="hr lg-none mt-2" />
</div>
</div>
</nav>
<div class="position-relative page-wrap">{{end}}</div>
</div>
</body>
<script>
/**
* @description: Prompt that the browser version is too low
*/
const defaultList = [
{
name: 'Edge',
version: '100'
},
{
name: 'Firefox',
version: '100'
},
{
name: 'Chrome',
version: '90'
},
{
name: 'Safari',
version: '15'
},
{
name: 'IE',
}
];
function getBrowserTypeAndVersion(){
var browser = {
name: '',
version: ''
};
var ua = navigator.userAgent.toLowerCase();
var s;
((ua.indexOf("compatible") > -1 && ua.indexOf("MSIE") > -1) || (ua.indexOf('Trident') > -1 && ua.indexOf("rv:11.0") > -1)) ? browser = { name: 'IE', version: '' } :
(s = ua.match(/edge\/([\d\.]+)/)) ? browser = { name: 'Edge', version: s[1] } :
(s = ua.match(/firefox\/([\d\.]+)/)) ? browser = { name: 'Firefox', version: s[1] } :
(s = ua.match(/chrome\/([\d\.]+)/)) ? browser = { name: 'Chrome', version: s[1] } :
(s = ua.match(/version\/([\d\.]+).*safari/)) ? browser = { name: 'Safari', version: s[1] } : browser = { name: 'unknown', version: '' };
// 根据关系进行判断
return browser;
}
function compareVersion(version1, version2) {
var v1 = version1.split('.');
var v2 = version2.split('.');
var len = Math.max(v1.length, v2.length);
while (v1.length < len) {
v1.push('0');
}
while (v2.length < len) {
v2.push('0');
}
for (var i = 0; i < len; i++) {
var num1 = parseInt(v1[i]);
var num2 = parseInt(v2[i]);
if (num1 >= num2) {
return 1;
} else if (num1 < num2) {
return -1;
}
}
return 0;
}
const browserInfo = getBrowserTypeAndVersion();
if (browserInfo.name === 'IE') {
const div = document.getElementById('protect-browser');
div.innerText = 'Sorry, this site does not support Internet Explorer. In order to avoid affecting the normal use of our features, please use a more modern browser such as Edge, Firefox, Chrome, or Safari.'
} else {
const notSupport = defaultList.some(item => {
if (item.name === browserInfo.name) {
return compareVersion(browserInfo.version, item.version) === -1;
}
return false;
});
if (notSupport) {
const div = document.getElementById('protect-browser');
div.innerText = 'The current browser version is too low, in order not to affect the normal use of the function, please upgrade the browser to the latest version.'
}
}
</script>
</html>