2014年11月4日星期二

Intro to CSS 3D transforms - 色拉油

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
Intro to CSS 3D transforms - 色拉油  阅读原文»

原文地址:Intro to CSS 3D transforms,本文只是翻译了其中的一部分,省去了作者写文章的原因浏览器兼容部分(已经过时)

Perspective

元素需要设置需要设置perspective来激活3D效果,可以通过两种方式实现

  • 在transform属性中使用perspective方法

    transform: perspective( 600px );
  • 直接使用perspective属性

    perspective: 600px;

NOTE:出于代码简介的目的,demo中的CSS样式没有使用浏览器前缀,在实际使用中需要使用-webkit-perspective, -moz-perspective, 等

<style>
.container {
width: 200px;
height: 200px;
border: 1px solid #CCC;
margin: 0 auto 40px;
}
.box {
width: 100%;
height: 100%;
}
#red1 .box {
background-color: red;
transform: perspective( 600px ) rotateY( 45deg );
}
</style>
<section id="red1" class="container">
<div class="box red"></div>
</section>

<style>
#blue1{
perspective: 600px;
}
#blue1 .box {
background-color: blue;
transform: rotateY( 45deg );
}
</style>

<section id="blue1" class="container">
<div class="box blue1"></div>
</section>

这两种方式都会触发3D效果,但是有一点不同:第一种方式直接在一个元素上触发3D变形,但是当多个元素的时候变形效果和预期会有所不同,如果使用同样的方法作用于不同位置的元素的时候,每个元素会有自己的轴心,为了解决这个问题,需要在父元素使用perspective属性,这样每个子元素都共享相同的3D空间

<style>
#red2 figure {
background: red;
transform: perspective( 400px ) rotateY(45deg);
}
.container figure {
display: block;
width: 55px;
height: 55px;
float: left;
margin: 5px;
}

#red2 figure {
background: #F00;
-webkit-transform: perspective( 400px ) rotateY( 45deg );
-moz-transform: perspective( 400px ) rotateY( 45deg );
-o-transform: perspective( 400px ) rotateY( 45deg );
transform: perspective( 400px ) rotateY( 45deg );
}
</style>
<section id="red2" class="container">
<figure></figure>
<figure></figure>
<figure></figure>
<figure></figure>
<figure></figure>
<figure></figure>
<figure></figure>
<figure></figure>
<figure></figure>
</section>

<style>
#blue2 {
perspective: 400px;
}

#blue2 figure {
background: blue;
transform: rotateY( 45deg );
}
</style>
<section id="blue2" class="container">
<figure></figure>
<figure></figure>
<figure></figure>
<figure></figure>
<figure></figure>
<figure></figure>
<figure></figure>
<figure></figure>
<figure></figure>
</section>

perspective属性的值决定了3D效果的强烈程度,可以认为是观察者到页面的距离。值越大距离越远,视觉上的3D效果就会相应的减弱。perspective: 2000px; 会产生一个好像我们使用望远镜看远方物体的3D效果,perspective: 100px;会产生一个小昆虫看大象的效果。

3D效果默认轴心是元素中央,可以通过perspective-origin来修改轴心

perspective-origin: 25% 75%;

点击这里看一下作者写的一个有意思的立方体旋转页面

3D变形方法

作为一个web者,可能很熟悉两个方向:X & Y,表示元素的水平方向和垂直方向,在perspective激活的3D空间中我们可以在X、Y、Z三个坐标轴上对元素进行变形处理。3D变形使用的变形方法和2D变形一样,如果熟悉2D变形方法很容易掌握3D变形

  • rotateX( angle )
  • rotateY( angle )
  • rotateZ( angle )
  • translateZ( tz )
  • scaleZ( sz )

translateX()方法使元素延X轴移动,translateZ()使元素延Z轴(在3D空间中方向从前到后)移动。正值使元素离观察者更近,负值使元素变远。

translateZ( -200px )


translateZ( 200px )


rotateX( 45deg )


rotateY( 45deg )


rotateZ( 45deg )

有几个变形方法的缩写,这些方法需要把三个参数写全

  • translate3d( tx, ty, tz )
  • scale3d( sx, sy, sz )
  • rotate3d( rx, ry, rz, angle )

