做为一个手残的外行前端 coder,今天由于须要,研究了下瀑布延时加载和图片的懒加载,作个总结,省得之后忘记了!javascript
最近作了一个图片网站,采用的是瀑布流的布局效果,大体以下:html
很容易,我天然而然的就想到了采用下拉的形式,每次加载一部分数据,那么说干就干。前端
最开始,个人后台代码是一次性把全部数据都返回给前端,如今把数据分红4分,首次进入首页时,只返回第一份java
@app.route('/', methods=['GET', 'POST'])
def index():
db = get_db()
cur = db.execute('select name, nvshen_id from nvshen order by id desc')
nvshen = [dict(name=row[0], nvshen_id=row[1]) for row in cur.fetchall()]
seg = int(len(nvshen)/4)
data = []
socre = 1
for n in nvshen[:seg]:
tmp_data = []
pic = db.execute('select pic_url from picture where nvshen_id = (?)', [n['nvshen_id']])
pic_list = [row[0] for row in pic.fetchall()]
pic_url = random.choice(pic_list)
tmp_data.append(n['name'])
tmp_data.append(pic_url)
tmp_data.append(n['nvshen_id'])
data.append(tmp_data)
return render_template('index.html', data=data, score=socre)
复制代码
而后再写一个获取数据的接口,参数就是 pagejquery
@app.route('/api/getdata/<int:page>', methods=['POST'])
def get_data(page):
db = get_db()
cur = db.execute('select name, nvshen_id from nvshen order by id desc')
nvshen = [dict(name=row[0], nvshen_id=row[1]) for row in cur.fetchall()]
seg = 0
seg_page = int(len(nvshen)/4)
end = False
if page == 2:
seg = seg_page
seg_page = seg*2
elif page == 3:
seg = seg_page*2
seg_page = seg*3
elif page == 4:
seg = seg_page*3
seg_page = int(len(nvshen)) + 1
end = True
elif page == 1:
pass
else:
return jsonify({"msg": "error page id", "code": 422}), 422
data = []
socre = 1
for n in nvshen[seg:seg_page]:
tmp_data = []
pic = db.execute('select pic_url from picture where nvshen_id = (?)', [n['nvshen_id']])
pic_list = [row[0] for row in pic.fetchall()]
pic_url = random.choice(pic_list)
tmp_data.append(n['name'])
tmp_data.append(pic_url)
tmp_data.append(n['nvshen_id'])
data.append(tmp_data)
print("getdata: ", data)
return jsonify({"msg": data, "code": 200, "end": end}), 200
复制代码
由于当前只是把数据分红4分,因此当 page 为4的时候,就把中止信号 end 设置为 True,这样前端判断这个信号就能够判断何时中止请求数据了。git
先写一个用户获取数据的函数json
function getData(page) {
var xhr = new XMLHttpRequest();
xhr.responseType = "json";
xhr.open('POST', '/api/getdata/' + page, true);
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xhr.onload = function (ev) {
if(this.status === 200) {
//console.log(this.response);
if(this.response['end'] === true) {
//console.log("end is true");
flag = false;
};
var mydata = this.response['msg'];
for(var i=0, len=mydata.length; i<len; i++){
var myurl = mydata[i][1];
var myid = mydata[i][2];
var myname = mydata[i][0];
var htmlText = '<article class="white-panel">' +
'<img data-src=' + myurl +' class="thumb">' +
'<h1>' +
'<a href=URL title="去投票" target="_blank">'.replace("URL", Flask.url_for("nvshen", {id: myid})) +
myname + '</a>' +
'</h1>' +
'<p>' +
'<div id="starBg" class="stars-bg">' +
'{% if score == 1 %}' +
'<a href="#" class="star-active" style="width: 20%"></a>' +
'{% elif score == 2 %}' +
'<a href="#" class="star-active" style="width: 40%"></a>' +
'{% elif score == 3 %}' +
'<a href="#" class="star-active" style="width: 60%"></a>' +
'{% elif score == 4 %}' +
'<a href="#" class="star-active" style="width: 80%"></a>' +
'{% elif score == 5 %}' +
'<a href="#" class="star-active" style="width: 100%"></a>' +
'{% else %}' +
'<a href="#" class="star-active" style="width: 0%"></a>' +
'{% endif %}' +
'</div>' +
'</p>' +
'</article>';
var script = '<script>' +
'$(function(){' +
'$("img.thumb").lazyload();' +
'})' +
'<\/script>';
$('#gallery-wrapper').append(htmlText);
$('body').append(script);
}
//console.log("add new html finish");
}
};
xhr.send();
}
复制代码
主要仍是拼接字符串,而后把获取到的数据塞进字符串中。flask
flask_jsglueapi
这里不得不提一下 flask 的一个插件 --flask_jsglue 对于在 JavaScript 中使用 url_for 函数真的是太好用了,感兴趣的同窗能够自行去看看,很是的简单好用。浏览器
而后就是下拉的逻辑了
var totalHeight = $(document).height(); //整个文档高度
var scrollTop = $(window).scrollTop();//浏览器可视窗口顶端距离网页顶端的高度(垂直偏移)
var p = 2;
var flag = true;
$(window).scroll(function () {
scrollTop = $(window).scrollTop();
console.log("totalHeight-scrollTop-$(this).height()", totalHeight-scrollTop-$(this).height());
totalHeight = $(document).height();
if(flag){
if(totalHeight-scrollTop-$(this).height()<0.5){
//console.log("add new html");
getData(p);
p ++;
}
}
});
复制代码
由于咱们再进入首页的时候,已经返回了数据的第一部分,因此这里的 page 就从2开始取值;而后当整个文档的高度减去垂直偏移量,再减去浏览器但是窗口的高度小于0.5时,则调用拉取数据的函数,而且 p 自加1.
对于图片懒加载,就比较简单了,有现成的组件库可使用。 首先引入类库
<script src="https://rawgit.com/tuupola/jquery_lazyload/2.x/lazyload.js" type="text/javascript"></script>
复制代码
而后修改 img 元素的图片地址属性
<img class="thumb" data-src="{{ p[1] }}">
复制代码
咱们通常会把图片地址赋值给 src,如今咱们赋值给 data-src。
最后,在页面全局写一个函数
$(function(){
$("img.thumb").lazyload();
});
复制代码
这样,就能保证图片只要当页面滚动到它的位置时才加载了。
最后再提供下网站地址,供你们参考