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

          首頁

          開發中我們需要遵循的幾個設計原則!

          周周

          出處:https://www.cnblogs.com/pengdai


          一、開發原則
          S:單一職責SRP
          O:開放封閉原則OCP
          L:里氏替換原則LSP
          I:接口隔離法則
          D:依賴倒置原則DIP
          合成/聚合復用原則
          迪米特法則
          在軟件開發中,前人對軟件系統的設計和開發總結了一些原則和模式, 不管用什么語言做開發,都將對我們系統設計和開發提供指導意義。本文主要將總結這些常見的原則和具體闡述意義。
          面向對象的基本原則(solid)是五個,但是在經常被提到的除了這五個之外還有迪米特法則和合成復用原則等,所以在常見的文章中有表示寫六大或七大原則的; 除此之外我還將給出一些其它相關書籍和互聯網上出現的原則;

          二、S單一職責SRP

          Single-Responsibility Principle,一個類,最好只做一件事,只有一個引起它的變化。單一職責原則可以看做是低耦合、高內聚在面向對象原則的引申,將職責定義為引起變化的原因,以提高內聚性減少引起變化的原因。

          1、定義

          一個對象應該只包含單一的職責,并且該職責被完整地封裝在一個類中。(Every object should have a single responsibility, and that responsibility should be entirely encapsulated by the class.),即又定義有且僅有一個原因使類變更。

          2、原則分析

          一個類或者大到模塊,小到方法,承擔的職責越多,它被復用的可能性越小,而且如果一個類承擔的職責過多,就相當于將這些職責耦合在一起,當其中一個職責變化時,可能會影響其他職責的運作。
          類的職責主要包括兩個方面:數據職責和行為職責,數據職責通過其屬性來體現,而行為職責通過其方法來體現。
          單一職責原則是實現高內聚、低耦合的指導方針,在很多代碼重構手法中都能找到它的存在,它是最簡單但又最難運用的原則,需要設計人員發現類的不同職責并將其分離,而發現類的多重職責需要設計人員具有較強的分析設計能力和相關重構經驗。

          3、優點

          降低類的復雜性,類的職責清晰明確。比如數據職責和行為職責清晰明確;
          提高類的可讀性和維護性;
          變更引起的風險減低,變更是必不可少的,如果接口的單一職責做得好,一個接口修改只對相應的類有影響,對其他接口無影響,這對系統的擴展性、維護性都有非常大的幫助。
          注意:單一職責原則提出了一個編寫程序的標準,用“職責”或“變化原因”來衡量接口或類設計得是否合理,但是“職責”和“變化原因”都是沒有具體標準的,一個類到底要負責那些職責?這些職責怎么細化?細化后是否都要有一個接口或類?這些都需從實際的情況考慮。因項目而異,因環境而異。

          4、例子

          SpringMVC中Entity、DAO、Service、Controller、Util等的分離。

          三、O開放封閉原則OCP

          Open - ClosedPrinciple,OCP對擴展開放,對修改關閉(設計模式的核心原則)

          1、定義

          一個軟件實體(如類、模塊和函數)應該對擴展開放,對修改關閉。意思是在一個系統或者模塊中,對于擴展是開放的,對于修改是關閉的。一個 好的系統是在不修改源代碼的情況下,可以擴展你的功能。而實現開閉原則的關鍵就是抽象化。

          2、原則分析

          當軟件實體因需求要變化時, 盡量通過擴展已有軟件實體,可以提供新的行為,以滿足對軟件的新的需求,而不是修改已有的代碼,使變化中的軟件有一定的適應性和靈活性 。已有軟件模塊,特別是最重要的抽象層模塊不能再修改,這使變化中的軟件系統有一定的穩定性和延續性。
          實現開閉原則的關鍵就是抽象化 :在"開-閉"原則中,不允許修改的是抽象的類或者接口,允許擴展的是具體的實現類,抽象類和接口在"開-閉"原則中扮演著極其重要的角色..即要預知可能變化的需求.又預見所有可能已知的擴展..所以在這里"抽象化"是關鍵!
          可變性的封閉原則:找到系統的可變因素,將它封裝起來。這是對"開-閉"原則最好的實現。不要把你的可變因素放在多個類中,或者散落在程序的各個角落。你應該將可變的因素,封套起來..并且切忌不要把所用的可變因素封套在一起。最好的解決辦法是,分塊封套你的可變因素!避免超大類、超長類、超長方法的出現!!給你的程序增加藝術氣息,將程序藝術化是我們的目標!

          3、例子

          設計模式中模板方法模式和觀察者模式都是開閉原則的極好體現。

          四、L里氏替換原則LSP

          Liskov Substitution Principle,LSP:任何基類可以出現的地方,子類也可以出現;這一思想表現為對繼承機制的約束規范,只有子類能夠替換其基類時,才能夠保證系統在運行期內識別子類,這是保證繼承復用的基礎。

          1、定義

          第一種定義方式相對嚴格:如果對每一個類型為S的對象o1,都有類型為T的對象o2,使得以T定義的所有程序P在所有的對象o1都代換成o2時,程序P的行為沒有變化,那么類型S是類型T的子類型。
          第二種更容易理解的定義方式:所有引用基類(父類)的地方必須能透明地使用其子類的對象。即子類能夠必須能夠替換基類能夠從出現的地方。子類也能在基類 的基礎上新增行為。
          里氏代換原則由2008年圖靈獎得主、美國第一位計算機科學女博士、麻省理工學院教授BarbaraLiskov和卡內基.梅隆大學Jeannette Wing教授于1994年提出。其原文如下:Let q(x) be a property provableabout objects x of type T. Then q(y) should be true for objects y of type Swhere S is a subtype of T.

          2、原則分析

          講的是基類和子類的關系,只有這種關系存在時,里氏代換原則才存在。正方形是長方形是理解里氏代換原則的經典例子。
          里氏代換原則可以通俗表述為:在軟件中如果能夠使用基類對象,那么一定能夠使用其子類對象。把基類都替換成它的子類,程序將不會產生任何錯誤和異常,反過來則不成立,如果一個軟件實體使用的是一個子類的話,那么它不一定能夠使用基類。

          里氏代換原則是實現開閉原則的重要方式之一,由于使用基類對象的地方都可以使用子類對象,因此在程序中盡量使用基類類型來對對象進行定義,而在運行時再確定其子類類型,用子類對象來替換父類對象。

          五、I接口隔離法則

          (Interface Segregation Principle,ISL):客戶端不應該依賴那些它不需要的接口。(這個法則與迪米特法則是相通的)

          1、定義

          客戶端不應該依賴那些它不需要的接口。
          另一種定義方法:一旦一個接口太大,則需要將它分割成一些更細小的接口,使用該接口的客戶端僅需知道與之相關的方法即可。
          注意,在該定義中的接口指的是所定義的方法。例如外面調用某個類的public方法。這個方法對外就是接口。

          2、原則分析:

          (1)接口隔離原則是指使用多個專門的接口,而不使用單一的總接口。每一個接口應該承擔一種相對獨立的角色,不多不少,不干不該干的事,該干的事都要干。
          ? 一個接口就只代表一個角色,每個角色都有它特定的一個接口,此時這個原則可以叫做“角色隔離原則”。
          ? 接口僅僅提供客戶端需要的行為,即所需的方法,客戶端不需要的行為則隱藏起來,應當為客戶端提供盡可能小的單獨的接口,而不要提供大的總接口。
          (2)使用接口隔離原則拆分接口時,首先必須滿足單一職責原則,將一組相關的操作定義在一個接口中,且在滿足高內聚的前提下,接口中的方法越少越好。
          (3)可以在進行系統設計時采用定制服務的方式,即為不同的客戶端提供寬窄不同的接口,只提供用戶需要的行為,而隱藏用戶不需要的行為。

          六、D依賴倒置原則DIP

          Dependency-Inversion Principle 要依賴抽象,而不要依賴具體的實現, 具體而言就是高層模塊不依賴于底層模塊,二者共同依賴于抽象。抽象不依賴于具體,具體依賴于抽象。

          1、定義

          高層模塊不應該依賴低層模塊,它們都應該依賴抽象。抽象不應該依賴于細節,細節應該依賴于抽象。簡單的說,依賴倒置原則要求客戶端依賴于抽象耦合。原則表述:
          (1)抽象不應當依賴于細節;細節應當依賴于抽象;
          (2)要針對接口編程,不針對實現編程。

          2、原則分析

          (1)如果說開閉原則是面向對象設計的目標,依賴倒轉原則是到達面向設計"開閉"原則的手段..如果要達到最好的"開閉"原則,就要盡量的遵守依賴倒轉原則. 可以說依賴倒轉原則是對"抽象化"的最好規范! 我個人感覺,依賴倒轉原則也是里氏代換原則的補充..你理解了里氏代換原則,再來理解依賴倒轉原則應該是很容易的。
          (2)依賴倒轉原則的常用實現方式之一是在代碼中使用抽象類,而將具體類放在配置文件中。
          (3)類之間的耦合:零耦合關系,具體耦合關系,抽象耦合關系。依賴倒轉原則要求客戶端依賴于抽象耦合,以抽象方式耦合是依賴倒轉原則的關鍵。

          3、例子1

          理解這個依賴倒置,首先我們需要明白依賴在面向對象設計的概念:
          依賴關系(Dependency):是一種使用關系,特定事物的改變有可能會影響到使用該事物的其他事物,在需要表示一個事物使用另一個事物時使用依賴關系。(假設A類的變化引起了B類的變化,則說名B類依賴于A類。)大多數情況下,依賴關系體現在某個類的方法使用另一個類的對象作為參數。在UML中,依賴關系用帶箭頭的虛線表示,由依賴的一方指向被依賴的一方。
          4、例子2
          某系統提供一個數據轉換模塊,可以將來自不同數據源的數據轉換成多種格式,如可以轉換來自數據庫的數據(DatabaseSource)、也可以轉換來自文本文件的數據(TextSource),轉換后的格式可以是XML文件(XMLTransformer)、也可以是XLS文件(XLSTransformer)等。
          由于需求的變化,該系統可能需要增加新的數據源或者新的文件格式,每增加一個新的類型的數據源或者新的類型的文件格式,客戶類MainClass都需要修改源代碼,以便使用新的類,但違背了開閉原則?,F使用依賴倒轉原則對其進行重構。
          當然根據具體的情況,也可以將AbstractSource注入到AbstractStransformer,依賴注入的方式有以下三種:

          [img]https://ss.csdn.net/p?https://mmbiz.qpic.cn/mmbiz_png/ ... rFZQ/640?wx_fmt=png[/img]

          七、合成/聚合復用原則

          (Composite/Aggregate ReusePrinciple ,CARP):要盡量使用對象組合,而不是繼承關系達到軟件復用的目的。

          1、定義

          經常又叫做合成復用原則(Composite ReusePrinciple或CRP),盡量使用對象組合,而不是繼承來達到復用的目的。
          就是在一個新的對象里面使用一些已有的對象,使之成為新對象的一部分;新對象通過向這些對象的委派達到復用已有功能的目的。簡而言之,要盡量使用合成/聚合,盡量不要使用繼承。

          2、原則分析

          (1)在面向對象設計中,可以通過兩種基本方法在不同的環境中復用已有的設計和實現,即通過組合/聚合關系或通過繼承。
          繼承復用:實現簡單,易于擴展。破壞系統的封裝性;從基類繼承而來的實現是靜態的,不可能在運行時發生改變,沒有足夠的靈活性;只能在有限的環境中使用。(“白箱”復用)
          組合/聚合復用:耦合度相對較低,選擇性地調用成員對象的操作;可以在運行時動態進行。(“黑箱”復用)
          (2)組合/聚合可以使系統更加靈活,類與類之間的耦合度降低,一個類的變化對其他類造成的影響相對較少,因此一般首選使用組合/聚合來實現復用;其次才考慮繼承,在使用繼承時,需要嚴格遵循里氏代換原則,有效使用繼承會有助于對問題的理解,降低復雜度,而濫用繼承反而會增加系統構建和維護的難度以及系統的復雜度,因此需要慎重使用繼承復用。
          (3)此原則和里氏代換原則氏相輔相成的,兩者都是具體實現"開-閉"原則的規范。違反這一原則,就無法實現"開-閉"原則,首先我們要明白合成和聚合的概念:
          注意:聚合和組合的區別是什么?
          合成(組合):表示一個整體與部分的關系,指一個依托整體而存在的關系(整體與部分不可以分開);比如眼睛和嘴對于頭來說就是組合關系,沒有了頭就沒有眼睛和嘴,它們是不可分割的。在UML中,組合關系用帶實心菱形的直線表示。
          聚合:聚合是比合成關系的一種更強的依賴關系,也表示整體與部分的關系(整體與部分可以分開);比如螺絲和汽車玩具的關系,螺絲脫離玩具依然可以用在其它設備之上。在UML中,聚合關系用帶空心菱形的直線表示。

          八、迪米特法則

          (Law of Demeter,LoD:系統中的類,盡量不要與其他類互相作用,減少類之間的耦合度。

          1、定義

          又叫最少知識原則(Least Knowledge Principle或簡寫為LKP)幾種形式定義:
          不要和“陌生人”說話。英文定義為:Don't talk to strangers.
          只與你的直接朋友通信。英文定義為:Talk only to your immediate friends.
          每一個軟件單位對其他的單位都只有最少的知識,而且局限于那些與本單位密切相關的軟件單位。
          簡單地說,也就是,一個對象應當對其它對象有盡可能少的了解。一個類應該對自己需要耦合或調用的類知道得最少,你(被耦合或調用的類)的內部是如何復雜都和我沒關系,那是你的事情,我就知道你提供的public方法,我就調用這么多,其他的一概不關心。

          2、法則分析

          朋友類:在迪米特法則中,對于一個對象,其朋友包括以下幾類:
          (1) 當前對象本身(this);
          (2) 以參數形式傳入到當前對象方法中的對象;
          (3) 當前對象的成員對象;
          (4) 如果當前對象的成員對象是一個集合,那么集合中的元素也都是朋友;
          (5) 當前對象所創建的對象。
          任何一個對象,如果滿足上面的條件之一,就是當前對象的“朋友”,否則就是“陌生人”。
          3、狹義法則和廣義法則:
          在狹義的迪米特法則中,如果兩個類之間不必彼此直接通信,那么這兩個類就不應當發生直接的相互作用,如果其中的一個類需要調用另一個類的某一個方法的話,可以通過第三者轉發這個調用。
          狹義的迪米特法則:可以降低類之間的耦合,但是會在系統中增加大量的小方法并散落在系統的各個角落,它可以使一個系統的局部設計簡化,因為每一個局部都不會和遠距離的對象有直接的關聯,但是也會造成系統的不同模塊之間的通信效率降低,使得系統的不同模塊之間不容易協調。
          廣義的迪米特法則:指對對象之間的信息流量、流向以及信息的影響的控制,主要是對信息隱藏的控制。信息的隱藏可以使各個子系統之間脫耦,從而允許它們獨立地被開發、優化、使用和修改,同時可以促進軟件的復用,由于每一個模塊都不依賴于其他模塊而存在,因此每一個模塊都可以獨立地在其他的地方使用。一個系統的規模越大,信息的隱藏就越重要,而信息隱藏的重要性也就越明顯。
          4、迪米特法則的主要用途:在于控制信息的過載。
          在類的劃分上,應當盡量創建松耦合的類,類之間的耦合度越低,就越有利于復用,一個處在松耦合中的類一旦被修改,不會對關聯的類造成太大波及;
          在類的結構設計上,每一個類都應當盡量降低其成員變量和成員函數的訪問權限;
          在類的設計上,只要有可能,一個類型應當設計成不變類;
          在對其他類的引用上,一個對象對其他對象的引用應當降到。

          5、例子

          外觀模式Facade(結構型)
          迪米特法則與設計模式Facade模式、Mediator模式
          系統中的類,盡量不要與其他類互相作用,減少類之間的耦合度,因為在你的系統中,擴展的時候,你可能需要修改這些類,而類與類之間的關系,決定了修改的復雜度,相互作用越多,則修改難度就越大,反之,如果相互作用的越小,則修改起來的難度就越小..例如A類依賴B類,則B類依賴C類,當你在修改A類的時候,你要考慮B類是否會受到影響,而B類的影響是否又會影響到C類. 如果此時C類再依賴D類的話,呵呵,我想這樣的修改有的受了。

          九、Q&A1、面向對象設計其他原則?

          封裝變化;
          少用繼承多用組合;
          針對接口編程、不針對實現編程;
          為交互對象之間的松耦合設計而努力;
          類應該對擴展開發、對修改封閉(開閉OCP原則);
          依賴抽象,不要依賴于具體類(依賴倒置DIP原則);
          密友原則:只和朋友交談(最少知識原則,迪米特法則);
          說明:一個對象應當對其他對象有盡可能少的了解,將方法調用保持在界限內,只調用屬于以下范圍的方法: 該對象本身(本地方法)對象的組件 被當作方法參數傳進來的對象 此方法創建或實例化的任何對象;
          別找我(調用我) 我會找你(調用你)(好萊塢原則);
          一個類只有一個引起它變化的原因(單一職責SRP原則);

          2、你能解釋一下里氏替換原則嗎?

          嚴格定義:如果對每一個類型為S的對象o1,都有類型為T的對象o2,使得以T定義的所有程序P在所有的對象用o1替換o2時,程序P的行為沒有變化,那么類型S是類型T的子類型。
          通俗表述:所有引用基類(父類)的地方必須能透明地使用其子類的對象。也就是說子類可以擴展父類的功能,但不能改變父類原有的功能。它包含以下4層含義:
          • 子類可以實現父類的抽象方法,但不能覆蓋父類的非抽象方法。
          • 子類中可以增加自己特有的方法。
          • 當子類的方法重載父類的方法時,方法的前置條件(即方法的形參)要比父類方法的輸入參數更寬松。
          • 當子類的方法實現父類的抽象方法時,方法的后置條件(即方法的返回值)要比父類更嚴格。

          3、什么情況下會違反迪米特法則?為什么會有這個問題?

          迪米特法則建議“只和朋友說話,不要陌生人說話”,以此來減少類之間的耦合。

          4、給我一個符合開閉原則的設計模式的例子?

          開閉原則要求你的代碼對擴展開放,對修改關閉。這個意思就是說,如果你想增加一個新的功能,你可以很容易的在不改變已測試過的代碼的前提下增加新的代碼。有好幾個設計模式是基于開閉原則的,如策略模式,如果你需要一個新的策略,只需要實現接口,增加配置,不需要改變核心邏輯。一個正在工作的例子是 Collections.sort() 方法,這就是基于策略模式,遵循開閉原則的,你不需為新的對象修改 sort() 方法,你需要做的僅僅是實現你自己的 Comparator 接口。

          5、什么時候使用享元模式(蠅量模式)?

          享元模式通過共享對象來避免創建太多的對象。為了使用享元模式,你需要確保你的對象是不可變的,這樣你才能安全的共享。JDK 中 String 池、Integer 池以及 Long 池都是很好的使用了享元模式的例子。




          jQuery-瀑布流【CSS】CSS隱藏元素的五種方法

          seo達人

          如果您想訂閱本博客內容,每天自動發到您的郵箱中, 請點這里

          用css隱藏頁面元素有許多種方法。

          1. 1、opacity:0
          2. 2、visibility:hidden
          3. 3、diaplay:none
          4. 4、position:absolute

          opacity

               opacity屬性的意思是設置一個元素的透明度。它不是為改變元素的邊界框(bounding box)而設計的。這一位著將opacity設置為0只能從視覺上隱藏元素。而元素本身依然占據它自己的位置并對網頁的布局起作用,它也將響應用戶交互。


          visibility

               第二個要說的屬性是visibility。將它的值設為hidden將隱藏我們的元素。如同opacity屬性,被隱藏的元素依然會對我們的網頁布局起作用。與opacity唯一不同的是它不會響應任何用戶交互。此外元素在讀屏軟件中會被隱藏

              注意,如果一個元素的visibility被設置為hidden,同時想要顯示它的某個子孫元素,只要將那個元素的visibility顯式設置為visible即可。

              

          dispaly

              display屬性依照詞義真正隱藏元素。將display屬性設為none確保元素不可見并且連盒模型也不生成。使用這個屬性,被隱藏的元素不占據任何空間。不僅如此,一旦display設為none任何對該元素直接打用戶交互操作都不可能生效。此外,讀屏軟件也不會讀到元素的內容。這種方式產生的效果就像元素完全不存在。

              任何這個元素的子孫元素也會被同時隱藏。為這個屬性添加過度動畫是無效的,他的任何不同狀態值之間的切換總是會立即生效。

              不過請注意,通過DOM依然可以訪問到這個元素。因此你可以通過DOM來操作它。


          position

              假設有一個元素你想要與它交互,但是你又不想讓它影響你的網頁布局,沒有合適的屬性可以處理這種情況(opacity和visibility影響布局mdisplay不影響布局但又無法直接交互)。在這種情況下,只能考慮將元素移出可視區域。這個辦法既不會影響布局,有可能讓元素保持可以操作。

          1. .hide {
          2. position: absolute;
          3. top: -9999px;
          4. left: -9999px;
          5. }


          clip-path

              隱藏元素的另一種方法是通過剪裁它們實現。

          1. .hide {
          2. clip-path: polygon(0px 0px,0px 0px,0px 0px,0px 0px);
          3. }

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


          CSS隱藏元素的五種方法

          seo達人

          如果您想訂閱本博客內容,每天自動發到您的郵箱中, 請點這里

          用css隱藏頁面元素有許多種方法。

          1. 1、opacity:0
          2. 2、visibility:hidden
          3. 3、diaplay:none
          4. 4、position:absolute

          opacity

               opacity屬性的意思是設置一個元素的透明度。它不是為改變元素的邊界框(bounding box)而設計的。這一位著將opacity設置為0只能從視覺上隱藏元素。而元素本身依然占據它自己的位置并對網頁的布局起作用,它也將響應用戶交互。


          visibility

               第二個要說的屬性是visibility。將它的值設為hidden將隱藏我們的元素。如同opacity屬性,被隱藏的元素依然會對我們的網頁布局起作用。與opacity唯一不同的是它不會響應任何用戶交互。此外元素在讀屏軟件中會被隱藏

              注意,如果一個元素的visibility被設置為hidden,同時想要顯示它的某個子孫元素,只要將那個元素的visibility顯式設置為visible即可。

              

          dispaly

              display屬性依照詞義真正隱藏元素。將display屬性設為none確保元素不可見并且連盒模型也不生成。使用這個屬性,被隱藏的元素不占據任何空間。不僅如此,一旦display設為none任何對該元素直接打用戶交互操作都不可能生效。此外,讀屏軟件也不會讀到元素的內容。這種方式產生的效果就像元素完全不存在。

              任何這個元素的子孫元素也會被同時隱藏。為這個屬性添加過度動畫是無效的,他的任何不同狀態值之間的切換總是會立即生效。

              不過請注意,通過DOM依然可以訪問到這個元素。因此你可以通過DOM來操作它。


          position

              假設有一個元素你想要與它交互,但是你又不想讓它影響你的網頁布局,沒有合適的屬性可以處理這種情況(opacity和visibility影響布局mdisplay不影響布局但又無法直接交互)。在這種情況下,只能考慮將元素移出可視區域。這個辦法既不會影響布局,有可能讓元素保持可以操作。

          1. .hide {
          2. position: absolute;
          3. top: -9999px;
          4. left: -9999px;
          5. }


          clip-path

              隱藏元素的另一種方法是通過剪裁它們實現。

          1. .hide {
          2. clip-path: polygon(0px 0px,0px 0px,0px 0px,0px 0px);
          3. }

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


          談談移動端布局

          周周

          移動端推廣速度快,效果好,越來越多的企業,商家開始重視移動站的建設和移動頁面(h5)的制作。隨著移動頁面的玩法越來越多,對前端技術的要求也會越來越高。

          選擇合適的布局,是寫好移動頁面的第一步。今天我們就來談談移動端的布局問題。
          為什么移動端布局如此混亂?這是由多方的原因造成的。
          1. css這套技術系統本身十分混亂,基本上可以說毫無規律可言,依賴于技術人員的熟練程度而不是邏輯更多一些;
          2.css歷經了多個時代的升級,每一次升級之后,新的技術標準和舊的基本上沒有任何關聯。比如:table布局,div+css布局,flex布局,grid布局等;
          3. 手機終端市場的混亂。當前市場上手機的尺寸五花八門;加上由iphone的retina技術帶來的dpr的混亂;

          關于移動設備一些基本概念的理解。



          一. 物理設備像素。
          思考:為什么手電筒只能發出一種顏色的光,而我們的屏幕能發出這么多種顏色的光?
          因為我們的屏幕是由無數個小的手電筒組成的,每個點可以發不同顏色的光,最后就組成了我們看到的彩色的效果。
          每張圖片都是由色點組成的,每個色點稱為一個像素。一張圖片由30萬個色點組成,這個圖片的像素就是30W。我們常說相機是多少像素,這個像素實際就是在說這款照相機的感器件有多少個,有100W個感光器件的相機就是100W像素的相機,有4000W個感光器件的相機就是4000W像素,以此類推。一臺100W像素的相機拍攝的照片洗成5寸的照片會比洗成6寸清晰一點。
          二. 屏幕分辨率
          屏幕分辨率是屏幕每行的像素點數*每列的像素點數,每個屏幕有自己的分辨率。屏幕分辨率越高,所呈現的色彩越多,清晰度越高。
          結論:
          1. 像素的單位本質上是:個數,100像素你可以理解成你有100個手電筒;
          2. 同樣大小(比如1cm*1cm大小的矩形),里面的像素越多,畫面越清晰;
          三.css像素
          在pc端1css像素相當于1物理設備像素。
          思考:
          我們的手機分辨率是640*1136(iphone 5和iphone 5s的物理設備分辨率),如果我們打開一個純粹pc端的網站會出現什么情況?
          (比如jumei.com,min-width是1090px,在pc端的我的電腦的設備寬度是1280,通過screen.width進行檢測)
          我們會發現網站會縮小到我們可以看到整個網站(www.jubi.com)
          則會發現,有滾動條了,因為禁止縮放了
          四. dpr
          1個css像素占多少物理設備像素
          思考:iphone 5或者iphone 5s一屏幕能看到的極限是多少寬度?
          應該是320(這是默認的可視區的css寬度) * 2 = 640px
          以上,我們學習完了所有關于移動端布局相關的概念,接下來,我們來聊一聊布局的思路。
          假如我們有640px的設計稿,我們如何才能讓用戶全部看到呢?
          思路一:百分比布局
          把尺寸除以2,比如我們量出來的是640px ---> 實際上我們只寫320px;
          如果是iphone 6怎么辦? iphone 6的寬度是375px;
          由于320和375的寬度其實差別不大,我們可以不定寬度,也就是把整體寬度設定為100%,然后其他的全部量出來是多少。
          布局方法
          - 拿到設計師給我們的設計稿之后(推薦640px),把所有量出來的尺寸除以2即可
          - 遇到等分就用百分比
          - 左浮動 + 右浮動(導航部分實現、折扣推薦導航部分) --> 適合于所有的元素寬度固定的
          - 左浮動 + padding擠(見超值折扣推薦內容部分) 本質上元素大小在任何尺寸下面都是一致,改變的其實是元素與元素之間的間距大小 --> 適合一個元素寬度固定,另一個寬度自適應;

          網站示例

          http://m.duba.com/

          http://m.lagou.com/

          百分比布局的缺點
          在大屏幕的手機下顯示效果會變成有些頁面元素寬度被拉的很長,但是高度還是和原來一樣,實際顯示非常的不協調,這就是流式布局的最致命的缺點,往往只有幾個尺寸的手機下看到的效果是令人滿意的,其實很多視覺設計師應該無法接受這種效果,因為他們的設計圖在大屏幕手機下看到的效果相當于是被橫向拉長來一樣。流式布局并不是最理想的實現方式,通過大量的百分比布局,會經常出現許多兼容性的問題,還有就是對設計有很多的限制,因為他們在設計之初就需要考慮流式布局對元素造成的影響,只能設計橫向拉伸的元素布局,設計的時候存在很多局限性。
          思路二:rem布局
          如何理解rem布局?
          思考一個問題,假如我們的設計稿是750px,我們量出來一個盒子的寬度是75px,那么在640px下面,它應該是多少合適呢? 答案是:64
          問題,如果才能保證你寫的css的尺寸只需要寫一次,在不同的屏幕尺寸下面不用改?
          假如我們在750px下面,我們讓html的font-size為75,則這個盒子的寬度是1rem,在640px下面我們讓html的font-size為64,則這個盒子的寬度也是1rem,問題就這樣解決了。
          那么實際開發中,該用什么樣等布局思路?
          我們打開m.jd.com,m.vip.com,會發現,實際上沒有一個網站用了純粹的百分比或者rem布局,經常會發現各種布局思路混在一起,因為沒有一套布局思路能夠通用保證不出問題
          為什么rem不是萬能的?
          比如1px,如果我們在dpr是2的情況下就會變得很粗,我們知道那并不是真正的1像素。
          推薦布局思路——使用由阿里出品的lib-flexible庫。

          網址:https://github.com/amfe/lib-flexible;


          該如何使用呢?
          1. 引入布局用的flexible.js要注意的是不要再寫meta:viewport標簽了,因為flexible.js會自動幫你創建;
          2. 引入base.css;
          3. 把設計師的設計稿拿過來,標注稿基準字體大小 = 標注稿寬度 / 10,如標注稿寬為750,標注稿基準字體大小為75;標注稿寬為640,標注稿基準字體大小為64;
          4. 除了字體大小以外,其他所有的均按rem來,比如你的設計稿是750px的,那么,假如你量出來的是75px,則是1rem;
          字體除外,要根據不同的dpr設置不同的大小,比如如果是750的設計稿,那么字體假如是24px,則在dpr為1的情況下是16px,dpr2的情況下是24px,dpr3的情況下是32px(這塊涉及到字體專業知識,總結一句話就是沒有人會考慮用奇數字體,https://www.zhihu.com/question/20440679,所以不能讓工具幫我們自動算,得寫死。
          以上是我個人關于移動端布局的一些總結。如有不妥的地方,還請指正。
          最后附上關于移動端常見問題當網址:



          jQuery-瀑布流

          seo達人

          如果您想訂閱本博客內容,每天自動發到您的郵箱中, 請點這里

          html與css:

          <!DOCTYPE html>
          <html lang="en">
          <head>
          <meta charset="UTF-8">
          <title>Document</title>
          <style type="text/css">
          /* 標簽重定義 */

          * {
          margin: 0;
          padding: 0;
          border: none;
          }

          body {
          background: #ddd;
          }

          img {
          border: none;
          }

          a {
          text-decoration: none;
          color: #444;
          }

          a:hover {
          color: #999;
          }
          /* wrap */

          #wrap {
          position: relative;
          width: auto;
          height: auto;
          margin: 0 auto;
          }

          #wrap>div {
          float: left;
          box-sizing: border-box;
          width: 280px;
          height: auto;
          margin: 10px;
          padding: 10px;
          border-radius: 5px;
          background: #fff;
          }

          #wrap>div>img {
          width: 260px;
          margin: 0 auto;
          }

          #wrap>div>a {
          display: block;
          font-size: 18px;
          font-weight: bold;
          line-height: 40px;
          text-align: center;
          }
          </style>
          </head>


          <body>
          <div id="wrap">
          <div>
          <img src="img/1.jpg">
          <a target="_blank">第一張 路飛與艾斯</a>
          </div>
          <div>
          <img src="img/2.jpg">
          <a target="_blank">第二張 艾博</a>
          </div>
          <div>
          <img src="img/3.jpg">
          <a target="_blank">第三張 路飛</a>
          </div>
          <div>
          <img src="img/4.jpg">
          <a target="_blank">第四張 艾斯</a>
          </div>
          <div>
          <img src="img/5.jpg">
          <a target="_blank">第五張 女王</a>
          </div>
          <div>
          <img src="img/6.jpg">
          <a target="_blank">第六張 香吉士</a>
          </div>
          <div>
          <img src="img/7.jpg">
          <a target="_blank">第七張 艾斯</a>
          </div>
          <div>
          <img src="img/8.jpg">
          <a target="_blank">第八張 霸氣</a>
          </div>
          </div>
          <script type="text/javascript" src="js/jquery.min.js"></script>
          <script type="text/javascript" src="js/script.js"></script>
          </body>

          </html>

          JS:

          var waterfall = function(wrap, boxes) {
          // 獲取屏幕可以顯示的列數
          var boxWidth = boxes.eq(0).width() + 40;
          var windowWidth = $(window).width();
          var colsNumber = Math.floor(windowWidth / boxWidth);


          // 設置容器的寬度
          wrap.width(boxWidth * colsNumber);


          // 定義一個數組并存儲每一列的高度
          var everyHeight = new Array();
          for (var i = 0; i < boxes.length; i++) {
          if (i < colsNumber) {
          everyHeight[i] = boxes.eq(i).height() + 40;
          } else {
          var minHeight = Math.min.apply(null, everyHeight);
          var minIndex = getIndex(minHeight, everyHeight);
          boxes.eq(i).css({
          'position': 'absolute',
          'top': minHeight,
          'left': boxes.eq(minIndex).position().left,
          'opacity': '0'
          }).stop().animate({
          'opacity': '1'
          }, 1000);
          everyHeight[minIndex] += boxes.eq(i).height() + 40;
          };
          }
          };


          // 獲取最小列的索引
          function getIndex(minHeight, everyHeight) {
          for (index in everyHeight) {
          if (everyHeight[index] == minHeight) {
          return index;
          };
          };
          };

          $(document).ready(function(event) {
          var wrap = $('#wrap');
          var boxes = $('#wrap').children('div');
          waterfall(wrap, boxes);
          });

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

          js json的格式、存儲與發送

          周周

          1.Json的格式

          其實json就是對象。源生的js代碼并沒有類的概念。對象救就是object。對象有自己的屬性,也可以有自己的方法。json是一種輕量級的存儲和交換信息的語言。他有自己的格式。

          較為簡單的json。里面只有簡單的對象,key+value的形式:

          • var CellInfo = {


          •                 "CellId":         document.getElementById("CellId").value,


          •                 "UEAmount":         document.getElementById("UE value").innerText,


          •                 "BearAddDel":         document.getElementById("bearvalue").innerText,


          •                 "UEAttachDe":         document.getElementById("attachvalue").innerText,


          •                 "TotalDLTP":         document.getElementById("dlvalue").innerText,

          •               "TotalULTP":         document.getElementById("ulvalue").innerText,


          •                 };



          每個元素之間用逗號隔開。調用每個key的值可用語句。例如:CellInfo.UEAmunt,就可取出其中的值。

          較為復雜的json。里面包含了對象。


          • var UEGroup1 = {



          •                 "UEAmount": ua[1],



          •                 "DBR1": {



          •                         "DLPackageSize": DS[1],



          •                         "ULPackageSize": US[1],



          •                         "DLTP": DP[1],



          •                         "ULTP": UP[1],



          •                         "QCI": QCI[0]



          •                 },



          •                 "DBR2": {



          •                         "DLPackageSize": DS[2],



          •                         "ULPackageSize": US[2],



          •                         "DLTP": DP[2],



          •                         "ULTP": UP[2],



          •                         "QCI": QCI[1]



          •                 },



          •                 "DBR3": {



          •                         "DLPackageSize": DS[3],



          •                         "ULPackageSize": US[3],



          •                         "DLTP": DP[3],



          •                         "ULTP": UP[3],



          •                         "QCI": QCI[2]



          •                 }



          •         };




          例如這個UEGroup1,里面的元素不僅有簡單的key+value,還包含了三個對象。對象里的元素用{}括起來,彼此之間用逗號隔開。想具體訪問某個元素的值也是通過逐層key,例如:UEGrooup1.DBR1.DLPackageSize

          動態的往json只增加元素,增加對象。

          前面說的幾個都是靜態的,提前寫好的。那如果臨時想加一個元素,例如在Cellinfo這個json中相加一個number的元素:

          CellInfo.number=10;

          對于往json中添加對象。例如我們想把Cellinfo和UEGroup1這兩個object作為兩個元素加入到另外一個大的json中:

          • var PETInfo = {};//聲明了一個空的對象



          • var CellInfo = {



          •                 "CellId":         document.getElementById("CellId").value,



          •                 "UEAmount":         document.getElementById("UE value").innerText,



          •                 "BearAddDel":         document.getElementById("bearvalue").innerText,



          •                 "UEAttachDe":         document.getElementById("attachvalue").innerText,



          •                 "TotalDLTP":         document.getElementById("dlvalue").innerText,



          •                 "TotalULTP":         document.getElementById("ulvalue").innerText,



          •                 };



          • str_CellInfo = JSON.stringify(CellInfo);//將CellInfo轉為字符串對象



          • PETInfo.CellInfo=str_CellInfo;//在PETInfo中添加名為Cellinfo的屬性,并賦值


          2.json的發送

          json寫好后,發送給后臺。至于后臺怎么處理數據我們不關心。發送json的函數如下:

          • function post(path, params, method) {



          •         method = method || "post";



          •         var form = document.createElement("form");



          •         form.setAttribute("method", method);



          •         form.setAttribute("action", path);





          •         for (var key in params) {



          •                 if (params.hasOwnProperty(key)) {



          •                         var hiddenField = document.createElement("input");



          •                         hiddenField.setAttribute("type", "hidden");



          •                         hiddenField.setAttribute("name", key);



          •                         hiddenField.setAttribute("value", params[key]);



          •                         form.appendChild(hiddenField);



          •                 }



          •         }



          •         document.body.appendChild(form);



          •         form.submit();



          • }

            參數分別是后臺的地址,變量,方法。變量就是我們自己寫好的json,方法默認為post。例如我們想發剛剛的PETInfo

            $.post('http://10.140.160.64:3012/users/ueinfo', PETInfo);

            數據的發送、并獲取結果的實例:

            需求描述:用戶填寫一系列的輸入框,前端獲取數據,封裝成json并發送給服務器,服務器會返回一個返回值,表示狀態。前端需要展示這個內容提示客戶。

            • function sendBook(){



            •         var Book={



            •                 "openstackIP":document.getElementById("openstackIP").value,



            •                 "RAPName":document.getElementById("RAPName").value,



            •                 "RAPVer":document.getElementById("ver").value,



            •                 "OAMIP":document.getElementById("OAMIP").value



            •         };//json封裝用戶輸入的數據



            •         $.post('http://10.140.160.64:3012/servers/env/book', Book)//調用post傳輸數據



            •         .done((resp) => {//傳輸后獲取服務器的返回值



            •         alert(resp);//展示返回值



            •        // window.location.href = 'Environment-List.html';//選擇性界面跳轉



            •     });



            • }

            3.json在本地的存儲

            存儲數據有很多方法。這里我用的是localStorage。localStorage與cookie的區別如下:

            ① cookie在瀏覽器與服務器之間來回傳遞。
            sessionStorage和localStorage不會把數據發給服務器,僅在本地保存

            ②數據有效期不同:
            cookie只在設置的cookie過期時間之前一直有效,即使窗口或瀏覽器關閉。
            sessionStorage:僅在當前瀏覽器窗口關閉前有效。
            localStorage  始終有效,長期保存。

            ③cookie數據還有路徑的概念,可以限制cookie只屬于某個路徑下。
            存儲大小也不同,cookie數據不能超過4k,sessionStorage和localStorage 雖然也有存儲大小的限制,但比cookie大得多,可以達到5M或更大。

            ④ 作用域不用
            sessionStorage不在不同的瀏覽器窗口中共享;
            localStorage在所有同源窗口中都是共享的;
            cookie也是在所有同源窗口中都是共享的;

            WebStorage 支持事件通知機制,可以將數據更新的通知發送給監聽者。Web Storage 的 api 接口使用更方便。

            用localstage存儲json的實例:

            • str_PETInfo=JSON.stringify(PETInfo);//將json轉為字符串對象



            • window.localStorage.setItem("PET",str_PETInfo);//存入本地,該json的key為PET


            將json取出來:



            • var PET=JSON.parse(window.localStorage.getItem("PET"));//將字符串轉化為json



            • var CellInfo=JSON.parse(PET.CellInfo);//json中的Cellinfo對象轉化為json



          jquery 關于table的全選與反選

          seo達人

          如果您想訂閱本博客內容,每天自動發到您的郵箱中, 請點這里

          控制表格的多選和反選,直接上代碼,順便安利一個小知識點:tr的底邊框不顯示的問題,解決辦法是:table{border-collapse:collapse;}    

          
          
          1. <!DOCTYPE html>
          2. <html>
          3. <head>
          4. <title></title>
          5. <style>
          6. *{margin:0;padding:0;}
          7. table{border-collapse:collapse}
          8. .detail_tb {width: 100%;border: 1px solid #ccc;}
          9. .detail_tb .fied_header {height: 38px;line-height: 38px;border-left: none;border-bottom: 1px solid #ccc;background-color: #ececec;}
          10. .detail_tb .fied_header th {text-align: center;border-right: 1px solid #ccc;color: #333;font-size: 14px;}
          11. .detail_tb .fied_header th input {vertical-align: middle;}
          12. .detail_tb tr {height: 38px;line-height: 38px;border-left: none;border-bottom: 1px solid #ccc;background-color: #fff;}
          13. .detail_tb tr td {text-align: center;border-right: 1px solid #ccc;color: #666;font-size: 14px;}
          14. .detail_tb tr td input {float: left;margin: 12px 5px 0 10px;}
          15. .detail_tb tr td span {float: left;}
          16. .detail_tb tr td select {display: inline-block;width: 90px;height: 24px;}
          17. </style>
          18. </head>
          19. <body>
          20. <table class="detail_tb" >
          21. <thead>
          22. <tr class="fied_header">
          23. <th width="65"><input type="checkbox" value="number" id="number"> 序號</th>
          24. <th width="110">孩子姓名</th>
          25. <th width="130">家長電話</th>
          26. <th width="110">介紹人孩子姓名</th>
          27. <th width="130">介紹人電話</th>
          28. <th width="150">報名時間</th>
          29. <th width="100">分組情況</th>
          30. <th width="100">拉新數量</th>
          31. <th width="100">是否簽到</th>
          32. <th width="100">是否發獎</th>
          33. </tr>
          34. </thead>
          35. <tbody id="tbody">
          36. <tr>
          37. <td width="65"><input type="checkbox" value="" id="" ><span>1</span></td>
          38. <td width="110">張三</td>
          39. <td width="130">13888888888</td>
          40. <td width="110">李四</td>
          41. <td width="130">13888888888</td>
          42. <td width="150">2016/08/6 21:00</td>
          43. <td width="100">
          44. <select name="" id="">
          45. <option value="">未分組</option>
          46. <option value="">1</option>
          47. <option value="">2</option>
          48. </select>
          49. </td>
          50. <td width="100">33</td>
          51. <td width="100"></td>
          52. <td width="100">
          53. <select name="" id="">
          54. <option value=""></option>
          55. <option value="">獎品1</option>
          56. <option value="">獎品2</option>
          57. </select>
          58. </td>
          59. </tr>
          60. <tr>
          61. <td width="65"><input type="checkbox" value="" id=""><span>2</span></td>
          62. <td width="110">張四</td>
          63. <td width="130">13888888888</td>
          64. <td width="110">李四</td>
          65. <td width="130">13888888888</td>
          66. <td width="150">2016/08/6 21:00</td>
          67. <td width="100">
          68. <select name="" id="">
          69. <option value="">未分組</option>
          70. <option value="">1</option>
          71. <option value="">2</option>
          72. </select>
          73. </td>
          74. <td width="100">33</td>
          75. <td width="100"></td>
          76. <td width="100">
          77. <select name="" id="">
          78. <option value=""></option>
          79. <option value="">獎品1</option>
          80. <option value="">獎品2</option>
          81. </select>
          82. </td>
          83. </tr>
          84. <tbody>
          85. </table>
          86. <script src="https://cdn.bootcss.com/jquery/1.11.3/jquery.min.js"></script>
          87. <script type="text/javascript">
          88. // 全選和反選
          89. $("#number").click(function () {
          90. var isChecked = $("#number").prop("checked");
          91. $("#tbody input").prop("checked", isChecked);
          92. })
          93. // 單獨選項控制全選
          94. $("#tbody input").click(function () {
          95. var allLength = $("#tbody input").length;
          96. var checkedLength = $("#tbody input:checked").length;
          97. if(allLength == checkedLength){
          98. $("#number").prop("checked",true);
          99. }else {
          100. $("#number").prop("checked",false);
          101. }
          102. });
          103. </script>
          104. </body>
          105. </html>



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


          手機端頁面常見的問題

          周周

          1.解決頁面使用overflow: scroll在iOS上滑動卡頓的問題?



          首先你可能會給頁面的html和body增加了height: 100%, 然后就可能造成IOS上頁面滑動的卡頓問題。解決方案是:



          (1) 看是否能把body和html的height: 100%去除掉。

          (2) 在滾動的容器中增加:-webkit-overflow-scrolling: touch或者給body增加:body {overflow-x: hidden}。



          2.ios頁面橡皮彈回效果遮擋頁面選項卡?



          (1) 有時body和html的height: 100%去除掉問題可能就沒有了。

          (2) 到達臨界值的時候在阻止事件默認行為

          var startY,endY;
          //記錄手指觸摸的起點坐標
          $('body').on('touchstart',function (e) {
               startY = e.touches[0].pageY;
          });
          $('body').on('touchmove',function (e) {
               endY = e.touches[0].pageY;  //記錄手指觸摸的移動中的坐標
               //手指下滑,頁面到達頂端不能繼續下滑
               if(endY>startY&& $(window).scrollTop()<=0){
                   e.preventDefault();
               }
             //手指上滑,頁面到達底部能繼續上滑
               if(endY<startY&& $(window).scrollTop()+ 
                   $(window).height()>=$('body')[0].scrollHeight){
                   e.preventDefault();
               }
          })
          有時也會碰見彈窗出來后兩個層的橡皮筋效果出現問題,我們可以在彈出彈出時給底層頁面加上一個類名,類名禁止頁面滑動這樣下層的橡皮筋效果就會被禁止,就不會影響彈窗層。 3.IOS機型margin屬性無效問題? (1) 設置html body的高度為百分比時,margin-bottom在safari里失效 (2) 直接padding代替margin 4.Ios綁定點擊事件不執行?  (1)添加樣式cursor :pointer。點擊后消除背景閃一下的css:-webkit-tap-highlight-color:transparent;  5.Ios鍵盤換行變為搜索? 首先,input 要放在 form里面。 這時 "換行" 已經變成 “前往”。 如果想變成 “搜索”,input 設置 type="search"。 6.Jq對a標簽點擊事件不生效? 出現這種情況的原因不明,有的朋友解釋:我們平時都是點擊的A標簽中的文字了。 所以要想用JS模擬點擊A標簽事件,就得先往A標簽中的文字添加能被JS捕獲的元素,然后再用JS模擬點擊該元素即可。但是我覺得不合理,雖然找不到原因但是解決辦法還是有的。 (1)document.getElementById("abc ").click(); (2)$("#abc ")[0].click(); 7.有時因為服務器或者別的原因導致頁面上的圖片沒有找到? 這是我們想需要用一個本地的圖片代替沒有找的的圖片
          <script type="text/javascript"> 
          function nofind(){ 
          var img=event.srcElement; 
          img.src="images/logoError.png"; 
          img.onerror=null; 控制不要一直跳動 
          } 
          </script> 
          <img src="images/logo.png" />
          8.transform屬性影響position:fixed?

          (1)規范中有規定:如果元素的transform值不為none,則該元素會生成包含塊和層疊上下文。CSS Transforms Module Level 1不只在手機上,電腦上也一樣。除了fixed元素會受影響之外,z-index(層疊上下文)值也會受影響。絕對定位元素等和包含塊有關的屬性都會受到影響。當然如果transform元素的display值為inline時又會有所不同。最簡單的解決方法就是transform元素內部不能有absolute、fixed元素.

          9.ios對position: fixed不太友好,有時我們需要加點處理?

          在安卓上面,點擊頁面底部的輸入框,軟鍵盤彈出,頁面移動上移。
          而ios上面,點擊頁面底部輸入框,軟鍵盤彈出,輸入框看不到了。。。查資料說什么的都有,iscroll,jquery-moblie,absolute,fixe,static都非常復雜,要改很多。。。
          讓他彈出時讓滾動條在部
          var u = navigator.userAgent, app = navigator.appVersion;
          var isiOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); //ios終端
          if (isiOS) {
              $('textarea').focus(function () {
                  window.setTimeout('scrollBottom()', 500);
              });
          }
          function scrollBottom() {
              window.scrollTo(0, $('body').height());
          }
          10.jq validate插件驗證問題?

          (1)所以的input必須有name不然會出錯

          11.有時手機會出現斷網的情況,我沒可能會對斷網的情況做一些處理?

          (1)navigator.onLine可判斷是否是脫機狀態.

          12.判斷對象的長度?

          (1)用Object.keys,Object.keys方法返回的是一個數組,數組里面裝的是對象的屬性
          var person = {
              "name" : "zhangshan",
              "sex" : "man",
              "age" : "50",
              "height" : "180",
              "phone" : "1xxxxxxxxxx",
              "email" : "xxxxxxxxx@xxx.com"
          };
          var arr = Object.keys(person);
          console.log(arr.length);
          (2)Object.getOwnPropertyNames(obj).length

          13.上一題我們用到了Object.keys與Object.getOwnPropertyNames他們的區別?

          Object.keys定義:返回一個對象可枚舉屬性的字符串數組;
          Object.getOwnPropertyNames定義:返回一個對象可枚舉、不可枚舉屬性的名稱;
          屬性的可枚舉性、不可枚舉性:定義:可枚舉屬性是指那些內部 “可枚舉” 標志設置為 true 的屬性,對于通過直接的賦值和屬性初始化的屬性,該標識值默認為即為 true,對于通過 Object.defineProperty 等定義的屬性,該標識值默認為 false。
          var obj = { "prop1": "v1" };
          Object.defineProperty(obj, "prop2", { value: "v2", enumerable: false });
          console.log(Object.keys(obj).length);           //output:1
          console.log(Object.getOwnPropertyNames(obj).length);    //output:2
          console.log(Object.keys(obj));           //output:Array[1] => [0: "prop1"]
          console.log(Object.getOwnPropertyNames(obj));    //output:Array[2] => [0: "prop1", 1: "prop2"]

          綜合實例


          var obj = { "prop1": "v1" };
          Object.defineProperty(obj, "prop2", { value: "v2", enumerable: false});
          console.log(obj.hasOwnProperty("prop1")); //output: true
          console.log(obj.hasOwnProperty("prop2")); //output: true
          console.log(obj.propertyIsEnumerable("prop1")); //output: true
          console.log(obj.propertyIsEnumerable("prop2")); //output: false
          console.log('prop1' in obj);    //output: true
          console.log('prop2' in obj);    //output: true
          for (var item in obj) {
              console.log(item);
          }
          //output:prop1
          for (var item in Object.getOwnPropertyNames(obj)) {
              console.log(Object.getOwnPropertyNames(obj)[item]);
          }
          //ouput:[prop1,prop2]

          14.移動開發不同手機彈出數字鍵盤問題?



          (1)type="tel"

          iOS和Android的鍵盤表現都差不多

          (2)type="number"

          優點是Android下實現的一個真正的數字鍵盤

          缺點一:iOS下不是九宮格鍵盤,輸入不方便

          缺點二:舊版Android(包括微信所用的X5內核)在輸入框后面會有超級雞肋的小尾巴,好在Android 4.4.4以后給去掉了。

          不過對于缺點二,我們可以用webkit私有的偽元素給fix掉:


          input[type=number]::-webkit-inner-spin-button,  
          input[type=number]::-webkit-outer-spin-button { 
                  -webkit-appearance: none; 
                  appearance: none; 
                  margin: 0; 
          }

          (3)pattern屬性



          pattern用于驗證表單輸入的內容,通常HTML5的type屬性,比如email、tel、number、data類、url等,已經自帶了簡單的數據格式驗證功能了,加上pattern后,前端部分的驗證更加簡單了。

          顯而易見,pattern的屬性值要用正則表達式。

          實例 簡單的數字驗證

          數字的驗證有兩個:

          <input type="number" pattern="d"> 

          <input type="number" pattern="[0-9]*">



          15.input[number]類型輸入非數字字符



          js獲取的值是空;比如-12,+123等



          16.Javascript:history.go()和history.back()的用法與區別?




          簡單的說就是:go(-1):返回上一頁,原頁面表單中的內容會丟失;back():返回上一頁,原頁表表單中的內容會保留。history.go(-1):后退+刷新history.back():后退

          之所以注意到這個區別,是因為不同的瀏覽器后退行為也是有區別的,而區別就跟javascript:history.go()和history.back()的區別類似。

          Chrome和ff瀏覽器后退頁面,會刷新后退的頁面,若有數據請求也會提交數據申請。類似于history.go(-1);

          而safari(包括桌面版和ipad版)的后退按鈕則不會刷新頁面,也不會提交數據申請。類似于javascript:history.back();



          17.Meta基礎知識:



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

          // width    設置viewport寬度,為一個正整數,或字符串‘device-width’

          // height   設置viewport高度,一般設置了寬度,會自動解析出高度,可以不用設置

          // initial-scale    默認縮放比例,為一個數字,可以帶小數

          // minimum-scale    允許用戶最小縮放比例,為一個數字,可以帶小數

          // maximum-scale    允許用戶最大縮放比例,為一個數字,可以帶小數

          // user-scalable    是否允許手動縮放 

          空白頁基本meta標簽

          <!-- 設置縮放 -->

          <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no, minimal-ui" />

          <!-- 可隱藏地址欄,僅針對IOS的Safari(注:IOS7.0版本以后,safari上已看不到效果) -->

          <meta name="apple-mobile-web-app-capable" content="yes" />

          <!-- 僅針對IOS的Safari頂端狀態條的樣式(可選default/black/black-translucent ) -->

          <meta name="apple-mobile-web-app-status-bar-style" content="black" />

          <!-- IOS中禁用將數字識別為電話號碼/忽略Android平臺中對郵箱地址的識別 -->

          <meta name="format-detection"content="telephone=no, email=no" />

          其他meta標簽

          <!-- 啟用360瀏覽器的極速模式(webkit) -->

          <meta name="renderer" content="webkit">

          <!-- 避免IE使用兼容模式 -->

          <meta http-equiv="X-UA-Compatible" content="IE=edge">

          <!-- 針對手持設備優化,主要是針對一些老的不識別viewport的瀏覽器,比如黑莓 -->

          <meta name="HandheldFriendly" content="true">

          <!-- 微軟的老式瀏覽器 -->

          <meta name="MobileOptimized" content="320">

          <!-- uc強制豎屏 -->

          <meta name="screen-orientation" content="portrait">

          <!-- QQ強制豎屏 -->

          <meta name="x5-orientation" content="portrait">

          <!-- UC強制全屏 -->

          <meta name="full-screen" content="yes">

          <!-- QQ強制全屏 -->

          <meta name="x5-fullscreen" content="true">

          <!-- UC應用模式 -->

          <meta name="browsermode" content="application">

          <!-- QQ應用模式 -->

          <meta name="x5-page-mode" content="app">

          <!-- windows phone 點擊無高光 -->

          <meta name="msapplication-tap-highlight" content="no">



          18.移動端如何定義字體font-family?



          @ --------------------------------------中文字體的英文名稱

          @ 宋體 SimSun

          @ 黑體 SimHei

          @ 微信雅黑 Microsoft Yahei

          @ 微軟正黑體 Microsoft JhengHei

          @ 新宋體 NSimSun

          @ 新細明體 MingLiU

          @ 細明體 MingLiU

          @ 標楷體 DFKai-SB

          @ 仿宋 FangSong

          @ 楷體 KaiTi

          @ 仿宋_GB2312 FangSong_GB2312

          @ 楷體_GB2312 KaiTi_GB2312 

          @

          @ 說明:中文字體多數使用宋體、雅黑,英文用Helvetica



          body { font-family: Microsoft Yahei,SimSun,Helvetica; }



          19.打電話發短信寫郵件怎么實現?


          // 一、打電話
          <a href="tel:0755-10086">打電話給:0755-10086</a>
          //  二、發短信,winphone系統無效
          <a href="sms:10086">發短信給: 10086</a>
          // 三、寫郵件
          <a href="mailto:863139978@qq.com">點擊我發郵件</a>
          //2.收件地址后添加?cc=開頭,可添加抄送地址(Android存在兼容問題)
          <a href="mailto:863139978@qq.com?cc=zhangqian0406@yeah.net">點擊我發郵件</a>
          //3.跟著抄送地址后,寫上&bcc=,可添加密件抄送地址(Android存在兼容問題)
          <a href="mailto:863139978@qq.com?cc=zhangqian0406@yeah.net&bcc=384900096@qq.com">點擊我發郵件</a>
          //4.包含多個收件人、抄送、密件抄送人,用分號(;)隔開多個郵件人的地址
          <a href="mailto:863139978@qq.com;[url=mailto:384900096@qq.com]384900096@qq.com[/url]">點擊我發郵件</a>
          //5.包含主題,用?subject=
          <a href="mailto:863139978@qq.com?subject=郵件主題">點擊我發郵件</a>
          //6.包含內容,用?body=;如內容包含文本,使用%0A給文本換行 
          <a href="mailto:863139978@qq.com?body=郵件主題內容%0A騰訊誠信%0A期待您的到來">點擊我發郵件</a>
          //7.內容包含鏈接,含http(s)://等的文本自動轉化為鏈接
          <a href="mailto:863139978@qq.com?body=http://www.baidu.com">點擊我發郵件</a>
          //8.內容包含圖片(PC不支持)
          <a href="mailto:863139978@qq.com?body=<img src='images/1.jpg' />">點擊我發郵件</a>
          //9.完整示例
          <a href="mailto:863139978@qq.com;[url=mailto:384900096@qq.com]384900096@qq.com[/url]?cc=zhangqian0406@yeah.net&bcc=993233461@qq.com&subject=[郵件主題]&body=騰訊誠邀您參與%0A%0A[url=http://www.baidu.com]http://www.baidu.com[/url]%0A%0A<img src='images/1.jpg' />">點擊我發郵件</a>
          20.移動端touch事件(區分webkit和winphone)?

          // 以下支持webkit
          touchstart——當手指觸碰屏幕時候發生。不管當前有多少只手指
          touchmove——當手指在屏幕上滑動時連續觸發。通常我們再滑屏頁面,會調用event的preventDefault()可以阻止默認情況的發生:阻止頁面滾動
          touchend——當手指離開屏幕時觸發
          touchcancel——系統停止跟蹤觸摸時候會觸發。例如在觸摸過程中突然頁面alert()一個提示框,此時會觸發該事件,這個事件比較少用

          //TouchEvent說明:
          touches:屏幕上所有手指的信息
          targetTouches:手指在目標區域的手指信息
          changedTouches:最近一次觸發該事件的手指信息
          touchend時,touches與targetTouches信息會被刪除,changedTouches保存的最后一次的信息,最好用于計算手指信息

          //參數信息(changedTouches[0])
          clientX、clientY在顯示區的坐標
          target:當前元素

          //事件響應順序
          ontouchstart > ontouchmove > ontouchend > onclick


          React Native原生與JS層交互

          seo達人

          如果您想訂閱本博客內容,每天自動發到您的郵箱中, 請點這里

          最近在對《React Native移動開發實戰》一書進行部分修訂和升級。在React Native開發中,免不了會涉及到原生代碼與JS層的消息傳遞等問題,那么React Native究竟是如何實現與原生的互相操作的呢?

          原生給React Native傳參

          原生給React Native傳值

          原生給JS傳值,主要依靠屬性,也就是通過initialProperties,這個RCTRootView的初始化函數的參數來完成。通過RCTRootView的初始化函數你可以將任意屬性傳遞給React Native應用,參數initialProperties必須是NSDictionary的一個實例。RCTRootView有一個appProperties屬性,修改這個屬性,JS端會調用相應的渲染方法。

          使用RCTRootView將React Natvie視圖封裝到原生組件中。RCTRootView是一個UIView容器,承載著React Native應用。同時它也提供了一個聯通原生端和被托管端的接口。

          例如有下面一段OC代碼:

          NSURL *jsCodeLocation;
          
            jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index.ios" fallbackResource:nil]; NSArray *imageList = @[@"http://foo.com/bar1.png",
                                   @"http://foo.com/bar2.png"]; NSDictionary *wjyprops = @{@"images" : imageList};
          
            RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation
                                                                moduleName:@"ReactNativeProject" initialProperties:wjyprops
                                                             launchOptions:launchOptions];
              
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11
          • 12
          • 13
          • 14

          下面是JS層的處理:

          import React, { Component } from 'react'; import {
            AppRegistry,
            View,
            Image,
          } from 'react-native'; class ImageBrowserApp extends Component { renderImage(imgURI) { return (
                <Image source={{uri: imgURI}} />
              );
            }
            render() { return (
                <View>
                  {this.props.images.map(this.renderImage)}
                </View>
              );
            }
          }
          
          AppRegistry.registerComponent('ImageBrowserApp', () => ImageBrowserApp);
              
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11
          • 12
          • 13
          • 14
          • 15
          • 16
          • 17
          • 18
          • 19
          • 20
          • 21
          • 22
          • 23

          不管OC中關于initialProperties的名字叫什么,在JS中都是this.props開頭,然后接下來才是key名字。

          {"rootTag":1,"initialProps":{"images":["http://foo.com/bar1.png","http://foo.com/bar2.png"]}}. 
              
          • 1

          使用appProperties進行參數傳遞

          RCTRootView同樣提供了一個可讀寫的屬性appProperties。在appProperties設置之后,React Native應用將會根據新的屬性重新渲染。當然,只有在新屬性和舊的屬性有更改時更新才會被觸發。

          NSArray *imageList = @[@"http://foo.com/bar3.png", @"http://foo.com/bar4.png"]; rootView.appProperties = @{@"images" : imageList};
              
          • 1
          • 2
          • 3

          可以隨時更新屬性,但是更新必須在主線程中進行,讀取則可以在任何線程中進行。

          React Native執行原生方法及回調

          React Native執行原生方法

          .h的文件代碼:

          #import <Foundation/Foundation.h> #import <RCTBridgeModule.h> @interface wjyTestManager : NSObject<RCTBridgeModule> @end
              
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7

          .m的文件代碼:

          #import "wjyTestManager.h" @implementation wjyTestManager RCT_EXPORT_MODULE();
          
          RCT_EXPORT_METHOD(doSomething:(NSString *)aString withA:(NSString *)a)
          { NSLog(@"%@,%@",aString,a);
          } @end
              
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11
          • 12

          為了實現RCTBridgeModule協議,你的類需要包含RCT_EXPORT_MODULE()宏。這個宏也可以添加一個參數用來指定在Javascript中訪問這個模塊的名字。如果你不指定,默認就會使用這個Objective-C類的名字。

          并且必須明確的聲明要給Javascript導出的方法,否則React Native不會導出任何方法。OC中聲明要給Javascript導出的方法,通過RCT_EXPORT_METHOD()宏來實現。

          import React, { Component } from 'react';
          import {
            AppRegistry,
            StyleSheet,
            Text,
            View,
            Alert,
            TouchableHighlight,
          } from 'react-native';
          
          import {
            NativeModules,
            NativeAppEventEmitter
          } from 'react-native'; var CalendarManager = NativeModules.wjyTestManager; class ReactNativeProject extends Component { render() { return (
                    <TouchableHighlight onPress={()=>CalendarManager.doSomething('sdfsdf','sdfsdfs')}>
                    <Text style={styles.text}
                >點擊 </Text>
                    </TouchableHighlight>
          
                  );
                }
          } const styles = StyleSheet.create({
          text: {
            flex: 1,
            marginTop: 55,
            fontWeight: 'bold' },
          });
          
          AppRegistry.registerComponent('ReactNativeProject', () => ReactNativeProject);
              
          • 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

          要用到NativeModules則要引入相應的命名空間import { NativeModules } from ‘react-native’;然后再進行調用CalendarManager.doSomething(‘sdfsdf’,’sdfsdfs’);橋接到Javascript的方法返回值類型必須是void。React Native的橋接操作是異步的,所以要返回結果給Javascript,你必須通過回調或者觸發事件來進行。

          傳參并回調

          RCT_EXPORT_METHOD(testCallbackEvent:(NSDictionary *)dictionary callback:(RCTResponseSenderBlock)callback)
          { NSLog(@"當前名字為:%@",dictionary); NSArray *events=@[@"callback ", @"test ", @" array"];
            callback(@[[NSNull null],events]);
          }
              
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6

          說明:第一個參數代表從JavaScript傳過來的數據,第二個參數是回調方法; 
          JS層代碼:

          import {
            NativeModules,
            NativeAppEventEmitter
          } from 'react-native'; var CalendarManager = NativeModules.wjyTestManager; class ReactNativeProject extends Component { render() { return (
                    <TouchableHighlight onPress={()=>{CalendarManager.testCallbackEvent(
                       {'name':'good','description':'http://www.lcode.org'},
                       (error,events)=>{ if(error){
                             console.error(error);
                           }else{
                             this.setState({events:events});
                           }
                     })}}
                   >
                    <Text style={styles.text}
                >點擊 </Text>
                    </TouchableHighlight>
          
                  );
                }
          }
              
          • 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

          參數類型說明

          RCT_EXPORT_METHOD 支持所有標準JSON類型,包括:

          • string (NSString)
          • number (NSInteger, float, double, CGFloat, NSNumber)
          • boolean (BOOL, NSNumber)
          • array (NSArray) 包含本列表中任意類型
          • object (NSDictionary) 包含string類型的鍵和本列表中任意類型的值
          • function (RCTResponseSenderBlock)

          除此以外,任何RCTConvert類支持的的類型也都可以使用(參見RCTConvert了解更多信息)。RCTConvert還提供了一系列輔助函數,用來接收一個JSON值并轉換到原生Objective-C類型或類。例如:

          #import "RCTConvert.h" #import "RCTBridge.h" #import "RCTEventDispatcher.h" //  對外提供調用方法,為了演示事件傳入屬性字段 RCT_EXPORT_METHOD(testDictionaryEvent:(NSString *)name details:(NSDictionary *) dictionary)
          { NSString *location = [RCTConvert NSString:dictionary[@"thing"]]; NSDate *time = [RCTConvert NSDate:dictionary[@"time"]]; NSString *description=[RCTConvert NSString:dictionary[@"description"]]; NSString *info = [NSString stringWithFormat:@"Test: %@\nFor: %@\nTestTime: %@\nDescription: %@",name,location,time,description]; NSLog(@"%@", info);
          }
              
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11
          • 12
          • 13
          • 14

          iOS原生訪問React Native

          如果需要從iOS原生方法發送數據到JavaScript中,那么使用eventDispatcher。例如:

          #import "RCTBridge.h" #import "RCTEventDispatcher.h" @implementation CalendarManager @synthesize bridge = _bridge; //  進行設置發送事件通知給JavaScript端 - (void)calendarEventReminderReceived:(NSNotification *)notification
          { NSString *name = [notification userInfo][@"name"];
              [self.bridge.eventDispatcher sendAppEventWithName:@"EventReminder" body:@{@"name": name}];
          } @end
              
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11
          • 12
          • 13
          • 14
          • 15
          • 16

          在JavaScript中可以這樣訂閱事件,通常需要在componentWillUnmount函數中取消事件的訂閱。

          import { NativeAppEventEmitter } from 'react-native';
          
          var subscription = NativeAppEventEmitter.addListener( 'EventReminder',
            (reminder) => console.log(reminder.name)
          ); ... // 千萬不要忘記忘記取消訂閱, 通常在componentWillUnmount函數中實現。
          subscription.remove();
              
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9

          用NativeAppEventEmitter.addListener中注冊一個通知,之后再OC中通過bridge.eventDispatcher sendAppEventWithName發送一個通知,這樣就形成了調用關系。

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

          前端工程師必備實用網站

          周周

          素材類網站


          千庫網,一個免費下載圖片素材的網站:http://588ku.com/ 
          千庫網.jpg.png


          Unsplash是一個分享免費高質量照片的網站,照片分辨率都挺大,而且都是真實的攝影師作品,圖片多是風景和靜物:https://unsplash.com/ 

          Unsplash.jpg.pngUnsplash2.jpg.png

          插件類網站

          jq22,分享jQuery插件和提供各種jQuery的詳細使用方法,在線預覽,jQuery插件下載及教程http://www.jq22.com/

          jq22.jpg.png


          http://www.htmleaf.com/ 這個網站與上一個網站類似,也提供了大量的jQuery插件。

                          htmleaf.jpg.png

          layui這是一個強大的模塊化前端框架http://www.layui.com/

                       layui1.jpg.png

          layui2.jpg.png

          H-ui,端框架,一個輕量級前端框架,簡單免費,兼容性好,服務中國網站:http://www.h-ui.net/index.shtml

          H-ui.jpg.png 

          字體類網站

          有字庫,一個免下載字體,直接在線引用字體的網站http://www.youziku.com/onlinefont/index

          有字庫.jpg.png



          PS字體庫,包含了幾乎所有類型的字體,下載好安裝,PS中就可以使用了:http://www.psjia.com/pssc/fontxz/list_18_3.html


                         PS字體庫.png

          圖標類網站

          iconfont,這是阿里巴巴旗下的圖標庫網站,直接搜索關鍵詞就可以找到大批的圖標。下載圖標的時候我們還可以選擇顏色、大小、格式,根據自己的需要下載就好了:http://www.iconfont.cn/plus

                             iconfont.jpg.png

          easyicon,這也是一個非常有名的圖標庫,與上面那個不同的是,這里的圖標不是單一顏色的,而是設計好的顏色。下載圖標也很簡單,直接點擊對應圖標上面的格式就可以下載:http://www.easyicon.net/iconsearch/ios/

                            easyicon.jpg.png

          奧森圖標(Font Awesome),提供豐富的矢量字體圖標—通過CSS可以任意控制所有圖標的大小 ,顏色,陰影:http://www.thinkcmf.com/font/search.html

                          奧森圖標.jpg.png

                           奧森圖標1.jpg.png

          配色類網站

          http://colorhunt.co這個網站給我們提供了很多的配色方案,我們直接使用就OK了。

          使用方法也很簡單,鼠標移動到對應的顏色上,我們就可以看到顏色的十六進制碼,復制這個顏色到工具里就可以使用了。

                          colorhunt.jpg.png

          https://webgradients.com/, 180種漸變方案供你選擇,還可以直接復制CSS樣式應用到網頁中。

                        webgradients.jpg.png

          adobe,這個是Adobe公司出的,他提供了多種配色方案。我們點擊圓盤中間的點,就可以調整出我們想要的配色方案:https://color.adobe.com/zh/create/color-wheel

                          Adobe.jpg.png

          http://www.colorhunter.com/這是一個提取現有圖片配色方案的工具。我們上傳一張圖片,它就會幫我們把圖片的配色提取出來供我們使用。

                          colorhunt.jpg.png

          bootcss,這個網站是為WEB設計,開發中經常用到的安全色。網站內列出了顏色的十六進制碼和RGB碼,復制粘貼就可以了:http://www.bootcss.com/p/websafecolors/

                         bootcss..jpg.png

          sioe,這是一個在線RGB和十六進制顏色碼轉換工具。在對應的位置填入十六進制代碼,點擊轉換,我們就可以獲取到RGB顏色的代碼了http://www.sioe.cn/yingyong/yanse-rgb-16/

                        sioe.jpg.png




          日歷

          鏈接

          個人資料

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

          存檔

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