這個移動時代,企業正在迅速擁抱移動解決方案,使他們的業務成為更高的預期。雖然有幾種方法可用于移動應用開發,但HTML5移動應用開發是最受歡迎的。雖然具有很少或根本沒有技術知識的人員可以聘請開發人員獲得多種應用程序來滿足他們的需求,但是有許多有魅力的HTML5框架和工具可以支持敏捷和輕松的移動開發。
在這篇文章中,我將發現已知的用于設計和開發移動應用程序的神話般接口的HTML5框架。這些框架包括包含JavaScript和CSS文件的庫。這些庫允許開發人員精通開發移動應用程序,而不需要實現任何本機代碼。
沒有任何進一步的煩惱,讓我們提供最好的HTML5移動UI框架。
Kendo UI是最受歡迎的HTML5框架之一,加載了高端功能。您可以通過此框架輕松開發無價的跨平臺移動應用程序。這個快速和輕便的平臺配備了一套超過70個UI小部件; 這個強大的集是完全基于jQuery的。在提供AngularJS集成的同時,它還支持Bootstrap并提供離線數據解決方案。它還提供了13個內置主題的壓倒性的列表,可以定制,以創建所需的外觀和感覺。
對于現場的新手,如果您擁有jQuery(可以輕松學習)的專業知識,那么開始使用Kendo UI就不難。此外,它還包括各種開源工具等
Bootstrap是另一個支持HTML,CSS和JS的高級框架,它允許人們通過響應式布局來開發美觀的移動應用程序。這個絕對框架的直觀和簡單的界面允許具有初學者,中級或高級技能的人們以期望的方式精通開發移動應用程序。為了幫助您在這個平臺上方便地工作,它包括基于HTML和CSS的設計模板。您可以使用這些模板創建表單,排版,圖像輪播,導航等。
Ionic是一個非常棒的HTML5框架,可以幫助開發先進的混合移動應用程序。它基本上是一個開源的前端SDK,它使用CSS,HTML和JavaScript來提供高效的混合移動應用開發。它包含可以幫助您開發高度交互式移動應用程序的工具。此外,它是用CSS擴展構建的--SASS(Syntactically Awesome StyleSheets),并針對AngularJS進行了優化。你可以很容易的開始運行這個框架,這很容易操作; 如果需要,您還可以參考互聯網上提供的便捷教程。
Sencha Touch是一個令人敬畏的HTML5和JavaScript框架,可以創建高端跨平臺移動網絡應用程序。這個基于MVC的框架為移動設備和驚人的主題提供了超過50個輝煌的UI組件,擁有原生的視覺吸引力。Sencha Touch開發的應用程序與所有主流移動平臺兼容。其本土化的UI小部件和強大的自適應布局增強了用戶交互,從而增加了其可信度。
Onsen UI是一個基于元素的自定義框架,可以設計出令人難以置信的應用程序。它旨在提供具有優異UX的確定性HTML5應用程序,而不是提及本機類的性能。它本質上是響應的,因此,允許人們有效地瞄準大量的屏幕尺寸,而不會影響質量。您可以通過這個開源框架的易于使用的界面,精通開發混合應用程序。此外,它還支持Apache Cordova和PhoneGaps。
Intel SDK是另一個令人驚奇的HTML5框架,在全球范圍內廣受歡迎,用于敏捷移動應用程序開發。您可以輕松開發跨平臺移動應用程序,具有所需的外觀和感覺。它通過審查工作流程使設計,開發,調試和部署相當簡單。
所有這些框架提供最優秀的性能,您可以通過考慮您的項目需求和業務目標來簡化您的選擇。選擇最適合的框架,并開發出具有迷人而卓越UI的移動應用。
(原創文章,版權所有)
家好,很高興又見面了,我是"高級前端?進階?",由我帶著大家一起關注前端前沿、深入前端底層技術,大家一起進步,也歡迎大家關注、點贊、收藏、轉發,您的支持是我不斷創作的動力。
今天給大家帶來的主題是“2023年前端必知的CSS 和 UI 15+全新功能”,文章知識點大部分來自于Google官網,但是內容做了不少總結和補充。希望本文能從總體上讓大家對2023年的瀏覽器新功能有一個大而全的了解。
話不多說,直接進入正題!
在創建移動網頁時,通常依靠媒體查詢來根據屏幕尺寸調整布局。 但是,如果想根據內容塊的大小應用修改該怎么辦? 這就是容器查詢的用途。
容器查詢允許根據父級大小修改元素的樣式,這與媒體查詢根據視口的大小應用更改不同。
比如下面的例子:
.post {
container-type: inline-size;
// size, inline-size或者 normal
// 為.post元素聲明一個containment context
}
<div class="post">
<div class="card">
<h2>Card title</h2>
<p>Card content</p>
</div>
</div>
container-type 支持不同類型,不同類型有不同含義:
接下來,使用 @container 規則定義容器查詢。 以下示例中的查詢將根據包含上下文的最近祖先(nearest ancestor )的大小將樣式應用于元素。 具體來說,如果容器寬度超過 700 像素,此查詢將為卡片標題應用更大的字體大小:
/* 容器小于700px樣式 */
.card h2 {
font-size: 1em;
}
/* 容器大于 700px */
@container (min-width: 700px) {
.card h2 {
font-size: 2em;
}
}
容器查詢規范還允許開發者查詢父容器的樣式值。 目前,已在 Chrome 111 中部分實現,開發者可以在其中使用 CSS 自定義屬性來應用容器樣式。
以下示例使用存儲在自定義屬性值中的天氣特征(例如下雨、晴天和陰天)來設置卡片背景和指示器圖標的樣式。
@container style(--sunny: true) {
.weather-card {
background: linear-gradient(-30deg, yellow, orange);
}
.weather-card:after {
content: url(<data-uri-for-demo-brevity>);
background: gold;
}
}
下面是 HTML 的內容值:
<ul class="card-list">
{/*使用--sunny: true*/}
<li class="card-container" style="--sunny: true;">
<div class="weather-card">
<div class="day">Saturday</div>
<div class="date">February <span>12</span></div>
<div class="temps">
<div class="high">High: <span>55</span></div>/
<div class="low">Low: <span>47</span></div>
</div>
<div class="features">
Clear skies, sun
</div>
</div>
</li>
</ul>
</ul>
以上示例只是樣式查詢的開始,后續甚至可以使用布爾查詢來確定自定義屬性值是否存在并減少代碼重復,目前正在討論的是范圍查詢(range queries)以根據一系列值應用樣式。
使用 :has() 選擇器,可以通過檢查父元素是否包含特定子元素,或者這些子元素是否處于特定狀態來應用樣式。 它本質上是一個“父”選擇器。
對該選擇器有不同的語法:
假如有以下 HTML:
<article>
<h1>Morning Times</h1>
<h2>Delivering you news every morning</h2>
<p>
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua.
</p>
</article>
同時有以下選擇器:
h1:has(+ h2) {
margin: 0 0 0.25rem 0;
color:red;
}
此時“Morning Times”文案將顯示紅色。
Web 平臺現在具有更高級的 nth-child 選擇功能,而高級 nth-child 語法提供了一個新關鍵字(“of”),它允許開發者使用 An+B 的現有微語法,以及要在其中進行搜索的更具體的子集。
如果在特殊類上使用常規的 nth-child,例如 :nth-child(2),則瀏覽器將選擇應用了特殊類的元素,并且也是第二個子元素。 這與 :nth-child(2 of .special) 形成對比,后者將首先預過濾所有 .special 元素,然后從該列表中選擇第二個元素。
:nth-child(2 of .highlight)
// 選擇具有 .highlight 類的第二個匹配元素
:nth-child(4 of .highlight, .sale)
// 從一組同級元素中選擇第四個元素,即 .highlight 或 .sale
Chrome Canary 包含一項新功能(Chrome 114 或更高版本),即 text-wrap:balance。
如果沒有 text-wrap: balance, 設計師、內容編輯和出版商幾乎沒有工具來改變行平衡的方式。最好的選擇是使用 <wbr> 或 - 幫助指導文本布局做出關于在何處換行和換行的更明智的決策。
作為開發人員,由于不知道標題或段落的最終大小、字體大小,甚至語言。 有效且美觀地處理文本換行所需的所有變量都在瀏覽器中。 這就是為什么會看到標題換行,如下圖所示:
.unbalanced {
max-inline-size: 50ch;
}
使用 CSS Text 4 中的 text-wrap:balance,可以請求瀏覽器找出文本的最佳平衡換行解決方案。 瀏覽器確實知道所有因素,例如:字體大小、語言和分配的區域。 比如下面效果:
代碼如下:
.balanced {
max-inline-size: 50ch;
text-wrap: balance;
}
網頁排版的另一個不錯的改進是 initial-letter, 此 CSS 屬性使開發者可以更好地控制內嵌首字下沉樣式。
開發者可以在:first-letter 偽元素上使用 initial-letter 來指定,比如:基于字母占用的行數的字母大小。 字母的塊偏移或“下沉”,即字母所在的位置。
p:first-letter {
initial-letter: 3.5 3;
}
開發網頁時,考慮屏幕的尺寸非常重要。 使用視口進行設計的一種方法是使用視口高度單位 vh/vw(100vh 是屏幕高度的 100%)。
這種方法的問題是移動設備上沒有考慮瀏覽器的工具欄高度:
為了解決這個問題,瀏覽器現在提供了新的單位值:
重要的是要知道這些單位沒有考慮滾動條。 因此,根據具體情況,開發者可能希望使用一個單位值而不是另一個單位值,或者只使用視口以外的另一個單位。
Web 平臺的另一個新的關鍵補充是廣色域色彩空間。 在 Web 平臺上提供廣色域顏色之前,開發者可以拍攝色彩鮮艷的照片,并可在現代設備上查看,但無法創建與這些鮮艷值相匹配的按鈕、文本顏色或背景。
但現在 Web 平臺上有了一系列新的色彩空間,包括: REC2020、P3、XYZ、LAB、OKLAB、LCH 和 OKLCH,可以在高清色彩指南中了解新的網絡色彩空間等。
可以立即在 DevTools 中看到顏色范圍如何擴展,其中白線描繪了 srgb 范圍的結束位置以及更寬色域顏色范圍的開始位置。
[data-color="red"] {
background-color: oklch(50% 130 20);
}
[data-color="red-alpha"] {
background-color: oklch(50% 130 20 / 0.4);
}
color-mix() 函數對擴展的顏色空間進行擴展。
此函數支持混合兩個顏色值,以根據混合顏色的通道創建新值,混合的色彩空間會影響結果。 在像 oklch 這樣更具感知性的色彩空間中,將具有與 srgb 等不同的顏色范圍。
該方法的語法如下:
color-mix(in lch, plum, pink);
color-mix(in lch, plum 40%, pink);
color-mix(in srgb, #34c9eb 20%, white);
color-mix(in hsl longer hue, hsl(120 100% 50%) 20%, white);
color-mix() 函數提供了大多數開發要求的功能,即能夠保留不透明的顏色值,同時為其添加一些透明度。
現在,可以使用品牌顏色變量,同時以不同的不透明度創建這些顏色的變體, 實現此目的的方法是將顏色與透明混合。比如: 當將藍色品牌顏色與 10% 透明顏色混合時,會得到 90% 不透明品牌顏色。
.shorter {
background-color: color-mix(
in hsl shorter hue,
hsl(10 100% 50%),
hsl(60 100% 50%)
);
}
.longer {
background-color: color-mix(
in hsl longer hue,
hsl(10 100% 50%),
hsl(60 100% 50%)
);
}
CSS 嵌套的實現來自于大多數開發者對 Sass、Less 的喜愛,也是 CSS 開發人員多年來最要求的功能之一,終于在 Web 平臺中得以實現。
CSS 嵌套允許開發人員以更簡潔、分組的格式編寫,從而減少冗余。
.card {}
.card:hover {}
/* 可以通過下面方式嵌套 */
.card {
&:hover {}
}
CSS 嵌套還支持嵌套媒體查詢,當然也包括容器查詢。在以下示例中,如果卡片的容器中有足夠的寬度,卡片就會從縱向布局更改為橫向布局:
.card {
display: grid;
gap: 1rem;
@container (width >= 480px) {
// 尺寸足夠大
display: flex;
}
}
CSS Scoped 樣式允許開發人員指定特定樣式應用的邊界,本質上是在 CSS 中創建本機命名空間(native namespacing )。
以前,開發人員只能依靠第 3 方腳本來重命名類,或使用特定的命名約定來防止樣式沖突,但目前開發者已經可以使用 @scope。:scope 屬于 CSS 偽類,它表示作為選擇器要匹配的參考點的元素。
/* Selects a scoped element */
:scope {
background-color: lime;
}
在上面的例子中,:scope 等效于 :root,因為目前尚無一種方法來顯式建立作用域元素。當從 DOM API 使用,如(querySelector(), querySelectorAll(), matches(), 或 Element.closest()), :scope 匹配調用 API 的元素。
let paragraph = document.getElementById('para');
let output = document.getElementById('output');
if (paragraph.matches(':scope')) {
output.innerText = 'Yep, the element is its own scope as expected!';
}
上面的示例演示了調用 Element.matches() 方法中使用 :scope 偽類來匹配調用它的元素。
層疊本質就是定義了如何合并來自多個源的屬性值的算法,簡單來說,CSS 規則的順序很重要。當兩條同級別的規則應用到一個元素的時候,寫在后面的就是實際使用的規則。
h1 {
color: red;
}
h1 {
color: blue;
}
// 兩條規則優先級相同,所以順序在最后的生效,h1是color:blue'勝出',顯示藍色。
Cascade layers 通過讓用戶控制哪些層比其他層具有更高的優先級來解決這個問題,這意味著對應用樣式進行更精細的控制。
即 CSS @規則 中的@layer 聲明了一個 級聯層,同一層內的規則將級聯在一起,這給予了開發者對層疊機制的更多控制。
@layer utilities {
/* 創建一個名為 utilities 的級聯層 */
}
下面是導入@layer 的方式:
@layer theme, layout, utilities;
層最初被指定的順序決定了它是否有優先級。對于聲明而言,如果同一聲明在多個級聯層中被指定,最后一層中的將優先于其他層。因此,在上面的例子中,如果 theme 層和 utilities 層中存在沖突的規則,那么 utilities 層中的將優先被應用。
即使 utilities 層中規則的優先級低于 theme 層中的,該規則仍會被應用。一旦級聯層順序建立之后,優先級和出現順序都會被忽略。這將使創建 CSS 選擇器變得更加簡單,因為你不需要確保每一個選擇器都有足夠高的優先級來覆蓋其他沖突的規則,只需要確保出現在一個順序更靠后的級聯層中。
現在三角函數已經被添加到現有的 CSS 數學函數中。這些功能已經在所有主流瀏覽器中得到支持,使開發者能夠在 Web 平臺上創建更復雜的布局。 比如: sin()、cos() 、 tan()、asin()、acos()、atan() 、 atan2()等等。
過去,開發者依賴于 transform 函數來應用子函數來縮放、旋轉和平移 UI 元素。 這涉及大量重復,并且在動畫中的不同時間應用多個變換時尤為復雜。
.target {
transform: translateX(50%) rotate(30deg) scale(1.2);
}
.target:hover {
transform: translateX(50%) rotate(30deg) scale(2);
/* Only scale changed here, yet you have to repeat all other parts */
}
現在,可以通過分離變換類型并單獨應用來在 CSS 動畫實現所有這些細節。
.target {
translate: 50% 0;
rotate: 30deg;
scale: 1.2;
}
.target:hover {
scale: 2;
}
這樣,平移、旋轉或縮放的變化可以在動畫期間的不同時間以不同的變化率同時發生。
彈出窗口經常用于對話框和工具提示等元素,這些元素通常需要錨定到特定元素。
現在,開發者可以使用 anchor()函數創建居中工具提示,使用錨點的寬度將工具提示定位在錨點 x 位置的 50%處。 然后,使用現有定位值來應用其余的放置樣式。但是,這種做法常常會遇到不少問題。
為了解決這個問題,錨點定位 API 允許自定義的 fallback 位置。
以下示例創建一個名為“top-then-bottom”的 fallback 位置。 瀏覽器將首先嘗試將工具提示放置在頂部,如果它不適合視口,則瀏覽器會將其放置在底部的錨定元素下方。
.center-tooltip {
position-fallback: --top-then-bottom;
translate: -50% 0;
}
// 注意下面的兩個@try
@position-fallback --top-then-bottom {
@try {
bottom: calc(anchor(top) + 0.5rem);
left: anchor(center);
}
@try {
top: calc(anchor(bottom) + 0.5rem);
left: anchor(center);
}
}大家好,很高興又見面了,我是"高級前端?進階?",由我帶著大家一起關注前端前沿、深入前端底層技術,大家一起進步,也歡迎大家關注、點贊、收藏、轉發,您的支持是我不斷創作的動力。
除了以上新增能力外,最近瀏覽器還新增了更多高級特性,比如:
https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_container_queries
https://developer.chrome.com/blog/whats-new-css-ui-2023/#style-queries
https://developer.mozilla.org/zh-CN/docs/Web/CSS/:has
https://developer.chrome.com/articles/css-nth-child-of-s/
https://www.bookstack.cn/read/html-tutorial/spilt.4.docs-text.md
https://developer.chrome.com/blog/css-text-wrap-balance/
https://developer.chrome.com/blog/control-your-drop-caps-with-css-initial-letter/
https://web.dev/articles/viewport-units?hl=zh-cn
https://developer.mozilla.org/zh-CN/docs/Web/CSS/color_value/oklch#browser_compatibility
https://developer.mozilla.org/zh-CN/docs/Web/CSS/color_value/color-mix
https://developer.mozilla.org/zh-CN/docs/Web/CSS/:scope
https://developer.chrome.com/blog/cascade-layers/
https://www.mathsisfun.com/sine-cosine-tangent.html
https://web.dev/articles/css-individual-transform-properties?hl=zh-cn
https://developer.chrome.com/blog/tether-elements-to-each-other-with-css-anchor-positioning/
https://developer.mozilla.org/zh-CN/docs/Web/HTML/Global_attributes/popover
https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_scroll-driven_animations
https://developer.mozilla.org/en-US/docs/Web/API/View_Transitions_API
https://developer.mozilla.org/en-US/docs/Web/CSS/accent-color
https://positivethinking.tech/insights/the-10-new-css-features-in-2023/
、了解React-Native組件
作為開發者都知道,UI組件對于一個應用的重要性。也許,在一款應用中,你還沒有完整的,有體系的構建UI組件,但是你一定或多或少有種想把組件抽出來的沖動,就像有些沖動是人類的本能一樣....這是作為一個開發者的本能。那么組件的復用和統一化是十分必要的。常見的組件有:日歷、下拉列表(常在應用中表現為下拉刷新)、導航欄、頭部、底部、選項卡等等。React-Native就提供了一套iOS原生的組件,這樣就不用HTML5去模擬組件了。React-Native使用css來構建頁面布局,使用Native iOS Components給我們提供強大的組件功能。目前已有組件如下圖:
二、使用CSS樣式 & Flexbox布局
第一篇,已經知道了如何構建工程。這里同樣創建一個HelloWorld工程。默認啟動界面如下圖:
1、基本樣式 這里使用View和Text組件作為演示對象,首先,修改index.ios.js里面的代碼,這里只需要關注StyleSheet和render里面的模板。修改后的代碼如下: /** * Sample React Native App * https://github.com/facebook/react-native */ 'use strict'; var React = require('react-native'); var { AppRegistry, StyleSheet, Text, View, } = React; var HelloWorld = React.createClass({ render: function() { return ( <View> <View></View> </View> ); } }); var styles = StyleSheet.create({ }); AppRegistry.registerComponent('HelloWorld', () => HelloWorld); 這時候,你cmd + R刷新模擬器應該看到是空白的界面。現在,是展現css魅力的時候了。React-native使用的css 表達是一個JS自面量對象,并且嚴格區分該對象屬性的類型,所以要遵循對象的寫法,而不能使用以前css的寫法,這個需要自己熟悉了。 (1)增加一個帶邊框的矩形,紅色邊框 直接在組件上添加樣式是這樣的:style={{height:40, borderWidth: 1, borderColor: 'red'}}style是組件的一個自有屬性,第一個{}JS執行環境或者說是模板,第二個{}只是css樣式對象的括號而已(慢慢體會,不難理解)。這樣修改后的代碼如下: render: function() { return ( <View> <View style={{height:40, borderWidth: 1, borderColor: 'red'}}> </View> </View> ); } cmd + R刷新模擬器,結果如下:
(2)如何知道該組件支持哪些樣式呢? 上面的已經很簡單了,作為web開發者用腳趾頭都能閉眼寫出來。如果我們需要知道該組件有哪些樣式,又不想查手冊,一個最為簡單的方法是,在樣式表里寫錯一個屬性,比如我寫一個沒有的屬性“border”。但是該屬性必須寫到樣式的創建中去,而不能寫為內聯樣式。寫成內聯樣式,你是看不到報錯提示的。我們改寫成樣式表創建類里面: var HelloWorld = React.createClass({ render: function() { return ( <View> <View style={styles.style_1}> </View> </View> ); } }); var styles = StyleSheet.create({ style_1:{ border: '1px solid red', height:40, borderWidth: 1, borderColor: 'red', } }); 這個時候你就能齊刷刷地看到樣式表的報錯和提示有哪些樣式了,如下圖所示:
(3)獨立樣式類 其實上面已經展示了獨立樣式類了,那么樣式類創建很簡單,我們只需要使用React.StyleSheet來創建類。其實創建的類就是一個js對象而已。那么在組件上引用是這樣的<View style={{對象名稱.對象屬性}}></View>,就跟上面(2)的代碼一樣。 2、說說Flexbox布局 其實,這樣的css樣式,作為web開發者一用就會,那么說說布局的事兒。除去margin, padding, position等大家熟悉的web布局的話,最為重要的就是flexbox,目前支持的屬性如下,有6個:
(1)先說flex屬性,上一段代碼 var HelloWorld = React.createClass({ render: function() { return ( <View style={styles.style_0}> <View style={styles.style_1}></View> <View style={styles.style_1}></View> <View style={{flex:10}}></View> </View> ); } }); var styles = StyleSheet.create({ style_0:{ flex:1, }, style_1:{ flex: 5, height:40, borderWidth: 1, borderColor: 'red', } }); 當一個(元素)組件,定義了flex屬性時,表示該元素是可伸縮的。當然flex的屬性值是大于0的時候才伸縮,其小于和等于0的時候不伸縮,例如:flex:0, flex:-1等。上面的代碼,最外層的view是可伸縮的,因為沒有兄弟節點和它搶占空間。里層是3個view,可以看到三個view的flex屬性加起來是5+5+10=20,所以第一個view和第二個view分別占1/4伸縮空間, 最后一個view占據1/2空間,具體如下圖:
(2) flexDirection flexDirection在React-Native中只有兩個屬性,一個是row(橫向伸縮)和column(縱向伸縮)。具體的效果可見如下代碼: var HelloWorld = React.createClass({ render: function() { return ( <View style={styles.style_0}> <View style={styles.style_1}> <Text style={{marginTop:40, fontSize:25}}>1/4高</Text> <Text style={{marginTop:40, fontSize:25}}>1/4高</Text> </View> <View style={[styles.style_1, {flexDirection: 'column'}]}> <Text style={{marginTop:40, fontSize:25}}>1/4高</Text> <Text style={{marginTop:40, fontSize:25}}>1/4高</Text> </View> <View style={{flex:10, borderWidth: 1, borderColor: 'red',}}> <Text style={{marginTop:40, fontSize:25}}>1/2高</Text> </View> </View> ); } }); var styles = StyleSheet.create({ style_0:{ flex:1, }, style_1:{ flex: 5, flexDirection: 'row', height:40, borderWidth: 1, borderColor: 'red', } }); 具體的效果如下:
(3)alignSelf:對齊方式 alignSelf的對齊方式主要有四種:flex-start、 flex-end、 center、 auto、 stretch。看看代碼,應該就很清楚了:
效果如下圖
*請認真填寫需求信息,我們會在24小時內與您取得聯系。