Page 89 - css揭秘
P. 89

但是,这导致它的内容也发生了斜向变形,这很不好看,而且难读(参
                                              见图 3-14)。有没有办法只让容器的形状倾斜,而保持其内容不变呢?
                    图 3-14
                    按钮进行斜向变形之后,它的文            嵌套元素方案
                    字就很难读了
                                                  我们可以对内容再应用一次反向的 skew() 变形,从而抵消容器的变形
                    !
                       如果你想把这个效果应用到           效果,最终产生我们所期望的结果。不幸的是,这意味着我们将不得不使用
                    一个默认显示为行内的元素,不            一层额外的 HTML 元素来包裹内容,比如用一个 div:
                    要忘记把它的 display 属性设置
                    为其 他值, 比如 inline-block        <a href="#yolo" class="button">                        HTML
                    或 block,否则变形是不会生效                 <div>Click me</div>
                    的。这一点对它内层的元素也是                </a>
                    适用的。
                                                  .button { transform: skewX(-45deg); }
                                                  .button > div { transform: skewX(45deg); }

                    图 3-15                        我们在图 3-15 中可以看到,这个方法的表现很不错,但它也意味着我
                    最终效果                      们不得不添加额外的 HTML 元素。如果结构层的变更是不允许的,或者你
                                              希望严格保持结构层的纯净度,别担心,我们还有一个纯 CSS 的解决方案。

                                               试一试 play.csssecrets.io/parallelograms



                                              伪元素方案


                                                  另一种思路是把所有样式(背景、边框等)应用到伪元素上,然后再对
                                              伪元素进行变形。因为我们的内容并不是包含在伪元素里的,所以内容并不
                                              会受到变形的影响。下面来看看这个技巧能否得到与前面相同的链接样式。
                                                  我们希望伪元素保持良好的灵活性,可以自动继承其宿主元素的尺寸,
                                              甚至当宿主元素的尺寸是由其内容来决定时仍然如此。一个简单的办法是
                                              给宿主元素应用 position:  relative 样式,并为伪元素设置 position:
                                              absolute,然后再把所有偏移量设置为零,以便让它在水平和垂直方向上都
                                              被拉伸至宿主元素的尺寸。代码看起来是这样的:

                                                  .button {
                                                      position: relative;
                                                      /* 其他的文字颜色、内边距等样式…… */
                                                  }
                                                  .button::before {
                                                      content: '';
                                                      position: absolute;
                                                      top: 0; right: 0; bottom: 0; left: 0;
                    图 3-16                        }
                    伪元素目前在内容之上,因此对
                    伪元素应用 background:  #58a       此时,用伪元素生成的方块是重叠在内容之上的,一旦给它设置背景,
                    会把内容完全盖住                  就会遮住内容(参见图 3-16)。为了修复这个问题,我们可以给伪元素设置



                   58   第 3 章 形状







          ඀ࠡ  JOEC
   84   85   86   87   88   89   90   91   92   93   94