整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

6个最好的HTML框架,用于开发一个伟大的移动UI

这个移动时代,企业正在迅速拥抱移动解决方案,使他们的业务成为更高的预期。虽然有几种方法可用于移动应用开发,但HTML5移动应用开发是最受欢迎的。虽然具有很少或根本没有技术知识的人员可以聘请开发人员获得多种应用程序来满足他们的需求,但是有许多有魅力的HTML5框架和工具可以支持敏捷和轻松的移动开发。

在这篇文章中,我将发现已知的用于设计和开发移动应用程序的神话般接口的HTML5框架。这些框架包括包含JavaScript和CSS文件的库。这些库允许开发人员精通开发移动应用程序,而不需要实现任何本机代码。

没有任何进一步的烦恼,让我们提供最好的HTML5移动UI框架。

Kendo UI

Kendo UI是最受欢迎的HTML5框架之一,加载了高端功能。您可以通过此框架轻松开发无价的跨平台移动应用程序。这个快速和轻便的平台配备了一套超过70个UI小部件; 这个强大的集是完全基于jQuery的。在提供AngularJS集成的同时,它还支持Bootstrap并提供离线数据解决方案。它还提供了13个内置主题的压倒性的列表,可以定制,以创建所需的外观和感觉。

对于现场的新手,如果您拥有jQuery(可以轻松学习)的专业知识,那么开始使用Kendo UI就不难。此外,它还包括各种开源工具等

Bootstrap

Bootstrap是另一个支持HTML,CSS和JS的高级框架,它允许人们通过响应式布局来开发美观的移动应用程序。这个绝对框架的直观和简单的界面允许具有初学者,中级或高级技能的人们以期望的方式精通开发移动应用程序。为了帮助您在这个平台上方便地工作,它包括基于HTML和CSS的设计模板。您可以使用这些模板创建表单,排版,图像轮播,导航等。

Ionic

Ionic是一个非常棒的HTML5框架,可以帮助开发先进的混合移动应用程序。它基本上是一个开源的前端SDK,它使用CSS,HTML和JavaScript来提供高效的混合移动应用开发。它包含可以帮助您开发高度交互式移动应用程序的工具。此外,它是用CSS扩展构建的--SASS(Syntactically Awesome StyleSheets),并针对AngularJS进行了优化。你可以很容易的开始运行这个框架,这很容易操作; 如果需要,您还可以参考互联网上提供的便捷教程。

Sencha Touch

Sencha Touch是一个令人敬畏的HTML5和JavaScript框架,可以创建高端跨平台移动网络应用程序。这个基于MVC的框架为移动设备和惊人的主题提供了超过50个辉煌的UI组件,拥有原生的视觉吸引力。Sencha Touch开发的应用程序与所有主流移动平台兼容。其本土化的UI小部件和强大的自适应布局增强了用户交互,从而增加了其可信度。

Onsen UI

Onsen UI是一个基于元素的自定义框架,可以设计出令人难以置信的应用程序。它旨在提供具有优异UX的确定性HTML5应用程序,而不是提及本机类的性能。它本质上是响应的,因此,允许人们有效地瞄准大量的屏幕尺寸,而不会影响质量。您可以通过这个开源框架的易于使用的界面,精通开发混合应用程序。此外,它还支持Apache Cordova和PhoneGaps。

Intel SDK

Intel SDK是另一个令人惊奇的HTML5框架,在全球范围内广受欢迎,用于敏捷移动应用程序开发。您可以轻松开发跨平台移动应用程序,具有所需的外观和感觉。它通过审查工作流程使设计,开发,调试和部署相当简单。

所有这些框架提供最优秀的性能,您可以通过考虑您的项目需求和业务目标来简化您的选择。选择最适合的框架,并开发出具有迷人而卓越UI的移动应用。

(原创文章,版权所有)

家好,很高兴又见面了,我是"高级前端‬进阶‬",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发,您的支持是我不断创作的动力。

今天给大家带来的主题是“2023年前端必知的CSS 和 UI 15+全新功能”,文章知识点大部分来自于Google官网,但是内容做了不少总结和补充。希望本文能从总体上让大家对2023年的浏览器新功能有一个大而全的了解。

话不多说,直接进入正题!

容器查询(Container Queries)

在创建移动网页时,通常依靠媒体查询来根据屏幕尺寸调整布局。 但是,如果想根据内容块的大小应用修改该怎么办? 这就是容器查询的用途。

容器查询允许根据父级大小修改元素的样式,这与媒体查询根据视口的大小应用更改不同

比如下面的例子:

.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 支持不同类型,不同类型有不同含义:

  • size:查询将基于容器的内联尺寸和块尺寸。将布局、样式和大小限制应用于容器。
  • inline-size:查询将基于容器的内联尺寸。将布局、样式和内联大小包含应用于元素。
  • normal:该元素不是任何容器大小查询的查询容器(query container),但仍然是容器样式查询的查询容器。

接下来,使用 @container 规则定义容器查询。 以下示例中的查询将根据包含上下文的最近祖先(nearest ancestor )的大小将样式应用于元素。 具体来说,如果容器宽度超过 700 像素,此查询将为卡片标题应用更大的字体大小:

/* 容器小于700px样式 */
.card h2 {
  font-size: 1em;
}
/* 容器大于 700px */
@container (min-width: 700px) {
  .card h2 {
    font-size: 2em;
  }
}

Style Queries

