无法理解 CSS 选择器在 juizy 幻灯片样式表代码中的含义

Couldn't understand CSS selectors meaning in the juizy slideshow stylesheet code

我正在尝试将 juizy slideshow 添加到我的网站页面,但我需要完全了解它是如何制作的,以便将其动画(幻灯片)与我自己的自定义动画同步我想添加到页面也是如此。

除了第一个 link 中的简短技术说明外,here there are more details (but in french and the downladable code from *1 与讨论的略有不同,因为作者对可下载版本进行了一些改进。

<body>

    <span id="sl_play" class="sl_command">&nbsp;</span>
    <span id="sl_pause" class="sl_command">&nbsp;</span>
    <span id="sl_i1" class="sl_command sl_i">&nbsp;</span>
    <span id="sl_i2" class="sl_command sl_i">&nbsp;</span>
    <span id="sl_i3" class="sl_command sl_i">&nbsp;</span>
    <span id="sl_i4" class="sl_command sl_i">&nbsp;</span>

    <section id="slideshow">

        <a class="commands prev commands1" href="#sl_i4" title="Go to last slide">&lt;</a>
        <a class="commands next commands1" href="#sl_i2" title="Go to 2nd slide">&gt;</a>
        <a class="commands prev commands2" href="#sl_i1" title="Go to 1rst slide">&lt;</a>
        <a class="commands next commands2" href="#sl_i3" title="Go to 3rd slide">&gt;</a>
        <a class="commands prev commands3" href="#sl_i2" title="Go to 2nd slide">&lt;</a>
        <a class="commands next commands3" href="#sl_i4" title="Go to 4th slide">&gt;</a>
        <a class="commands prev commands4" href="#sl_i3" title="Go to 3rd slide">&lt;</a>
        <a class="commands next commands4" href="#sl_i1" title="Go to first slide">&gt;</a>

        <a class="play_commands pause" href="#sl_pause" title="Maintain paused">Pause</a>
        <a class="play_commands play" href="#sl_play" title="Play the animation">Play</a>

        <div class="container">
            <div class="c_slider"></div>
            <div class="slider">
                <figure>
                    <img src="img/dummy-640x310-1.jpg" alt="" width="640" height="310" />
                    <figcaption>The mirror of soul</figcaption>
                </figure><!--
                --><figure>
                    <img src="img/dummy-640x310-2.jpg" alt="" width="640" height="310" />
                    <figcaption>Let's cross that bridge when we come to it</figcaption>
                </figure><!--
                --><figure>
                    <img src="img/dummy-640x310-3.jpg" alt="" width="640" height="310" />
                    <figcaption>Sushi<em>(do)</em> time</figcaption>
                </figure><!--
                --><figure>
                    <img src="img/dummy-640x310-4.jpg" alt="" width="640" height="310" />
                    <figcaption>Waking Life</figcaption>
                </figure>
            </div>
        </div>

        <span id="timeline"></span>

        <ul class="dots_commands"><!--
            --><li><a title="Show slide 1" href="#sl_i1">Slide 1</a></li><!--
            --><li><a title="Show slide 2" href="#sl_i2">Slide 2</a></li><!--
            --><li><a title="Show slide 3" href="#sl_i3">Slide 3</a></li><!--
            --><li><a title="Show slide 4" href="#sl_i4">Slide 4</a></li>
        </ul>

    </section>

</body>

这是它的样式表代码:

#slideshow {
    position: relative;
    width: 640px;
    height: 310px;
    padding: 15px;
    border: 1px solid #ddd;
    margin: 0 auto 2em;
    background: #FFF;
    background: -webkit-linear-gradient(#FFF, #FFF 20%, #EEE 80%, #DDD);
    background: -moz-linear-gradient(#FFF, #FFF 20%, #EEE 80%, #DDD);
    background: -ms-linear-gradient(#FFF, #FFF 20%, #EEE 80%, #DDD);
    background: -o-linear-gradient(#FFF, #FFF 20%, #EEE 80%, #DDD);
    background: linear-gradient(#FFF, #FFF 20%, #EEE 80%, #DDD);

    -webkit-border-radius: 2px 2px 2px 2px;
    -moz-border-radius: 2px 2px 2px 2px;
    border-radius: 2px 2px 2px 2px;

    -webkit-box-shadow: 0 0 3px rgba(0,0,0, 0.2);
    -moz-box-shadow: 0 0 3px rgba(0,0,0, 0.2);
    box-shadow: 0 0 3px rgba(0,0,0, 0.2);
}

/* Here are some other rules for the #timeline and .dots_commands that i removed to make shorter this code */

/* play/pause commands */
.play_commands {
    position: absolute;
    width: 22px; height: 22px;
    top: 25px; right: 25px;
    z-index: 10;
    text-indent: -9999px;
    border:0 none;
    opacity: 0;

    -webkit-transition: opacity 1s, right 1s;
    -moz-transition: opacity 1s, right 1s;
    transition: opacity 1s, right 1s;
}
.play { right: 55px; cursor: default; }

.pause:hover { border:0 none; }
.play_commands:focus { outline:0; }

#slideshow:hover .pause,
#sl_play:target ~ #slideshow:hover .pause,
.play_commands:focus {
    opacity: 1;
}
.sl_command:target ~ #slideshow:hover .pause,
#sl_pause:target ~ #slideshow:hover .pause {
    opacity: 0;
}
.pause:after,
.pause:before {
    position: absolute;
    display: block;
    content: " ";
    top:0;
    width:38%;
    height: 22px;
    background: #fff;
    background: rgba(255,255,255,0.5);
}
.pause:after {
    right:0;
}
.pause:before {
    left:0;
}
.play {
    width: 1px; 
    height: 1px; 
    border-top: 10px solid transparent; 
    border-left: 20px solid #fff; 
    border-left: 20px solid rgba(255,255,255,0.5); 
    border-bottom: 10px solid transparent;
    opacity: 0;
}
.play:hover,
.play:focus {
    border-bottom: 10px solid transparent;
}

#slideshow .container {
    position:relative;
    width: 640px;
    height: 310px;
    overflow: hidden;
}
/* timeline base */
#slideshow .container:after {
    position:absolute;
    bottom: 0; left:0;
    content: " ";
    background: #999;
    width: 100%;
    height: 1px;
}

@-webkit-keyframes slider {
    0%, 20%, 100%   { left: 0 }
    25%, 45%        { left: -100% }
    50%, 70%        { left: -200% }
    75%, 95%        { left: -300% }
}
@-moz-keyframes slider {
    0%, 20%, 100%   { left: 0 }
    25%, 45%        { left: -100% }
    50%, 70%        { left: -200% }
    75%, 95%        { left: -300% }
}
@keyframes slider {
    0%, 20%, 100%   { left: 0 }
    25%, 45%        { left: -100% }
    50%, 70%        { left: -200% }
    75%, 95%        { left: -300% }
}

#slideshow .slider {
    position: absolute;
    left:0; top:0;
    width: 400%;
    height: 310px;

    -webkit-animation: slider 32s infinite;
    -moz-animation: slider 32s infinite;
    animation: slider 32s infinite;
}
.sl_i:target ~ #slideshow .slider {
    -webkit-transition: left 1s;
    -moz-transition: left 1s;
    transition: left 1s;
}
.sl_command:target ~ #slideshow .slider {
    -webkit-transition: opacity 1s;
    -moz-transition: opacity 1s;
    transition: opacity 1s;
}
#slideshow .c_slider {
    position: absolute;
    left:0; top:0;
    width: 400%;
    height: 310px;
    background: url(img/dummy-640x310-1.jpg) 0 0 no-repeat, url(img/dummy-640x310-2.jpg) 640px 0 no-repeat, url(img/dummy-640x310-3.jpg) 1280px 0 no-repeat, url(img/dummy-640x310-4.jpg) 1920px 0 no-repeat;
}
.sl_i:target ~ #slideshow .c_slider {
    -webkit-transition: background 1s;
    -moz-transition: background 1s;
    transition: background 1s;
}


