前端及开发文章及欣赏

前端框架Bootstrap的使用

seo达人

如果您想订阅本博客内容,每天自动发到您的邮箱中, 请点这里 

1. 下载Bootstrap

下载地址:https://v3.bootcss.com/ 
进入后下载这个标题的Bootstrap 
这里写图片描述 
下载完成后,将所需的css,js复制到工程中即可

2. 拷贝官方的模块文件

<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! --> <title>Bootstrap 101 Template</title> <!-- Bootstrap --> <link href="css/bootstrap.min.css" rel="stylesheet"> </head> <body> <h1>你好,世界!</h1> <script src="https://cdn.bootcss.com/jquery/1.12.4/jquery.min.js"></script> <script src="js/bootstrap.min.js"></script> </body> </html>
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

3. 页面添加组件

图片

  • 下面一个按钮为例:

    • 喜欢的样式
<button type="button" class="btn btn-primary">(首选项)Primary</button>
    
  • 1

这里写图片描述

<div class="btn-group" role="group" aria-label="...">
  <button type="button" class="btn btn-default">Left</button>
  <button type="button" class="btn btn-default">Middle</button>
  <button type="button" class="btn btn-default">Right</button>
</div>
    
  • 1
  • 2
  • 3
  • 4
  • 5

这里写图片描述 
然后将二者结合即可:

<div class="btn-group" role="group" aria-label="...">
  <button type="button" class="btn btn-primary">Left</button>
  <button type="button" class="btn btn-primary">Middle</button>
  <button type="button" class="btn btn-primary">Right</button>
</div>
    
  • 1
  • 2
  • 3
  • 4
  • 5
- 最后的结果如下:
Left Middle Right

这里写图片描述

至此你就可以简单的用前端框架做出美观的界面了!

蓝蓝设计www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计、BS界面设计 、 cs界面设计 、 ipad界面设计 、 包装设计 、 图标定制 、 用户体验 、交互设计、 网站建设 平面设计服务

CSS3弹性布局怎么兼容IE(11)?

seo达人

如果您想订阅本博客内容,每天自动发到您的邮箱中, 请点这里 

弹性布局(Flexbox)确实为我们构建复杂、灵活的布局带来了很大的便利,但是它的兼容性确实让人很头痛,下面是我遇到的一个问题:

理想效果:

IE11效果:

html大概结构:

[html] view plain copy
  1. <div class="box">  
  2.     <div class="input-container">  
  3.         <input />  
  4.         <div class="tooltip"></div>  
  5.     </div>  
  6.     <button></button>  
  7. </div>  

这里大致说一下css,input-container宽高没设死,由input决定,并设置position: relative;相对定位,并采用display: flex;弹性布局。tooltip设置绝对定位,通过top调整垂直位置,由input-container的弹性布局属性设置水平居中(是不是觉得我很作死,为什么不直接用绝对定位就把垂直水平都搞定了。哈哈,一切源于一颗装B+傻B的心,不过,能实际体会一下flexbox带来的问题,我觉得也挺好的)。


结果在chrome下正常,IE11下就成上图那样了,我上MDN Web看了一下,说弹性布局是支持IE11的(下图),但是从上图来看,IE下垂直方向是对的,但是水平方向却不对,说明flexbox还是没被支持,我也尝试着添加了各种前缀,还是不行。

蓝蓝设计www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计、BS界面设计 、 cs界面设计 、 ipad界面设计 、 包装设计 、 图标定制 、 用户体验 、交互设计、 网站建设 平面设计服务

html模糊查询

seo达人

