前端及开发文章及欣赏

vue-router学习笔记

seo达人

目录

介绍

目录

介绍

学习vue-router做的一些总结笔记,内容会持续更新!



目录

1、HTML和JS中使用router

2、动态路由

3、嵌套路由

4、编程式导航

5、命名路由、命名视图

6、重定向、别名

7、路由组件传参

8、导航守卫

9、路由元信息

10、过度动效

11、数据获取

12、滚动条位置




Vue (一)、创建组件

seo达人

使用 vue-cli 创建 vue 项目:



cd 到指定的目录下 命令行输入:



vue init webpack-simple <项目名称>



根据提示设置Project name



设置Project description



设置Author



设置License



设置Use sass?



cd到刚刚创建的项目名称目录



命令行输入:npm install



等待安装完成后 执行 npm run dev 命令



注:以下部分练习是在https://jsfiddle.net 中进行

创建组件:(创建全局组件)

Html 部分:

<div id="app">

<div>练习</div>

<!-- 这里的 inline-template 取代组件函数中的 template:'' -->

<my-cmp inline-template>

  <p>{{ status }}</p>

</my-cmp>

<hr>

<my-cmp inline-template>

  <p>第二次使用{{ status }}</p>

</my-cmp>

</div>



Js 部分:

Vue.component('my-cmp',{

data: function () {

  return {

    status:'Critical'

    }

  },

 methods: {}



});



var vm = new Vue({

  el: "#app"

})



如果将data提取成公共的部分,则多次使用同一个组件则这部分数据在内存中使用的是同一块存储 如下演示:

html部分:

<div id="app">

  <div>练习</div>

  <my-cmp></my-cmp>

  <hr>

  <my-cmp></my-cmp>

</div>



Js 部分

var data = {status:'Critical'};

Vue.component('my-cmp',{

data: function () {

  return data

  },

 template:'<p>Server status {{ status }} (<button @click="changeStatus">Change</button>)</p>',

 methods: {

    changeStatus(){

    this.status = "Nomal"

    }  

 },



});

var vm = new Vue({

  el: "#app"

})



上面的js代码当点击按钮的时候两个组件引用的数据均会发生变化

局部注册组件:

html部分:

<div id="app">

  <div>局部注册组件练习</div>

  <local-cmp></local-cmp>

  <hr>

  <local-cmp></local-cmp>

</div>



Js 部分:



var cmp = {

   data: function () {

        return {

          status:'Critical'

        }

    },

   template:'<p>Server status {{ status }} (<button @click="changeStatus">Change</button>)</p>',

   methods: {

      changeStatus(){

        this.status = "Nomal"

      }  

   },

};

var vm = new Vue({

  el: "#app",

  components:{'local-cmp':cmp}

})


微信小程序入门——环境搭建以及开发工具的认识

seo达人

环境搭建

首先在微信公众平台注册一个我们自己的账号:





根据注册提示完成注册


  1. 用我们刚刚注册好的账号登录,进入微信官方文档界面,下载微信开发者工具




  2. 根据提示安装好就可以登录创建工程了!



    开发工具的认识

    开发工具的界面详解:





    MINA框架:

    js文件:页面中的逻辑界面;用于功能编写

    wxml文件:配置页面元素及页面布局

    wxss文件:样式文件,对页面进行美化【在文件夹中重写时,覆盖默认的页面样式】

    json文件:页面的配置文件,例如tabBar的描述【在文件夹中重写时,覆盖默认的页面结构】



    App文件:

    App.js文件:用于注册一个小程序,并进行生命周期

    App.json负责整个App的配置:

    (1)pages:定义小程序的路由

    (2)window:定义小程序的顶部菜单

    (3)tabBar:定义小程序的底部Tab

    (4)networkTimeout:定义小程序的超时

    (5)debug:定义小程序的debug模式

    App.wxss样式会被整个App的页面引用,公用css可以写在这里



    创建工程

    1.登录微信开发者工具,进行工程创建的信息填写



    -项目名称必须与事先定好的路径最后一个文件名相同,如果没有,项目名称将会自动修改为路径里面最后一个文件名。若强行修改项目名称,则会出现一下错误,导致无法创建。


  3. 在微信公众平台找到我们的AppID,填在AppID的文本框内。也可以暂时使用测试号



    3.创建完成后,根据需要就可以自己修改代码,完成自己的小程序编写了!


Android 获取应用 MD5 SHA1 SHA256 签名信息

seo达人

闲着没事儿写了个小 demo ,获取手机上已安装应用信息,系统应用和 非系统应用

MD5 SHA1 SHA256 签名信息 点击签名信息可复制到剪切板,

