首页

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)。


Web前端学习—如何在网页中插入字体图标详细步骤

seo达人

一、什么是字体图标

字体图标:简单的说,就是一种特殊的字体,通过这种字体,显示给用户的就像一个个图片一样,但它的本质是文字。目前在移动端应用比较广泛!







二、字体图标的使用步骤

这里以阿里巴巴矢量图标库为例!!!



sep1:

百度搜索iconfont,找到阿里巴巴矢量图标库官网



网址在这里https://www.iconfont.cn/

进去之后注册或登录,共有3种登录方式,在这里我使用新浪微博账号登录





好了,登录之后我们就可以在里面选择自己想要的字体图标啦!!!那么,如何选择下载并应用到自己的项目中呢??别着急,跟着我走!



sep2:下载字体图标字体库

在这里我们可以根据自己的需求输入相应的关键字进行搜索(中英文都可以)



鼠标放上去,然后就可以把自己喜欢的宝贝加入购物车啦!



网购的赶脚有木有,

我知道,看到这里大家就该有疑问了,

还要花钱买吗?

放心!

答案是:不需要!



我们选的东西都在购物车里啦!



打开购物车,就能看到你选的图标了!!

接下来你要做的是把它们下载到本地。



由于要在网页中使用

在这里我们选择 下载代码



下载后将压缩包解压,为了方便后续使用我们改一下文件夹名称,在这里我改为 icon (注意:在HTML中导入路径时,记得带上你所改的文件夹名称)



打开之后你会发现里面有不同类型的文件(建议都不要删除)



打开后缀名为.html的这个文件(可以更直观地查看自己下载的字体图标)







step3:在项目中引用字体图标

不要走开,重点来了!!!

官方提供了三种引用方法(下面对应的都有步骤)





Unicode 引用

Unicode 是字体在网页端最原始的应用方式,特点是:

兼容性最好,支持 IE6+,及所有现代浏览器。

支持按字体的方式去动态调整图标大小,颜色等等。

但是因为是字体,所以不支持多色。只能使用平台里单色的图标,就算项目里有多色图标也会自动去色。

注意:新版 iconfont 支持多色图标,这些多色图标在 Unicode 模式下将不能使用,如果有需求建议使用symbol 的引用方式

Unicode 使用步骤如下

第一步:拷贝项目下面生成的 @font-face

@font-face { font-family: 'iconfont'; src: url('iconfont.eot'); src: url('iconfont.eot?#iefix') format('embedded-opentype'), url('iconfont.woff2') format('woff2'), url('iconfont.woff') format('woff'), url('iconfont.ttf') format('truetype'), url('iconfont.svg#iconfont') format('svg'); }

第二步:定义使用 iconfont 的样式

.iconfont { font-family: "iconfont" !important; font-size: 16px; font-style: normal; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; }

第三步:挑选相应图标并获取字体编码,应用于页面

<span class="iconfont">&#x33;</span>



font-class 引用

font-class 是 Unicode 使用方式的一种变种,主要是解决 Unicode 书写不直观,语意不明确的问题。

与 Unicode 使用方式相比,具有如下特点:

兼容性良好,支持 IE8+,及所有现代浏览器。

相比于 Unicode 语意明确,书写更直观。可以很容易分辨这个 icon 是什么。

因为使用 class 来定义图标,所以当要替换图标时,只需要修改 class 里面的 Unicode 引用。

不过因为本质上还是使用的字体,所以多色图标还是不支持的。

使用步骤如下:

第一步:引入项目下面生成的 fontclass 代码:

<link rel="stylesheet" href="./iconfont.css">

第二步:挑选相应图标并获取类名,应用于页面:

<span class="iconfont icon-xxx"></span>



symbol 引用

这是一种全新的使用方式,应该说这才是未来的主流,也是平台目前推荐的用法。相关介绍可以参考这篇文章 这种用法其实是做了一个 SVG 的集合,与另外两种相比具有如下特点:

支持多色图标了,不再受单色限制。

通过一些技巧,支持像字体那样,通过 font-size, color 来调整样式。

兼容性较差,支持 IE9+,及现代浏览器。

浏览器渲染 SVG 的性能一般,还不如 png。

使用步骤如下:

第一步:引入项目下面生成的 symbol 代码:

<script src="./iconfont.js"></script>

第二步:加入通用 CSS 代码(引入一次就行):

<style> .icon { width: 1em; height: 1em; vertical-align: -0.15em; fill: currentColor; overflow: hidden; } </style>

第三步:挑选相应图标并获取类名,应用于页面:

<svg class="icon" aria-hidden="true"> <use xlink:href="#icon-xxx"></use> </svg>



下面,我就跟大家详细说说 font-class 引用的引用方式:



打开编辑器(在这里我使用的是 VS Code编辑器),新建一个项目文件夹(demo)





将解压后的字体图标文件夹(icon)直接放到demo目录下





在demo文件夹下面新建一个html文件 demo.html



导入icon文件夹里面的外部样式表

<link rel="stylesheet" href="./icon/iconfont.css">



iconfont.css 里面就是我们下载的字体图标的所有css样式了,我们打开看看吧!

你会发现里面有一个 iconfont类名(这里划重点!后面要用),它是所有字体图标的公用样式。





这时我们就可以在页面中使用这些字体图标啦!上面我们只是导入了整个css样式表,现在我们要针对性地把某个图标引用到html页面中,并在网页中显示出来。

下面 我们就开始写页面的主体部分吧!



<p> 我有一个梦想:能够拥有一套 <span class="iconfont icon-home"></span> </p>

这里的span标签里面放的就是要用的某个字体图标了,你会发现它用了两个class类名。

第一个是iconfont,也就是我前面划的重点(到这里不明白的话,可以再回头看看)

第二个是icon-home,这个类名从何而来呢?

来,继续往下看,再次打开icon文件夹下的



话不多说,直接看图



是不是对应上啦!简单地说就是你要用那个图标就添加它的class类名。



到这里,恭喜你已经学会了如何在网页中插入字体图标啦!!!

那么,赶快运行一下看看效果吧!



到这里是不是还满足不了你的需求,会有这样的疑问:如果是这样的效果,跟一张图片有什么区别呢???

当然不是啦!

之所以叫做字体图标,顾名思义,它在网页中就是一种字体的存在,不过它比普通字体长得好看些有木有!

我们可以像更改文字样式一样去更改它的样式,比如说 大小、颜色、阴影…



Symbol 引用方式还可以实现下面原图标的彩色效果哦!可以自己照着官方提供的步骤试试看





下面附上Font class引用方法的 源代码 供参考

前面的步骤一定要看!!!

如果前期工作没做的话,直接用我的源代码是实现不了的。



<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <title>字体图标</title>

    <link rel="stylesheet" href="./icon/iconfont.css">

    <style>

        .iconfont{

            font-size: 200px;

            color: palevioletred;

            text-shadow: 18px 17px 17px gray;

        }

    </style>

</head>

<body>

    <p>

        我有一个梦想:能够拥有一套

        <span class="iconfont icon-home"></span>

    </p>

</body>

</html>

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

花费了很长时间整理出来的。

很简单是不是!!!

看到这里还不会的话,建议重新再看一遍!



其中有错误的话,还请指出,我会虚心接受并改正!!!

————————————————

版权声明:本文为CSDN博主「Humy.」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/weixin_42678796/article/details/104569773

JavaScript基础知识——JS预解析

seo达人

JavaScript基础知识——JS预解析

js代码是由浏览器中的JavaScript解析器来执行的。JavaScript解析器在运行JavaScript代码时分为两步:1预解析、2代码执行。



预解析

预解析是指js引擎会把js里面所有的var与function提升到当前作用域的最前面。(这里的当前作用域包括:全局作用域与局部作用域)。

预解析可分为:变量预解析和函数预解析

变量预解析:就是把所有的变量声明提升到当前的作用域的最前面但是不提升赋值操作。如下例所示:



<script>

console.log(num);  //结果为undefined

var num = 10;

</script>

//其实际执行过程为

var num;

console.log(num);

num=10;



函数预解析:就是把所有的函数声明提升到当期作用域的最前面 但是不包括调用函数。如下例所示:



var num = 10

fun();

function fun() {   //结果是undefined

console.log(num);

var num = 20;

}

//其实际执行过程为

var num;

funtion fun() {

var num;

console.log(num);

num=20;

}

num = 10;

fun();




在idea中使用jdbc往数据库里储存中文乱码问题

seo达人

在idea中使用jdbc往数据库里储存中文乱码问题

这里使用的数据库是mysql。

ide为idea.

有时做一些web项目时需要往数据库里面储存中文,就是需要用到jdbc往数据库里面储存数据时,参数改为中文。可是储存完之后,打开sqlyog查询又是???这样子的乱码



上网找了很多方法,数据库的编码问题都改了,而且统一成utf-8了,但还是储存时为乱码。

后面检查时在sqlyog里改中文又可以正常显示。

这就说明数据库上是没有问题的,应该是连接这块,于是在连接的url上加入了参数就可以正常显示了characterEncoding=UTF-8



这里使用的是c3p0的连接池,不同的连接池可以去对应的配置文件中加上参数




日历

链接

个人资料

蓝蓝设计的小编 http://www.lanlanwork.com

存档