如果您想订阅本博客内容,每天自动发到您的邮箱中, 请点这里 

  1. <head>  
  2.     <meta charset="UTF-8">  
  3.     <title>模糊查询</title>  
  4. <style type="text/css">  
  5.     body{  
  6.         text-align:center;  
  7.     }  
  8.     #datas{  
  9.         display:none;  
  10.     }  
  11.     #txt{  
  12.         font-size:300%;  
  13.         width:80%;  
  14.         height:10%;  
  15.         margin-top:10%;  
  16.     }  
  17.     #msg{  
  18.         margin:0 auto;  
  19.         text-align:left;  
  20.         width:80%;  
  21.         border: medium solid #C0C0C0;   
  22.     }  
  23. </style>  
  24. </head>  
  25. <body>  
  26.   
  27. <form action="" method="post">  
  28. <!-- 搜索框 -->     
  29. <input type="text" id='txt' />  
  30. </form>  
  31. <!-- 模糊查询结果显示框 -->  
  32. <div id="msg"></div>  
  33.   
  34. <!-- 查询数据 -->  
  35. <div id="datas">  
  36. 城市,北京市,海淀区,东城区,西城区,宣武区,丰台区,朝阳区,崇文区,大兴区,石景山区,门头沟区,房山区,通州区,顺义区,怀柔区,昌平区,平谷区,密云县,延庆县,天津市,和平区,河西区,河北区,河东区,南开区,红桥区,北辰区,津南区,武清区,塘沽区,西青区,汉沽区,大港区,宝坻区,东丽区,蓟县,静海县,宁河县 ,上海,黄浦区,卢湾区,徐汇区,长宁区,静安区,普陀区,闸北区,杨浦区,虹口区,闵行区,宝山区,嘉定区,浦东新区,金山区,松江区,青浦区,南汇区,奉贤区,崇明县 ,重庆,渝中区,大渡口区,江北区,沙坪坝区,九龙坡区,南岸区,北碚区,万盛区,双桥区,渝北区,巴南区,万州区,涪陵区,黔江区,长寿区,江津区,永川区,南川区,綦江县,潼南县,铜梁县,大足县,荣昌县,璧山县,垫江县,武隆县,丰都县,城口县,梁平县,开县,巫溪县,巫山县,奉节县,云阳县,忠县,石柱土家族自治县,彭水苗族土家族自治县,酉阳苗族自治县,秀山土家族苗族自治县,新疆维吾尔自治区,乌鲁木齐,克拉玛依,石河子,阿拉尔市,图木舒克,五家渠,哈密,吐鲁番,阿克苏,喀什,和田,伊宁,塔城,阿勒泰,奎屯,博乐,昌吉,阜康,库尔勒,阿图什,乌苏 ,西藏自治区,拉萨,日喀则,宁夏回族自治区,银川,石嘴山,吴忠,固原,中卫,青铜峡市,灵武市,内蒙古自治区,呼和浩特,包头,乌海,赤峰,通辽,鄂尔多斯,呼伦贝尔,巴彦淖尔,乌兰察布,霍林郭勒市,满洲里市,牙克石市,扎兰屯市,根河市,额尔古纳市,丰镇市,锡林浩特市,二连浩特市,乌兰浩特市,阿尔山市 ,广西,南宁,柳州,桂林,梧州,北海,崇左,来宾,贺州,玉林,百色,河池,钦州,防城港,贵港,岑溪,凭祥,合山,北流,宜州,东兴,桂平,黑龙江,哈尔滨,大庆,齐齐哈尔,佳木斯,鸡西,鹤岗,双鸭山,牡丹江,伊春,七台河,黑河,绥化 加格达奇,五常,双城,尚志,纳河,虎林,密山,铁力,同江,富锦,绥芬河,海林,宁安,穆林,北安,五大连池,肇东,海伦,安达,吉林,长春,吉林,四平,辽源,通化,白山,松原,白城,九台市,榆树市,德惠市,舒兰市,桦甸市,蛟河市,磐石市,公主岭市,双辽市,梅河口市,集安市,临江市,大安市,洮南市,延吉市,图们市,敦化市,龙井市,珲春市,和龙市,辽宁,沈阳,大连,金州,鞍山,抚顺,本溪,丹东,锦州,营口,阜新,辽阳,盘锦,铁岭,朝阳,葫芦岛,新民,瓦房店,普兰,庄河,海城,东港,凤城,凌海,北镇,大石桥,盖州,灯塔,调兵山,开原,凌源,北票,兴城 ,河北,石家庄,唐山,邯郸,秦皇岛,保定,张家口,承德,廊坊,沧州,衡水,邢台,辛集市,藁城市,晋州市,新乐市,鹿泉市,遵化市,迁安市,武安市,南宫市,沙河市,涿州市,固安..定州市,安国市,高碑店市,泊头市,任丘市,黄骅市,河间市,霸州市,三河市,冀州市,深州市,山东,济南,青岛,淄博,枣庄,东营,烟台,潍坊,济宁,泰安,威海,日照,莱芜,临沂,德州,聊城,菏泽,滨州,章丘,胶南,胶州,平度,莱西,即墨,滕州,龙口,莱阳,莱州,招远,蓬莱,栖霞,海阳,青州,诸城,安丘,高密,昌邑,兖州,曲阜,邹城,乳山,文登,荣成,乐陵,临清,禹城,江苏,南京,镇江,常州,无锡,苏州,徐州,连云港,淮安,盐城,扬州,泰州,南通,宿迁,江阴市,宜兴市,邳州市,新沂市,金坛市,溧阳市,常熟市,张家港市,太仓市,昆山市,吴江市,如皋市,通州市,海门市,启东市,东台市,大丰市,高邮市,江都市,仪征市,丹阳市,扬中市,句容市,泰兴市,姜堰市,靖江市,兴化市,安徽,合肥,蚌埠,芜湖,淮南,亳州,阜阳,淮北,宿州,滁州,安庆,巢湖,马鞍山,宣城,黄山,池州,铜陵,界首,天长,明光,桐城,宁国,浙江,杭州,嘉兴,湖州,宁波,金华,温州,丽水,绍兴,衢州,舟山,台州,建德市,富阳市,临安市,余姚市,慈溪市,奉化市,瑞安市,乐清市,海宁市,平湖市,桐乡市,诸暨市,上虞市,嵊州市,兰溪市,义乌市,东阳市,永康市,江山市,临海市,温岭市,龙泉市,福建,福州,厦门,泉州,三明,南平,漳州,莆田,宁德,龙岩,福清市,长乐市,永安市,石狮市,晋江市,南安市,龙海市,邵武市,武夷山,建瓯市,建阳市,漳平市,福安市,福鼎市,广东,广州,深圳,汕头,惠州,珠海,揭阳,佛山,河源,阳江,茂名,湛江,梅州,肇庆,韶关,潮州,东莞,中山,清远,江门,汕尾,云浮,增城市,从化市,乐昌市,南雄市,台山市,开平市,鹤山市,恩平市,廉江市,雷州市 吴川市,高州市,化州市,高要市,四会市,兴宁市,陆丰市,阳春市,英德市,连州市,普宁市,罗定市,海南,海口,三亚,琼海,文昌,万宁,五指山,儋州,东方,云南,昆明,曲靖,玉溪,保山,昭通,丽江,普洱,临沧,安宁市,宣威市,个旧市,开远市,景洪市,楚雄市,大理市,潞西市,瑞丽市,贵州,贵阳,六盘水,遵义,安顺,清镇市,赤水市,仁怀市,铜仁市,毕节市,兴义市,凯里市,都匀市,福泉市,四川,成都,绵阳,德阳,广元,自贡,攀枝花,乐山,南充,内江,遂宁,广安,泸州,达州,眉山,宜宾,雅安,资阳,都江堰市,彭州市,邛崃市,崇州市,广汉市,什邡市,绵竹市,江油市,峨眉山市,阆中市,华蓥市,万源市,简阳市,西昌市,湖南,长沙,株洲,湘潭,衡阳,岳阳,郴州,永州,邵阳,怀化,常德,益阳,张家界,娄底,浏阳市,醴陵市,湘乡市,韶山市,耒阳市,常宁市,武冈市,临湘市,汨罗市,津市市,沅江市,资兴市,洪江市,冷水江市,涟源市,吉首市,武汉,襄樊,宜昌,黄石,鄂州,随州,荆州,荆门,十堰,孝感,黄冈,咸宁,大冶市,丹江口市,洪湖市,石首市,松滋市,宜都市,当阳市,枝江市,老河口市,枣阳市,宜城市,钟祥市,应城市,安陆市,汉川市,麻城市,武穴市,赤壁市,广水市,仙桃市,天门市,潜江市,恩施市,利川市,河南,郑州,洛阳,开封,漯河,安阳,新乡,周口,三门峡,焦作,平顶山,信阳,南阳,鹤壁,濮阳,许昌,商丘,驻马店,巩义市,新郑市,新密市,登封市,荥阳市,偃师市,汝州市,舞钢市,林州市,卫辉市,辉县市,沁阳市,孟州市,禹州市,长葛市,义马市,灵宝市,邓州市,永城市,项城市,济源市,山西,太原,大同,忻州,阳泉,长治,晋城,朔州,晋中,运城,临汾,吕梁,古交,潞城,高平,介休,永济,河津,原平,侯马,霍州,孝义,汾阳,陕西,西安,咸阳,铜川,延安,宝鸡,渭南,汉中,安康,商洛,榆林,兴平市,韩城市,华阴市,甘肃,兰州,天水,平凉,酒泉,嘉峪关,金昌,白银,武威,张掖,庆阳,定西,陇南,玉门市,敦煌市,临夏市,合作市,青海,西宁,格尔木,德令哈,江西,南昌,九江,赣州,吉安,鹰潭,上饶,萍乡,景德镇,新余,宜春,抚州,乐平市,瑞昌市,贵溪市,瑞金市,南康市,井冈山市,丰城市,樟树市,高安市,德兴市,台湾,台北,台中,基隆,高雄,台南,新竹,嘉义,板桥市,宜兰市,竹北市,桃园市,苗栗市,丰原市,彰化市,南投市,太保市,斗六市,新营市,凤山市,屏东市,台东市,花莲市,马公市 ,特别行政区,香港:中西区,东区,九龙城区,观塘区,南区,深水埗区,黄大仙区,湾仔区,油尖旺区,离岛区,葵青区,北区,西贡区,沙田区,屯门区,大埔区,荃湾区,元朗区,澳门:花地玛堂区,圣安多尼堂区(花王堂区),望德堂区,大堂区,风顺堂区(圣老楞佐堂区),离岛,氹仔,路环,  
  37. </div>    
  38. <script type="text/javascript">    
  39.     function handle(){    
  40.         var data = datas.split(",");  
  41.         var word = document.getElementById('txt').value;  
  42.         var value = "";  
  43.         for(var i = 1;i < data.length;i++){  
  44.             if(word!="" && data[i].match(word+".*") != null){  
  45.                 value += "<a onclick=add('"+ data[i] +"') href='#'>" + data[i] + "</a><br/>";  
  46.             }  
  47.         }         
  48.         document.getElementById('msg').innerHTML=value;  
  49.     }   
  50.     function add(city){  
  51.         document.getElementById('txt').value=city;  
  52.     }  
  53.     //firefox下检测状态改变只能用oninput,且需要用addEventListener来注册事件。     
  54.     if(/msie/i.test(navigator.userAgent))    //ie浏览器     
  55.         {document.getElementById('txt').onpropertychange=handle     
  56.     } else{//非ie浏览器,比如Firefox     
  57.     alert(1)  
  58.         document.getElementById('txt').addEventListener("input",handle,false);     
  59.     }  
  60.     var datas = document.getElementById('datas').innerHTML;  
  61.   
  62. </script>    
  63.   
  64. </body>  
  65. </html>  
