Page 234 - css揭秘
P. 234

尽管这个提示框在展示过程中的过渡效果看起来是符合预期的,但是当
                    输入框失去焦点、提示框收缩并消失时,这个过渡过程就不是我们所期望的
                    结果了(参见图 8-11)。这到底是怎么回事?!这个结果似乎在我们意料之
                    外,但其实也在情理之中:当我们把焦点从输入框中切出去的时候,所触发
                    的过渡会以 scale(1) 作为起始值,并以 scale(0) 作为最终值。由于此时
                    是相同的调速函数在起作用,这个过渡仍然会在 350ms 后到达 110% 的变形
                    程度。只不过在这里,110% 变形程度的解析结果并不是 scale(1.1),而是
                    scale(-0.1) !

                                                                                         图 8-11
                                                                                         这到底是怎么回事













                        不过也别灰心,因为修复这个问题不过是多加一行代码而已。假设我们
                    只想给提示框的关闭过程指定普通的 ease 调速函数,那么可以在定义关闭
                    状态的 CSS 规则中把当前的调速函数覆盖掉:

                        input:not(:focus) + .callout {
                            transform: scale(0);
                            transition-timing-function: ease;
                        }

                        .callout {
                            transform-origin: 1.4em -.4em;
                            transition: .5s cubic-bezier(.25,.1,.3,1.5);
                        }


                        这时候再试一试,就会发现提示框关闭的过程已经恢复到我们设置自定
                    义 cubic-bezier() 函数之前的样子了,而它的展开过程仍然保留了我们想
                    要的弹性效果。

                        细心的读者可能还会发现另一个问题:提示框的关闭动作明显要迟钝一
                    些。这又是为什么呢?我们来仔细想想看。在提示框的展开过程中,当时间
                    进行到 50% 时(即 250ms 之后),它就已经达到 100% 的完整尺寸了。但
                    在收缩的过程中,从 0 到 100% 的变化会花费我们为过渡所指定的所有时间
                   (500ms),因此感觉上会慢一半。

                        要修复这个问题,只需同时覆盖过渡的持续时间即可:我们既可以单独
                    覆盖 transition-duration 这一个属性,也可以用 transition 这个简写属
                    性来覆盖所有的值。如果选择后者的话,就不需要显式指定 ease 了,因为



                                                                                               42 缓动效果        203







          ඀ࠡ  JOEC
   229   230   231   232   233   234   235   236   237   238   239