/* need a stop ! */

/* actions when target ! */
.sl_command { display: none; }

.sl_command:target ~ #slideshow .slider,
.sl_command:target ~ #slideshow figure:after,
.sl_command:target ~ #slideshow figcaption,
.sl_command:target ~ #slideshow #timeline,
.sl_command:target ~ #slideshow .dots_commands li:first-child a:after {
    -webkit-animation-play-state: paused;
    -moz-animation-play-state: paused;
    animation-play-state: paused;
}

#sl_play:target ~ #slideshow .slider,
#sl_play:target ~ #slideshow figure:after,
#sl_play:target ~ #slideshow figcaption,
#sl_play:target ~ #slideshow #timeline,
#sl_play:target ~ #slideshow .dots_commands li:first-child a:after {
    -webkit-animation-play-state: running;
    -moz-animation-play-state: running;
    animation-play-state: running;
}

.sl_command:target ~ #slideshow .pause  { opacity:0; }
.sl_command:target ~ #slideshow .play   { opacity:1; right: 25px; cursor: pointer; }
#sl_play:target ~ #slideshow .pause     { opacity:0; }
#sl_play:target ~ #slideshow .play      { opacity:0; right: 55px; cursor: default;}

.sl_i:target ~ #slideshow .slider                                   { visibility: hidden }
.sl_i:target ~ #slideshow .slider figcaption                        { visibility: hidden }
.sl_i:target ~ #slideshow .dots_commands li:first-child a:after     { display:none; }
.sl_i:target ~ #slideshow .dots_commands li:first-child a:before    { display:block; }}

