@@ -123223,7 +123223,7 @@
|
||||
"banner_type": 2,
|
||||
"target_id": 1,
|
||||
"asset_path": "assets\/image\/webview\/wv_ba_01.png",
|
||||
"webview_url": "\/webview.php\/static\/index?id=79",
|
||||
"webview_url": "/manga",
|
||||
"fixed_flag": false,
|
||||
"back_side": true,
|
||||
"banner_id": 200001,
|
||||
|
||||
@@ -84,6 +84,12 @@ func main() {
|
||||
r.GET("/webview.php/announce/index", handler.AnnounceIndexHandler)
|
||||
// Server APIs
|
||||
|
||||
// Web
|
||||
// Manga
|
||||
r.GET("/manga", func(ctx *gin.Context) {
|
||||
ctx.HTML(http.StatusOK, "manga.tmpl", gin.H{})
|
||||
})
|
||||
|
||||
r.Run(":8080") // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,97 @@
|
||||
@charset "utf-8";
|
||||
|
||||
#list-container {
|
||||
width: 386px;
|
||||
height: 536px;
|
||||
background-image: url("/static/images/bg-left.png");
|
||||
background-repeat: no-repeat;
|
||||
float: left;
|
||||
}
|
||||
|
||||
h2 {
|
||||
height: 76px;
|
||||
margin: 16px auto 14px;
|
||||
}
|
||||
|
||||
h2>img {
|
||||
display: block;
|
||||
height: 76px;
|
||||
margin: auto;
|
||||
}
|
||||
|
||||
#list-scroll {
|
||||
height: 410px;
|
||||
width: 363px;
|
||||
margin-left: 8px;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
li {
|
||||
text-align: left;
|
||||
background-image: url("/static/images/list-content-bg.png");
|
||||
font-size: 18px;
|
||||
width: 330px;
|
||||
height: 58px;
|
||||
margin: 0 0 8px 8px;
|
||||
list-style-type: none;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
li.tapped {
|
||||
background-image: url("/static/images/list-content-bg-on.png");
|
||||
}
|
||||
|
||||
li p {
|
||||
color: #fff;
|
||||
padding: 16px 8px 8px 50px;
|
||||
}
|
||||
|
||||
.new-icon {
|
||||
background-image: url("/static/images/new-icon.png");
|
||||
width: 50px;
|
||||
height: 50px;
|
||||
position: absolute;
|
||||
left: -4px;
|
||||
}
|
||||
|
||||
#image-container {
|
||||
float: left;
|
||||
background-image: url("/static/images/bg-right.png");
|
||||
background-repeat: no-repeat;
|
||||
width: 490px;
|
||||
height: 536px;
|
||||
margin-left: 4px;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
#image-scroll {
|
||||
width: 454px;
|
||||
height: 500px;
|
||||
margin: 20px 0 0 16px;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
#large-image-container {
|
||||
display: none;
|
||||
position: absolute;
|
||||
left: 5px;
|
||||
top: 6px;
|
||||
width: 855px;
|
||||
height: 488px;
|
||||
background-color: white;
|
||||
box-shadow: 10px 10px 5px rgba(51, 51, 51, 0.5);
|
||||
border-radius: 20px;
|
||||
border: 2px solid dimgray;
|
||||
padding: 15px 0;
|
||||
}
|
||||
|
||||
#large-image-scroll {
|
||||
position: relative;
|
||||
width: 850px;
|
||||
height: 488px;
|
||||
padding: 0 -17px;
|
||||
}
|
||||
|
||||
#large-image {
|
||||
margin: auto;
|
||||
}
|
||||
|
After Width: | Height: | Size: 494 KiB |
|
After Width: | Height: | Size: 603 KiB |
|
After Width: | Height: | Size: 506 KiB |
|
After Width: | Height: | Size: 547 KiB |
|
After Width: | Height: | Size: 476 KiB |
|
After Width: | Height: | Size: 473 KiB |
|
After Width: | Height: | Size: 624 KiB |
|
After Width: | Height: | Size: 628 KiB |
|
After Width: | Height: | Size: 735 KiB |
|
After Width: | Height: | Size: 436 KiB |
|
After Width: | Height: | Size: 470 KiB |
|
After Width: | Height: | Size: 534 KiB |
|
After Width: | Height: | Size: 423 KiB |
|
After Width: | Height: | Size: 687 KiB |
|
After Width: | Height: | Size: 772 KiB |
|
After Width: | Height: | Size: 772 KiB |
|
After Width: | Height: | Size: 743 KiB |
|
After Width: | Height: | Size: 510 KiB |
|
After Width: | Height: | Size: 468 KiB |
|
After Width: | Height: | Size: 504 KiB |
|
After Width: | Height: | Size: 657 KiB |
|
After Width: | Height: | Size: 508 KiB |
|
After Width: | Height: | Size: 553 KiB |
|
After Width: | Height: | Size: 565 KiB |
|
After Width: | Height: | Size: 509 KiB |
|
After Width: | Height: | Size: 572 KiB |
|
After Width: | Height: | Size: 953 KiB |
|
After Width: | Height: | Size: 1.1 MiB |
|
After Width: | Height: | Size: 906 KiB |
|
After Width: | Height: | Size: 824 KiB |
|
After Width: | Height: | Size: 711 KiB |
|
After Width: | Height: | Size: 1.0 MiB |
|
After Width: | Height: | Size: 856 KiB |
|
After Width: | Height: | Size: 810 KiB |
|
After Width: | Height: | Size: 999 KiB |
|
After Width: | Height: | Size: 1.1 MiB |
|
After Width: | Height: | Size: 916 KiB |
|
After Width: | Height: | Size: 692 KiB |
|
After Width: | Height: | Size: 592 KiB |
|
After Width: | Height: | Size: 786 KiB |
|
After Width: | Height: | Size: 809 KiB |
|
After Width: | Height: | Size: 752 KiB |
|
After Width: | Height: | Size: 690 KiB |
|
After Width: | Height: | Size: 639 KiB |
|
After Width: | Height: | Size: 1.6 MiB |
|
After Width: | Height: | Size: 1.0 MiB |
|
After Width: | Height: | Size: 754 KiB |
|
After Width: | Height: | Size: 713 KiB |
|
After Width: | Height: | Size: 698 KiB |
|
After Width: | Height: | Size: 822 KiB |
|
After Width: | Height: | Size: 847 KiB |
|
After Width: | Height: | Size: 735 KiB |
|
After Width: | Height: | Size: 1011 KiB |
|
After Width: | Height: | Size: 1.0 MiB |
|
After Width: | Height: | Size: 13 KiB |
|
After Width: | Height: | Size: 10 KiB |
|
After Width: | Height: | Size: 1.4 KiB |
|
After Width: | Height: | Size: 1.6 KiB |
|
After Width: | Height: | Size: 58 KiB |
@@ -0,0 +1,69 @@
|
||||
var Button = function() {
|
||||
};
|
||||
|
||||
Button.TAPPED = 'tapped';
|
||||
|
||||
Button.initialize = function(element, onTap) {
|
||||
var touchInfo = null;
|
||||
|
||||
if (typeof onTap === 'function') {
|
||||
onTap = onTap.bind(element);
|
||||
} else {
|
||||
onTap = function() {};
|
||||
}
|
||||
|
||||
function d2(x1, y1, x2, y2) {
|
||||
var dx = x2 - x1, dy = y2 - y1;
|
||||
return dx * dx + dy * dy;
|
||||
}
|
||||
|
||||
function startTap(touch) {
|
||||
touchInfo = {startX: touch.clientX, startY: touch.clientY, tapped: false};
|
||||
element.classList.add(Button.TAPPED);
|
||||
}
|
||||
|
||||
function endTap() {
|
||||
element.classList.remove(Button.TAPPED);
|
||||
touchInfo = null;
|
||||
}
|
||||
|
||||
element.addEventListener('touchstart', function(e) {
|
||||
startTap(e.changedTouches[0]);
|
||||
e.preventDefault();
|
||||
});
|
||||
|
||||
element.addEventListener('touchmove', function(e) {
|
||||
if (touchInfo) {
|
||||
var x0 = touchInfo.startX;
|
||||
var y0 = touchInfo.startY;
|
||||
var x = e.changedTouches[0].clientX;
|
||||
var y = e.changedTouches[0].clientY;
|
||||
|
||||
var current = document.elementFromPoint(x, y);
|
||||
|
||||
const THRESHOLD_SQ_PX = 50 * 50;
|
||||
if (!element.contains(current) || d2(x0, y0, x, y) > THRESHOLD_SQ_PX) {
|
||||
endTap();
|
||||
}
|
||||
}
|
||||
|
||||
e.preventDefault();
|
||||
});
|
||||
|
||||
element.addEventListener('touchend', function(e) {
|
||||
if (touchInfo && !touchInfo.tapped) {
|
||||
touchInfo.tapped = true;
|
||||
onTap();
|
||||
}
|
||||
|
||||
endTap();
|
||||
e.preventDefault();
|
||||
});
|
||||
|
||||
element.addEventListener('touchcancel', function(e) {
|
||||
endTap();
|
||||
e.preventDefault();
|
||||
});
|
||||
|
||||
return element;
|
||||
};
|
||||
@@ -0,0 +1,253 @@
|
||||
{{ define "manga.tmpl" }}
|
||||
<!DOCTYPE html>
|
||||
<html lang="ja">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="apple-mobile-web-app-capable" content="yes">
|
||||
<meta name="viewport" content="width=880, target-densitydpi=device-dpi, user-scalable=no">
|
||||
<meta name="format-detection" content="telephone=no">
|
||||
<title>转校生漫画 〜转校生庆典〜</title>
|
||||
<link rel="stylesheet" href="/static/css/base.css">
|
||||
<link rel="stylesheet" href="/static/css/perfect-scrollbar.css">
|
||||
<link rel="stylesheet" href="/static/css/ll-perfect-scrollbar.css">
|
||||
<link rel="stylesheet" href="/static/css/style.css">
|
||||
</head>
|
||||
<body class="android_chromium ">
|
||||
<div id="body">
|
||||
<div id="list-container">
|
||||
<h2><img src="/static/images/title-banner.png"></h2>
|
||||
<div id="list-scroll">
|
||||
<ul>
|
||||
<li class="button" data-image="/static/images/15238702168776.png">
|
||||
<p>第54 转学生派对话</p>
|
||||
</li>
|
||||
<li class="button" data-image="/static/images/15238701747409.png">
|
||||
<p>第53 末路话</p>
|
||||
</li>
|
||||
<li class="button" data-image="/static/images/15238695641197.png">
|
||||
<p>第52 练习话</p>
|
||||
</li>
|
||||
<li class="button" data-image="/static/images/15238695587056.png">
|
||||
<p>第51 放松效果话</p>
|
||||
</li>
|
||||
<li class="button" data-image="/static/images/15238695455400.png">
|
||||
<p>第50 好胜心话</p>
|
||||
</li>
|
||||
<li class="button" data-image="/static/images/15238695303404.png">
|
||||
<p>第49 相遇的两人话</p>
|
||||
</li>
|
||||
<li class="button" data-image="/static/images/15238695116848.png">
|
||||
<p>第48 消化话</p>
|
||||
</li>
|
||||
<li class="button" data-image="/static/images/15238694919055.png">
|
||||
<p>第47 摘花话</p>
|
||||
</li>
|
||||
<li class="button" data-image="/static/images/15238694807202.png">
|
||||
<p>第46 小心叮咛话</p>
|
||||
</li>
|
||||
<li class="button" data-image="/static/images/15141865196092.jpg">
|
||||
<p>第45 好人有好报话</p>
|
||||
</li>
|
||||
<li class="button" data-image="/static/images/15141865133555.jpg">
|
||||
<p>第44 被宠坏的鸟儿话</p>
|
||||
</li>
|
||||
<li class="button" data-image="/static/images/15141865055652.jpg">
|
||||
<p>第43 海对岸的双峰话</p>
|
||||
</li>
|
||||
<li class="button" data-image="/static/images/15238681581968.png">
|
||||
<p>第42 美丽的发声练习话</p>
|
||||
</li>
|
||||
<li class="button" data-image="/static/images/15141864889884.jpg">
|
||||
<p>第41 强力副歌的美学话</p>
|
||||
</li>
|
||||
<li class="button" data-image="/static/images/15141864804128.jpg">
|
||||
<p>第40 热血女子话</p>
|
||||
</li>
|
||||
<li class="button" data-image="/static/images/15141864695842.jpg">
|
||||
<p>第39 恶作剧之风话</p>
|
||||
</li>
|
||||
<li class="button" data-image="/static/images/15141864584520.jpg">
|
||||
<p>第38 禅之心话</p>
|
||||
</li>
|
||||
<li class="button" data-image="/static/images/15141864261972.jpg">
|
||||
<p>第37 枪械迷话</p>
|
||||
</li>
|
||||
<li class="button" data-image="/static/images/15141863772178.jpg">
|
||||
<p>第36 爱与正义的风纪纠察话</p>
|
||||
</li>
|
||||
<li class="button" data-image="/static/images/15141863639911.jpg">
|
||||
<p>第35 帅哥特集话</p>
|
||||
</li>
|
||||
<li class="button" data-image="/static/images/15141863483422.jpg">
|
||||
<p>第34 保护话</p>
|
||||
</li>
|
||||
<li class="button" data-image="/static/images/15141863365919.jpg">
|
||||
<p>第33 窗边美景话</p>
|
||||
</li>
|
||||
<li class="button" data-image="/static/images/15141863229129.jpg">
|
||||
<p>第32 机动性↑↑话</p>
|
||||
</li>
|
||||
<li class="button" data-image="/static/images/15141863126912.jpg">
|
||||
<p>第31 祈祷话</p>
|
||||
</li>
|
||||
<li class="button" data-image="/static/images/15141862946556.jpg">
|
||||
<p>第30 努力话</p>
|
||||
</li>
|
||||
<li class="button" data-image="/static/images/15141862776588.jpg">
|
||||
<p>第29 溜冰话</p>
|
||||
</li>
|
||||
<li class="button" data-image="/static/images/15141856059568.jpg">
|
||||
<p>第28 逃跑话</p>
|
||||
</li>
|
||||
<li class="button" data-image="/static/images/15047555888980.jpg">
|
||||
<p>第27 突刺话</p>
|
||||
</li>
|
||||
<li class="button" data-image="/static/images/15047555798773.jpg">
|
||||
<p>第26 咖喱饭话</p>
|
||||
</li>
|
||||
<li class="button" data-image="/static/images/15047555704112.jpg">
|
||||
<p>第25 坠入爱河之日话</p>
|
||||
</li>
|
||||
<li class="button" data-image="/static/images/15047555585712.jpg">
|
||||
<p>第24 饲料话</p>
|
||||
</li>
|
||||
<li class="button" data-image="/static/images/15047555499746.jpg">
|
||||
<p>第23 刚才的事话</p>
|
||||
</li>
|
||||
<li class="button" data-image="/static/images/15047555411780.jpg">
|
||||
<p>第22 天体观测话</p>
|
||||
</li>
|
||||
<li class="button" data-image="/static/images/15107324142966.png">
|
||||
<p>第21 空腹话</p>
|
||||
</li>
|
||||
<li class="button" data-image="/static/images/15047555219572.jpg">
|
||||
<p>第20 斗舞2话</p>
|
||||
</li>
|
||||
<li class="button" data-image="/static/images/15047555087747.jpg">
|
||||
<p>第19 斗舞话</p>
|
||||
</li>
|
||||
<li class="button" data-image="/static/images/15047554922924.jpg">
|
||||
<p>第18 点单话</p>
|
||||
</li>
|
||||
<li class="button" data-image="/static/images/15088959186072.jpg">
|
||||
<p>第17 学园偶像祭最快决定战!!话</p>
|
||||
</li>
|
||||
<li class="button" data-image="/static/images/15047554774569.jpg">
|
||||
<p>第16 历史话</p>
|
||||
</li>
|
||||
<li class="button" data-image="/static/images/15047554596230.jpg">
|
||||
<p>第15 量尺寸话</p>
|
||||
</li>
|
||||
<li class="button" data-image="/static/images/15047554481319.jpg">
|
||||
<p>第14 艺术话</p>
|
||||
</li>
|
||||
<li class="button" data-image="/static/images/15047554315307.jpg">
|
||||
<p>第13 读书话</p>
|
||||
</li>
|
||||
<li class="button" data-image="/static/images/15047554203428.jpg">
|
||||
<p>第12 演出前话</p>
|
||||
</li>
|
||||
<li class="button" data-image="/static/images/15047554108052.jpg">
|
||||
<p>第11 特技话</p>
|
||||
</li>
|
||||
<li class="button" data-image="/static/images/15047553982300.jpg">
|
||||
<p>第10 学园偶像祭最快决定战!!话</p>
|
||||
</li>
|
||||
<li class="button" data-image="/static/images/15047553849518.jpg">
|
||||
<p>第9 给我醒过来!!话</p>
|
||||
</li>
|
||||
<li class="button" data-image="/static/images/15047553728636.jpg">
|
||||
<p>第8 秘密调查话</p>
|
||||
</li>
|
||||
<li class="button" data-image="/static/images/15047553611357.jpg">
|
||||
<p>第7 炎话</p>
|
||||
</li>
|
||||
<li class="button" data-image="/static/images/15047553496606.jpg">
|
||||
<p>第6 野生话</p>
|
||||
</li>
|
||||
<li class="button" data-image="/static/images/15047553374283.jpg">
|
||||
<p>第5 诞生话</p>
|
||||
</li>
|
||||
<li class="button" data-image="/static/images/15047551242040.jpg">
|
||||
<p>第4 优雅的放学后话</p>
|
||||
</li>
|
||||
<li class="button" data-image="/static/images/15047551145790.jpg">
|
||||
<p>第3 情人节话</p>
|
||||
</li>
|
||||
<li class="button" data-image="/static/images/15047551059201.jpg">
|
||||
<p>第2 游泳话</p>
|
||||
</li>
|
||||
<li class="button" data-image="/static/images/15047550942873.jpg">
|
||||
<p>第1 开始!话</p>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div id="image-container">
|
||||
<div id="image-scroll">
|
||||
<img id="image" src="/static/images/15238702168776.png" width="444" height="850">
|
||||
</div>
|
||||
</div>
|
||||
<div id="large-image-container">
|
||||
<div id="large-image-scroll">
|
||||
<img id="large-image" width="888" height="1700">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<script src="/static/js/perfect-scrollbar.min.js"></script>
|
||||
<script src="/static/js/button.js"></script>
|
||||
<script>
|
||||
var largeImageContainer = document.getElementById('large-image-container');
|
||||
|
||||
var listScroll = document.getElementById('list-scroll');
|
||||
var imageScroll = document.getElementById('image-scroll');
|
||||
var largeImageScroll = document.getElementById('large-image-scroll');
|
||||
|
||||
var image = document.getElementById('image');
|
||||
var largeImage = document.getElementById('large-image');
|
||||
|
||||
new PerfectScrollbar(listScroll, {suppressScrollX: true});
|
||||
var imageScrollbar = new PerfectScrollbar(imageScroll, {suppressScrollX: true});
|
||||
var largeImageScrollbar = new PerfectScrollbar(largeImageScroll, {suppressScrollX: true});
|
||||
|
||||
function resetImageScroll() {
|
||||
imageScroll.scrollTop = 0;
|
||||
imageScrollbar.update();
|
||||
}
|
||||
|
||||
function showLargeImage() {
|
||||
if (largeImageContainer.style.display === 'block') {
|
||||
return;
|
||||
}
|
||||
|
||||
largeImage.src = image.src;
|
||||
largeImageContainer.style.display = 'block';
|
||||
|
||||
largeImageScroll.scrollTop = 0;
|
||||
largeImageScrollbar.update();
|
||||
}
|
||||
|
||||
function hideLargeImage() {
|
||||
largeImageContainer.style.display = 'none';
|
||||
}
|
||||
|
||||
image.addEventListener('load', resetImageScroll);
|
||||
image.addEventListener('click', showLargeImage);
|
||||
|
||||
largeImageContainer.addEventListener('click', hideLargeImage);
|
||||
|
||||
var buttons = document.getElementsByClassName('button');
|
||||
for (var i = 0; i < buttons.length; ++i) {
|
||||
Button.initialize(buttons[i], function() {
|
||||
var url = this.getAttribute('data-image');
|
||||
if (url.replace(/^.*\//, '') !== image.src.replace(/^.*\//, '')) {
|
||||
image.src = url;
|
||||
} else {
|
||||
resetImageScroll();
|
||||
}
|
||||
});
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
{{ end }}
|
||||