容器查询规范还允许开发者查询父容器的样式值。 目前,已在 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()

使用 :has() 选择器,可以通过检查父元素是否包含特定子元素,或者这些子元素是否处于特定状态来应用样式。 它本质上是一个“父”选择器

对该选择器有不同的语法:

  • h1:has(p):选择具有 <p> 子级标记的 <h1> ,无论其级别如何。
  • h1:has(> p):选择具有 <p> 子级标记的 <h1>
  • h1:has(+ p):选择后面直接跟着<p>元素的<h1>

假如有以下 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”文案将显示红色。

nth-of

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

text-wrap: balance

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

网页排版的另一个不错的改进是 initial-letter, 此 CSS 属性使开发者可以更好地控制内嵌首字下沉样式。

开发者可以在:first-letter 伪元素上使用 initial-letter 来指定,比如:基于字母占用的行数的字母大小。 字母的块偏移或“下沉”,即字母所在的位置。

p:first-letter {
  initial-letter: 3.5 3;
}
  • 第一个参数定义字母的大小及其占用的行数: 字母将放大,同时保持其纵横比。不能使用负值,但可以使用小数值。
  • 第二个参数定义字母下沉(letter sink): 这可以被认为是字母所在位置的偏移量。 值是可选的,不能为负数。 如果不存在,则假定字母大小的值取整至最接近的整数。 这相当于使用关键字“drop”。 接收器还接受另一个关键字值“raise”,它相当于接收器 1。

新 viewport 单元

开发网页时,考虑屏幕的尺寸非常重要。 使用视口进行设计的一种方法是使用视口高度单位 vh/vw(100vh 是屏幕高度的 100%)。

这种方法的问题是移动设备上没有考虑浏览器的工具栏高度

  • 蓝色箭头:显示页面的高度
  • 红色箭头:屏幕上可见的高度

为了解决这个问题,浏览器现在提供了新的单位值:

  • 小视口(svh/svw):考虑地址栏和工具栏
  • 大视口(lvh/lvw):不考虑地址栏和工具栏
  • 动态视口 (dvh/dvw):当工具栏可见或/和不可见时调整其值。

重要的是要知道这些单位没有考虑滚动条。 因此,根据具体情况,开发者可能希望使用一个单位值而不是另一个单位值,或者只使用视口以外的另一个单位。

广色域色彩空间

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

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 Nesting(CSS 嵌套)

CSS 嵌套的实现来自于大多数开发者对 Sass、Less 的喜爱,也是 CSS 开发人员多年来最要求的功能之一,终于在 Web 平台中得以实现。

CSS 嵌套允许开发人员以更简洁、分组的格式编写,从而减少冗余。

.card {}
.card:hover {}
/* 可以通过下面方式嵌套 */
.card {
  &:hover {}
}

CSS 嵌套还支持嵌套媒体查询,当然也包括容器查询。在以下示例中,如果卡片的容器中有足够的宽度,卡片就会从纵向布局更改为横向布局:

.card {
  display: grid;
  gap: 1rem;
  @container (width >= 480px) {
    // 尺寸足够大
    display: flex;
  }
}

Scoped CSS

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 伪类来匹配调用它的元素。

Cascade layers

层叠本质就是定义了如何合并来自多个源的属性值的算法,简单来说,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()等等。

  • cos(): CSS 函数是一个三角函数,它返回数字的余弦值,该值介于 -1 和 1 之间。该函数包含一个计算,必须通过解释解析为 <number> 或 <angle> 以弧度表示的参数结果。 也就是说,cos(45deg)、cos(0.125turn) 和 cos(3.14159 / 4) 都表示相同的值,大约为 0.707。
  • sin():CSS 函数是一个三角函数,它返回数字的正弦值,该值是 -1 到 1 之间的值。该函数包含一个计算,必须通过解释来解析为 <number> 或 <angle> 以弧度表示的参数结果。 也就是说,sin(45deg)、sin(0.125turn) 和 sin(3.14159 / 4) 都表示相同的值,大约为 0.707。

单独动画属性

过去,开发者依赖于 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);
  }
}大家好,很高兴又见面了,我是"高级前端‬进阶‬",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发,您的支持是我不断创作的动力。

其他

除了以上新增能力外,最近浏览器还新增了更多高级特性,比如:

  • Popover:全局属性 popover 用来指定一个元素为弹出式元素(popover element)。弹出式元素通过 display: none 被隐藏,直到通过调用/控制元素(即带有 popovertarget 属性的 <button> 或 \ )或 HTMLElement.showPopover() 调用打开
  • <selectmenu>:通过 Popover 和锚点定位(anchor positioning),开发者可以构建完全可定制的选择菜单。 OpenUI 社区小组一直在研究这些菜单的基本结构,并寻找允许自定义其中任何内容的方法。
  • Scroll-driven animations:提供了构建在 CSS 动画模块和 Web 动画 API 之上的功能。 允许根据沿着基于滚动的时间线而不是默认的基于时间的文档时间线的进度来对属性值进行动画处理。
  • View transitions:View Transitions API 提供了一种机制,可以轻松地在不同 DOM 状态之间创建动画转换,同时还可以一步更新 DOM 内容。
  • 离散属性动画:为 Web 提供某种方法来为离散属性设置动画,比如 display:none 等
  • accent-color :为某些元素生成的用户界面控件设置强调色。

参考资料

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。看看代码,应该就很清楚了:

 效果如下图