GitHub:https://github.com/sunan-n/GetAppInfo

如下图:







<span style="white-space:pre;"> </span>主要就是这个方法,传参数进来获取相应的签名类型 信息<br />
&nbsp; &nbsp; public static String getSignaturesInfo(Context context, String packageName, String tpye) {<br />
//&nbsp; &nbsp; &nbsp; &nbsp; //获取包管理器<br />
&nbsp; &nbsp; &nbsp; &nbsp; PackageManager pm = context.getPackageManager();<br />
&nbsp; &nbsp; &nbsp; &nbsp; //返回包括在包中的签名信息<br />
&nbsp; &nbsp; &nbsp; &nbsp; int flags = PackageManager.GET_SIGNATURES;<br />
&nbsp; &nbsp; &nbsp; &nbsp; PackageInfo packageInfo = null;<br />
&nbsp; &nbsp; &nbsp; &nbsp; try {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //获得包的所有内容信息类<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; packageInfo = pm.getPackageInfo(packageName, flags);<br />
&nbsp; &nbsp; &nbsp; &nbsp; } catch (PackageManager.NameNotFoundException e) {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; e.printStackTrace();<br />
&nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; &nbsp; &nbsp; //签名信息<br />
&nbsp; &nbsp; &nbsp; &nbsp; Signature[] signatures = packageInfo.signatures;<br />
&nbsp; &nbsp; &nbsp; &nbsp; byte[] cert = signatures[0].toByteArray();<br />
&nbsp; &nbsp; &nbsp; &nbsp; //将签名转换为字节数组流<br />
&nbsp; &nbsp; &nbsp; &nbsp; InputStream input = new ByteArrayInputStream(cert);<br />
&nbsp; &nbsp; &nbsp; &nbsp; //证书工厂类,这个类实现了出厂合格证算法的功能<br />
&nbsp; &nbsp; &nbsp; &nbsp; CertificateFactory cf = null;<br />
&nbsp; &nbsp; &nbsp; &nbsp; try {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; cf = CertificateFactory.getInstance("X509");<br />
&nbsp; &nbsp; &nbsp; &nbsp; } catch (CertificateException e) {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; e.printStackTrace();<br />
&nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; &nbsp; &nbsp; //X509证书,X.509是一种非常通用的证书格式<br />
&nbsp; &nbsp; &nbsp; &nbsp; X509Certificate c = null;<br />
&nbsp; &nbsp; &nbsp; &nbsp; try {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; c = (X509Certificate) cf.generateCertificate(input);<br />
&nbsp; &nbsp; &nbsp; &nbsp; } catch (CertificateException e) {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; e.printStackTrace();<br />
&nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; &nbsp; &nbsp; String hexString = null;<br />
&nbsp; &nbsp; &nbsp; &nbsp; try {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //加密算法的类,这里的参数可以使MD4,MD5等加密算法<br />
//&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; MessageDigest md = MessageDigest.getInstance("SHA1");<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; MessageDigest md = MessageDigest.getInstance(tpye);<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //获得公钥<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; byte[] publicKey = md.digest(c.getEncoded());<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //字节到十六进制的格式转换<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; hexString = byte2HexFormatted(publicKey);<br />
&nbsp; &nbsp; &nbsp; &nbsp; } catch (NoSuchAlgorithmException e1) {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; e1.printStackTrace();<br />
&nbsp; &nbsp; &nbsp; &nbsp; } catch (CertificateEncodingException e) {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; e.printStackTrace();<br />
&nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; &nbsp; &nbsp; return hexString;<br />
&nbsp; &nbsp; }<br />
<br />

flutter 打包相关的事宜

seo达人

1.集成高德地图发布版和调试版的sha获取的问题



调试版,进入 ~/.android



执行



keytool -list -v -keystore debug.keystore



 



可以获得sha



 



2.发布版的sha获取需要找到发布版的key文件,例如



/Users/aboc/keys/phpec/key.jks



然后执行keytool -list -v -keystore /Users/aboc/keys/phpec/key.jks



会需要输入密码,密码在项目



android/key.properties 这个文件夹中,但密码是在创建的时候生成的



 



 



3.安卓打包的签名就是上面文件里面显示的md5



可以使用 一.查询keystore的MD5



可以在运行窗口,定位到keystore所在的路径,(以android默认keystore为例)执行cd /Users/aboc/.android定位到.android下



执行下面这条语句后就能显示Key的所有信息



keytool -list -v -keystore phpec.jks



这个方法获取到md5



或者用这里的这个工具



https://developers.weixin.qq.com/doc/oplatform/Downloads/Android_Resource.html


CSS BUG解决方法以及CSS BUG类的小技巧

seo达人

CSS bug是布局中最头疼的问题。我们需要兼顾各种浏览器,以期待获得一致的效果。非常遗憾的是各厂商之间的竞争导致很多问题的存在。而IE6与IE7在很多问题上也存在着很大的差别。在webjx.com大量的技术文档中,也包含了这方面的内容。轻松的解决CSS bug是我们必须掌握的技能。现在整理出最常用的12种CSS BUG解决方法以及CSS BUG类的小技巧。希望对您的学习、工作有所帮助新建一个前端学习qun438905713,在群里大多数都是零基础学习者,大家相互帮助,相互解答,并且还准备很多学习资料,欢迎零基础的小伙伴来一起交流。



一、 针对浏览器的选择器



这些选择器在你需要针对某款浏览器进行css设计时将非常有用.

IE6及其更低版本

  • html {}

    IE7及其更低版本

    :first-child+html {} html {}

    仅针对IE7

    *:first-child+html {}

    IE7和当代浏览器

    html>body{}

    仅当代浏览器(IE7不适用)

    html>/*/body{}

    Opera9及其更低版本

    html:first-child {}

    Safari

    html[xmlns
    =""] body:last-child {}

    要使用这些选择器,请将它们放在样式之前. 例如:


    content-box { 

    width: 300px; 

    height: 150px; 

    }



     


  • html #content-box { 

    width: 250px; 







    您也可以参考—CSS hacks:浏览器特定选择器介绍



    二、让IE6支持PNG透明



    一个IE6的Bug引起了大麻烦, 他不支持透明的PNG图片。

    你需要使用一个css滤镜

     



    *html #image-style { 

    background-image: none; 

    filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src="fil 

    ename.png", sizingMethod="scale"); 

    }





    三、移除超链接的虚线



    FireFox下,当你点击一个超链接时会在外围出现一个虚线轮廓. 这很容易解决, 只需要在标签样式中加入:

     



    outline:none.

    a{ 

    outline: none; 

    }





    您也可以参考—除链接元素的虚线框(兼容IE7、IE6、FF)



    四、给行内元素定义宽度



    如果你给一个行内元素定义宽度,那么它只是在IE6下有效. 所有的HTML元素要么是行内元素要么就好是块元素. 行内元素包括: <span>, <a>, <strong> 和 <em>. 块元素包括<div>, <p>, <h1>, <form>和<li> . 你不能定义行内元素的宽度, 为了解决这个问题你可以将行内元素转变为块元素.

     



    span { width: 150px; display: block }





    五、让固定宽度的页面居中



    为了让页面在浏览器居中显示, 需要相对定位外层div, 然后把margin设置为auto.

     


    wrapper { 

    margin: auto; 

    position: relative; 

    }





    六、IE6双倍边距的bug



    给此对象加上display:inline即可解决问题。具体介绍:



    七、Box Model 盒模型bug的一般解决办法





    八、两个层之间的3px间隙



    传说中的“IE 3px bug”,解决的办法:



    九、在IE中的HTML注释引起文字奇怪的复制



    Duplicate Characters Bug很神奇。



    十、图片替换技术



    用文字总比用图片做标题好一些. 文字对屏幕阅读机和SEO都是非常友好的.

     



    HTML:

    <h1><span>Main heading one</span></h1>

    CSS:

    h1 { background: url(heading-image.gif) no-repeat; } 

    h1 span { 

    position:absolute; 

    text-indent: -5000px; 







    你可以看到我们对标题使用了标准的<h1>作为标签并且用css来将文本替换为图片. text-indent属性将文字推到了浏览器左边5000px处, 这样对于浏览者来说就看不见了.

    关掉css,然后看看头部会是什么样子的.本文由webjx.com整理,转载请注明出处!



    十一、 最小宽度



    IE6另外一个bug就是它不支持 min-width 属性. min-width又是相当有用的, 特别是对于弹性模板来说, 它们有一个100%的宽度,min-width 可以告诉浏览器何时就不要再压缩宽度了.

    除IE6以外所有的浏览器你只需要一个 min-width: Xpx; 例如:

     



    .container { 

    min-width:300px; 

    }





    为了让他在IE6下工作, 我们需要一些额外的工作. 开始的时候我们需要创建两个div, 一个包含另一个:

     



    <div class="container"> 

    <div class="holder">Content</div> 

    </div>





    然后你需要定义外层div的min-width属性,本文由webjx.com整理,转载请注明出处!

     



    .container { 

    min-width:300px; 

    }





    这时该是IE hack大显身手的时候了. 你需要包含如下的代码:

     


  • html .container { 

    border-right: 300px solid #FFF; 


  • html .holder { 

    display: inline-block; 

    position: relative; 

    margin-right: -300px; 

    }





    As the browser window is resized the outer div width reduces to suit until it shrinks to the border width, at which point it will not shrink any further. The holder div follows suit and also stops shrinking. The outer div border width becomes the minimum width of the inner div.



    十二、隐藏水平滚动条



    为了避免出现水平滚动条, 在body里加入 overflow-x:hidden .

     



    body { overflow-x: hidden; }





    当你决定使用一个比浏览器窗口大的图片或者flash时, 这个技巧将非常有用


css教程:可读性可维护性良好的CSS文件

seo达人

大多数文章中,我们并未特别注意CSS文件的可维护与可读性的问题,当完成一项前端的工作之后,许多人都会忘记该项目的结构与细节。然而代码并不是马上就能完全定型,在余下的时间里还有不断的维护工作,而这些工作也许不会是你自己完成。所以,结构优良的代码能很大程度上优化它的可维护性。下面列出四则技巧提高CSS文件可维护性的方法,以此作为指南,以一种较好的CSS样式组织习惯来进行WEB前端开发。



一、CSS样式文件分解



对于小项目,在写代码之前,按页面结构或页面内容将代码分为几块并给予注释。例如,可以分别将 全局样式、布局、字体样式、表单、评论和其他分为几个不同的块来继续工作。



而对于较大的工程,这样显然不会有什么效果。此时,就需要将样式分解到几个不同的样式表文件。下面的master stylesheet 就是这一方法的例子,它的工作主要是导入其他样式文件。使用这一方法不仅能优化样式结构,而且有利于减少一些不必要的服务器请求。而分解文件的方法就有许多种,master stylesheet 使用了最常见的一种。



@import "reset.css";

@import "layout.css";

@import "colors.css";

@import "typography.css";

@import "flash.css";

/ @import "debugging.css"; /



同时对于大型项目,你也可以加上CSS文件的升级标志或者一些诊断等其他措施,这里不再详述。大家注意在实现工作中总结与思考,也欢迎多参考webjx.com的相关文章。



二、为CSS文件建立索引



为了能够迅速的了解整个CSS文件的结构,在文件开头建立文件索引是一个不错的选择。

一种可行的方法是建立树形的索引,结构上的id 和 class 都可以成为该树的一个分支。



[Layout]

  • body

          + Header / #header

          + Content / #content

                - Left column / #leftcolumn

                - Right column / #rightcolumn

                - Sidebar / #sidebar

                - RSS / #rss

                - Search / #search

                - Boxes / .box

                - Sideblog / #sideblog

          + Footer / #footer

    Navigation         #navbar

    Advertisements         .ads

    Content header         h2



    或者也可以这样:



    [Contents]

          1. Body

          2. Header / #header

                2.1. Navigation / #navbar

          3. Content / #content

                3.1. Left column / #leftcolumn

                3.2. Right column / #rightcolumn

                3.3. Sidebar / #sidebar

                      3.3.1. RSS / #rss

                      3.3.2. Search / #search

                      3.3.3. Boxes / .box

                      3.3.4. Sideblog / #sideblog

                      3.3.5. Advertisements / .ads

          4. Footer / #footer



    新建一个前端学习qun438905713,在群里大多数都是零基础学习者,大家相互帮助,相互解答,并且还准备很多学习资料,欢迎零基础的小伙伴来一起交流。



    另一种方式可以只是先简单的将内容列举出来,也不需要缩进。下面的一个例子中,如果你需要跳至RSS部分你只需要简单的搜索。



    [Contents]
    1. Body
    2. Header / #header
    3. Navigation / #navbar
    4. Content / #content
    5. Left column / #leftcolumn
    6. Right column / #rightcolumn
    7. Sidebar / #sidebar
    8. RSS / #rss
    9. Search / #search
    10. Boxes / .box
    11. Sideblog / #sideblog
    12. Advertisements / .ads
    13. Footer / #footer

      /--[8. RSS / #rss]--/

      rss { ... }

      rss img { ... }



      定义这样一个样式检索可以很有效的使其他人阅读学习你的代码变得容易。在制作大项目的时候,你也可以将检索打印出来从而在你阅读代码的时候方便查阅。您还可以参考下面的文章。



      三、格式化CSS属性



      当我们编写代码的时候,使用一些特殊的编码风格会对提高CSS代码的可读性有很大帮助。许多人都有各自不同的编码风格。一部分人习惯于将颜色和字体的代码放在前面,另外一部分则更喜欢将类似浮动和定位的更“重要”的属性放在前面。类似的,也可以将页面元素按照它在布局中的结构进行排序:



          body,

                h1, h2, h3,

                p, ul, li,

                form {

                        margin: 0;

                        padding: 0;

                        border: 0;

                 }



      一些开发者用一种更为有意思的方法:他们将属性按首字母的顺序排列。值得注意的是,这样一种方法可能对某些浏览器会产生问题。不管自己的格式如何,你要确保你已经清晰的定义了这些格式方法。这样,你的同事在阅读你的代码的时候将会感谢你的努力。您还可以参考下面的文章。



      四、合理的利用缩进



      为了让你的代码给人感觉更为直观,你可以使用一行来定义大纲元素的样式。当指定的选择器里的属性超过三个的时候,这种方式将带来混乱。但是,适度的使用这种方式,你可以很清楚的区分相同类的不同点。


      main-column { display: inline; float: left; width: 300px; }

          #main-column h1 { margin-bottom: 20px; }

          #main-column p { color: #333; }



      同时,样式修改的维护也是个比较麻烦的问题。很多人修改样式之后就忘记了,结果后来又发现修改的样式导致了页面出错,不得不苦苦寻找。因此,为修改的样式构建一个特殊的格式就很必要了。一种很简单的方式是,给修改过的样式缩进,同时,也可以使用一些注释(比如"@new")来做一个标识。


      sidebar ul li a {

             display: block;

             background-color: #ccc;

                  border-bottom: 1px solid #999; / @new /

             margin: 3px 0 3px 0;

                  padding: 3px; / @new /

      }



      总的来说,只有建立一个合适的样式指南才会对样式表的可读性有所帮助。记住,移去每一个对你理解文件没有帮助的样式指南,避免对过多的元素使用过多的样式指南。然后,为了一个可读性可维护性良好的CSS文件而努力吧。不要忘记和webjx.com分享您的经验,欢迎参与评论


CSS初学:如何修改Zblog中的CSS

seo达人

在学习应用css之前我们要先了解一下什么是css。CSS是Cascading Style Sheets(层叠样式表)的简称.


  • CSS语言是一种标记语言,它不需要编译,可以直接由浏览器执行(属于浏览器解释型语言).


  • 在标准网页设计中CSS负责网页内容(XHTML)的表现.


  • CSS文件也可以说是一个文本文件,它包含了一些CSS标记,CSS文件必须使用css为文件名后缀.


  • 可以通过简单的更改CSS文件,改变网页的整体表现形式,可以减少我们的工作量,所以她是每一个网页设计人员的必修课.


  • CSS是由W3C的CSS工作组产生和维护的.



    新建一个前端学习qun438905713,在群里大多数都是零基础学习者,大家相互帮助,相互解答,并且还准备很多学习资料,欢迎零基础的小伙伴来一起交流。



    了解了什么是css后我们就可以方便对其应用了,我们可以用以下两种方式加入你的博客当中去,由于css的应用方式有就近原则。也就是说最接近目标的样式定义优先权越高。高优先权样式将继承低优先权样式的未重叠定义但覆盖重叠的定义。



    链入外部样式表文件 (Linking to a Style Sheet)



    你可以先建立外部样式表文件(.css),然后使用HTML的link对象。示例如下:



    <head>

    <title>文档标题</title>

    <link rel=stylesheet href="http://www.123-seo,cn/dhtmlet.css" type="text/css">

    </head>



    而在XML中,你应该如下例所示在声明区中加入:



    <? xml-stylesheet type="text/css" href="http://www.123-seo.cn/dhtmlet.css" ?>



    定义内部样式块对象 (Embedding a Style Block)



    你可以在你的HTML文档的<HTML>和<BODY>标记之间插入一个<STYLE>...</STYLE>块对象。 定义方式请参阅样式表语法。示例如下:



    <html>

    <head>

    <title>文档标题</title>

    <style type="text/css">

    <!--

    body {font: 10pt "Arial"}

    h1 {font: 15pt/17pt "Arial"; font-weight: bold; color: maroon}

    h2 {font: 13pt/15pt "Arial"; font-weight: bold; color: blue}

    p {font: 10pt/12pt "Arial"; color: black}

    -->

    </style>

    </head>

    <body>



    请注意,这里将style对象的type属性设置为"text/css",是允许不支持这类型的浏览器忽略样式表单。


css对边框的属性控制和链接的伪类选择器

seo达人

边框(border): css控制的边框属性包括border-width, border-color, border-style.



Border之所以让人很困惑主要源于IE5错综复杂的BUG, 由于IE5是一个“will soon be dead” 的浏览器, 这里只例举一个最为知名的关于border-width的BUG, 让大家更好的理解border的含义, 先看下图:







如上图所示, 对象A(白色矩形)周围有蓝色边框B, 可以看出A的实际宽度为ef, 而IE5不这么认为, 它把cd的长度定义为对象A的宽度, 这个bug在边框的宽度小时几乎察觉不到, 但在边框与对象宽度相差不大时显得尤为明显.



新建一个前端学习qun438905713,在群里大多数都是零基础学习者,大家相互帮助,相互解答,并且还准备很多学习资料,欢迎零基础的小伙伴来一起交流。



现在, 结合以上说明, 可以看出border是独立于对象之外, 位于magin与padding之间(后说明), 具有固定宽度, 颜色和样式的区域.


  1. border-width: 其可有具体数值(如1px, 2px等)或是描述性(thin, medium, thick)的属性值. 由于浏览器及个人设置的不同导致thin, medium, thick这些属性值的表现不一, 不推荐使用. css代码如下:



    border-width: 1px;

    border-width: 2px;

    border-width: thin;

    border-width: medium;

    border-width: thick;



    宽度效果如下(注意不同浏览器下的区别):



     1px    2px    thin    medium    thick 


  2. border-style: 边框样式包括solid, dashed, dotted, double, groove, ridge, inset, outset等, 代码如下:



    border-style: solid;

    border-style: dashed;

    border-style: dotted;

    border-style: double;

    border-style: groove;

    border-style: ridge;

    border-style: inset;

    border-style: outset;



    样式效果如下(你可能需要Firefox或是Opera才能看到后四种效果):



     solid   



     dashed   



     dotted   



     double   



     groove   



     ridge   



     inset   



     outset   


  3. border-color: 边框颜色属性和一般颜色属性是一样的, 可以参看属性篇(1).



    Summary: 以上例举的都是四边相同样式的情况, 其实可以分别设置border-top, border-right, border-bottom, border-left四边的属性, 比方说想要表现一个宽2px, 蓝色(blue), 样式为solid的上下边框, 代码如下:



    border-top-width: 2px;

    border-top-color: blue;

    border-top-style: solid;

    border-bottom-width: 2px;

    border-bottom-color: blue;

    border-bottom-style: solid;



    简写为:



    border-top: blue 2px solid;

    border-bottom: blue 2px solid;



    表现如下:



     宽2px,蓝色,样式为solid的边框 



    链接(link): 在html里用<a></a>标明链接, 在css里用a作为链接的选择器名.



    css的缺点和它的优点一样明显, 其最大的缺陷就在于网页的动态表现不足, 在这一点上和Flash差距尤为突出.



    好在css还是留了一手, 那就是链接的伪类选择器, 所谓伪类就是指依赖于浏览器或是用户的状态. 对于链接来讲, 存在link, hover, visited, active四种状态, 即四种伪类选择器: a:link(存在链接, 但无鼠标动作), a:visited(被点击或访问过), a:hover(鼠标悬停于链接上时的状态), a:active(鼠标点击与释放之间的状态).



    css便是以这几个伪类选择器实现了其为数不多的动态效果. 目前最为常用的就是导航条和按钮的动态显示. 以下用一个动态按钮的实例来说明这四个伪类选择器.


  4. 首先准备一副图片(button.png), 如下图(160px240px), 其由四幅160px60px的小图自上而下排列而成.



     






  5. 接着需要往你的本地调试文件夹(调试环境的建立方法参考属性(1)中的说明)的index.htm中写入html代码, 如下:



    <div id=”button”><a href=”#”></a></div>


  6. 在style.css中写入以下代码:



    body {background-color: #FFF;}

    button a{

    width:160px;

    height:60px;

    display:block;

    background:url(../image/button.png) no-repeat 0 0;


    button a:link { background-position:0 0;}

    button a:hover { background-position:0 -60px;} 

    button a:active { background-position:0 -120px;}

    button a:visited { background-position:0 -180px;}



    可以看到如 Example2 的效果.


  7. 代码解释:



    <div id=”button”><a href=”#”></a></div>



    在index.htm写入如上代码, 目的在于插入一个id名为”button”的盒子(div),且其内含有一个链接<a href=”#”></a>.


    button a{

    width:160px;

    height:60px;

    display:block;

    background:url(../image/button.png) no-repeat 0 0;

    }



    在css文件中写入以上代码, 目的在于控制盒子中链接的表现, 通过名为”#button a”的选择器来实现. 链接的宽高为160px*60px, 背景为图片button.png.



    在这强调一下display:block的作用. 由于在html文件中,链接<a href=”#”> </a>中没有任何的内容(content)填充, 如果没有声明”display:block”, 那么即使声明了选择器”#button a”的宽高, 浏览器也会因为html文件中没有内容而无法显示链接. 所以”display:block”在这里的作用就在于强制浏览器显示没有内容填充的链接. 


    button a:link { background-position:0 0;}



    用伪类选择器a:link声明链接的背景图片在左上角显示, 即距离左边和顶边分别0, 0. 但由于已经在选择器 “#button a”中声明了图片位置, 此代码可有可无.


    button a:hover { background-position:0 -60px;} 

    button a:active { background-position:0 -120px;}

    button a:visited { background-position:0 -180px;}



    用伪类选择器a:hover声明鼠标悬停时, 背景图片上移60px, 而使排在第二位的绿色小图片显示出来;



    用伪类选择器a:active声明在鼠标点击与释放之间的状态时, 背景图片上移120px, 而使排在第三位的红色小图片显示;



    用伪类选择器a:visited声明在链接被点击或访问过时, 背景图片上移180px, 而使排在第四位的灰色小图片显示;



    现在你基本了解了css动态按钮的制作过程, 但以上css代码还存在一个严重的缺陷, 相信你会很快发现问题所在——这个按钮居然是一个”一次性按钮“, 也就是说这个按钮在点击第一次后, 就一直显示那个灰色小图片, 你能想出解决方法吗?


JavaScript中的this/call/apply/bind

seo达人

文章目录

一、this

1.什么是this

2.this 代表什么

3.绑定 this 的方法

4.this的指向

5.改变指向

二、Function.prototype.bind()

三、call/apply

1.定义

2.语法

3.异同

一、this

1.什么是this

this 关键字在大部分语言中都是一个重要的存在,JS中自然不例外,其表达的意义丰富多样甚至有些复杂,深刻理解this是学习JS、面向对象编程非常重要的一环。



2.this 代表什么

this代表函数(方法)执行的上下文环境(上下文,类似与你要了解一篇文章,了解文章的上下文你才能清晰的了解各种关系)。



但在 JavaScript 中 this 不是固定不变的,它会随着执行环境的改变而改变。



1.在方法中,this 表示该方法所属的对象。



2.如果单独使用,this 表示全局对象。



3.在函数中,this 表示全局对象。



4.在函数中,在严格模式下,this 是未定义的(undefined)。



5.在事件中,this 表示接收事件的元素。



6.类似 call() 和 apply() 方法可以将 this 引用到任何对象。



3.绑定 this 的方法

this的动态切换,固然为 JavaScript 创造了巨大的灵活性,但也使得编程变得困难和模糊。有时,需要把this固定下来,避免出现意想不到的情况。JavaScript 提供了call、apply、bind这三个方法,来切换/固定this的指向。



4.this的指向

1.在一般函数方法中使用 this 指代全局对象



function test(){

this.x = 1;  //这里this就是window

console.log(this.x);

}

test(); // 1



JS规定,函数中的this,在函数被调用时确定,它指函数当前运行的环境。



2.作为对象方法调用,this 指代上级对象



var x =3;

function test(){

alert(this.x);

}

var o = {

  x:1,

  m:test 

};

o.m(); // 1



如果函数作为对象的方法时,方法中的 this 指向该对象。



3.作为构造函数调用,this 指代new 出的对象



function test(){

console.log(this);

}

var o = new test();

       test();

//可以看出o代表的不是全局对象



new关键词的作用是调用某个函数并拿到其中的返回值,只是调用过程稍特殊。在上面的代码实例中。test函数被new关键词调用时,内部依次执行了以下步骤:



(1)创建一个空对象。



(2)将这个空对象的原型,指向这个构造函数的prototype。



(3)将空对象的值赋给函数内部的this(this就是个空对象了)。



(4)执行函数体代码,为this这个对象绑定键值对。



(5)返回this,将其作为new关键词调用oop函数的返回值。



所以构造函数中的this,依旧是在构造函数被new关键词调用时确定其指向,指向的是当前被实例化的那个对象。



4.箭头函数中的this

箭头函数是ES6的新特性,最重要的特点是它会捕获其所在上下文的this作为自己的this,或者说,箭头函数本身并没有this,它会沿用外部环境的this。也就是说,箭头函数内部与其外部的this是保持一致的。



this.a=20

var test={

    a:40,

    init:()=>{

        console.log(this.a)

        function go(){

            this.a=60

            console.log(this.a)

        }

        go.prototype.a=50

        return go

    }   

}



var p=test.init()

p()

new (test.init())()

//输出 20 60 60 60



5.改变指向

this的动态切换,固然为 JavaScript 创造了巨大的灵活性,但也使得编程变得困难和模糊。有时,需要把this固定下来,避免出现意想不到的情况。JavaScript 提供了call、apply、bind这三个方法,来切换/固定this的指向。



bind方法和apply、call稍有不同,bind方法返回一个新函数,以后调用了才会执行,但apply、call会立即执行。



二、Function.prototype.bind()

bind()方法主要就是将函数绑定到某个对象,bind()会创建一个函数,函数体内的this对象的值会被绑定到传入bind()中的第一个参数的值,例如:f.bind(obj),实际上可以理解为obj.f(),这时f函数体内的this自然指向的是obj;



示例:



function f(y, z){

    return this.x + y + z;

}

var m = f.bind({x : 1}, 2);

console.log(m(3));

//6

1

2

3

4

5

6

这里bind方法会把它的第一个实参绑定给f函数体内的this,所以这里的this即指向{x : 1}对象,从第二个参数起,会依次传递给原始函数,这里的第二个参数2,即是f函数的y参数,最后调用m(3)的时候,这里的3便是最后一个参数z了,所以执行结果为1 + 2 + 3 = 6分步处理参数的过程其实是一个典型的函数柯里化的过程(Curry)。



三、call/apply

1.定义

每个函数都包含两个非继承而来的方法:call()方法和apply()方法。



call和apply可以用来重新定义函数的执行环境,也就是this的指向;call和apply都是为了改变某个函数运行时的context,即上下文而存在的,换句话说,就是为了改变函数体内部this的指向。



2.语法

call()



调用一个对象的方法,用另一个对象替换当前对象,可以继承另外一个对象的属性,它的语法是:



Function.call(obj[, param1[, param2[, [,...paramN]]]]);

1

obj:这个对象将代替Function类里this对象

params:一串参数列表



说明:call方法可以用来代替另一个对象调用一个方法,call方法可以将一个函数的对象上下文从初始的上下文改变为obj指定的新对象,如果没有提供obj参数,那么Global对象被用于obj。



apply()



和call()方法一样,只是参数列表不同,语法:



Function.apply(obj[, argArray]);



obj:这个对象将代替Function类里this对象

argArray:这个是数组,它将作为参数传给Function



说明:如果argArray不是一个有效数组或不是arguments对象,那么将导致一个TypeError,如果没有提供argArray和obj任何一个参数,那么Global对象将用作obj。



3.异同

相同点



call()和apply()方法的相同点就是这两个方法的作用是一样的。都是在特定的作用域中调用函数,等于设置函数体内this对象的值,以扩充函数赖以运行的作用域。



一般来说,this总是指向调用某个方法的对象,但是使用call()和apply()方法时,就会改变this的指向,看个例子:



function add(a, b) {

    return a + b;

}



function sub(a, b) {

    return a - b;

}



console.log(add.call(sub, 2, 1));//3



为什么add.call(sub, 2, 1)的执行结果是3呢,因为call()方法改变了this的指向,使得sub可以调用add的方法,也就是用sub去执行add中的内容,再来看一个例子:



function People(name, age) {

    this.name = name;

    this.age = age;

}



function Student(name, age, grade) {

    People.call(this, name, age);

    this.grade = grade;

}



var student = new Student('小明', 21, '大三');

console.log(student.name + student.age + student.grade);//小明21大三



在这个例子中,我们并没有给Student的name和age赋值,但是存在这两个属性的值,这还是要归功于call()方法,它可以改变this的指向。

在这个例子里,People.call(this, name, age);中的this代表的是Student,这也就是之前说的,使得Student可以调用People中的方法,因为People中有this.name = name;等语句,这样就将name和age属性创建到了Student中。



总结一句话就是call()可以让括号里的对象来继承括号外函数的属性。



至于apply()方法作用也和call()方法一样,可以这么写:



People.apply(this, [name, age]);

1

或者这么写:



People.apply(this, arguments);

1

在这里arguments和[name, age]是等价的。



不同点



从定义中也可以看出来,call()和apply()的不同点就是接收参数的方式不同。



1.apply()方法接收两个参数,一个是函数运行的作用域(this),另一个是参数数组。

2.call()方法不一定接受两个参数,第一个参数也是函数运行的作用域(this),但是传递给函数的参数必须列举出来。



在给对象参数的情况下,如果参数的形式是数组的时候,比如之前apply()方法示例里面传递了参数arguments,这个参数是数组类型,并且在调用Person的时候参数的列表是对应一致的(也就是Person和Student的参数列表前两位是一致的)就可以采用apply()方法。



但是如果Person的参数列表是这样的(age,name),而Student的参数列表是(name,age,grade),这样就可以用call()方法来实现了,也就是直接指定参数列表对应值的位置Person.call(this,age,name)。


日历

链接

blogger

蓝蓝 http://www.lanlanwork.com

存档