Pro-tip: fn3d()变形方法可以触发硬件加速HTML5 buzzwords in action

任意3D操作会触发硬件加速,甚至可能变形只用到了2D的,或者没有做任何事情(比如translate3d(0,0,0))。需要注意的是这只是当前的表现,未来可能变化(这也是为什么我们没有写文档或者鼓励这么做),但是这在很多场景下非常有用,可以显著的提高渲染性能

立方体

创建六个面

<section class="container">
<div id="cube">
<figure class="front">1</figure>
<figure class="back">2</figure>
<figure class="right">3</figure>
<figure class="left">4</figure>
<figure class="top">5</figure>
<figure class="bottom">6</figure>
</div>
</section>

为6个面设置基本的位置和尺寸样式

.container {
width: 200px;
height: 200px;
position: relative;
perspective: 1000px;
}

#cube {
width: 100%;
height: 100%;
position: absolute;
transform-style: preserve-3d;
}

#cube figure {
width: 196px;
height: 196px;
display: block;
position: absolute;
border: 2px solid black;
}

1、2是前后面,3、4是左右,5、6是上下

#cube .front { transform: rotateY( 0deg ); }
#cube .back { transform: rotateX( 180deg ); }
#cube .right { transform: rotateY( 90deg ); }
#cube .left { transform: rotateY( -90deg ); }
#cube .top { transform: rotateX( 90deg ); }
#cube .bottom { transform: rotateX( -90deg ); }

我们可以移除#cube .front样式声明,只用前面是可见的,上、下、左、右面与视角平行,所以看不到。需要从中心位置移动它们才可以看得到,每个面都是200px宽,每个面都需要从立方体中心移动100px;

#cube .front { transform: rotateY( 0deg ) translateZ( 100px ); }
#cube .back { transform: rotateX( 180deg ) translate
c# 当引用类型作为方法的参数 - huaxiaoyao  阅读原文»

c#java)中,参数传递都是传递的参数本身的值,

对于值类型,传递的是值本身。

对于引用类型,定义引用类型变量的时候,一个是在栈中的变量,存储的是一个指针,指向在堆中分配的对象实例的地址,当然,如果对象没有实例化,给null值的时候例外。

传递引用类型变量的时候,传递的也是值,

但它的值是内存地址,地址指定堆中的对象。

所以当我们在方法中改变对象内容的时候,我们外围 的引用类型变量操作的对象也发生了变化,因为他们指向的是同一个。

但是如果我们在操作的方法中对 对象进行了新的实例化,则就会在堆中新生成一个对象,和原来的就是两个不同的对象了,在操作的方法结束,这个对象如果没有特别处理,就没有变量指向它了,它就会被销毁。

示例:

new Thread(() =>

{

try

{

StringBuilder sb = null;

//addline(ref sb);

addline(sb);

rtb_log.InvokeIfRequired(()=> rtb_log.AppendText(sb.ToString()+"\r\n"));

}

catch (Exception ex)

{

rtb_log.InvokeIfRequired(() => rtb_log.AppendText(ex.Message + "\r\n"));

}

finally { if (conn != null && conn.State == ConnectionState.Open) conn.Close(); }

}).Start();



void addline( StringBuilder sb)

{

if (sb == null) sb = new StringBuilder();

sb.Append("hello world!");

}

调用时会发生 对象空引用的异常。

原因是因为在方法中进行了对象的初始化,但是外围的sb和方法中的sb是两个不同的变量,在方法中分配了对象实例后,外围 sb指定的还是null.

如果想解除这个异常,有几个方法,第一个是对对象进行有效初始化,不要置为null值,如果这里可以直接new StringBuilder()。不要在方法内部再实例化。第二个是如果对象在外围无法初始化,像接口对象,需要延迟到方法中进行初始化的,可以使用返回值的方式或者是ref参数的方法。

例如:

void addline(ref StringBuilder sbx)

{

if (sbx == null) sbx = new StringBuilder();

sbx.Append("hello world!");

}

或者

StringBuilder addline2(StringBuilder sbx)

{

if (sbx == null) sbx = new StringBuilder();

sbx.Append("hello world!");

return sbx;

}


本文链接:c# 当引用类型作为方法的参数,转载请注明。

阅读更多内容

没有评论:

发表评论