蓝蓝设计www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计、BS界面设计 、 cs界面设计 、 ipad界面设计 、 包装设计 、 图标定制 、 用户体验 、交互设计、 网站建设 平面设计服务

清除浮动的八种方法

seo达人

如果您想订阅本博客内容,每天自动发到您的邮箱中, 请点这里 

浮动是什么?

浮动元素会脱离文档流进行左浮或者右浮,直到碰到父级元素或者其他的浮动元素。

为什么清除浮动:浮动会导致父元素高度坍塌,因为浮动脱离文档流,浮动以后不占文档流的位置,撑开的父元素高度肯定会坍塌。

清除浮动的八种方法:

1、父级div给出固定的高度。手动定义height,这样就解决了父级元素获取不到高度的问题。

优点:代码量少,简单容易掌握。

缺点:只适合高度固定的布局,如果高度和父级div不同会出现问题。

2、overflow,设置overflow:hidden。

优点:代码少,浏览器支持。

缺点:会把超出的部分隐藏起来,而且不能配合position使用

3、额外标签,添加一个新的标签,如div,或者br,并且设置标签的属性clear:both;清除浮动,让父级能自动获得高度。

优点:代码少,浏览器支持,不会各种问题。

缺点:会有很多空的div或者br。

4、使用单伪类after和zoom,使用方法:

