• 旋转的骰子(二)


    1.动画——旋转的骰子

    上一次我们做了一个旋转的骰子(参看第2讲),这次我们想要点击按钮,让骰子旋转到特定的点数停下来!

    2.分析需求——庖丁解牛

    a.立方体特定的朝向对应着特定的旋转角度

       骰子显示特定点数,无非就是旋转骰子,让特定点数的面朝向屏幕外侧

    b.通过自定义属性控制旋转角度

       利用css属性选择器,将特定属性值和骰子旋转样式,建立一一对应关系

    c.通过进行动画控制

       通过添加类,删除类,启动动画

    d.添加控制按钮,触发动画

       添加6个按钮,点击,触发筛子旋转,方便调试

    3.旋转特定角度,露出特定平面

    4.自定义属性的设置 

    与表达式

    “与”表达式(&&),准确的说是“逻辑与”表达式,形式为: A && B && C

    其中ABC为子表达式,子表达式数目不限,只有所有的子表达式都为true,整个表达式的值才为true.

    判断为true的常见类型:

      布尔值true,非零数值,对象,字符串

    判断false的常见类型:

      布尔值false,数值0对象(null),未定义变量(undefine)

    与表达式是可以赋值给给其他变量的,它的值的分两种情况:

    如果整个表达式的值为 true ,则整个表达式的值,是 最后一个为 true 的,子表达式的值
    如果表达式的值为 false 则整个表达式的值,为 第一个为 false 的子表达式的值

    如下图所示

     5.动画的开启/结束

     

     6.测试按钮

     

     

     7.更多思考

    我们可以制作一个骰子,然后通过单一按钮,进行随机投掷,这样就变成了一个有趣的小游戏

    8 代码

    注意代码中引用jquery-1.12.4.js,可自行到官网下载

    1. html>
    2. <html>
    3. <head>
    4. <meta charset="UTF-8"/>
    5. <title>Rotate Dicetitle>
    6. <link rel="stylesheet" type="text/css" href="./styles.css"/>
    7. head>
    8. <body>
    9. <div class="dice">
    10. <div class="vertical">
    11. <div class="horizontal">
    12. <div class="cube" point="">
    13. <div class="face front one">
    14. <span class="dot">span>
    15. div>
    16. <div class="face back two">
    17. <span class="dot">span>
    18. <span class="dot">span>
    19. div>
    20. <div class="face up three">
    21. <span class="dot">span>
    22. <span class="dot">span>
    23. <span class="dot">span>
    24. div>
    25. <div class="face down four">
    26. <div class="dot-row">
    27. <span class="dot">span>
    28. <span class="dot">span>
    29. div>
    30. <div class="dot-row">
    31. <span class="dot">span>
    32. <span class="dot">span>
    33. div>
    34. div>
    35. <div class="face left five">
    36. <div class="dot-row">
    37. <span class="dot">span>
    38. <span class="dot">span>
    39. div>
    40. <div class="dot-row">
    41. <span class="dot">span>
    42. div>
    43. <div class="dot-row">
    44. <span class="dot">span>
    45. <span class="dot">span>
    46. div>
    47. div>
    48. <div class="face right six">
    49. <div class="dot-row">
    50. <span class="dot">span>
    51. <span class="dot">span>
    52. <span class="dot">span>
    53. div>
    54. <div class="dot-row">
    55. <span class="dot">span>
    56. <span class="dot">span>
    57. <span class="dot">span>
    58. div>
    59. div>
    60. <div class="axis-face x">div>
    61. <div class="axis-face y">div>
    62. <div class="axis-face z">div>
    63. div>
    64. div>
    65. div>
    66. div>
    67. <div class="btn-group">
    68. <button class="" point="1">1button>
    69. <button class="" point="2">2button>
    70. <button class="" point="3">3button>
    71. <button class="" point="4">4button>
    72. <button class="" point="5">5button>
    73. <button class="" point="6">6button>
    74. div>
    75. <script src="./jquery-1.12.4.js">script>
    76. <script src="./think.js">script>
    77. body>
    78. html>

     

     

    1. html
    2. {
    3. background-color: black;
    4. font-size:100px;
    5. padding: 1em;
    6. text-align: center;
    7. }
    8. .btn-group{
    9. display: inline-block;
    10. }
    11. /*骰子动画*/
    12. .dice.ani .vertical{
    13. animation: jump 1s linear;
    14. }
    15. .dice.ani .horizontal{
    16. animation: rotateY 2s ease-out;
    17. }
    18. .dice.ani .cube{
    19. transition: transform 2.1s ;
    20. }
    21. @keyframes rotateY {
    22. from{transform:rotateY(0);}
    23. to{transform:rotateY(1800deg);}
    24. }
    25. /*@keyframes rotateX {
    26. from{transform:rotateX(0);}
    27. to{transform:rotateX(3600deg);}
    28. }*/
    29. @keyframes jump {
    30. from{transform: translateY(-3.6em);}
    31. 30%{transform: translateY(-3em);}
    32. 60%{transform: translateY(0);}
    33. 70%{transform: translateY(-1.5em);}
    34. 80%{transform: translateY(0);}
    35. 90%{transform: translateY(-.6em);}
    36. to,10%{transform: translateY(0);}
    37. }
    38. /*转到对应点数的动画*/
    39. .cube{
    40. transform: rotateX(-10deg) rotateY(10deg);
    41. }
    42. .cube[point=p1]{
    43. transform: rotateX(-10deg) rotateY(10deg);
    44. }
    45. .cube[point=p2]{
    46. transform: rotateX(-10deg) rotateY(190deg);
    47. }
    48. .cube[point=p3]{
    49. transform: rotateX(-100deg) rotateY(0) rotateZ(10deg);
    50. }
    51. .cube[point=p4]{
    52. transform: rotateX(80deg) rotateY(0) rotateZ(-10deg);
    53. }
    54. .cube[point=p5]{
    55. transform: rotateX(-10deg) rotateY(100deg);
    56. }
    57. .cube[point=p6]{
    58. transform: rotateX(-10deg) rotateY(-80deg);
    59. }
    60. /*面的样式*/
    61. .dice,.vertical,.horizontal,.cube,.face{
    62. transform-style:preserve-3d;
    63. }
    64. .dice,.vertical,.horizontal,.cube,.face,.face::after,.axis-face{
    65. width:1em;
    66. height: 1em;
    67. }
    68. .dice{
    69. margin: auto;
    70. }
    71. .cube{
    72. position: relative;
    73. }
    74. .face,.face::after,.axis-face{
    75. position: absolute;
    76. top:0;
    77. left: 0;
    78. }
    79. .face{
    80. box-sizing: border-box;
    81. padding: .15em;
    82. background-color: white;
    83. border-radius: 40%;
    84. box-shadow: 0 0 .2em #ccc inset;
    85. }
    86. .face::after{
    87. content:"";
    88. display: block;
    89. border-radius: .2em;
    90. transform: translateZ(-.1px);
    91. background-color: #e0e0e0;
    92. }
    93. .axis-face{
    94. background:#e0e0e0;
    95. }
    96. /*点的样式*/
    97. .dot{
    98. width:.2em;
    99. height: .2em;
    100. display: inline-block;
    101. background: #444;
    102. border-radius: 50%;
    103. box-shadow: inset .05em .05em .1em black;
    104. }
    105. /* 面的方位*/
    106. .face.front{
    107. transform: translateZ(.5em);
    108. }
    109. .face.back{
    110. transform: translateZ(-.5em) rotateY(180deg);
    111. }
    112. .face.up{
    113. transform: translateY(-50%) rotateX(90deg);
    114. }
    115. .face.down{
    116. transform: translateY(50%) rotateX(-90deg);
    117. }
    118. .face.left{
    119. transform: translateX(-50%) rotateY(-90deg);
    120. }
    121. .face.right{
    122. transform: translateX(50%) rotateY(90deg);
    123. }
    124. .axis-face.x{
    125. transform:rotateY(90deg);
    126. }
    127. .axis-face.y{
    128. transform:rotateX(90deg);
    129. }
    130. .axis-face.z{
    131. }
    132. /* 点的排列布局*/
    133. .face,.dot-row{
    134. display: flex;
    135. }
    136. .face.one{
    137. align-items: center;
    138. justify-content: center;
    139. }
    140. .face.two{
    141. justify-content: space-around;
    142. }
    143. .face.two .dot:nth-child(2){
    144. align-self: flex-end;
    145. }
    146. .face.three{
    147. justify-content: space-around;
    148. }
    149. .face.three .dot:nth-child(2){
    150. align-self:center;
    151. }
    152. .face.three .dot:nth-child(3){
    153. align-self: flex-end;
    154. }
    155. .face.four{
    156. flex-direction: column;
    157. justify-content: space-between;
    158. }
    159. .face.four .dot-row{
    160. justify-content: space-between;
    161. }
    162. .face.five{
    163. flex-direction: column;
    164. justify-content: space-between;
    165. }
    166. .face.five .dot-row{
    167. justify-content: space-between;
    168. }
    169. .face.five .dot-row:nth-child(2){
    170. justify-content:center;
    171. }
    172. .face.six{
    173. flex-direction: column;
    174. justify-content: space-around;
    175. }
    176. .face.six .dot-row{
    177. justify-content: space-between;
    178. }
    1. jQuery(function($){
    2. var $btnGroup = $('.btn-group'),
    3. $cube = $('.cube'),
    4. $dice = $('.dice');
    5. $btnGroup.on('click',onclick_btn);
    6. $cube.on('transitionend',onAniEnd);
    7. function onclick_btn(e){
    8. var point,
    9. $btn;
    10. if(!$dice.hasClass('ani') && e.target.tagName =="BUTTON"){
    11. $btn = $(e.target);
    12. point = parseInt($btn.attr('point'));
    13. if(setPoint(point)){
    14. $dice.addClass('ani');
    15. }
    16. }
    17. }
    18. function setPoint(point){
    19. var prePoint,
    20. pointStr,
    21. num;
    22. pointStr = $cube.attr('point').match(/\d/);
    23. num = pointStr && pointStr.length>0 && pointStr[0];
    24. prePoint = parseInt(num);
    25. if(prePoint != point){
    26. $cube.attr("point","p"+point);
    27. return true;
    28. }else {
    29. return false;
    30. }
    31. }
    32. function onAniEnd(e){
    33. $dice.removeClass('ani');
    34. }
    35. });

  • 相关阅读:
    【微服务】Sentinel 控制台
    继承(个人学习笔记黑马学习)
    MySQL进阶之存储引擎和索引
    算法学习笔记 - 网络流初步
    过拟合和欠拟合是什么?有什么异同点?解决办法是什么?
    Linux Crontab 定时任务使用示例
    3分钟开通GPT-4
    使用Hbuilder+Xcode打包iOS app前期准备
    丹尼尔·拉瑞莫(BM):EOS的主要开发者
    【网络结构】VGG
  • 原文地址:https://blog.csdn.net/konglingbin66/article/details/128033429