分组列表悬浮顶部栏(吸顶效果 如下图)
(侵图删)
实现如上,思路有二:
- css是否可以直接实现(#粘性定位#即position的sticky)
- js操作Dom
思路一
使用粘性定位(position:sticky)只需要设置top值就可以在滚动到相应值时固定,用法简单但有一定的兼容性问题,如某些浏览器不支持此属性值需要自己做兼容(chrome和safari需要position:-webkit-sticky)。
Tips:粘性定位是相对于(BFC)和 最近的块先元素定位,所以部分情况不适用,要根据需求判定使用。
html
<div class="search-content"><div class="area-card"><div class="title-item">A</div><div class="area-item">安道尔 +376</div><div class="area-item">奥地利 +43</div><div class="area-item">澳大利亚 +61</div><div class="area-item">阿尔巴尼亚 +355</div><div class="area-item">阿尔及利亚 +213</div><div class="area-item">爱尔兰 +353</div><div class="area-item">阿富汗 +93</div><div class="area-item">安哥拉 +244</div><div class="area-item">安圭拉 +1264</div><div class="area-item">阿根廷 +54</div><div class="area-item">埃及 +20</div><div class="area-item">阿鲁巴 +297</div><div class="area-item">阿拉伯联合酋长国 +971</div><div class="area-item">奥兰群岛 +358</div><div class="area-item">阿曼 +968</div><div class="area-item">阿塞拜疆 +994</div><div class="area-item">埃塞俄比亚 +251</div><div class="area-item">爱沙尼亚 +372</div><div class="area-item">阿森松 +247</div><div class="area-item">安提瓜和巴布达 +1268</div></div><div class="area-card"><div class="title-item">B</div><div class="area-item">巴巴多斯 +1246</div><div class="area-item">博茨瓦纳 +267</div><div class="area-item">不丹 +975</div><div class="area-item">冰岛 +354</div><div class="area-item">波多黎各 +1787</div><div class="area-item">白俄罗斯 +375</div><div class="area-item">巴哈马 +1242</div><div class="area-item">布基拉法索 +226</div><div class="area-item">保加利亚 +359</div><div class="area-item">巴基斯坦 +92</div><div class="area-item">巴林 +973</div><div class="area-item">波兰 +48</div><div class="area-item">布隆迪 +257</div><div class="area-item">巴拉圭 +595</div><div class="area-item">比利时 +32</div><div class="area-item">巴勒斯坦领土 +970</div><div class="area-item">玻利维亚 +591</div><div class="area-item">伯利兹 +501</div><div class="area-item">百慕大 +1441</div><div class="area-item">北马里亚纳群岛 +1670</div><div class="area-item">贝宁 +229</div><div class="area-item">巴拿马 +507</div><div class="area-item">巴西 +55</div></div><div class="area-card"><div class="title-item">C</div><div class="area-item">赤道几内亚 +240</div><div class="area-item">朝鲜 +850</div></div><div class="area-card"><div class="title-item">D</div><div class="area-item">德国 +49</div><div class="area-item">多哥 +228</div><div class="area-item">丹麦 +45</div><div class="area-item">多米尼加 +1767</div><div class="area-item">多米尼加共和国 +1809</div></div><div class="area-card"><div class="title-item">E</div><div class="area-item">厄瓜多尔 +593</div><div class="area-item">俄罗斯 +7</div><div class="area-item">厄立特里亚 +291</div></div><div class="area-card"><div class="title-item">F</div><div class="area-item">梵蒂冈城 +379</div><div class="area-item">佛得角 +238</div><div class="area-item">法国 +33</div><div class="area-item">斐济 +679</div><div class="area-item">芬兰 +358</div><div class="area-item">菲律宾 +63</div><div class="area-item">法罗群岛 +298</div><div class="area-item">法属玻利尼西亚 +689</div><div class="area-item">法属圭亚那 +594</div></div><div class="area-card"><div class="title-item">G</div><div class="area-item">冈比亚 +220</div><div class="area-item">关岛 +1671</div><div class="area-item">瓜德罗普岛 +590</div><div class="area-item">哥伦比亚 +57</div><div class="area-item">格鲁吉亚 +995</div><div class="area-item">格陵兰 +299</div><div class="area-item">格林纳达 +1473</div><div class="area-item">哥斯达黎加 +506</div><div class="area-item">圭亚那 +592</div></div><div class="area-card"><div class="title-item">H</div><div class="area-item">海地 +509</div><div class="area-item">洪都拉斯 +504</div><div class="area-item">韩国 +82</div><div class="area-item">荷兰 +31</div></div><div class="area-card"><div class="title-item">J</div><div class="area-item">吉布提 +253</div><div class="area-item">吉尔吉斯斯坦 +996</div><div class="area-item">捷克共和国 +420</div><div class="area-item">加纳 +233</div><div class="area-item">加拿大 +1</div><div class="area-item">几内亚 +224</div><div class="area-item">加蓬 +241</div><div class="area-item">柬埔寨 +855</div></div><div class="area-card"><div class="title-item">K</div><div class="area-item">克罗地亚 +385</div><div class="area-item">喀麦隆 +237</div><div class="area-item">科摩罗 +269</div><div class="area-item">开曼群岛 +1345</div><div class="area-item">肯尼亚 +254</div><div class="area-item">科特迪瓦 +225</div><div class="area-item">卡塔尔 +974</div><div class="area-item">科威特 +965</div></div><div class="area-card"><div class="title-item">L</div><div class="area-item">利比里亚 +231</div><div class="area-item">黎巴嫩 +961</div><div class="area-item">利比亚 +218</div><div class="area-item">罗马尼亚 +40</div><div class="area-item">留尼汪岛 +262</div><div class="area-item">卢森堡 +352</div><div class="area-item">莱索托 +266</div><div class="area-item">立陶宛 +370</div><div class="area-item">拉脱维亚 +371</div><div class="area-item">老挝 +856</div><div class="area-item">卢旺达 +250</div><div class="area-item">列支敦士登 +423</div></div><div class="area-card"><div class="title-item">M</div><div class="area-item">缅甸 +95</div><div class="area-item">马达加斯加 +261</div><div class="area-item">马尔代夫 +960</div><div class="area-item">摩尔多瓦 +373</div><div class="area-item">马耳他 +356</div><div class="area-item">蒙古 +976</div><div class="area-item">美国 +1</div><div class="area-item">孟加拉国 +880</div><div class="area-item">密克罗尼西亚 +691</div><div class="area-item">马里 +223</div><div class="area-item">秘鲁 +51</div><div class="area-item">摩洛哥 +212</div><div class="area-item">毛里求斯 +230</div><div class="area-item">毛里塔尼亚 +222</div><div class="area-item">马拉维 +265</div><div class="area-item">马来西亚 +60</div><div class="area-item">摩纳哥 +377</div><div class="area-item">马其顿 +389</div><div class="area-item">莫桑比克 +258</div><div class="area-item">马绍尔群岛 +692</div><div class="area-item">蒙塞拉特岛 +1664</div><div class="area-item">美属萨摩亚 +1684</div><div class="area-item">美属维尔京群岛 +1340</div><div class="area-item">马提尼克 +596</div><div class="area-item">墨西哥 +52</div><div class="area-item">马约特 +262</div></div><div class="area-card"><div class="title-item">N</div><div class="area-item">尼泊尔 +977</div><div class="area-item">南非 +27</div><div class="area-item">尼加拉瓜 +505</div><div class="area-item">瑙鲁 +674</div><div class="area-item">纳米比亚 +264</div><div class="area-item">尼日尔 +227</div><div class="area-item">尼日利亚 +234</div><div class="area-item">挪威 +47</div></div><div class="area-card"><div class="title-item">P</div><div class="area-item">帕劳 +680</div><div class="area-item">葡萄牙 +351</div></div><div class="area-card"><div class="title-item">R</div><div class="area-item">日本 +81</div><div class="area-item">瑞典 +46</div><div class="area-item">瑞士 +41</div></div><div class="area-card"><div class="title-item">S</div><div class="area-item">苏丹 +249</div><div class="area-item">圣诞岛 +61</div><div class="area-item">萨尔瓦多 +503</div><div class="area-item">塞尔维亚 +381</div><div class="area-item">圣基茨和尼维斯 +1869</div><div class="area-item">斯洛伐克 +421</div><div class="area-item">塞拉利昂 +232</div><div class="area-item">斯里兰卡 +94</div><div class="area-item">苏里南 +597</div><div class="area-item">斯洛文尼亚 +386</div><div class="area-item">圣卢西亚 +1758</div><div class="area-item">索马里 +252</div><div class="area-item">圣马力诺 +378</div><div class="area-item">塞内加尔 +221</div><div class="area-item">圣皮埃尔和密克隆 +508</div><div class="area-item">塞浦路斯 +357</div><div class="area-item">塞舌尔 +248</div><div class="area-item">沙特阿拉伯 +966</div><div class="area-item">斯威士兰 +268</div><div class="area-item">圣文森特和格林纳丁斯 +1784</div></div><div class="area-card"><div class="title-item">T</div><div class="area-item">土耳其 +90</div><div class="area-item">泰国 +66</div><div class="area-item">汤加 +676</div><div class="area-item">土库曼斯坦 +993</div><div class="area-item">特克斯和凯科斯群岛 +1649</div><div class="area-item">突尼斯 +216</div><div class="area-item">坦桑尼亚 +255</div><div class="area-item">图瓦卢 +688</div></div><div class="area-card"><div class="title-item">W</div><div class="area-item">危地马拉 +502</div><div class="area-item">乌干达 +256</div><div class="area-item">乌克兰 +380</div><div class="area-item">文莱 +673</div><div class="area-item">乌拉圭 +598</div><div class="area-item">委内瑞拉 +58</div><div class="area-item">乌兹别克斯坦 +998</div></div><div class="area-card"><div class="title-item">X</div><div class="area-item">西班牙 +34</div><div class="area-item">新加坡 +65</div><div class="area-item">新喀里多尼亚 +687</div><div class="area-item">希腊 +30</div><div class="area-item">叙利亚 +963</div><div class="area-item">新西兰 +64</div><div class="area-item">匈牙利 +36</div></div><div class="area-card"><div class="title-item">Y</div><div class="area-item">印度 +91</div><div class="area-item">约旦 +962</div><div class="area-item">意大利 +39</div><div class="area-item">印度尼西亚 +62</div><div class="area-item">英国 +44</div><div class="area-item">伊朗 +98</div><div class="area-item">伊拉克 +964</div><div class="area-item">也门 +967</div><div class="area-item">牙买加 +1876</div><div class="area-item">亚美尼亚 +374</div><div class="area-item">越南 +84</div><div class="area-item">以色列 +972</div><div class="area-item">英属维尔京群岛 +1284</div></div><div class="area-card"><div class="title-item">Z</div><div class="area-item">直布罗陀 +350</div><div class="area-item">赞比亚 +260</div><div class="area-item">乍得 +235</div><div class="area-item">中非共和国 +236</div><div class="area-item">中国 +86</div><div class="area-item">中国澳门 +853</div><div class="area-item">中国台湾 +886</div><div class="area-item">中国香港 +852</div><div class="area-item">智利 +56</div></div></div>
css
.search-content {
overflow-x: hidden;
overflow-y: auto;
scroll-behavior: smooth;
}
.search-content .title-item {
width: 100%;
height: 20px;
line-height: 20px;
background-color:#F7F7F7;
color: #999999;
padding-left: 20px;
position: -webkit-sticky;
position: -moz-sticky;
position: -ms-sticky;
position: sticky;
top: 0;
}
.search-content .area-item {
width:90%;
margin:0 auto;
height:40px;
line-height:40px;
box-sizing:border-box;
border-bottom:.4px solid #e2e2e2;
list-style:none;
}
.search-content .area-item:last-child {
border-bottom:0;
}
思路二
监听滚动条拉动距离,动态定位列表标题
html 同上
css
.search-content .title-item {
width: 100%;
height: 20px;
line-height: 20px;
background-color:#F7F7F7;
color: #999999;
padding-left: 20px;
}
.search-content .title-item-fixed {
position: fixed;
top: 0;
}
.search-content .area-item {
width:90%;
margin:0 auto;
height:40px;
line-height:40px;
box-sizing:border-box;
border-bottom:.4px solid #e2e2e2;
list-style:none;
}
.search-content .area-item:last-child {
border-bottom:0;
}
js
var title = document.getElementsByClassName('title-item'),// 标题布局样式相同,获取快捷统一
section = document.getElementsByClassName('area-card');// 区块父级元素
var titleOtList = [],
len = title.length; // 标题数量
for(var i=0; i < len; i++) {
titleOtList.push(title[i].offsetTop);// 存放各标题的offsetTop值
}
$(window).scroll(function () {
var st = document.documentElement.scrollTop || document.body.scrollTop;
for(let i=0; i<len; i++) {
if(st > ot[i] && st < ot[i+1]) {
title[i].className = 'title-item title-item-fixed';
} else {
title[i].className = 'title-item';
}
}
});
截图保存实现方案
诉求:生成截图,长按保存
插件使用:截屏功能插件-html2canvas
html
<div id="app">
<div id="img-content">
<div class="shopping-result">
<p class="result-text">购买成功!</p>
<p class="number-code">初始密码:8ujds900</p>
<p class="save-too">为避免忘记密码,请点下方按钮保存密码</p>
<button id="save-btn">保存密码到手机相册</button>
</div>
</div>
<div class="cutpicture-mask">
<div class="close-btn">X</div>
<div class="content-box"></div>
</div>
</div>
css
#app {
position: relative;
width: 750px;
}
#img-content {
width: 100%;
height: 200px;
background: rgb(192, 245, 138);
border: 1px solid rgb(173 255 47);
border-radius: 10px 100px / 20px;
text-align: center;
position: fixed;
bottom: 20px;
left: 0;
}
.cutpicture-mask {
display: none;
width: 100%;
height: 100%;
background-color: rgb(0 0 0 / 80%);
position: fixed;
top: 0;
left: 0;
z-index: 1;
}
.close-btn {
position: absolute;
right: 20px;
top: 10px;
color: rgb(255 255 255);
}
.content-box{
width: 300px;
height: 200px;
background: rgb(192, 245, 138);
border: 1px solid rgb(173 255 47);
border-radius: 10px 100px / 20px;
text-align: center;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
-webkit-transform: translate(-50%, -50%);
}
.content-box img {
width: 100%;
background: rgb(192, 245, 138);
border: 1px solid rgb(173 255 47);
border-radius: 10px 100px / 20px;
}
.content-box .tap-tip {
color: rgb(186 182 39);
font-size: 14px;
}
js
$('#img-content').on('click','#save-btn',function(){
$('.content-box').html('');
var cutpictureHtml =
'<p class="liang-number">尊 111 <span class="high-light">520</span></p>'+
'<p class="number-code">初始密码:8ujds900</p>'+
'<p class="number-phone">密保手机:122********</p>';
$('.content-box').append(cutpictureHtml);
$('.cutpicture-mask').show();
new html2canvas($('.cutpicture-mask .content-box')[0]).then(canvas => {
// canvas为转换后的Canvas对象
let oImg = new Image();
oImg.src = canvas.toDataURL(); // 导出图片
$('.cutpicture-mask .content-box').html(oImg); // 将生成的图片添加到body
$('.cutpicture-mask .content-box').append('<p class="tap-tip">长按保存图片到相册</p>'); // 将生成的图片添加到body
});
});
$('.cutpicture-mask').on('click','.close-btn',function(){
$('.cutpicture-mask').hide();
});