<address id="ttjl9"></address>

      <noframes id="ttjl9"><address id="ttjl9"><nobr id="ttjl9"></nobr></address>
      <form id="ttjl9"></form>
        <em id="ttjl9"><span id="ttjl9"></span></em>
        <address id="ttjl9"></address>

          <noframes id="ttjl9"><form id="ttjl9"></form>

          首頁

          CentOS7 關于啟動Apache(httpd)服務

          前端達人

          想要啟動apache(httpd)服務,執行以下命令都不行↓

          service httpd start (sentos7之前版本的命令) 
          
          • 1
          systemctl start httpd命令(sentos7之后版本的命令) 
          
          • 1
          /etc/init.d/httpd start 
          
          • 1

          出現以下結果,如圖:
          在這里插入圖片描述
          在這里插入圖片描述
          1.使用命令yum install httpd httpd-devel 安裝完apache

          yum install httpd httpd-devel 
          
          • 1

          在這里插入圖片描述
          2. 然后等待,會出現需要確認下載項 y/d/n 輸入y,Enter即可
          在這里插入圖片描述
          3.等待安裝完成之后,可使用命令啟動apache
          在這里插入圖片描述
          4.可通過命令 service httpd status查看apache運行狀態

           service httpd status(cemtos6)
            systemctl status httpd(centos7) 
          
          • 1
          • 2

          在這里插入圖片描述
          5.也可以在虛擬機的瀏覽器中查看apache的頁面,如果裝成功了能訪問到的頁面如圖,用120.0.1或者是通過ip訪問
          在這里插入圖片描述
          6.查看ip的命令是ifconfig
          ifconfig在這里插入圖片描述
          在這里插入圖片描述
          擴展:

          systemctl start httpd.service #啟動
          
          systemctl stop httpd.service #停止
          
          systemctl restart httpd.service #重啟
          
          systemctl enable httpd.service #開機自啟
          
          systemctl disable httpd.service #開機不啟動




          藍藍設計建立了UI設計分享群,每天會分享國內外的一些優秀設計,如果有興趣的話,可以進入一起成長學習,請掃碼藍小助,報下信息,藍小助會請您入群。歡迎您加入噢~~希望得到建議咨詢、商務合作,也請與我們聯系。

          截屏2021-05-13 上午11.41.03.png


          轉自:csdn

          分享此文一切功德,皆悉回向給文章原作者及眾讀者.

          免責聲明:藍藍設計尊重原作者,文章的版權歸原作者。如涉及版權問題,請及時與我們取得聯系,我們立即更正或刪除。

          藍藍設計www.syprn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務





          優秀網站設計賞析

          前端達人

          很多網站仍然在使用老舊的頁面設計,比如國內一些企業官網,萬年不變的相類似的模板,外國的則是hero頁面,帶CTA按鈕,三欄式的布局。這些設計不能說是不好的設計,很實用,用戶能夠預測展示的內容,也容易找到需要的內容。但是正因為可預測,用戶沒有新鮮感,沒有期待,所以我們找了一些不僅打破常規,也依然有良好用戶體驗的網頁設計。

          接下來是精彩的UI設計賞析

          WechatIMG2092.jpegWechatIMG2093.jpegWechatIMG2094.jpegWechatIMG2095.jpegWechatIMG2096.jpegWechatIMG2097.jpegWechatIMG2100.jpegWechatIMG2099.jpegWechatIMG2098.jpeg


          藍藍設計建立了UI設計分享群,每天會分享國內外的一些優秀設計,如果有興趣的話,可以進入一起成長學習,請掃碼藍小助,報下信息,藍小助會請您入群。歡迎您加入噢~~希望得到建議咨詢、商務合作,也請與我們聯系。

          截屏2021-05-13 上午11.41.03.png

            藍藍設計www.syprn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服



            更多精彩文章:

                 ui界面設計之網站設計案例欣賞(一)

                 超贊的創意頁面排版設計,打造“視”不可擋的網頁設計

                超贊的網頁設計+精美流程圖賞析

                 超贊的網站設計賞析



          table td的寬度詳解

          前端達人

          前言:一直總覺得td的寬度好難駕馭,但萬事萬物總是有規律的。就像亮劍說的:不用因為怕八路就敬而遠之,應該靠上去,熟悉他們,了解他們。

          正文:

          • Table只有Table的寬度是可以設置的,并且各個瀏覽器理解一致

          • 1.原則上應該講table的寬度設置成一個固定的值,而不應該設置成一個根據屏幕變化的值
            Table的寬度為600px,Table的td所有寬度總和不到600px,瀏覽器會自動按照td的寬度的比例算出寬度

            <table style="width: 600px;border-collapse: collapse;" > <tr> <td style="width: 200px;">我是200px</td> <td style="width: 200px;">我也是200px</td> </tr> </table>  
                    
            • 1
            • 2
            • 3
            • 4
            • 5
            • 6

            運行結果:兩個td都是300px;

          • 2.Table的寬度為600px,前兩個td的寬度已經為600px,那么第三個td的寬度沒有指定,這樣的話第三個td的寬度是根據內容出現寬度的,然后前兩個再按照比列計算、
            前兩個td小于table寬度,那么最后一個td就起到補全的作用

             <table style="width: 600px;border-collapse: collapse;" > <tr> <td style="width: 300px;">我是200px</td> <td style="width: 300px;">我也是200px</td> <td >我是根據內容的</td> </tr> </table>  
                    
            • 1
            • 2
            • 3
            • 4
            • 5
            • 6
            • 7
          • 3.Table中的td內,如果放置塊狀元素超過td的寬度,并且table的table-layout: fixed;(fixed表示td的寬度是定長的,不隨td內容變化而變化)。
            這樣盡量不要再td里寫overflow: auto; 因為這樣在IE6,7不會出現滾動條的,最好的辦法是套一個div,寬度設置成100%

            <table style="width: 600px;border-collapse: collapse;table-layout: fixed;" > <tr> <td style="width: 200px;"><div style="width: 100%;overflow: auto;"><div style="width: 300px;height: 100px;background-color: red;"></div></div></td> <td >我是自由寬度</td> </tr> </table>
                    

            藍藍設計建立了UI設計分享群,每天會分享國內外的一些優秀設計,如果有興趣的話,可以進入一起成長學習,請掃碼藍小助,報下信息,藍小助會請您入群。歡迎您加入噢~~希望得到建議咨詢、商務合作,也請與我們聯系。

            截屏2021-05-13 上午11.41.03.png


            轉自:csdn 

            分享此文一切功德,皆悉回向給文章原作者及眾讀者.

            免責聲明:藍藍設計尊重原作者,文章的版權歸原作者。如涉及版權問題,請及時與我們取得聯系,我們立即更正或刪除。

            藍藍設計www.syprn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務

          CentOS7 升級PHP到7.2

          前端達人

          寫在前面

          CentOS7下安裝PHP默認是5.4的,但是有些框架要求PHP的版本得在5.4以上,這就需要我們把PHP升級一下了。

          yum provides php 
          
          • 1

          開始升級PHP:

          rpm -Uvh https://mirror.webtatic.com/yum/el7/epel-release.rpm #更新源
          rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
          yum remove php-common -y  #移除系統自帶的php-common
          yum install -y php72w php72w-opcache php72w-xml php72w-mcrypt php72w-gd php72w-devel php72w-mysql php72w-intl php72w-mbstring  #安裝依賴包 
          
          • 1
          • 2
          • 3
          • 4

          查看版本

          php -v 
          
          • 1

          PHP 7.2.8 (cli) (built: Jul 20 2018 15:20:01) ( NTS )
          Copyright (c) 1997-2018 The PHP Group
          Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
              with Zend OPcache v7.2.8, Copyright (c) 1999-2018, by Zend Technologies
          

          藍藍設計建立了UI設計分享群,每天會分享國內外的一些優秀設計,如果有興趣的話,可以進入一起成長學習,請掃碼藍小助,報下信息,藍小助會請您入群。歡迎您加入噢~~希望得到建議咨詢、商務合作,也請與我們聯系。

          截屏2021-05-13 上午11.41.03.png


          轉自:csdn 作者:Peithon

          分享此文一切功德,皆悉回向給文章原作者及眾讀者.

          免責聲明:藍藍設計尊重原作者,文章的版權歸原作者。如涉及版權問題,請及時與我們取得聯系,我們立即更正或刪除。

          藍藍設計www.syprn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務

          centos7重啟php環境

          前端達人

          apache
          啟動
          systemctl start httpd
          停止
          systemctl stop httpd
          重啟
          systemctl restart httpd
          或者

          service httpd stop

          service httpd start

          service httpd restart


          mysql
          啟動
          systemctl start mysqld
          停止
          systemctl stop mysqld
          重啟
          systemctl restart mysqld

          或者

          service mysqld stop

          service mysqld start

          service mysqld restart



          php-fpm
          啟動
          systemctl start php-fpm
          停止
          systemctl stop php-fpm
          重啟
          systemctl restart php-fpm


          nginx
          啟動
          systemctl start nginx
          停止
          systemctl stop nginx
          重啟
          systemctl restart nginx

          或者

          service nginx stop
          service nginx start
          service nginx restart

          開機自啟

          chkconfig httpd on

          chkconfig mysqld on
           

           

          一、MySQL啟動方式

          1

          2

          3

          4

          5

          1、使用 service 啟動:service mysqld start

           

          2、使用 mysqld 腳本啟動:/etc/init.d/mysqld start

           

          3、使用 safe_mysqld 啟動:safe_mysqld&

          二、MySQL停止

          1

          2

          3

          4

          5

          1、使用 service 啟動:   service mysqld stop

           

          2、使用 mysqld 腳本啟動:/etc/init.d/mysqld stop

           

          3、mysqladmin shutdown

          三、MySQL重啟

          1

          2

          3

          1、使用 service 啟動:service mysqld restart

           

          2、使用 mysqld 腳本啟動:/etc/init.d/mysqld restart

          四、強制關閉

          以上方法都無效的時候,可以通過強行命令:“killall mysql”來關閉MySQL,但是不建議用這樣的方式,因為這種野蠻的方法會強行終止MySQL數據庫服務,有可能導致表損壞……所以自己掂量著用。

          Windows下重啟MySQL服務,對于沒裝mysql圖形管理端的用戶來說啟動和停止mysql服務:
          …\…\bin>net stop mysql
          …\…\bin>net start mysql

           

           

          卸載PHP

          yum remove php
          yum remove php*
          yum remove php-*
          yum remove php7
          yum remove php70
          yum remove php7.0
          yum remove php-common
          這才是苦大仇深卸載個干干凈凈= w

           

           

          Centos下Yum安裝PHP5.5,5.6,7.0

          默認的版本太低了,手動安裝有一些麻煩,想采用Yum安裝的可以使用下面的方案:

          1.檢查當前安裝的PHP包

          yum list installed | grep php

          如果有安裝的PHP包,先刪除他們

           yum remove php.x86_64 php-cli.x86_64 php-common.x86_64 php-gd.x86_64 php-ldap.x86_64 php-mbstring.x86_64 php-mcrypt.x86_64 php-mysql.x86_64 php-pdo.x86_64

          2.Centos 5.X

            rpm -Uvh http://mirror.webtatic.com/yum/el5/latest.rpm
            CentOs 6.x
            rpm -Uvh http://mirror.webtatic.com/yum/el6/latest.rpm
            CentOs 7.X
          rpm -Uvh https://mirror.webtatic.com/yum/el7/epel-release.rpm
          rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm

          如果想刪除上面安裝的包,重新安裝
          rpm -qa | grep webstatic
          rpm -e  上面搜索到的包即可

          3.運行yum install

            yum install php55w.x86_64 php55w-cli.x86_64 php55w-common.x86_64 php55w-gd.x86_64 php55w-ldap.x86_64 php55w-mbstring.x86_64 php55w-mcrypt.x86_64 php55w-mysql.x86_64 php55w-pdo.x86_64
           

          yum install php56w.x86_64 php56w-cli.x86_64 php56w-common.x86_64 php56w-gd.x86_64 php56w-ldap.x86_64 php56w-mbstring.x86_64 php56w-mcrypt.x86_64 php56w-mysql.x86_64 php56w-pdo.x86_64


          注:如果想升級到5.6把上面的55w換成56w就可以了。

          yum install php70w.x86_64 php70w-cli.x86_64 php70w-common.x86_64 php70w-gd.x86_64 php70w-ldap.x86_64 php70w-mbstring.x86_64 php70w-mcrypt.x86_64 php70w-mysql.x86_64 php70w-pdo.x86_64
          4.安裝PHP FPM

          yum install php55w-fpm 
          yum install php56w-fpm 
          yum install php70w-fpm
          注:如果想升級到5.6把上面的55w換成56w就可以了。

          nginx重啟不了



          藍藍設計建立了UI設計分享群,每天會分享國內外的一些優秀設計,如果有興趣的話,可以進入一起成長學習,請掃碼藍小助,報下信息,藍小助會請您入群。歡迎您加入噢~~希望得到建議咨詢、商務合作,也請與我們聯系。

          截屏2021-05-13 上午11.41.03.png


          轉自:csdn 作者:鍋巴胸

          分享此文一切功德,皆悉回向給文章原作者及眾讀者.

          免責聲明:藍藍設計尊重原作者,文章的版權歸原作者。如涉及版權問題,請及時與我們取得聯系,我們立即更正或刪除。

          藍藍設計www.syprn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務


          outlook HTML簽名制作方法

          前端達人

             最近公司要求統一郵件簽名格式,好一頓折騰啊!因為統一提供的簽名是HTML格式 而outlook不直接提供HTML的簽名生成和修改。但其實outlook的簽名是有HTML格式的,并且可以直接編輯,方便而且更好控制,只是outlook對HTML的支持限制很多,很多元素無法使用。以前基本上不會寫HTML,為了這個簽名,HTML倒是學會了不少,也算意外收獲吧。痛并快樂著!

                首先,要制作outlook簽名,需要在outlook先生成一個簽名,起個名字就行,反正內容是要重新修改的。打開outlook,依次打開工具-》選項-》郵件格式,就能看到簽名按鈕。點擊簽名按鈕,打開簽名和信紙對話框,選電子郵件簽名選項卡,然后點擊新建,輸入個名字,OK。第一步到此結束。


                然后打開“C:\Users\你的用戶名稱\AppData\Roaming\Microsoft\Signatures”目錄就可以看到三個文件,一個文件夾,其中那個htm文件就是我們簽名的htm版本。用記事本打開這個文件后可以看到很多的html代碼,這些都是outlook自動生成的,對我們沒有用處,全選然后刪除吧。.rtf和.txt兩個文件是簽名的富文本和純文本格式,可以直接刪除那兩個文件。和.htm同名的文件夾千萬不要刪除,那個html文件需要那個文件夾,它們是一體的,這個文件夾里會緩存一些圖片,看需求吧,不需要就可以直接刪除,特別對于簽名圖片是網絡引用的那種,一定要刪了,要不然outlook只是用那些緩存圖片,即使網絡圖片更換,它也不會變化。

                最后可以將以下代碼復制進那個htm文件

          <head> 
          </head> 
          <body> 
          <hr style="width: 210px; height: 1px;" color="#b5c4df" size="1" align="left"> 
          <table width="100%" border="0" cellspacing="0" cellpadding="0" class="1"> 
          <tbody> 
          <tr> 
          <td valign="top" width="55" height="60"> 
          <img src="http://www.xxxxxx.cn/email/logo.gif" width="45" height="45"> 
          </td> 
          <td valign="top" height="60" style="mso-line-height-rule:exactly; line-height:2.5;font-size:12px;"> 
          <strong><span><font face="宋體">你的名字</font> ┃ <font face="宋體">營銷中心</font><br></span></strong> 
          <strong><span style="color:#C42634;"><font face="宋體">xxxxxxxxxx有限公司</font></span></strong> 
          </td> 
          </tr> 
          </tbody> 
          </table> 
          <table width="100%" border="0" cellspacing="0" cellpadding="0" class="1"> 
          <tbody> 
          <tr> 
          <td valign="top" style="mso-line-height-rule:exactly; line-height:2.5;font-size:12px;>  
           <span><font face="宋體">移動電話</font> <font face="Tahoma">Mobile:139-8765-4321</font> <font face="宋體">辦公座機</font> <font face="Tahoma">Office Tel:029-1234 5678 Ext.604</font> <font face="宋體">公司網站</font> <font face="Tahoma">Web:http://www.xxxx.com</font></span><br> 
          <span><font face="宋體">電子郵箱</font> <font face="Tahoma">E-mail:xxxxxx@xxxxx.com</font> <font face="宋體">公司地址</font> <font face="Tahoma">Address:</font><font face="宋體">xxxxxxxxxxx</font><font face="Tahoma">x</font><font face="宋體">層</font><font face="Tahoma">xxxx</font></span><br> 
          </td> 
          </tr> 
          <tr> 
          <td valign="top" style="mso-line-height-rule:exactly; line-height:1.5;font-size:10px;color:#CCCCCC;"> 
          <span><font face="宋體">保密提示:本郵件及其附件含有保密信息,受商業秘密相關法律法規保護,不得泄露,僅限于發送給上面地址中列出的個人或群組合法使用。禁止任何其他人以任何形式使用(包括但不限于全部或部分地泄露、復制或散布)本郵件中的信息。如果您錯收了本郵件,請您立即電話或郵件通知發件人并刪除本郵件!謝謝您的合作。</font><font face="Tahoma"> Confidentiality Notice: This e-mail and its attachments contain confidential information, which is protected under commercial secrets related laws and regulations, and intended only for the legitimate use of person or entity whose address is listed above. Any use of the information contained herein in any way (including, but not limited to, total or partial disclosure, reproduction, or dissemination) by persons other than the intended recipient(s) is prohibited. If you receive this e-mail in error, please notify the sender by phone or email immediately and delete it.</font><br></span> 
          </td> 
          </tr> 
          </tbody> 
          </table> 
          <img src="http://www.xxxxxx.cn/email/ad.gif"><br> 
          </body> 
          </html> 

                在outlook簽名中最難處理的行高,line-height屬性,outlook的這個屬性只能支持在塊上設置,比如可以給td標簽設置line-height,但是不能給span設置line-height,否則行高設置是不起作用的。

               具體內容可以根據實際情況改寫。修改簽名文件后,最好關閉outlook重新打開一下,要不然outlook里面會有緩存,造成顯示錯誤。



          藍藍設計建立了UI設計分享群,每天會分享國內外的一些優秀設計,如果有興趣的話,可以進入一起成長學習,請掃碼藍小助,報下信息,藍小助會請您入群。歡迎您加入噢~~希望得到建議咨詢、商務合作,也請與我們聯系。

          截屏2021-05-13 上午11.41.03.png


          轉自:csdn 作者:ssmile

          分享此文一切功德,皆悉回向給文章原作者及眾讀者.

          免責聲明:藍藍設計尊重原作者,文章的版權歸原作者。如涉及版權問題,請及時與我們取得聯系,我們立即更正或刪除。

          藍藍設計www.syprn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務


          使用outlook制作簽名

          前端達人

          制作簽名的幾種方法

          你好,最近公司需要我制作公司簽名,之前就想著不就是簽名嘛,多簡單的事。
          但是經過一系列的嘗試之后,發現還真不容易。主要是因為outlook新建簽名的編輯欄不支持直接使用html編輯。下面我介紹我嘗試的幾種方法

          直接在編輯器中編輯

          只有文字的話,那就直接在編輯器中輸入文字進行排版就好了,沒什么難度;

          有文字與圖片結合,這種情況就要看是怎樣的排版了,outlook默認的圖片插入模式是嵌入式,這樣的話就在文字就在圖片的右下角,不能并排顯示,很不實用。那么想修改圖片的插入模式可以在 “文件》選項》郵件》編輯器選項》高級“中修改 具體位置如圖
          修改圖片插入/粘貼的方式這種方法的限制很多,比如你將圖片插入修改為“四周緊密型”,那么你插入的圖片在編輯器中看不到,實際使用的時候是可以看見的。這就很別扭了,還有就是圖片好像會成為附件,如果有你的照片你不想別人每次下載附件將你的照片下載過去吧·······
          由于這種方法并不能滿足我的需求,所以我找啊找找到了另一種方法

          在Word中編輯好了復制過去

          在word中編輯好圖片文字的樣式與排版,直接復制,然后到outlook編輯簽名的編輯器中郵件粘貼,注意粘貼的時候選擇保留源格式。
          這樣有一個問題,就是你新建郵件選擇你的簽名時會發現排版可能跟你的不一樣,或者到手機上文字直接成了一個字一行的現象
          所以也直接pass

          直接在生成的文件上編輯

          在后來一次偶然的機會我發現,每次新建簽名就會在一個文件夾中生成四個文件,修改了這里面的文件也就修改了簽名。所以我決定直接在源文件上修改。那個文件夾地址是:“C:\Users\×××\AppData\Roaming\Microsoft\Signatures”自己把×××換成自己的電腦用戶名,如果不知道的話就Win+R,輸入cmd,Users\后面的就是自己的電腦用戶名。四個文件如下圖:
          四個源文件
          其中.files文件是存放一些圖片以及其他的幾個必要文件;.htm文件就是代碼源文件,類似于html;.rtf就是視圖;.txt就是里面的純文本。這里面最主要的就是files與htm。
          所以我新建了一個空白簽名,然后在htm里面修改代碼,這需要一些html基礎。把需要的圖片放入files文件夾中。
          但是這個有一個缺點,就是圖片可能顯示不了,你把圖片放在服務器別人在outlook的PC端上看需要點擊下載圖片才能瀏覽,放在本地別人根本看不見。還有就是outlook限制了很多html的語法,很多樣式什么的都不能用。
          所以PASS

          直接用word新建htm格式編輯

          后來經過查找各種資料發現。word生成的htm文件其實是與outlook簽名生成的htm類似的,他兩的語法是一樣的,畢竟是一家啊。還發現了任何簽名其實對表格的適應性與兼容性是最好的。
          所以我就用word新建了htm文件,然后用word編輯。首先是插入表格,然后在一整張表格中完成你的排版,添加圖片什么得都沒問題。排版完了之后,直接復制,到新建簽名得編輯器中粘貼,注意保留源格式。。這里得圖片插入模式要為嵌入式,怎么修改前面已經說了。
          這種方法是最完美適應的?。?!

          圖片不清晰問題

          有時候會出現編輯的時候圖片清晰,但是發送出去圖片就模糊了;有兩點:
          1.修改圖片的dpi為96,圖片格式最好都為jpg吧 ,因為如果不是outlook會幫你改過來的;
          2.插入的圖片不要縮小,最好插入前就弄好像素大小,插入進去是怎樣的大小就怎樣。
          否則都會被壓縮。


          藍藍設計建立了UI設計分享群,每天會分享國內外的一些優秀設計,如果有興趣的話,可以進入一起成長學習,請掃碼藍小助,報下信息,藍小助會請您入群。歡迎您加入噢~~希望得到建議咨詢、商務合作,也請與我們聯系。

          截屏2021-05-13 上午11.41.03.png


          轉自:cadn 作者:ME小鬼

          分享此文一切功德,皆悉回向給文章原作者及眾讀者.

          免責聲明:藍藍設計尊重原作者,文章的版權歸原作者。如涉及版權問題,請及時與我們取得聯系,我們立即更正或刪除。

          藍藍設計www.syprn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務

          Vue2.0 阻止事件冒泡

          前端達人


          問題

          描述:點擊 save-btn 元素會同時觸發 wrap 綁定的 click 事件。

          <div class="wrap" @click="cancel"> <div class="save-btn" @click="save('save result')"></div> </div> 

          解決方案:阻止事件冒泡

          • 方案一:把特殊變量 $event 傳入內聯語句中,訪問原始的 DOM 事件。

            <div class="wrap" @click="cancel"> <div class="save-btn" @click="save('save result',$event)"></div> </div> 
            // ... methods: { save(msg, event){ // 現在可以訪問原生事件對象 if(event) event.preventDefault(); alert(msg); } } 
          • 方案二:利用 Vue.js 提供的事件修飾符解決。在 save-btn 元素上使用 @click.stop="save('save result')" 即可。

          事件修飾符

          在事件處理程序中調用 event.preventDefault()event.stopPropagation() 是非常常見的需求。盡管我們可以在方法中輕松實現這點,但更好的方式是:方法只有純粹的數據邏輯,而不是去處理 DOM 事件細節。

          為了解決這個問題,Vue.js 為 v-on 提供了事件修飾符。之前提過,修飾符是由點開頭的指令后綴來表示的。

          .stop .prevent .capture .self .once .passive 
          <!-- 阻止單擊事件繼續傳播 --> <a v-on:click.stop="doThis"></a> <!-- 提交事件不再重載頁面 --> <form v-on:submit.prevent="onSubmit"></form> <!-- 修飾符可以串聯 --> <a v-on:click.stop.prevent="doThat"></a> <!-- 只有修飾符 --> <form v-on:submit.prevent></form> <!-- 添加事件監聽器時使用事件捕獲模式 --> <!-- 即元素自身觸發的事件先在此處理,然后才交由內部元素進行處理 --> <div v-on:click.capture="doThis">...</div> <!-- 只當在 event.target 是當前元素自身時觸發處理函數 --> <!-- 即事件不是從內部元素觸發的 --> <div v-on:click.self="doThat">...</div> <!-- 2.1.4 新增 點擊事件將只會觸發一次 --> <a v-on:click.once="doThis"></a> <!-- 2.3.0 新增 滾動事件的默認行為 (即滾動行為) 將會立即觸發 --> <!-- 而不會等待 `onScroll` 完成  --> <!-- 這其中包含 `event.preventDefault()` 的情況 --> <!-- 該修飾符尤其能夠提升移動端的性能 --> <!-- 不要把 .passive 和 .prevent 一起使用,因為 .prevent 將會被忽略,同時瀏覽器可能會向你展示一個警告。請記住,.passive 會告訴瀏覽器你不想阻止事件的默認行為。 --> <div v-on:scroll.passive="onScroll">...</div> 

          使用修飾符時,順序很重要;相應的代碼會以同樣的順序產生。因此,用 v-on:click.prevent.self 會阻止所有的點擊,而 v-on:click.self.prevent 只會阻止對元素自身的點擊。



          藍藍設計建立了UI設計分享群,每天會分享國內外的一些優秀設計,如果有興趣的話,可以進入一起成長學習,請掃碼藍小助,報下信息,藍小助會請您入群。歡迎您加入噢~~希望得到建議咨詢、商務合作,也請與我們聯系。

          截屏2021-05-13 上午11.41.03.png


          轉自:腳本之家

          分享此文一切功德,皆悉回向給文章原作者及眾讀者.

          免責聲明:藍藍設計尊重原作者,文章的版權歸原作者。如涉及版權問題,請及時與我們取得聯系,我們立即更正或刪除。

          藍藍設計www.syprn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務


          作者:一通

          來源:簡書


          什么是面向對象(OOP)

          前端達人

          入門便是不識

          從我們開始接觸Java這門語言后,就有人告訴我們這是一個面向對象的語言。說的最多的是new個對象,其實并不知道什么是對象。以為對象就是一個class(類),并不覺得有什么特殊。直到很久之后,面試官問到什么是OOP,嘴巴都是一個大O,OOP?WTF?那人厭惡的說到就是面向對象編程。我說:Java就是面向對象,就是一切以對象為載體,去編程,去面對。面試官: go out ! now!


          滾回來的我趕緊看看什么是OOP,Object Oriented Programming,原來就是面向對象的編程啊,還有OOD(面向對象的設計),OOA(面向對象的分析)。那什么是面向對象呢?要想了解這個問題我們要先了解面向過程,這樣對比我們就好理解了。

          很早很早以前的編程是面向過程的,比如實現一個算術運算1+1 = 2,通過這個簡單的算法就可以解決問題。但是隨著時代的進步,人們不滿足現有的算法了,因為問題越來越復雜,不是1+1那么單純了,比如一個班級的學生的數據分析,這樣就有了對象這個概念,一切事物皆對象。將現實的事物抽象出來,注意抽象這個詞是重點啊,把現實生活的事物以及關系,抽象成類,通過繼承,實現,組合的方式把萬事萬物都給容納了。實現了對現實世界的抽象和數學建模。這是一次飛躍性的進步。

          image.png

          舉個最簡單點的例子來區分 面向過程和面向對象

          有一天你想吃魚香肉絲了,怎么辦呢?你有兩個選擇

          1、自己買材料,肉,魚香肉絲調料,蒜苔,胡蘿卜等等然后切菜切肉,開炒,盛到盤子里。

          2、去飯店,張開嘴:老板!來一份魚香肉絲!

          看出來區別了嗎?這就是1是面向過程,2是面向對象。

          面向對象有什么優勢呢?首先你不需要知道魚香肉絲是怎么做的,降低了耦合性。如果你突然不想吃魚香肉絲了,想吃洛陽白菜,對于1你可能不太容易了,還需要重新買菜,買調料什么的。對于2,太容易了,大喊:老板!那個魚香肉絲換成洛陽白菜吧,提高了可維護性。總的來說就是降低耦合,提高維護性!

          面向過程是具體化的,流程化的,解決一個問題,你需要一步一步的分析,一步一步的實現。

          面向對象是模型化的,你只需抽象出一個類,這是一個封閉的盒子,在這里你擁有數據也擁有解決問題的方法。需要什么功能直接使用就可以了,不必去一步一步的實現,至于這個功能是如何實現的,管我們什么事?我們會用就可以了。

          面向對象的底層其實還是面向過程,把面向過程抽象成類,然后封裝,方便我們我們使用的就是面向對象了。

          面向過程:

          優點:性能比面向對象好,因為類調用時需要實例化,開銷比較大,比較消耗資源。
          缺點:不易維護、不易復用、不易擴展.

          優點:易維護、易復用、易擴展,由于面向對象有封裝、繼承、多態性的特性,可以設計出低耦合的系統,使系統 更加靈活、更加易于維護 .
          缺點:性能比面向過程差


          原來君如此

          image.png

          面向對象的三大特性:

          1、封裝
          隱藏對象的屬性和實現細節,僅對外提供公共訪問方式,將變化隔離,便于使用,提高復用性和安全性。
          2、繼承
          提高代碼復用性;繼承是多態的前提。
          3、多態
          父類或接口定義的引用變量可以指向子類或具體實現類的實例對象。提高了程序的拓展性。

          五大基本原則:

          1、單一職責原則SRP(Single Responsibility Principle)
          類的功能要單一,不能包羅萬象,跟雜貨鋪似的。
          2、開放封閉原則OCP(Open-Close Principle)
          一個模塊對于拓展是開放的,對于修改是封閉的,想要增加功能熱烈歡迎,想要修改,哼,一萬個不樂意。
          3、里式替換原則LSP(the Liskov Substitution Principle LSP)
          子類可以替換父類出現在父類能夠出現的任何地方。比如你能代表你爸去你姥姥家干活。哈哈~~
          4、依賴倒置原則DIP(the Dependency Inversion Principle DIP)
          高層次的模塊不應該依賴于低層次的模塊,他們都應該依賴于抽象。抽象不應該依賴于具體實現,具體實現應該依賴于抽象。就是你出國要說你是中國人,而不能說你是哪個村子的。比如說中國人是抽象的,下面有具體的xx省,xx市,xx縣。你要依賴的是抽象的中國人,而不是你是xx村的。
          5、接口分離原則ISP(the Interface Segregation Principle ISP)
          設計時采用多個與特定客戶類有關的接口比采用一個通用的接口要好。就比如一個手機擁有打電話,看視頻,玩游戲等功能,把這幾個功能拆分成不同的接口,比在一個接口里要好的多。


          最后

          1、抽象會使復雜的問題更加簡單化。
          2、從以前面向過程的執行者,變成了張張嘴的指揮者。
          3、面向對象更符合人類的思維,面向過程則是機器的思想



          藍藍設計建立了UI設計分享群,每天會分享國內外的一些優秀設計,如果有興趣的話,可以進入一起成長學習,請掃碼藍小助,報下信息,藍小助會請您入群。歡迎您加入噢~~希望得到建議咨詢、商務合作,也請與我們聯系。

          截屏2021-05-13 上午11.41.03.png


          分享此文一切功德,皆悉回向給文章原作者及眾讀者.

          免責聲明:藍藍設計尊重原作者,文章的版權歸原作者。如涉及版權問題,請及時與我們取得聯系,我們立即更正或刪除。

          藍藍設計www.syprn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務

          作者:豬_隊友

          鏈接:https://www.jianshu.com/p/7a5b0043b035

          來源:簡書

          淺談VUE防抖與節流的最佳解決方案(函數式組件)

          前端達人

          這篇文章主要介紹了淺談VUE防抖與節流的最佳解決方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

          前言

          有echarts使用經驗的同學可能遇到過這樣的場景,在window.onresize事件回調里觸發echartsBox.resize()方法來達到重繪的目的,resize事件是連續觸發的這意味著echarts實例會連續的重繪這是非常耗性能的。還有一個常見的場景在input標簽的input事件里請求后端接口,input事件也是連續觸發的,假設我輸入了“12”就會請求兩次接口參數分別是“1”和“12”,比浪費網絡資源更要命的是如果參數為“1”的請求返回數據的時間晚于參數為“12”的接口,那么我們得到的數據是和期望不符的。當然基于axios可以做很多封裝可以取消上一個請求或者通過攔截做處理,但還是從防抖入手比較簡單。

          防抖和節流到底是啥

          函數防抖(debounce)

          解釋:當持續觸發某事件時,一定時間間隔內沒有再觸發事件時,事件處理函數才會執行一次,如果設定的時間間隔到來之前,又一次觸發了事件,就重新開始延時。

          案例:持續觸發scroll事件時,并不立即執行handle函數,當1000毫秒內沒有觸發scroll事件時,才會延時觸發一次handle函數。

          1
          2
          3
          4
          5
          6
          7
          8
          9
          10
          11
          function debounce(fn, wait) {
           let timeout = null
           return function() {
            if(timeout !== null) clearTimeout(timeout)  
            timeout = setTimeout(fn, wait);
           }
          }
          function handle() { 
           console.log(Math.random())
          }
          window.addEventListener('scroll', debounce(handle, 1000))

          addEventListener的第二個參數實際上是debounce函數里return回的方法,let timeout = null 這行代碼只在addEventListener的時候執行了一次 觸發事件的時候不會執行,那么每次觸發scroll事件的時候都會清除上次的延時器同時記錄一個新的延時器,當scroll事件停止觸發后最后一次記錄的延時器不會被清除可以延時執行,這是debounce函數的原理

          函數節流(throttle)

          解釋:當持續觸發事件時,有規律的每隔一個時間間隔執行一次事件處理函數。

          案例:持續觸發scroll事件時,并不立即執行handle函數,每隔1000毫秒才會執行一次handle函數。

          1
          2
          3
          4
          5
          6
          7
          8
          9
          10
          11
          12
          13
          14
          function throttle(fn, delay) {
           var prev = Date.now()    
           return function() {       
            var now = Date.now()       
            if (now - prev > delay) {         
             fn()       
             prev = Date.now()      
            }    
           }   
          }   
          function handle() {     
           console.log(Math.random())  
          }
          window.addEventListener('scroll', throttle(handle, 1000))

          原理和防抖類似,每次執行fn函數都會更新prev用來記錄本次執行的時間,下一次事件觸發時判斷時間間隔是否到達預先的設定,重復上述操作。

          防抖和節流都可以用于 mousemove、scroll、resize、input等事件,他們的區別在于防抖只會在連續的事件周期結束時執行一次,而節流會在事件周期內按間隔時間有規律的執行多次。

          在vue中的實踐

          在vue中實現防抖無非下面這兩種方法

          • 封裝utils工具
          • 封裝組件

          封裝utils工具

          把上面的案例改造一下就能封裝一個簡單的utils工具

          utils.js

          1
          2
          3
          4
          5
          6
          let timeout = null
          function debounce(fn, wait) {
           if(timeout !== null) clearTimeout(timeout)
           timeout = setTimeout(fn, wait)
          }
          export default debounce

          app.js

          1
          2
          3
          4
          5
          6
          7
          8
          9
          10
          11
          12
          <input type="text" @input="debounceInput($event)">
           
          import debounce from './utils'
          export default {
           methods: {
            debounceInput(E){
             debounce(() => {
              console.log(E.target.value)
             }, 1000)
            }
           }
          }

          封裝組件

          至于組件的封裝我們要用到$listeners、$attrs這兩個屬性,他倆都是vue2.4新增的內容,官網的介紹比較晦澀,我們來看他倆到底是干啥的:

          $listeners: 父組件在綁定子組件的時候會在子組件上綁定很多屬性,然后在子組件里通過props注冊使用,那么沒有被props注冊的就會放在$listeners里,當然不包括class和style,并且可以通過 v-bind="$attrs" 傳入子組件的內部組件。

          $listeners: 父組件在子組件上綁定的不含.native修飾器的事件會放在$listeners里,它可以通過 v-on="$listeners" 傳入內部組件。

          簡單來說$listeners、$attrs他倆是做屬性和事件的承接,這在對組件做二次封裝的時候非常有用。

          我們以element-ui的el-input組件為例封裝一個帶防抖的debounce-input組件

          debounce-input.vue

          1
          2
          3
          4
          5
          6
          7
          8
          9
          10
          11
          12
          13
          14
          15
          16
          17
          18
          19
          20
          <template>
           <el-input v-bind="$attrs" @input="debounceInput"/>
          </template>
          <script>
          export default {
           data() {
            return {
             timeout: null
            }
           },
           methods: {
            debounceInput(value){
             if(this.timeout !== null) clearTimeout(this.timeout)  
             this.timeout = setTimeout(() => {
              this.$emit('input', value)
             }, 1000)
            }
           }
          }
          </script>

          app.vue

          1
          2
          3
          4
          5
          6
          7
          8
          9
          10
          11
          12
          13
          14
          15
          16
          <template>
           <debounce-input placeholder="防抖" prefix-icon="el-icon-search" @input="inputEve"></debounce-input>
          </template>
          <script>
          import debounceInput from './debounce-input'
          export default {
           methods: {
            inputEve(value){
             console.log(value)
            }
           },
           components: {
            debounceInput
           }
          }
          </script>

          上面組件的封裝用了$attrs,雖然不需要開發者關注屬性的傳遞,但是在使用上還是不方便的,因為把el-input封裝在了內部這樣對樣式的限定也比較局限。有接觸過react高階組件的同學可能有了解,react高階組件本質上是一個函數通過包裹被傳入的React組件,經過一系列處理,最終返回一個相對增強的React組件。那么在vue中可以借鑒這種思路嗎,我們來了解一下vue的函數式組件。

          關于vue函數式組件

          什么是函數式組件?

          函數式組件是指用一個Function來渲染一個vue組件,這個組件只接受一些 prop,我們可以將這類組件標記為 functional,這意味著它無狀態 (沒有響應式數據),也沒有實例 (沒有this上下文)。

          一個函數式組件大概向下面這樣:

          1
          2
          3
          4
          5
          6
          7
          8
          9
          10
          export default () => {
           functional: true,
           props: {
            // Props 是可選的
           },
           // 為了彌補缺少的實例, 提供第二個參數作為上下文
           render: function (createElement, context) {
            return vNode
           }
          }

          注意:在 2.3.0 之前的版本中,如果一個函數式組件想要接收 prop,則 props 選項是必須的。在 2.3.0 或以上的版本中,你可以省略 props 選項,所有組件上的特性都會被自動隱式解析為 prop。但是你一旦注冊了 prop 那么只有被注冊的 prop 會出現在 context.prop 里。

          render函數的第二個參數context用來代替上下文this他是一個包含如下字段的對象:

          • props:提供所有 prop 的對象
          • children: VNode 子節點的數組
          • slots: 一個函數,返回了包含所有插槽的對象
          • scopedSlots: (2.6.0+) 一個暴露傳入的作用域插槽的對象。也以函數形式暴露普通插槽。
          • data:傳遞給組件的整個數據對象,作為 createElement 的第二個參數傳入組件
          • parent:對父組件的引用
          • listeners: (2.3.0+) 一個包含了所有父組件為當前組件注冊的事件監聽器的對象。這是 data.on 的一個別名。
          • injections: (2.3.0+) 如果使用了 inject 選項,則該對象包含了應當被注入的屬性。

          vm.$slots API 里面是什么

          slots用來訪問被插槽分發的內容。每個具名插槽 有其相應的屬性 (例如:v-slot:foo 中的內容將會在 vm.$slots.foo 中被找到)。default 屬性包括了所有沒有被包含在具名插槽中的節點,或 v-slot:default 的內容。

          slots() 和 children 對比

          你可能想知道為什么同時需要 slots() 和 children。slots().default 不是和 children 類似的嗎?在一些場景中,是這樣——但如果是如下的帶有子節點的函數式組件呢?

          1
          2
          3
          4
          5
          6
          <my-functional-component>
           <p v-slot:foo>
            first
           </p>
           <p>second</p>
          </my-functional-component>

          對于這個組件,children 會給你兩個段落標簽,而 slots().default 只會傳遞第二個匿名段落標簽,slots().foo 會傳遞第一個具名段落標簽。同時擁有 children 和 slots(),因此你可以選擇讓組件感知某個插槽機制,還是簡單地通過傳遞 children,移交給其它組件去處理。

          一個函數式組件的使用場景

          假設有一個a組件,引入了 a1,a2,a3 三個組件,a組件的父組件給a組件傳入了一個type屬性根據type的值a組件來決定顯示 a1,a2,a3 中的那個組件。這樣的場景a組件用函數式組件是非常方便的。那么為什么要用函數式組件呢?一句話:渲染開銷低,因為函數式組件只是函數。

          用函數式組件的方式來實現防抖

          因為業務關系該防抖組件的封裝同時支持 input、button、el-input、el-button 的使用,如果是input類組件對input事件做防抖處理,如果是button類組件對click事件做防抖處理。

          1
          2
          3
          4
          5
          6
          7
          8
          9
          10
          11
          12
          13
          14
          15
          16
          17
          18
          19
          20
          21
          22
          23
          24
          25
          26
          27
          28
          29
          30
          31
          32
          33
          34
          35
          36
          37
          38
          39
          40
          41
          42
          43
          44
          45
          46
          47
          48
          49
          50
          51
          52
          const debounce = (fun, delay = 500, before) => {
           let timer = null
           return (params) => {
            timer && window.clearTimeout(timer)
            before && before(params)
            timer = window.setTimeout(() => {
              // click事件fun是Function input事件fun是Array
             if (!Array.isArray(fun)) {
              fun = [fun]
             }
             for (let i in fun) {
              fun[i](params)
             }
             timer = null
            }, parseInt(delay))
           }
          }
          export default {
           name: 'Debounce',
           functional: true, // 靜態組件 當不聲明functional時該組件同樣擁有上下文以及生命周期函數
           render(createElement, context) {
            const before = context.props.before
            const time = context.props.time
            const vnodeList = context.slots().default
            if (vnodeList === undefined){
             console.warn('<debounce> 組件必須要有子元素')
             return null
            }
            const vnode = vnodeList[0] || null // 獲取子元素虛擬dom
            if (vnode.tag === 'input') {
             const defaultFun = vnode.data.on.input
             const debounceFun = debounce(defaultFun, time, before) // 獲取節流函數
             vnode.data.on.input = debounceFun
            } else if (vnode.tag === 'button') {
             const defaultFun = vnode.data.on.click
             const debounceFun = debounce(defaultFun, time, before) // 獲取節流函數
             vnode.data.on.click = debounceFun
            } else if (vnode.componentOptions && vnode.componentOptions.tag === 'el-input') {
             const defaultFun = vnode.componentOptions.listeners.input
             const debounceFun = debounce(defaultFun, time, before) // 獲取節流函數
             vnode.componentOptions.listeners.input = debounceFun
            } else if (vnode.componentOptions && vnode.componentOptions.tag === 'el-button') {
             const defaultFun = vnode.componentOptions.listeners.click
             const debounceFun = debounce(defaultFun, time, before) // 獲取節流函數
             vnode.componentOptions.listeners.click = debounceFun
            } else {
             console.warn('<debounce> 組件內只能出現下面組件的任意一個且唯一 el-button、el-input、button、input')
             return vnode
            }
            return vnode
           }
          }
          1
          2
          3
          4
          5
          6
          7
          8
          9
          10
          11
          12
          13
          14
          15
          16
          17
          18
          19
          20
          21
          22
          23
          24
          25
          26
          27
          <template>
           <debounce time="300" :before="beforeFun">
            <input type="text" v-model="inpModel" @input="inputChange"/>
           </debounce>
          </template>
           
          <script>
          import debounce from './debounce'
          export default {
           data() {
            return {
             inpModel: 1
            }
           },
           methods: {
            inputChange(e){
             console.log(e.target.value, '防抖')
            },
            beforeFun(e){
             console.log(e.target.value, '不防抖')
            }
           },
           components: {
            debounce
           }
          }
          </script>

          原理也很簡單就是在vNode中攔截on下面的click、input事件做防抖處理,這樣在使用上就非常簡單了。

          自定義指令 directive

          我們來思考一個問題,函數式組件封裝防抖的關節是獲取vNode,那么我們通過自定義指令同樣可以拿到vNode,甚至還可以得到原生的Dom,這樣用自定義指令來處理會更加方便。。。。。。


          藍藍設計建立了UI設計分享群,每天會分享國內外的一些優秀設計,如果有興趣的話,可以進入一起成長學習,請掃碼藍小助,報下信息,藍小助會請您入群。歡迎您加入噢~~希望得到建議咨詢、商務合作,也請與我們聯系。

          截屏2021-05-13 上午11.41.03.png


          轉自:腳本之家

          分享此文一切功德,皆悉回向給文章原作者及眾讀者.

          免責聲明:藍藍設計尊重原作者,文章的版權歸原作者。如涉及版權問題,請及時與我們取得聯系,我們立即更正或刪除。

          藍藍設計www.syprn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務

          日歷

          鏈接

          個人資料

          藍藍設計的小編 http://www.syprn.cn

          存檔

          亚洲va欧美va天堂v国产综合