.clearfloat:after{

  content:"";//设置内容为空

  height:0;//高度为0

  line-height:0;//行高为0

  display:block;//将文本转为块级元素

  visibility:hidden;//将元素隐藏

  clear:both//清除浮动

 }

  .clearfloat{

 zoom:1;为了兼容IE

    }

优点:浏览器支持好,大型的浏览器都在使用,建议使用。

缺点:代码多,需要after和zoom都要使用才能兼容主流的浏览器。

5、双伪类清除浮动。使用方法:

.clearfloat:before,.clearfloatafter {

                 content: "";

                 display: block;

                  clear: both;

             }

            .clearfloat {

                 zoom: 1;

           }

缺点:不严谨不建议使用

6、父级div跟着浮动,所有代码一起浮动就会形成一个整体,

缺点:会产生新的问题,不建议使用。

7、父级定义display:table;将div属性变成的表格。

缺点:产生新的问题,而且影响布局。

8、overflow:auto;需要设置width,不设置height,浏览器会自动检测浮动区的高度。

缺点:容易生成滚动条。

蓝蓝设计www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计、BS界面设计 、 cs界面设计 、 ipad界面设计 、 包装设计 、 图标定制 、 用户体验 、交互设计、 网站建设 平面设计服务





vue一些需要注意的小知识点

seo达人

如果您想订阅本博客内容,每天自动发到您的邮箱中, 请点这里 

