簡體   English   中英

CSS3動畫目標選擇器

[英]CSS3 animated target selector

http://codepen.io/mikethedj4/pen/cpbCk

我在這里有點麻煩。 我希望將div比例設置為0並以縮小為目標,但是當我嘗試時它不起作用。

的CSS

/* Content Area */
.content div {
    width: 50%;
    margin: 2em auto;
    padding: 1em;
    background: #333;
    border: 1em solid #555;
    color: #fff;
    transform: scale(0);
    -webkit-transform: scale(0);
    -moz-transform: scale(0);
    -o-transform: scale(0);
    -ms-transform: scale(0);
    transition:all 300ms ease-in-out;
    -webkit-transition:all 300ms ease-in-out;
    -moz-transition:all 300ms ease-in-out;
    -o-transition:all 300ms ease-in-out;
    -ms-transition:all 300ms ease-in-out;
}

/* hide unselected targets */
.content div:not(:target) {
    display: none;
}
/* display selected target */
:target {
    display: inherit;
    transform: scale(1);
    -webkit-transform: scale(1);
    -moz-transform: scale(1);
    -o-transform: scale(1);
    -ms-transform: scale(1);
}

的HTML

<article id="container">
    <ul>
        <li><a href="#about">About</a></li>
        <li><a href="#contact">Contact</a></li>
        <li><a href="#services">Services</a></li>
    </ul>

    <div class="content">
        <div id="about">
            Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla at feugiat odio. Proin sit amet eros ac diam tempus tempor. Fusce gravida ut nisi in consectetur. Sed hendrerit sapien id metus adipiscing, id vehicula lacus fermentum. Proin mollis facilisis erat, eu sollicitudin diam scelerisque ut. Phasellus non mollis nisl. Vestibulum ac mi quis metus mollis fermentum. Donec pharetra consequat lacinia. Vestibulum porta tortor purus, non fermentum turpis congue eget. Nulla varius augue dolor, at pellentesque diam volutpat in. Vestibulum vitae ligula eu eros tristique accumsan. Mauris sagittis iaculis lorem id egestas. Suspendisse potenti. Cras faucibus dolor turpis, ac ultrices dolor rhoncus a.

            <p>Etiam aliquam magna vitae hendrerit accumsan. Nam venenatis risus a tempor semper. Nullam ac est nec dolor pellentesque laoreet ac ac nisi. Ut sit amet magna nunc. Vestibulum orci ipsum, pretium nec venenatis vel, lacinia et magna. Proin dignissim dui ligula, eget pretium nisl ultrices eu. Etiam sit amet nunc non nisl scelerisque dignissim a sed sapien.</p>

            <p>Quisque auctor sit amet mi sed porta. Fusce nec erat eros. Suspendisse et diam sit amet quam pretium sollicitudin quis nec enim. Nam fermentum risus dui, non volutpat dolor pellentesque nec. Quisque interdum, neque eu feugiat hendrerit, risus augue malesuada mauris, non vestibulum ante erat quis purus. Nunc scelerisque sapien vel leo bibendum, vel dapibus ipsum ultricies. Cras commodo lacus quis nunc eleifend iaculis. Nam adipiscing ipsum non justo ultrices, sit amet vestibulum urna vehicula. Praesent porttitor neque et dictum euismod. Aliquam erat volutpat. Nam adipiscing, neque ut dictum ultricies, dui odio aliquet dui, ac rhoncus neque nulla a enim.</p>
        </div>
        <div id="contact">
            Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut purus leo, varius pellentesque vestibulum at, lobortis quis est. Suspendisse mattis leo vel eros faucibus adipiscing. Phasellus sed nisl eu lectus blandit dignissim vel id nibh. Donec rutrum felis urna, sed elementum urna venenatis quis. Praesent vel tortor sed felis sodales lobortis eget eget nulla. Aliquam bibendum elit eu nunc facilisis, varius tempor lectus mattis. Aenean sed aliquet orci. Aliquam viverra molestie ultrices.

            <p>Nullam luctus imperdiet risus, vel convallis massa interdum id. In ultricies pulvinar libero vitae sodales. Fusce eleifend varius tincidunt. Nulla sed blandit nibh. Ut sollicitudin, metus et sagittis tincidunt, nisl felis ultricies ante, eu dapibus massa odio sed nunc. Pellentesque semper eros dui, ac mollis nunc dictum non. Quisque ultrices sapien at velit pellentesque, at lacinia est commodo. Morbi commodo in neque eu tempor. Curabitur eu mattis diam, eu tristique mauris.</p>

            <p>Suspendisse sit amet lacus rutrum, faucibus augue vitae, euismod nibh. Mauris aliquet nisi in nibh aliquam, et ullamcorper turpis mattis. Vestibulum ut hendrerit libero, eu ultricies odio. Etiam sodales vehicula dignissim. Vestibulum libero tellus, luctus sed imperdiet quis, malesuada sed nunc. In aliquet pellentesque erat pellentesque fringilla. Aenean egestas ipsum eu nunc auctor, nec vestibulum est varius. Integer convallis, orci sit amet sagittis hendrerit, purus ligula dictum dolor, in lobortis ligula lacus pulvinar lorem. Sed pulvinar porttitor egestas. Duis ac ante ipsum. Donec sem odio, sollicitudin in fermentum egestas, gravida sed diam. Nam condimentum augue ut ligula dapibus sodales. Donec blandit sem non cursus aliquam.</p>
        </div>
        <div id="services">
            Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus posuere porta suscipit. In ac purus quis lectus blandit rutrum eu vitae nisi. Nunc vel ante at enim imperdiet ultrices et non erat. Vestibulum sagittis facilisis nulla. Ut quis turpis sit amet enim volutpat tincidunt. Vivamus vel ornare neque. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Duis tincidunt mi et ipsum cursus, vitae tincidunt ipsum fringilla. Integer eu mollis elit, in tincidunt neque.

            <p>Maecenas ac est gravida, iaculis mauris vitae, tempus enim. Mauris ut nisi dapibus, commodo massa sed, iaculis augue. Cras sit amet leo libero. Mauris ac dui lorem. Aenean velit risus, ornare molestie neque ac, feugiat cursus tellus. Duis commodo lacinia felis, vitae aliquam mauris consectetur cursus. Donec arcu orci, sollicitudin eu lacus id, ultricies sollicitudin ligula. Vivamus ac egestas ipsum. Duis aliquam suscipit tristique. Vestibulum aliquet bibendum arcu, in adipiscing arcu sagittis ut. Aenean in leo risus. Morbi vitae nibh in eros accumsan consequat in ac lacus. Maecenas pretium mattis justo non euismod. Sed vel velit sollicitudin, posuere mi nec, dictum lectus.</p>

            <p>Nullam nisl nisi, dignissim ultrices cursus id, aliquet vel purus. Praesent velit purus, pharetra id eros id, viverra ultricies velit. Phasellus sed lacinia neque, at dictum odio. Mauris eget accumsan augue, ac imperdiet magna. Proin commodo sem id purus vulputate mollis. Nunc a dignissim urna. Nam facilisis, lectus sit amet blandit egestas, velit tortor imperdiet massa, eu elementum lorem dolor nec diam. Interdum et malesuada fames ac ante ipsum primis in faucibus. Phasellus sit amet nisl turpis. Nulla vel nulla ut odio feugiat ultrices. Ut id consequat sem.</p>
        </div>
    </div>
