Pure CSS3 Image Slider - Without JavaScript or radio inputs

前端 未结 1 1344
迷失自我
迷失自我 2020-12-05 22:16

Is there a way one can create an image slider using just CSS3 and HTML
but without using any of the HTML input (radio) elements and no JavaScript?

相关标签:
1条回答
  • 2020-12-05 22:42

    Pure CSS carousel

    (...Since you're not allowed to use input radio elements to maintain the active state...)
    there's another way to make a sliding gallery in pure CSS(3) using the :target pseudo.

    • :target become those id="foo" elements who are referenced by a clicked anchor with URI Fragment (Hash) href="#foo"

    • In CSS, using :target pseudo you can than reference down-the-tree to other sibling elements using ~ (General sibling selectors), and than you can further access their child elements (slides, buttons etc) as usual.

    • Tip: If you don't like the "feature" of the gallery messing with your URL fragments (Browser Back button triggering a gallery slide instead of navigating the history!), you can always sandbox it - calling your gallery file into an <iframe>.

    html, body{height:100%;}
    body{font:15px/1 sans-serif; margin:0;}
    
    /*
    RESPONSIVE CSS3 SLIDE CAROUSEL GALLERY
    http://stackoverflow.com/a/34696029/383904
    */
    
    .CSSgal{
      position: relative;
      overflow: hidden;
      height:   100%; /* Or set a fixed height */
    }
    
    /* SLIDER */
    .CSSgal .slider{
      height:      100%;
      white-space: nowrap;
      font-size:   0;
      transition:  0.8s;
    }
    
    /* SLIDES */
    .CSSgal .slider > *{
      font-size:       1rem;
      display:         inline-block;
      vertical-align:  top;
      height:          100%;
      width:           100%;
      background:      none 50% no-repeat;
      background-size: cover;
    }
    
    /* PREV/NEXT, CONTAINERS & ANCHORS */
    .CSSgal .prevNext{
      position: absolute;
      z-index:  1;
      top:      50%;
      width:    100%;
      height:   0;
    }
    .CSSgal .prevNext > div+div{
      visibility: hidden; /* Hide all but first P/N container */
    } 
    .CSSgal .prevNext a{
      background:  #fff;
      position:    absolute;
      width:       40px;
      height:      40px;
      line-height: 40px;
      text-align:  center;
      opacity:     0.7;
      text-decoration:   none;
      -webkit-transform: translateY( -50% );
              transform: translateY( -50% );
    }
    .CSSgal .prevNext a:hover{
      opacity: 1;
    }
    .CSSgal .prevNext a+a{
      right: 0px;
    }
    
    /* NAVIGATION */
    .CSSgal .bullets{
      position:   absolute;
      z-index:    2;
      bottom:     0;
      padding:    10px 0;
      width:      100%;
      text-align: center;
    }
    .CSSgal .bullets > a{
      display:         inline-block;
      width:           20px;
      height:          20px;
      line-height:     20px;
      text-decoration: none;
      text-align:      center;
      border-radius:   50%;
      background:      rgba(255,255,255,1);
    }
    .CSSgal .bullets > a+a{
      background: rgba(255,255,255,0.5); /* Dim all but first */
    }
    .CSSgal .bullets > a:hover{
      background: rgba(0,255,255,0.9);
    }
    
    /* ACTIVE NAVIGATION ANCHOR */
    .CSSgal >s:target ~ .bullets >* { background: rgba(255,255,255,0.5); }
    #s1:target ~ .bullets >*:nth-child(1){ background: rgba(255,255,255,  1); }
    #s2:target ~ .bullets >*:nth-child(2){ background: rgba(255,255,255,  1); }
    #s3:target ~ .bullets >*:nth-child(3){ background: rgba(255,255,255,  1); }
    #s4:target ~ .bullets >*:nth-child(4){ background: rgba(255,255,255,  1); }
    
    /* PREV/NEXT CONTAINERS VISIBILITY */
    .CSSgal >s:target ~ .prevNext >* { visibility:  hidden; }
    #s1:target ~ .prevNext >*:nth-child(1){ visibility: visible; }
    #s2:target ~ .prevNext >*:nth-child(2){ visibility: visible; }
    #s3:target ~ .prevNext >*:nth-child(3){ visibility: visible; }
    #s4:target ~ .prevNext >*:nth-child(4){ visibility: visible; }
    
    /* SLIDER ANIMATION POSITIONS */
    #s1:target ~ .slider{ transform: translateX(   0%); -webkit-transform: translateX(   0%); }
    #s2:target ~ .slider{ transform: translateX(-100%); -webkit-transform: translateX(-100%); }
    #s3:target ~ .slider{ transform: translateX(-200%); -webkit-transform: translateX(-200%); }
    #s4:target ~ .slider{ transform: translateX(-300%); -webkit-transform: translateX(-300%); }
    <div class="CSSgal">
    
      <!-- Don't wrap targets in parent -->
      <s id="s1"></s> 
      <s id="s2"></s>
      <s id="s3"></s>
      <s id="s4"></s>
    
      <div class="slider">
        <div style="background:#5fc;">Slide 1</div>
        <div style="background-image:url('//i.imgur.com/squw4Fw.jpg');"></div>
        <div style="background:#fc5;">Slide 3</div>
        <div style="background:#f5c;">Slide 4</div>
      </div>
      
      <div class="prevNext">
        <div><a href="#s4">4</a><a href="#s2">2</a></div>
        <div><a href="#s1">1</a><a href="#s3">3</a></div>
        <div><a href="#s2">2</a><a href="#s4">4</a></div>
        <div><a href="#s3">3</a><a href="#s1">1</a></div>
      </div>
    
      <div class="bullets">
        <a href="#s1">1</a>
        <a href="#s2">2</a>
        <a href="#s3">3</a>
        <a href="#s4">4</a>
      </div>
    
    </div>

    0 讨论(0)
提交回复
热议问题