#sl_i1:target ~ #slideshow .commands                                { display: none; }
#sl_i1:target ~ #slideshow .commands1                               { display: block; }
#sl_i1:target ~ #slideshow .c_slider                                { background-position: 0 0, 640px 0, 1280px 0, 1920px 0; }
#sl_i1:target ~ #slideshow .dots_commands li:first-child a:before   { left:0; }

#sl_i2:target ~ #slideshow .commands                                { display: none; }
#sl_i2:target ~ #slideshow .commands2                               { display: block; }
#sl_i2:target ~ #slideshow .c_slider                                { background-position: -640px 0, 0 0, 640px 0, 1280px 0; }
#sl_i2:target ~ #slideshow .dots_commands li:first-child a:before   { left:18px; }

#sl_i3:target ~ #slideshow .commands                                { display: none; }
#sl_i3:target ~ #slideshow .commands3                               { display: block; }
#sl_i3:target ~ #slideshow .c_slider                                { background-position: -1280px 0, -640px 0, 0 0, 640px 0; }
#sl_i3:target ~ #slideshow .dots_commands li:first-child a:before   { left:36px; }

#sl_i4:target ~ #slideshow .commands                                { display: none; }
#sl_i4:target ~ #slideshow .commands4                               { display: block; }
#sl_i4:target ~ #slideshow .c_slider                                { background-position: -1920px 0, -1280px 0, -640px 0, 0 0; }
#sl_i4:target ~ #slideshow .dots_commands li:first-child a:before   { left:54px; }

我无法从以前的样式表中理解的选择器组合在于此规则:

#slideshow:hover .pause,
#sl_play:target ~ #slideshow:hover .pause,
.play_commands:focus {
    opacity: 1;
}
  1. 第一个组合 #slideshow:hover .pause 是否转换为 "Select all elements with the class name pause that are descendants of the element with an ID of slideshow"?

  2. #sl_play:target ~ #slideshow:hover .pause表示什么?

----------------在之后编辑---------------- ------

对于问题2)我还是不明白悬停状态前必须有一个带有:target伪[=的ID是什么意思50=],通常在 css 中,优先级与代码中的元素配置有关,但在这种情况下,它看起来更像是与事件有关:这是否意味着 hyperlink 针对 #sl_play 必须首先激活,然后悬停应该出现在 #slideshow 上,因为规则可能有效?如果优先级是关于事件的,那么代码中的优先级就不再重要了?

问题 #1:第一个组合 #slideshow:hover .pause 是否转换为 "Select all elements with the class name pause that are descendants of the element with an ID of slideshow"?

答:是的,它是后代选择器,没有指定它必须是子代;它可能会进一步下降。请记住,它还指定了悬停状态。

问题 #2#sl_play:target ~ #slideshow:hover .pause 表示什么?

答案:这使用了通用的兄弟连接器。 #slideshow:hover 前面必须有 #sl_play:target,但不一定紧跟。一定是后来的兄弟。

这里有一篇很好的文章解释了子选择器和兄弟选择器的所有变体:CSS Tricks