1.vue的生命周期,主要的介绍官网(https://cn.vuejs.org/v2/api/)上都有。

主要说的是created和mounted。之前在写项目的过程中,需要对DOM节点进行操作(但是在vue里面尽量不要获取节点进行操作。vue主要是对数据进行操作),在created里面这些操作并不能实现,但是在mounted里面是可以的。

主要原因就是:created是vm实例已经创建但是未完成挂载,而mounted已经部分完成挂载,这么说的原因是,mounted不承诺所有的子组件都会被挂载,如果你希望等到的是整个视图都渲染完毕,可以用 vm.$nextTick 替换掉mounted.

$nextTick是下次DOM更新循环结束之后执行的回调函数。

2.vue里点击按钮,弹框的实现。

通过在父组件上绑定一个show,type为boolean,在子组件用props接收传过来的show值,show值为true时弹出框显示,false时不显示。

父组件:

子组件:

3.v-show与v-if的区别?

v-if与v-show都属于条件渲染,意思就是根据不同的条件使用不同的模板。

在vue中,v-show只是简单的修改了样式,DOM节点是真实存在的,只是隐藏了。

v-if是真实的条件渲染,值为false是不编译不渲染,当值为true时,才开始编译。

蓝蓝设计www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计、BS界面设计 、 cs界面设计 、 ipad界面设计 、 包装设计 、 图标定制 、 用户体验 、交互设计、 网站建设 平面设计服务

前端框架Bootstrap的使用

seo达人

如果您想订阅本博客内容,每天自动发到您的邮箱中, 请点这里 

1. 下载Bootstrap

下载地址:https://v3.bootcss.com/ 
进入后下载这个标题的Bootstrap 
这里写图片描述 
下载完成后,将所需的css,js复制到工程中即可

2. 拷贝官方的模块文件

<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! --> <title>Bootstrap 101 Template</title> <!-- Bootstrap --> <link href="css/bootstrap.min.css" rel="stylesheet"> </head> <body> <h1>你好,世界!</h1> <script src="https://cdn.bootcss.com/jquery/1.12.4/jquery.min.js"></script> <script src="js/bootstrap.min.js"></script> </body> </html>
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

3. 页面添加组件

图片

  • 下面一个按钮为例:

    • 喜欢的样式
<button type="button" class="btn btn-primary">(首选项)Primary</button>
    
  • 1

这里写图片描述

<div class="btn-group" role="group" aria-label="...">
  <button type="button" class="btn btn-default">Left</button>
  <button type="button" class="btn btn-default">Middle</button>
  <button type="button" class="btn btn-default">Right</button>
</div>
    
  • 1
  • 2
  • 3
  • 4
  • 5

这里写图片描述 
然后将二者结合即可:

<div class="btn-group" role="group" aria-label="...">
  <button type="button" class="btn btn-primary">Left</button>
  <button type="button" class="btn btn-primary">Middle</button>
  <button type="button" class="btn btn-primary">Right</button>
</div>
    
  • 1
  • 2
  • 3
  • 4
  • 5
- 最后的结果如下:
Left Middle Right

这里写图片描述

至此你就可以简单的用前端框架做出美观的界面了!

蓝蓝设计www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计、BS界面设计 、 cs界面设计 、 ipad界面设计 、 包装设计 、 图标定制 、 用户体验 、交互设计、 网站建设 平面设计服务

html 如何引入一个公共的头部和底部

seo达人

如果您想订阅本博客内容,每天自动发到您的邮箱中, 请点这里 


摘要: LINK[rel=import]其实有点类似于IFRAME,它引用的对象也是一个完整的文档,而不是文档片段,而且里面的SCRIPT也会执行,对跨域的资源访问同样有同源策略的限制

html 静态页面中引用外部页面没那么方便,主要方法有:

asp语言和PHP语言

首先制作一个头部文件head.asp,或者一个底部文件foot.asp。如主页是index.asp,调用头部代码是在index.asp文件代码的开始位置(第一个标记后面,

标记前面)增加如下代码:

如果是PHP文件,文件名改为 head.php即可

使用框架来实现

以前人们常常使用静态frame框架来做首尾(一般不是iframe)。现在越来越少见了。主要因为设计网页相对比较困难,而且还增加了连接数,占用线程较多,速度慢,而且也不利于搜索引擎的对头尾的收录

使用.js脚本来实现

建立一个head.js的文件,找一个html转js的网站,然后把你头部的html代码转化成js代码,并放在head.js文件里面。然后在需要调用head文件代码的地方添加

这个地方src="js/head.js"的路径是你head.js文件的路径

html转换为JS:

以后无论在哪个页面,想调用该头部文件,直接插入head.js文件即可

这种方式的优点是方便,便于修改。缺点是由于搜索引擎读不懂javascript文件,头部文件和尾部文件搜索引擎无法收录,而且js文件过大会加重访问者的浏览器负担,影响访问速度

Behavior的download方式

最好能有一种方法,就像asp页面包含其他页面时那样,用一小段包含语句就可以实现,不要将需要包含的内容出现在本页面内,而是分割出去到另外一个自己的页面

蓝蓝设计www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计、BS界面设计 、 cs界面设计 、 ipad界面设计 、 包装设计 、 图标定制 、 用户体验 、交互设计、 网站建设 平面设计服务


css 图片有间隔多个Img标签之间的间隙

seo达人

如果您想订阅本博客内容,每天自动发到您的邮箱中, 请点这里 

今天写css时发现,图片加起来刚好是900px的三张图片,不能在一个900px宽容器放下,因为图片之间有间隔,我猜是浏览器把两个img标签之间的空格当成了空白节点。

在网上找到了几个不错的解决方法:

1.多个img标签写在一行

<img src="/i/eg_tulip.jpg" alt="郁金香" height="100px"/> <img src="/i/eg_tulip.jpg" alt="郁金香" height="100px"/>
<img src="/i/eg_tulip.jpg" alt="郁金香" height="100px"/><img src="/i/eg_tulip.jpg" alt="郁金香" height="100px"/>

效果前:技术分享

效果后:技术分享

 

2.在img标签的父级上写:font-size:0;//这个在解决display:inline-block出现的问题也有帮助

<div style="font-size:0"> <img src="/i/eg_tulip.jpg" alt="郁金香" height="100px"/> <img src="/i/eg_tulip.jpg" alt="郁金香" height="100px"/> </div>

效果:技术分享

 

3.使用display:block(img是内联元素)//要float一下才行

<img src="/i/eg_tulip.jpg" alt="郁金香" height="100px" style="display:block"/> <img src="/i/eg_tulip.jpg" alt="郁金香" height="100px" style="display:block"/>

效果:技术分享

 

4.使用letter-spacing属性

<div style="letter-spacing:-800px"><!--letter-spacing的值无论是负多少都不会产生重叠--> <img src="/i/eg_tulip.jpg" alt="郁金香" height="100px"/> <img src="/i/eg_tulip.jpg" alt="郁金香" height="100px"/> </div> 

效果:技术分享

蓝蓝设计www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计、BS界面设计 、 cs界面设计 、 ipad界面设计 、 包装设计 、 图标定制 、 用户体验 、交互设计、 网站建设 平面设计服务

前端性能优化 —— 移动端浏览器优化策略

seo达人

如果您想订阅本博客内容,每天自动发到您的邮箱中, 请点这里 

摘要: 前端性能优化是一个很宽泛的概念,本书前面的部分也多多少少提到一些前端优化方法,这也是我们一直在关注的一件重要事情。配合各种方式、手段、辅助系统,前端优化的最终目的都是提升用户体验,改善页面性能,我们常常竭尽全力进行前端页面优化,但却忽略了这样做的效果和意义。先不急于探究前端优化具体可以怎样去做,先看看什么是前端性能,应该怎样去了解和评价前端页面的性能。


相对于桌面端浏览器,移动端Web浏览器上有一些较为明显的特点:设备屏幕较小、新特性兼容性较好、支持一些较新的HTML5和CSS3特性、需要与Native应用交互等。但移动端浏览器可用的CPU计算资源和网络资源极为有限,因此要做好移动端Web上的优化往往需要做更多的事情。


首先,在移动端Web的前端页面渲染中,桌面浏览器端上的优化规则同样适用,此外针对移动端也要做一些的优化来达到更好的效果。需要注意的是,并不是移动端的优化原则在桌面浏览器端就不适用,而是由于兼容性和差异性的原因,一些优化原则在移动端更具代表性。


一、网络加载类


1.首屏数据请求提前,避免JavaScript文件加载后才请求数据


为了进一步提升页面加载速度,可以考虑将页面的数据请求尽可能提前,避免在JavaScript加载完成后才去请求数据。通常数据请求是页面内容渲染中关键路径最长的部分,而且不能并行,所以如果能将数据请求提前,可以极大程度上缩短页面内容的渲染完成时间。


2.首屏加载和按需加载,非首屏内容滚屏加载,保证首屏内容最小化


由于移动端网络速度相对较慢,网络资源有限,因此为了尽快完成页面内容的加载,需要保证首屏加载资源最小化,非首屏内容使用滚动的方式异步加载。一般推荐移动端页面首屏数据展示延时最长不超过3秒。目前中国联通3G的网络速度为338KB/s(2.71Mb/s),所以推荐首屏所有资源大小不超过1014KB,即大约不超过1MB。


3.模块化资源并行下载


在移动端资源加载中,尽量保证JavaScript资源并行加载,主要指的是模块化JavaScript资源的异步加载,例如AMD的异步模块,使用并行的加载方式能够缩短多个文件资源的加载时间。


4.inline首屏必备的CSS和JavaScript


通常为了在HTML加载完成时能使浏览器中有基本的样式,需要将页面渲染时必备的CSS和JavaScript通过<script>或<style>内联到页面中,避免页面HTML载入完成到页面内容展示这段过程中页面出现空白。


<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <title>样例</title>

    <meta name="viewport" content="width=device-width,minimum-scale=1.0, maximum-scale=1.0,user-scalable=no">

    <style>

    /* 必备的首屏CSS */

    html, body{

        margin: 0;

        padding: 0;

        background-color: #ccc;

    }

    </style>

</head>

<body>

</body>


5.meta dns prefetch设置DNS预解析


设置文件资源的DNS预解析,让浏览器提前解析获取静态资源的主机IP,避免等到请求时才发起DNS解析请求。通常在移动端HTML中可以采用如下方式完成。


<!-- cdn域名预解析 -->

<meta http-equiv="x-dns-prefetch-control" content="on">

<link rel="dns-prefetch" href="//cdn.domain.com">


6.资源预加载


对于移动端首屏加载后可能会被使用的资源,需要在首屏完成加载后尽快进行加载,保证在用户需要浏览时已经加载完成,这时候如果再去异步请求就显得很慢。


7.合理利用MTU策略


通常情况下,我们认为TCP网络传输的最大传输单元(Maximum Transmission Unit,MTU)为1500B,即网络一个RTT(Round-Trip Time,网络请求往返时间)时间内可以传输的数据量最大为1500字节。因此,在前后端分离的开发模式中,尽量保证页面的HTML内容在1KB以内,这样整个HTML的内容请求就可以在一个RTT时间内请求完成,最大限度地提高HTML载入速度。


二、缓存类


1.合理利用浏览器缓存


除了上面说到的使用Cache-Control、Expires、Etag和Last-Modified来设置HTTP缓存外,在移动端还可以使用localStorage等来保存AJAX返回的数据,或者使用localStorage保存CSS或JavaScript静态资源内容,实现移动端的离线应用,尽可能减少网络请求,保证静态资源内容的快速加载。


2.静态资源离线方案


对于移动端或Hybrid应用,可以设置离线文件或离线包机制让静态资源请求从本地读取,加快资源载入速度,并实现离线更新。关于这块内容,我们会在后面的章节中重点讲解。


3.尝试使用AMP HTML


AMP HTML可以作为优化前端页面性能的一个解决方案,使用AMP Component中的元素来代替原始的页面元素进行直接渲染。


<!-- 不推荐 -->

<video width="400" height="300" src="http://www.domain.com/videos/myvideo.mp4" poster="path/poster.jpg">

    <div fallback>

        <p>Your browser doesn’t support HTML5 video</p>

    </div>

    <source type="video/mp4" src="foo.mp4">

    <source type="video/webm" src="foo.webm">

</video>



<!-- 推荐 -->

<amp-video width="400" height="300" src="http://www.domain.com/videos/myvideo.mp4" poster= "path/poster.jpg">

    <div fallback>

        <p>Your browser doesn’t support HTML5 video</p>

    </div>

    <source type="video/mp4" src="foo.mp4">

    <source type="video/webm" src="foo.webm">

</amp-video>


三、图片类


1.图片压缩处理


在移动端,通常要保证页面中一切用到的图片都是经过压缩优化处理的,而不是以原图的形式直接使用的,因为那样很消耗流量,而且加载时间更长。


2.使用较小的图片,合理使用base64内嵌图片


在页面使用的背景图片不多且较小的情况下,可以将图片转化成base64编码嵌入到HTML页面或CSS文件中,这样可以减少页面的HTTP请求数。需要注意的是,要保证图片较小,一般图片大小超过2KB就不推荐使用base64嵌入显示了。


.class-name {

       background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAALCAMAAABxsOwqAAAAYFBMVEWnxwusyQukxQudwQyZvgyhxAyfwgyxzAsUHQGOuA0aJAERGAFIXwSTugyEqgtqhghQZgUwQQIpOQKbuguVtQuKrAuCowp2kQlheghTbQZHWQU7SwVAVgQ6TgQlLwMeKwFOemyQAAAAVElEQVQI1y3JVRaAIAAF0UconXbvf5ei8HfPDIQQhBAAFE10iKig3SLRNN4SP/p+N08VC0YnfIlNWtqIkhg/TPYbCvhqdHAWRXPZSp3g3CWZvVLXC6OJA3ukv0AaAAAAAElFTkSuQmCC');

}


3.使用更高压缩比格式的图片


使用具有较高压缩比格式的图片,如webp等。在同等图片画质的情况下,高压缩比格式的图片体积更小,能够更快完成文件传输,节省网络流量。


<img src="//cdn.domain.com/path/photo.webp" alt="webp格式图片">


4.图片懒加载


为了保证页面内容的最小化,加速页面的渲染,尽可能节省移动端网络流量,页面中的图片资源推荐使用懒加载实现,在页面滚动时动态载入图片。


<img data-src="//cdn.domain.com/path/photo.jpg" alt="懒加载图片">


5.使用Media Query或srcset根据不同屏幕加载不同大小图片


在介绍响应式的章节中我们了解到,针对不同的移动端屏幕尺寸和分辨率,输出不同大小的图片或背景图能保证在用户体验不降低的前提下节省网络流量,加快部分机型的图片加载速度,这在移动端非常值得推荐。


6.使用iconfont代替图片图标


在页面中尽可能使用iconfont来代替图片图标,这样做的好处有以下几个:使用iconfont体积较小,而且是矢量图,因此缩放时不会失真;可以方便地修改图片大小尺寸和呈现颜色。但是需要注意的是,iconfont引用不同webfont格式时的兼容性写法,根据经验推荐尽量按照以下顺序书写,否则不容易兼容到所有的浏览器上。


@font-face {

    font-family: iconfont;

    src: url("./iconfont.eot");

    src: url("./iconfont.eot?#iefix") format("eot"),

         url("./iconfont.woff") format("woff"),

         url("./iconfont.ttf") format("truetype");

}


7.定义图片大小限制


加载的单张图片一般建议不超过30KB,避免大图片加载时间长而阻塞页面其他资源的下载,因此推荐在10KB以内。如果用户上传的图片过大,建议设置告警系统,帮助我们观察了解整个网站的图片流量情况,做出进一步的改善。


四、脚本类


1.尽量使用id选择器


选择页面DOM元素时尽量使用id选择器,因为id选择器速度最快。


2.合理缓存DOM对象


对于需要重复使用的DOM对象,要优先设置缓存变量,避免每次使用时都要从整个DOM树中重新查找。


// 不推荐

$('#mod .active').remove('active');

$('#mod .not-active').addClass('active');


// 推荐

let $mod = $('#mod');

$mod.find('.active').remove('active');

$mod.find('.not-active').addClass('active');


3.页面元素尽量使用事件代理,避免直接事件绑定


使用事件代理可以避免对每个元素都进行绑定,并且可以避免出现内存泄露及需要动态添加元素的事件绑定问题,所以尽量不要直接使用事件绑定。


// 不推荐

$('.btn').on('click', function(e){

    console.log(this);

});


// 推荐

$('body').on('click', '.btn', function(e){

    console.log(this);

});


4.使用touchstart代替click


由于移动端屏幕的设计,touchstart事件和click事件触发时间之间存在300毫秒的延时,所以在页面中没有实现touchmove滚动处理的情况下,可以使用touchstart事件来代替元素的click事件,加快页面点击的响应速度,提高用户体验。但同时我们也要注意页面重叠元素touch动作的点击穿透问题。


// 不推荐

$('body').on('click', '.btn', function(e){

    console.log(this);

});


// 推荐

$('body').on('touchstart', '.btn', function(e){

    console.log(this);

});


5.避免touchmove、scroll连续事件处理


需要对touchmove、scroll这类可能连续触发回调的事件设置事件节流,例如设置每隔16ms(60帧的帧间隔为16.7ms,因此可以合理地设置为16ms)才进行一次事件处理,避免频繁的事件调用导致移动端页面卡顿。


// 不推荐

$('.scroller').on('touchmove', '.btn', function(e){

    console.log(this);

});


// 推荐

$('.scroller').on('touchmove', '.btn', function(e){

    let self = this;

    setTimeout(function(){

        console.log(self);

    }, 16);

});


6.避免使用eval、with,使用join代替连接符+,推荐使用ECMAScript 6的字符串模板


这些都是一些基础的安全脚本编写问题,尽可能使用较率的特性来完成这些操作,避免不规范或不安全的写法。


7.尽量使用ECMAScript 6+的特性来编程


ECMAScript 6+一定程度上更加安全,而且部分特性执行速度更快,也是未来规范的需要,所以推荐使用ECMAScript 6+的新特性来完成后面的开发。


五、渲染类


1.使用Viewport固定屏幕渲染,可以加速页面渲染内容


一般认为,在移动端设置Viewport可以加速页面的渲染,同时可以避免缩放导致页面重排重绘。在移动端固定Viewport设置的方法如下。


<!-- 设置viewport不缩放 -->

<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">


2.避免各种形式重排重绘


页面的重排重绘很耗性能,所以一定要尽可能减少页面的重排重绘,例如页面图片大小变化、元素位置变化等这些情况都会导致重排重绘。


3.使用CSS3动画,开启GPU加速


使用CSS3动画时可以设置transform: translateZ(0)来开启移动设备浏览器的GPU图形处理加速,让动画过程更加流畅。


-webkit-transform: translateZ(0);

-ms-transform: translateZ(0);

-o-transform: translateZ(0);

transform: translateZ(0);


4.合理使用Canvas和requestAnimationFrame


选择Canvas或requestAnimationFrame等更的动画实现方式,尽量避免使用setTimeout、setInterval等方式来直接处理连续动画。


5.SVG代替图片


部分情况下可以考虑使用SVG代替图片实现动画,因为使用SVG格式内容更小,而且SVG DOM结构方便调整。


6.不滥用float


在DOM渲染树生成后的布局渲染阶段,使用float的元素布局计算比较耗性能,所以尽量减少float的使用,推荐使用固定布局或flex-box弹性布局的方式来实现页面元素布局。


7.不滥用web字体或过多font-size声明


过多的font-size声明会增加字体的大小计算,而且也没有必要的。


六、架构协议类


1.尝试使用SPDY和HTTP 2


在条件允许的情况下可以考虑使用SPDY协议来进行文件资源传输,利用连接复用加快传输过程,缩短资源加载时间。HTTP 2在未来也是可以考虑尝试的。


2.使用后端数据渲染


使用后端数据渲染的方式可以加快页面内容的渲染展示,避免空白页面的出现,同时可以解决移动端页面SEO的问题。如果条件允许,后端数据渲染是一个很不错的实践思路。后面的章节会详细介绍后端数据渲染的相关内容。


3.使用Native View代替DOM的性能劣势


可以尝试使用Native View的MNV开发模式来避免HTML DOM性能慢的问题,目前使用MNV的开发模式已经可以将页面内容渲染体验做到接近客户端Native应用的体验了。


关于页面优化的常用技术手段和思路主要包括以上这些,尽管列举出很多,但仍可能有少数遗漏,可见前端性能优化不是一件简简单单的事情,其涉及的内容很多。大家可以根据实际情况将这些方法应用到自己的项目当中,要想全部做到几乎是不可能的,但做到用户可接受的原则还是很容易实现的。


于此同时我们要清楚的是,在我们做到了优化的同时也付出了很大的代价,这也是前端优化的一个问题。理论上这些优化都是可以实现的,但是作为工程师我们也要明白懂得权衡。优化提升了用户体验,使数据加载更快,但是项目代码却可能打乱,异步内容要拆分出来,首屏的一个雪碧图可能要分成两个,页面项目代码维护成本成倍增加,项目结构也可能变得混乱。


所以前期在设计构建、组件的解决方案时要解决好异步的自动处理问题。任何一部分优化都可以做得很深入,但不一定都值得,在优化的同时也要尽量考虑性价比,这才是我们作为一名前端工程师处理前端优化时应该具有的正确思维。

蓝蓝设计www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计、BS界面设计 、 cs界面设计 、 ipad界面设计 、 包装设计 、 图标定制 、 用户体验 、交互设计、 网站建设 平面设计服务




微信小程序知识体系梳理

seo达人

如果您想订阅本博客内容,每天自动发到您的邮箱中, 请点这里 

小程序介绍

17年一月9号,小程序刚发布的时候,个人很幸运的成为第一批吃螃蟹的人,当然也是第一批采坑的人。

小程序是基于微信的一种应用,使用微信自定义的组件,让我们使用JavaScript的方式,达到匹配原生应用的效果。小程序的一大优势就是,你只要有个微信,你就能搜索你所需要的点餐、买票、旅游等一些日常需求的小程序,而且——用完即毁、无需下载。

小程序开发所需要的技能

小程序是最适合前端开发人员,你所需的知识仅仅是JavaScript、css、html的基本知识,如果你有其他单页面应用的开发经验,那小程序会很快上手,但是这都不是必须的。

小程序的知识体系的梳理

项目整体架构

app.js 小程序的启动js文件。

app.json 小程序的全局json配置文件。同时也可以进行pages配置、底部tab切换的配置等等。

app.wxss 小程序的全局样式。

pages 小程序的相关页面。在app.json中配置了pages,pages文件夹就会自动出现对应的页面。

pages

js 是小程序的逻辑部分。 
wxss 小程序的对应page的布局,也就是局部样式。相当于web网页的css。 
wxml 页面布局。相当于web网页的html。 
json 小程序的局部页面配置。

小程序路由

1、push路由 
wx.navigateTo({ 
url:’/pages/index/index’ 
});

2、替换路由 
wx.redirectTo({ 
url:”/pages/index/index” 
});

3、路由回退 
wx.navigateBack({ 
delta: 1 
});

4、tab切换 
wx.switchTab({ 
url:’相关页面路径’ 
});

5、路由清理替换 
wx.reLaunch({ 
url:’新的页面路径’ 
});

小程序路由传参

wx.navigateTo({ 
url: “/pages/index/index?id=”+inputValue 
}); 
就会把inputValue的值传递过去。在相应的界面的onLoad周期函数的options中接收。

//index.js 
onLoad: function(options){ 
console.log(options.id); 
}

小程序界面交互(Toast、Modal)

Toast分三种:sucess、loading、none; 
Modal:title、content属性是必须要的。 
modal还有一些其他的属性,比如确认按钮的显示。

小程序page的生命周期

onLoad——初始化加载一次 
onReady——页面初次渲染完成 
onShow——监听页面显示 
onHide——监听页面隐藏 
onUnload——监听页面卸载

生命周期函数的本质:给开发人员一个触发时机的暴露的接口。在这样的时机下,我们可以做什么?

小程序如何更改data

vue中:this.message = ‘hello world’; 
小程序中: 
this.setData({ 
message: ‘hello world’ 
})

小程序分享功能

使用onShareAppMessage函数可以实现分享转发功能。 
onShareAppMessage: function(){ 
return { 
title:’图吧同行’, 
path:’/pages/index/index’, 
desc:’描述信息’ 

}

登录功能

小程序的登录是一个项目的核心逻辑。分为三步。

第一步:wx.login,获取code。 
第二步:把code发送给我们的后台服务器,得到openId。 
第三步:服务器把openId返回给你。你就知道每次是哪一个用户登录了小程序。

蓝蓝设计www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计、BS界面设计 、 cs界面设计 、 ipad界面设计 、 包装设计 、 图标定制 、 用户体验 、交互设计、 网站建设 平面设计服务


日历

链接

blogger

蓝蓝 http://www.lanlanwork.com

存档