wiki viewer 仿ç
åèï¼https://www.jianshu.com/p/d48ae4ca707e
项ç®ç®ä»
æ ¹æ®ç¨æ·è¾å ¥çææ¬æ£ç´¢ç»´åºç¾ç§çæ¡ç®ï¼æ¾ç¤ºåè¥å¹²æ¡ç»æï¼ç»æå å«è¯æ¡æ é¢åå 容æè¦ã
ææ¯ç¹
- å©ç¨wikipediaçAPIæ£ç´¢ç»´åºç¾ç§æ°æ®åºï¼
APIææ¡£å°åæ¯http://www.mediawiki.org/wiki/API:Main_page
APIå¨çº¿å®éªå°åï¼https://en.wikipedia.org/wiki/Special:ApiSandbox#action=query&titles=Main%20Page&prop=revisions&rvprop=content&format=jsonfm
è·åéæºç»´åºç¾ç§æ¡ç®æ¹æ³ï¼http://en.wikipedia.org/wiki/Special:Random
彿¶å¦ä¹ apiçæ¶åè¿·äºå¥½ä¹ ï¼ä¸»è¦ä¸ç¥é该ç¨ä»ä¹åæ°æè½è·å¾ådemo䏿 ·çç»æï¼ç»æç½ä¸æå°ä¸ç¯demoï¼å ³é®ç¹æ¯list=search&srsearch=xxx
-
æç´¢æ¡å¨ç»
ç¨æ·çé¢å¨ä¸å¼å§ï¼è¾å ¥æ¡æ¯ä¸ä¸ªå½¢ä¼¼æ¾å¤§éç徿 ï¼ç¹å»è¯¥å¾æ ï¼æ¾å¤§éææéæ¸ç¼©çå°0ï¼å¾æ æä¸ºä¸ä¸ªåï¼ç¶åè¿ä¸ªåå两边åå¼ï¼æåºä¸ä¸ªè¾å ¥æ¡ï¼è¾å ¥æ¡èªå¨è·åç¦ç¹ï¼æ¥çè¾å ¥æ¡å°¾ç«¯ä¸¤æ¡æçº¿æ®µä»å³ä¸è§åå³ä¸è§é£å ¥ï¼å½¢æä¸ä¸ªå ³éçåï¼ç¹å»è¯¥åï¼å¨ç»éåè¿è¡ä¸éï¼æç´¢æ¡åè¿å为ä¸ä¸ªæç´¢å¾æ ã
å®ç°è¯¥å¨ç»çè¿ç¨ä¸»è¦éç¨äºä»¥ä¸ææ¯ï¼-
æç´¢å¾æ ææï¼ç¨ä¸ä¸ªé«åº¦å¾å°çdivï¼å¯¹æç´¢æ¡ï¼å
å´åï¼ç»å¯¹å®ä½ï¼å©ç¨css3æè½¬ï¼è®©å
¶æä¸ºä¸æ¡æçº¿ï¼ä½ä¸ºæç´¢å¾æ çææãä¿®æ¹divç宽度就å¯ä»¥ä¿®æ¹ææçé¿åº¦ãé¾ç¹ï¼ç±äºcss3æè½¬æ¯ç¸å¯¹divä¸å¿çï¼ä¿®æ¹äºdivçé¿åº¦ä»¥åï¼divçä¸å¿ä½ç½®åäºï¼æè½¬ä»¥ååä¹åçä½ç½®å¹³è¡å´ä¸å
±çº¿ï¼è¾¾ä¸å°ææï¼ä¸ºæ¤è¿éè¦å¨divç¸å¯¹å®ä½ä»¥åå©ç¨css3ä½ç§»åæ¢
transform: translate(-50%,-50%) rotate(45deg);
让ä¸è®ºdivé¿åº¦å¤å°ï¼divçä¸å¿é½åºå®å¨ä¸ä¸ªä½ç½®ãè¿æ ·ä»¥åï¼ç¼©çdivæ¶ä¼ådivä¸å¿æ¶ç¼©ï¼é£ä¹è¿ä¸ªä¸å¿æ¾å¨åªå¿å¢ï¼æç´¢å¾æ åçè¾¹ç¼ä¸ãæ¤æ¶divæä¸é¨å伿¾ç¤ºå¨æç´¢å¾æ åå é¨ï¼ä¸ºè§£å³è¿ä¸ªé®é¢ï¼è®©divçz-index
设置为-1ï¼å¹¶ç»æç´¢å¾æ åï¼å®é æ¯æç´¢æ¡å å´åï¼å ä¸å页é¢ç¸åçèæ¯ï¼æå ædivææå¨åå çé¨åã - æç´¢æ¡çå ³éåï¼åæç´¢å¾æ ææç±»ä¼¼ï¼ä¸åçå¨ç»è¿ç¨ä¸ä¿®æ¹çcss屿§æ¯å ¶ç»å¯¹å®ä½ä½ç½®ã
- å®ç°å¨ç»çjsï¼å¨æç´¢æ¡å å«åä¸çå¬ç¹å»äºä»¶ï¼æ ¹æ®ç¹å»äºä»¶ç®æ åå½åæç´¢æ¡ç¶æ(æå¨æç´¢æ¡å ³éå®å ¨ä»¥åç»å ¶å collaspsedç±»)ç¡®å®æ§è¡ä»ä¹å¨ç»ï¼å个å¨ç»çé¡ºåºæ§è¡ï¼å©ç¨jqueryçanimate()æ¹æ³åè°å½æ°ã
-
æç´¢å¾æ ææï¼ç¨ä¸ä¸ªé«åº¦å¾å°çdivï¼å¯¹æç´¢æ¡ï¼å
å´åï¼ç»å¯¹å®ä½ï¼å©ç¨css3æè½¬ï¼è®©å
¶æä¸ºä¸æ¡æçº¿ï¼ä½ä¸ºæç´¢å¾æ çææãä¿®æ¹divç宽度就å¯ä»¥ä¿®æ¹ææçé¿åº¦ãé¾ç¹ï¼ç±äºcss3æè½¬æ¯ç¸å¯¹divä¸å¿çï¼ä¿®æ¹äºdivçé¿åº¦ä»¥åï¼divçä¸å¿ä½ç½®åäºï¼æè½¬ä»¥ååä¹åçä½ç½®å¹³è¡å´ä¸å
±çº¿ï¼è¾¾ä¸å°ææï¼ä¸ºæ¤è¿éè¦å¨divç¸å¯¹å®ä½ä»¥åå©ç¨css3ä½ç§»åæ¢
-
å
容æ¾ç¤º
ä¸å¼å§æå¨htmlä¸åäº12个ç¨äºå¡«å ç»æå 容çdiv>a>(h3+p)ï¼å¨åäº«é¡¹ç®æ¶ï¼ä¼ä¼´ä»¬ç»çæè§æ¯å¨æçædomï¼å¯¹æ¤åäºç¸åºä¿®æ¹ã
index.pug
<!DOCTYPE html>
html(lang="en")
head
meta(charset="UTF-8")
meta(name="viewport", content="width=device-width, initial-scale=1.0")
meta(http-equiv="X-UA-Compatible", content="ie=edge")
title ç»´åºç¾ç§æç´¢é¡µé¢
link(href="../css/style.css", rel="stylesheet")
body
section#search
div
a(href="http://zh.wikipedia.org/wiki/Special:Random" target="_blank")
button.button ç¹å»åºç°éæºè¯æ¡
form
.input-box-wrap
.input-box.collpased
input(type="text")
.shrink
.close.down
.close.up
.tail
p ç¹å»å¾æ æç´¢
section#result
script(src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js")
script(src="../js/index.js")
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<meta http-equiv="X-UA-Compatible" content="ie=edge"/>
<title>ç»´åºç¾ç§æç´¢é¡µé¢</title>
<link href="../css/style.css" rel="stylesheet"/>
</head>
<body>
<section id="search">
<div><a href="http://zh.wikipedia.org/wiki/Special:Random" target="_blank">
<button class="button">ç¹å»åºç°éæºè¯æ¡</button></a></div>
<form>
<div class="input-box-wrap">
<div class="input-box collpased">
<input type="text"/>
<div class="shrink"></div>
<div class="close down"></div>
<div class="close up"></div>
</div>
<div class="tail"></div>
</div>
<p>ç¹å»å¾æ æç´¢</p>
</form>
</section>
<section id="result"></section>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script src="../js/index.js"></script>
</body>
</html>
style.scss
//colors
$blue: #2E94B9;
$lightyellow: #FFFDC0;
$red: #D25565;
$orange: #F0B775;
/*åºæ¬ä¸å
¨å±æ ·å¼*/
body{
background-color: $blue;
font-size: 18px;
color: white;
width: 80%;
margin: 10px auto;
}
ul, li, input, button, h1, h2, h3{
margin: 0;
padding: 0;
}
input, button{
border-width: 0;
background-color: transparent;
color: $lightyellow;
outline: none;
}
h1, h2, h3{
margin-bottom: 16px;
}
a{
text-decoration: none;
color: black;
}
.off{
display: none;
}
/*============
æç´¢æ é¨å
==============*/
#search{
text-align: center;
margin-top: 200px;
}
#search form,
#search>div,
#search div.input-box-wrap,
#search div.input-box{
margin-left: auto;
margin-right: auto;
}
#search button{
font-size: 100%;
height: 100%;
&:hover{
cursor: pointer;
}
}
#search>div{
margin: 32px auto;
}
form{
margin: 32px auto;
}
/*æç´¢æ¡æ ·å¼*/
div.input-box-wrap{
height: 30px;
width: 320px;
position: relative;
margin-bottom: 36px;
}
div.input-box{
width: 30px;
height: 100%;
position: relative;
background-color: $blue;
padding: 0;
border-radius: 20px;
border: 4px solid $orange;
overflow: hidden;
input{
height: 100%;
width: 100%;
font-size: 100%;
display: none;
}
}
.collapsed{
cursor: pointer;
}
/*æ¾å¤§éç尾巴*/
div.input-box-wrap div.tail,
div.input-box div.close{
position: absolute;
border-radius: 1px;
background-color: $orange;
}
div.input-box-wrap div.tail{
width: 30px;
height: 3px;
left: 172px;
top: 31px;
transform: translate(-50%,-50%) rotate(45deg);
z-index: -1;
}
/*ç¼©å°æç´¢æ¡çå*/
.input-box{
.shrink{
width: 30px;
height: 30px;
position: absolute;
top: 0;
right: 10px;
cursor: pointer;
z-index: 1;
display: none;
}
.close{
width: 20px;
height: 2px;
right: -10px;
top: 40px;
transform: translate(0, -50%) rotate(45deg);
}
.close.up{
right: -10px;
top: -10px;
transform: translate(0, -50%) rotate(-45deg);
}
}
/*==============
ç»æé¡µé¢é¨å
================*/
#result{
// display: none;
ul{
list-style: none;
padding: 0;
}
li{
color: black;
padding-left: 6px;
&:hover{
background-color: $orange;
}
a{
padding: 16px 16px 2px 24px;
margin: 16px 0 0 0;
display: block;
background-color: $lightyellow;
}
}
}
style.css
@charset "UTF-8";
/*åºæ¬ä¸å
¨å±æ ·å¼*/
body {
background-color: #2E94B9;
font-size: 18px;
color: white;
width: 80%;
margin: 10px auto;
}
ul, li, input, button, h1, h2, h3 {
margin: 0;
padding: 0;
}
input, button {
border-width: 0;
background-color: transparent;
color: #FFFDC0;
outline: none;
}
h1, h2, h3 {
margin-bottom: 16px;
}
a {
text-decoration: none;
color: black;
}
.off {
display: none;
}
/*============
æç´¢æ é¨å
==============*/
#search {
text-align: center;
margin-top: 200px;
}
#search form,
#search > div,
#search div.input-box-wrap,
#search div.input-box {
margin-left: auto;
margin-right: auto;
}
#search button {
font-size: 100%;
height: 100%;
}
#search button:hover {
cursor: pointer;
}
#search > div {
margin: 32px auto;
}
form {
margin: 32px auto;
}
/*æç´¢æ¡æ ·å¼*/
div.input-box-wrap {
height: 30px;
width: 320px;
position: relative;
margin-bottom: 36px;
}
div.input-box {
width: 30px;
height: 100%;
position: relative;
background-color: #2E94B9;
padding: 0;
border-radius: 20px;
border: 4px solid #F0B775;
overflow: hidden;
}
div.input-box input {
height: 100%;
width: 100%;
font-size: 100%;
display: none;
}
.collapsed {
cursor: pointer;
}
/*æ¾å¤§éç尾巴*/
div.input-box-wrap div.tail,
div.input-box div.close {
position: absolute;
border-radius: 1px;
background-color: #F0B775;
}
div.input-box-wrap div.tail {
width: 30px;
height: 3px;
left: 172px;
top: 31px;
transform: translate(-50%, -50%) rotate(45deg);
z-index: -1;
}
/*ç¼©å°æç´¢æ¡çå*/
.input-box .shrink {
width: 30px;
height: 30px;
position: absolute;
top: 0;
right: 10px;
cursor: pointer;
z-index: 1;
display: none;
}
.input-box .close {
width: 20px;
height: 2px;
right: -10px;
top: 40px;
transform: translate(0, -50%) rotate(45deg);
}
.input-box .close.up {
right: -10px;
top: -10px;
transform: translate(0, -50%) rotate(-45deg);
}
/*==============
ç»æé¡µé¢é¨å
================*/
#result ul {
list-style: none;
padding: 0;
}
#result li {
color: black;
padding-left: 6px;
}
#result li:hover {
background-color: #F0B775;
}
#result li a {
padding: 16px 16px 2px 24px;
margin: 16px 0 0 0;
display: block;
background-color: #FFFDC0;
}
index.js
var paraJack = {
wikiItemBaseUrl: 'https://zh.wikipedia.org/wiki/',
resultNum: 12
}
$(document).ready(function(){
setEventHandler();
});
function setEventHandler() {
//ç¹å»å¾æ ï¼å±å¼æç´¢
$('.input-box-wrap').on('click', '.collpased', function(event){
expandSearchInput();
});
//ç¹å»× ï¼æå
$('.input-box-wrap').on('click', '.shrink', function(){
shrinkSearchInput();
});
//æäº¤æç´¢ææ¬ï¼æ¾ç¤ºç»æ
$('form').on('submit', function(){
//鲿¢é»è®¤äºä»¶
event.preventDefault();
var $search = $('#search');
var searchStr = $search.find('input').val(); //è¾å
¥çææ¬
$search.animate({
marginTop: '0px'
}, 500);
$('form>p').hide();
$.getJSON('https://zh.wikipedia.org/w/api.php?action=query&titles=' + encodeURIComponent(searchStr) + '&action=query&format=json&list=search&srsearch=' + encodeURIComponent(searchStr) + '&srlimit=' + paraJack.resultNum + '&srprop=snippet&callback=?',function(data){
genResultDom(paraJack.resultNum);
//æ ¹æ®éè¦çç»ææ°éå¡«å
domç»æ
var $anchors = $('#result a');
$.each(data.query.search,function(index,val){
//æ ¹æ®ç»æä¿®æ¹Dom
var $theAnchor = $anchors.eq(index),
$p = $theAnchor.find('p'),
$h2 = $theAnchor.find('h3'),
title = val.title, //ç»æé¡¹æ é¢
snippet = val.snippet; //ç»æé¡¹å
容æè¦
$h2.html(title);
$p.html(snippet);
$theAnchor.attr({
href: paraJack.wikiItemBaseUrl + title
//ç¨ç»æé¡¹æ é¢çæURL
});
});
$('#result').show(); //æ¾ç¤ºç»æ
});
});
}
function expandSearchInput () {
var $result = $('#result');
var $form = $('form');
var $inputBoxWrap = $form.find('.input-box-wrap');
var $inputBox = $inputBoxWrap.find('.input-box');
var $tail = $inputBoxWrap.find('.tail');
var $up = $inputBox.find('.up');
var $down = $inputBox.find('.down');
var $shrink = $inputBox.find('.shrink');
var $input = $inputBox.find('input');
$tail.animate({
width: '0px' //缩çæç´¢å¾æ 尾巴å°0
}, 500, function(){
$inputBox.animate({
//æ°´å¹³å±å¼è¾å
¥æ¡å
å«å
width: '200px',
padding: '0px 45px 0px 15px'
}, 500, function(){
//å°è¾å
¥æ¡å
å«åæ«å°¾çåæ»å
¥è¾å
¥æ¡å
ï¼åæ¥çä½ç½®$inputBoxä¹å¤ï¼è$inputBoxçoverflow屿§è®¾ç½®ä¸ºäºhiddenï¼
$up.animate({
top: '15px',
right: '15px'
}, 500);
$down.animate({
top: '15px',
right: '15px'
}, 500, function(){
//æ¾ç¤ºè¾å
¥æ¡æ¬èº«å¹¶è·åç¦ç¹ï¼
//å°è¾å
¥æ¡å
å«å设置为collapseç±»ï¼å¨æè¯¥ç±»çè¾å
¥æ¡å
å«åä¸ç¹å»æä¼è§¦åæ¶ç¼©å¨ç»ï¼å æ¤å¨å±å¼å¨ç»è¿è¡å°æ¤ä½ç½®ä¹åæ¯ä¸å¯è½éè¿ç¹å»'å
³éå'ä¸éææ¹åæ¥è¿è¡æ¶ç¼©å¨ç»çï¼
$input.show().focus();
$inputBox.removeClass('collpased');
$shrink.show();
//æ¾ç¤ºç¨äºæ¥å'æå æç´¢æ 'ç¹å»ç'å
³éå'ä¸çéææ¹å
});
});
});
}
function shrinkSearchInput(){
//ç¹å»è¾å
¥æ¡æ«å°¾çåï¼å¨ç»æå æç´¢æ 为æç´¢å¾æ
var $result = $('#result'),
$form = $('form'),
$p = $('form>p'),
$inputBoxWrap = $form.find('div.input-box-wrap'),
$inputBox = $inputBoxWrap.find('div.input-box'),
$tail = $inputBoxWrap.find('div.tail'),
$up = $inputBox.find('div.up'),
$down = $inputBox.find('div.down'),
$shrink = $inputBox.find('div.shrink'),
$input = $inputBox.find('input');
//æ¸
空è¾å
¥æ¡å
å®¹ï¼æ¾ç¤ºç¹å»æç¤ºææ¬ï¼éèä¹åçæç´¢ç»æ
$input.val('');
$p.show();
$result.hide();
$('#search').animate({
marginTop: '200px'
},500);
$up.animate({
top: '-10px',
right: '-10px'
},500);
$down.animate({
top: '40px',
right: '-10px'
},500,function(){
$inputBox.animate({
width: '30px',
padding: '0px'
},500,function(){
$tail.animate({
width: '30px'
},500);
$input.hide(); //éèæç´¢æ¡
$inputBox.addClass('collpased');
$shrink.hide(); //éèæ¥åâæ¶ç¼©æç´¢æ âç¹å»çéæå
});
});
}
function genResultDom(resultNum) {
if (typeof resultNum === 'number') {
var $result = $('#result'),
$ul = $result.html('<ul></ul>').find('ul');
for (var i = 0; i < resultNum; i++) {
$ul.append($('<li><a href="" target="_blank"><h3></h3><p></p></a></li>'));
}
}
}