【问题标题】:how to change the height of an element depending on the window / document height?如何根据窗口/文档高度更改元素的高度?
【发布时间】:2015-05-06 00:31:57
【问题描述】:

我有一个元素,我需要根据屏幕分辨率动态更改他的大小,到目前为止,我有一个固定大小,即 .scroll-sidebars { max-height: 650px; } 但这仅适用于大屏幕,正如您在下面的 img 中看到的那样,底部有一点边距,这就是我想要的

如果我在较小的屏幕上使用相同的高度,这就是我得到的

所以我想避免这种情况,一旦该面板的高度发生变化,面板上会出现一个滚动条并不重要,这很好,我所需要的只是保持该边距始终在底部。

我有一个指令,这是一个粘性侧边栏,我不知道它是否有帮助,因为也许我们可以根据指令计算那个高度

.directive('sticky', function($document, $timeout) {
  return {
    restrict: 'A',
    link: function(scope, element) {
      var width = $document.width();
      if (width > 991) {
        $timeout(function() {
          angular.element($document).ready(function() {
            var stickySidebar = element,
                stickyHeight,
                sidebarTop,
                scrollTop,
                stickyStop,
                sidebarBottom,
                stopPosition;

            if (stickySidebar.length > 0) {
              stickyHeight = stickySidebar.height();
              sidebarTop = stickySidebar.offset().top;
            }

            $document.scroll(function() {

              if (stickySidebar.length > 0) {
                scrollTop = $document.scrollTop() + 52; //stkicy responds to the navbar
                if (sidebarTop < scrollTop) {
                  stickySidebar.css('top', scrollTop - sidebarTop);
                  sidebarBottom = stickySidebar.offset().top + stickyHeight;
                  stickyStop = $('.main-content').offset().top + $('.main-content').height();
                  if (stickyStop < sidebarBottom) {
                    stopPosition = $('.main-content').height() - stickyHeight;
                    stickySidebar.css('top', stopPosition);
                  }
                }
                else {
                  stickySidebar.css('top', '0');
                }
              }
            });
            $document.resize(function() {
              if (stickySidebar.length > 0) {
                stickyHeight = stickySidebar.height();
              }
            });

          });
        }, 1000);
      }else {
        console.log('do not apply function because the size is not the proper one');
      }
    }
  };
});

和html部分

  <div class="col-md-3">
    <div sticky>
      <div class="panel">
        <div class="panel-heading">
          <h3 class="panel-title">Sports</h3><br>
        </div>
        <div class="panel-group">
          <div class="scroll-sidebars">
            <accordion close-others="false">
              <accordion-group ng-repeat="sport in sports">
                <accordion-heading>
                  <div>
                    {{::sport.name}}
                  </div>
                </accordion-heading>
                <div>
                     {{::league.name}}
                </div>
              </accordion-group>
            </accordion>
          </div>
        </div>
      </div>

【问题讨论】:

    标签: javascript css angularjs user-interface user-experience


    【解决方案1】:

    .scroll-sidebars { max-height: 90%; }

    定义一个像素数总是会导致该部分占用那么多像素。不管屏幕大小。所以如果我有一个低分辨率的大屏幕,也会出现同样的问题。

    使用百分比时,CSS 使用浏览器的高度和宽度来确定包含部分的大小。

    【讨论】:

    • 我一直在尝试使用% 而不是px,但这对我不起作用。查看我的更新
    • 也许我自己没有解释,如果我把px 工作,你可以看到高度变化,但% 没有任何变化,我放的百分比无关紧要,将始终为 100 %,因此不会占用 %
    【解决方案2】:

    你可以在你的 css 上使用 vh,不需要使用 JS,但是,如果你需要对旧浏览器的支持,你将需要 JS :(

    .scroll-sidebars {
      height: 100vh;
    }
    

    【讨论】:

      【解决方案3】:

      而不是 $document.resize() 使用 $window.onresize 这是纯 javascript onresize 事件。在此之前添加 $window 依赖项

      代码

      $window.onresize = function() {
          if (stickySidebar.length > 0) {
            stickyHeight = stickySidebar.height();
          }
      };
      

      希望对你有帮助,谢谢。

      【讨论】:

      • 好的,但是,它会改变什么?查看我的代码,以便您了解我想要更改的内容。
      • 是的,我知道了,但我的朋友有什么不同?
      • @NietzscheProgrammer 在视口更改时调用代码
      【解决方案4】:

      假设你不关心old browsers not supporting it,你可以使用函数calc

      .scroll-sidebars { 
          max-height: calc(100% - 50px); 
      }
      

      上述规则会将高度设置为容器高度的 100%,减去 50px(根据您的需要调整此值)。

      您可以根据视口高度定义高度。视口是文档的可见部分。请注意,您可以将其与these browsers 一起使用。下面使用vh单位,代表视口高度。

      .scroll-sidebars { 
          max-height: calc(100vh - 100px);
      }
      

      【讨论】:

      • 那么你会在 50px 部分中输入什么魔法数字以确保窗口没有你减去的数字那么高,从而使该部分不可见? (考虑更多的应用,而不仅仅是提供的案例)
      • 好吧,如果 OP 正在为智能手表设计 web 应用程序,我不会建议该解决方案。我建议以减去 50px 为例,我让 OP 对其进行调整,是的,假设容器高度大于“减去的那个小边距”
      • 查看html部分以了解.scroll-sidebars从哪里开始
      • 你的意思可能是父元素已经有一个限制高度,所以100%的高度也有限制,是吗?
      • 是的,我的意思是,百分号没有任何作用,没有任何影响。如果我使用它没有任何变化,只使用 px
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-30
      • 2015-03-22
      • 1970-01-01
      • 2018-12-31
      • 1970-01-01
      • 1970-01-01
      • 2021-11-06
      相关资源
      最近更新 更多