</article>

你必須有兩個問題,第一個是說.content div具有較高的特異性比:target ,因此在規則:target正在從那些覆蓋.content div 您可以使用.content div:target類的選擇器來解決此問題

另一個問題是更改顯示狀態會中斷過渡。 一種解決方法是使用關鍵幀動畫:

http://codepen.io/anon/pen/dxHkf

您可能會注意到有些閃爍,但這僅發生在Codepen上,獨立使用時沒問題。

.content div:target {
    -webkit-animation: scale 300ms ease-out forwards;
    -moz-animation: scale 300ms ease-out forwards;
    animation: scale 300ms ease-out forwards;
}

@-webkit-keyframes scale {
    from {
        -webkit-transform: scale(0);
    }
    to {
        -webkit-transform: scale(1);
    }
}
@-moz-keyframes scale {
    from {
        -moz-transform: scale(0);
    }
    to {
        -moz-transform: scale(1);
    }
}
@keyframes scale {
    from {
        transform: scale(0);
    }
    to {
        transform: scale(1);
    }
}

另一個選擇可能是使用一種不同的技術來隱藏元素而不是display ,例如使用clip

http://codepen.io/anon/pen/eofrz

.content div:not(:target) {
    position: absolute;
    clip: rect(0 0 0 0);
}

.content div:target {
    transform: scale(1);
    -webkit-transform: scale(1);
    -moz-transform: scale(1);
    -o-transform: scale(1);
    -ms-transform: scale(1);
}

我剛剛注意到的一個較小的窗口是,除了IE之外,所有瀏覽器似乎都以縮放元素的中心(或多或少)為目標,這可能不是您想要的。 一種快速的解決方法是將transform-origin設置為50% 0

.content div {
    ...
    -webkit-origin: 50% 0;
    -moz-origin: 50% 0;
    -o-origin: 50% 0%;
    transform-origin: 50% 0;
}

現在,它當然會從頂部進行轉換,但是,這是我找到的解決此問題的唯一方法。

如果我正確理解了您的問題,則需要將scale(0)設置為not(:target)所有元素,然后將其轉換為:target上的scale(1) ,如下所示。

正如ndm在其答案中指出的那樣,更改顯示狀態會中斷過渡,因此從display: none更改為display: block將使過渡效果不發生。

為了克服這個問題,您可以像下面那樣修改代碼。 它使用translate屬性將內容移出顯示區域。 注意:這會使滑入從左側發生,但我找不到更好的替代方法)。

.content div {
    width: 50%;
    margin: 2em auto;
    padding: 1em;
    background: #333;
    border: 1em solid #555;
    color: #fff;
    transition: all 300ms ease-in-out;
    -webkit-transition: all 300ms ease-in-out;
    -moz-transition: all 300ms ease-in-out;
    -o-transition: all 300ms ease-in-out;
    -ms-transition: all 300ms ease-in-out;
}
/* hide unselected targets */
 .content div:not(:target) {
    height: 0;
    overflow: hidden;
    position: absolute;
    transform: translate(-100%) scale(0);
    -webkit-transform: translate(-100%) scale(0);
    -moz-transform: translate(-100%) scale(0);
    -o-transform: translate(-100%) scale(0);
    -ms-transform: translate(-100%) scale(0);
}
/* display selected target */
 :target {
    transform: translate(0%) scale(1);
    -webkit-transform: translate(0%) scale(1);
    -moz-transform: translate(0%) scale(1);
    -o-transform: translate(0%) scale(1);
    -ms-transform: translate(0%) scale(1);
}

CodePen鏈接

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM