【问题标题】:Slide down div on click Pure CSS?单击纯 CSS 时向下滑动 div?
【发布时间】:2012-11-04 21:51:23
【问题描述】:

我发现这个帖子How to create sliding DIV on click?

但所有答案都是 Jquery 方法。有没有办法用 PURE CSS 来创建它? 我还有一些其他的想法......

  1. 我可以添加什么来使向下滑动的 div 在滚动时保持不动
  2. 将触发动画的链接更改为“关闭”,以使 div 向上滑动

这是该帖子中示例的链接// http://shutterbugtheme.tumblr.com/

我也尝试过谷歌搜索,但唯一的结果是 jquery 方法...

【问题讨论】:

    标签: css animation html slidedown


    【解决方案1】:

    这在纯 CSS 中是不可能识别点击的。你可以使用 :hover 和一个过渡来做到这一点,但这与没有 javascript 的情况一样接近。

    .hover
    {
        cursor: pointer;
        position: relative;
        z-index: 1;
    }
    
    .slide
    {
        position: absolute;
        top: 0;
        z-index: -1;
        -webkit-transition: top 1s;
        -moz-transition: top 1s;
    }
    
    .hover:hover + .slide
    {
        top: 50px;
    }
    

    http://jsfiddle.net/Kyle_/MaMu9/1/

    请注意,虽然过渡是 CSS3,并且在 IE


    编辑:在使用 CSS 中的 :focus 属性发布另一个答案之后:有一个警告是可能的:您必须在元素外部单击使其向下滑动以使其向上滑动,否则它可以正常工作。

    请注意,该元素必须具有 tabindex='1'(或任何有意义的数字,具体取决于元素在文档中的位置)才能正常工作。

    .hover:focus + .slide
    {
        top: 50px;
        -webkit-transition: top 1s;
    }
    

    http://jsfiddle.net/Kyle_Sevenoaks/MaMu9/1/

    【讨论】:

    • 这是公认的答案,但现在它已被删除。有什么问题吗?
    • “在纯 CSS 中不可能识别点击”。您可以这样做,使用@lostsource 的答案中提到的:focus hack 或使用隐藏的复选框和分配的标签作为触发元素,请参阅:codepen.io/surjithctly/pen/pLDwe
    • 可以肯定的是,如果您阅读了整个答案,您就会发现我已经提到过......
    • 尽管这个问题是在 2 年前提出的,但我想说我(在 google 中)找到了另一个使用复选框 hack 并且不使用任何硬编码宽度或高度的解决方案,look
    • -1 原因:checkbox-hack/解决方案多次为我服务,我正在帮助提出这个答案。随时更新此答案,我将删除我的反对票。 :)
    【解决方案2】:

    运行此代码。

    input {
      display: none;
    }
    
    label {
      cursor: pointer;
      display: inline-block;
      padding: 10px 20px;
      border: 1px solid;
      border-radius: 4px;
      background: tomato;
      color: #FFF;
      font-family: arial;
      -webkit-transition: background-color 0.1s, color 0.1s;
    }
    
    label:hover {
      background: #blue;
      color: #blue;
    }
    
    .test {
      -webkit-transition: height .3s ease;
      height: 0;
      overflow: hidden;
      width: 200px;
      background: tomato;
      margin-top: 10px;
      color: #FFF;
    }
    
    input:checked + .test {
      height: 100px;
    }
    <label for="check">Click me</label>
    
    <input id="check" type="checkbox">
    
    <div class="test">
      <p>I am some hidden text</p>
    </div>

    【讨论】:

      【解决方案3】:

      做同样事情的另一种方法:

      .contents {
        background: yellow;
        color: rgba(0, 0, 0, .8);
        padding: 20px;
        margin:0;
      }
      .slide-up, .slide-down {
        overflow:hidden;
      }
      .slide-up > div, .slide-down > div {
        transform: translateY(-100%);
        transition: .4s ease-in-out;
      }
      .slide-down > div {            
        transform: translateY(0);
      } 
      

      工作示例:https://jsfiddle.net/webarthur/3ep33h5s/1/

      【讨论】:

        【解决方案4】:

        简单:

        .contents {
          background: yellow;
          color: rgba(0, 0, 0, .8);
          padding: 20px;
          margin:0;
        }
        .slide-up, .slide-down {
          overflow:hidden
        }
        .slide-up > div, .slide-down > div {
          margin-top: -25%;
          transition: margin-top 0.4s ease-in-out;
        }
        .slide-down > div {            
          margin-top: 0;
        } 
        

        工作示例: https://jsfiddle.net/webarthur/3ep33h5s/

        【讨论】:

          【解决方案5】:

          这可以使用target 伪类来检测点击。

          将按钮href设置为滑动div的id。

          然后可以通过在slidingDiv上设置滑动div的高度来完成向下滑动:目标类在高度上使用css3 transition

          我认为原始按钮无法更改其 href 以使用纯 css 关闭滑动 div,但是您始终可以在滑动 div 上添加一个关闭按钮来关闭它。

          此关闭按钮通过在滑动 div 类上添加相同的过渡来工作。

          这是一个WORKING DEMO

          享受吧。

          【讨论】:

          • 它会添加回历史记录,如果用户点击浏览器后退按钮会很烦人
          【解决方案6】:

          这是可以做到的,虽然有点小技巧。保持状态的两个元素(在 CSS 中称为 :checked)是复选框和单选按钮元素。所以如果你通过一个for属性将一个复选框与一个标签关联起来,并添加一个div,你可以通过读取(隐藏)按钮的状态得到一个结果:

          <div class=window>
          <input type=checkbox class=toggle id=punch>
          <label for=punch>Punch It, Chewie<label>
          <div><p>Here’s my content. Beep Boop Blurp.</p></div>
          </div>
          

          还有 CSS:

          input.toggle { display: none; }
          input.toggle ~ div { height: 0px; margin: .2rem; overflow: hidden; }
          input.toggle:checked ~ div { height: 180px; }
          

          A further explanation and example that includes an animated open/close effect.

          【讨论】:

          • 该页面不存在。
          【解决方案7】:

          您可以识别元素上的“焦点”事件并使用 CSS 过渡对其进行操作。

          这是一个示例,当单击时会将 div 向下移动 50px

          标记

          <div tabindex='1' id='box'></div>​
          

          CSS

          #box {
           background-color:#3a6d90;
           width:100px; height:100px;    
          
           transition: margin-top 2s;
           -moz-transition: margin-top 2s; /* Firefox 4 */
           -webkit-transition: margin-top 2s; /* Safari and Chrome */
           -o-transition: margin-top 2s; /* Opera */
          }
          
          #box:focus {
           margin-top:50px;
           outline:0;
          }
          

          工作示例:http://jsfiddle.net/NBHeJ/

          【讨论】:

            【解决方案8】:

            这是一个很好的入门示例。你可以在底部看到,他们发布了他们使用的动画函数的源代码,尽管这是 javascript。

            sliding-js-generic

            如果你想要纯 css,我会使用 ws3schools 多年来一直是优秀的资源,但请注意,你想要的效果是否有效很大程度上取决于浏览器的支持。

            w3schools-css

            基本结构,让它们有效果,你只需要沿着body内的两个div的线条工作,在顶部隐藏和容器可见,并运行隐藏div的动画以显示推动另一个div向下,让它们都内联。

            <body>
             <div id="hidden-div"></div>
             <div id="main-content-div"></div>
            </body>
            

            【讨论】:

            • @keihead 考虑到 css3 动画还不能完全跨浏览器,你问这个很有趣。 ...只要在访问者浏览器中启用了 js,jquery 动画就可以在所有主流浏览器和 ie6+ 中运行,更加防弹。
            • jquery 应该适用于所有主流浏览器,为什么我的答案被标记了!?我说的没有任何问题。
            • 我发誓我从来没有打算把它记下来。这完全是个意外。我猜你是因为这个错误而把我的问题记下来了?
            • 不...我不认为是你,而且我不是那样的。
            猜你喜欢
            • 2011-07-13
            • 1970-01-01
            • 1970-01-01
            • 2018-06-04
            • 2019-08-31
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多