Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >弹窗查看内容时 内容滚动区域设置为body区

弹窗查看内容时 内容滚动区域设置为body区

作者头像
书童小二
发布于 2018-12-21 06:58:26
发布于 2018-12-21 06:58:26
1.4K01
代码可运行
举报
文章被收录于专栏:前端儿前端儿
运行总次数:1
代码可运行

看到渣浪的查看文章或者查看大图有个效果:弹窗查看内容时,如果内容过长有滚动条,则滚动条会被放到body区滚动

什么意思呢?

看个图片,一般正常弹窗是有宽高限制的,如果内容过长则直接在弹窗中进行滚动

点我预览

将滚动位置放到整个body中,让弹窗中内容自适应高度

这么做的好处自然很明显,body区域有更大的可视区域,来看看最后的效果

点我预览

那具体是怎么实现呢

其实不算很难,各位看官可以先想一想能怎么搞

首先,得先弄一个基本的弹窗逻辑,为了简单,就直接操作了。可以自行封装

写个HTML结构

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<button class="show-big-img" data-h="300">查看大图 h300</button>
<button class="show-big-img" data-h="3000">查看大图 h3000</button>


<div class="layer-shade"></div>
<div class="layer-wrap">
    <a href="javascript:;" class="layer-close">&times;</a>
    <div class="layer-content">
        <p class="show-origin-img">
            <a href="javascript:;">查看原图</a>
        </p>
        <div class="big-img">
            <div class="big-img__item">我是图片</div>
        </div>
    </div>
</div>

将 layer-shade 看作遮罩,将 layer-wrap看作弹窗,将 layer-content 看作弹窗内容区,将 big-img__item 看作这里的长图片(长内容)

把样式写好

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  1 body {
  2     &.layer-scroll-in-body {
  3         overflow: hidden;
  4     }
  5 }
  6 
  7 .layer-shade {
  8     display: none;
  9     position: fixed;
 10     width: 100%;
 11     height: 100%;
 12     top: 0;
 13     left: 0;
 14     background-color: #000;
 15     opacity: .15;
 16     
 17     &.visible {
 18         display: block;
 19     }
 20 }
 21 
 22 @keyframes bounceIn {
 23     to {
 24         opacity: 1;
 25         transform: scale(1);
 26     }
 27 }
 28 
 29 .layer-wrap {
 30     display: none;
 31     z-index: 1;
 32     position: fixed;    
 33     width: 70%;
 34     height: 50%;
 35     top: 100px;
 36     left: 100px;
 37     background-color: #000;
 38     border-radius: 3px;
 39     
 40     opacity: 0;
 41     transform: scale(.3);
 42     
 43     &.visible {
 44         display: block; 
 45         animation: bounceIn .5s;
 46         animation-fill-mode: both;
 47     }
 48     
 49     &.layer-scroll-in-body {
 50         position: absolute;
 51         height: auto;
 52     }
 53     
 54     &__wrapper {
 55         overflow: auto;
 56         position: fixed;
 57         top: 0;
 58         right: 0;
 59         width: 100%;
 60         height: 100%;
 61     }
 62 }
 63 
 64 .layer-close {
 65     position: absolute;
 66     top: -16px;
 67     right: -12px;
 68     width: 24px;
 69     height: 24px;
 70     text-decoration: none;
 71     color: #fff;
 72     background: #999;
 73     border-radius: 50%;
 74     border: 3px solid #fff;
 75     text-align: center;
 76     line-height: 22px;
 77     font-size: 22px;
 78     
 79     &:hover {
 80         background-color: #358eea;
 81     }
 82 }
 83 
 84 .layer-content {
 85     height: 100%;
 86     overflow: auto;
 87 }
 88 
 89 .show-origin-img {
 90     position: absolute;
 91     top: 5px;
 92     right: 20px;
 93     font-size: 12px;
 94     
 95     a {
 96         color: #fff;
 97         text-decoration: none;
 98         
 99         &:hover {
100             text-decoration: underline;
101         }
102     }
103     
104 }
105 
106 .big-img {
107     display: flex;
108     justify-content: center;
109     box-sizing: border-box;
110     padding: 20px;
111     
112     &__item {
113         display: flex;
114         justify-content: center;
115         align-items: center;
116         max-width: 100%;
117         width: 300px;
118         height: 3000px;
119         background-color: #c7bdb3;
120     }
121 }

最后加上JS操作逻辑

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 显示弹窗
function showLayer(onShow, onClose) {
    var $body = $('body'),
        $layerShade = $('.layer-shade'),
        $layerWrap = $('.layer-wrap');
    
    // 查看大图
    $('.show-big-img').click(function() {
        $layerWrap.find('.big-img__item').css('height', $(this).attr('data-h'));
        
        // 显示前处理
        if (onShow && typeof onShow === 'function') {
            onShow($body, $layerWrap);
        }
       
        $layerShade.addClass('visible');
        $layerWrap.addClass('visible');
    });

    $('.layer-close').click(function() {
        // 关闭前处理
        if (onClose && typeof onClose === 'function') {
            onClose($body, $layerWrap);
        }
        
        $layerShade.removeClass('visible');    
        $layerWrap.removeClass('visible');
    });
}

// 显示弹窗,并设置弹窗内容滚动区为body区
function showLayerScrollInBody(setPageScroll) {
    // 模拟:确保显示弹窗前页面由垂直方向滚动条
    setPageScroll && $('.show-big-img').css('margin-bottom', 2000);
    
    showLayer(function($body, $layer) {
        // body设置 overflow: hidden
        $body.addClass('layer-scroll-in-body');
        
        $layer
            .addClass('layer-scroll-in-body')
            // 弹出层增加一层父级
            .wrap('<div class="layer-wrap__wrapper">');
    }, function($body, $layer) {
        // 关闭弹窗,则恢复
        $body.removeClass('layer-scroll-in-body');
        
        $layer
            .removeClass('layer-scroll-in-body')
            .unwrap();
    });
}


showLayer();

/* showLayerScrollInBody(); */

/* showLayerScrollInBody(true); */

代码不算太复杂,如果到这里为止已经看懂的话,应该不需要再往下看了

一般的弹窗实现,需要设置遮罩层和弹窗的position为fixed,才能更好地保证页面有滚动条的时候位置不会出错。

fixed之后,弹窗的最大高度为视窗高度,若要使得弹窗的内容区直接显示出来,就必须设置为非fixed值,而弹窗不能少了定位,那就只能使用 absolute值了

但设置了absolute就无法计算页面有滚动条的时候的位置,所以需要给弹窗包裹一层父级,设置为fixed,则弹窗基于此父级来定位,相应的 top 和 left 值无需改变

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$layer.wrap('<div class="layer-wrap__wrapper">');
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
&__wrapper {
        overflow: auto;
        position: fixed;
        top: 0;
        right: 0;
        width: 100%;
        height: 100%;
    }

原先弹窗是设置了高度的,所以需要进行重置。推荐使用css类名来切换,方便维护

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$layer.addClass('layer-scroll-in-body')
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
&.layer-scroll-in-body {
        position: absolute;
        height: auto;
    }

在页面有滚动条的时候,还要注意页面的滚动条会不会和弹窗中的滚动条产生冲突,如

所以需要给body设置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$body.addClass('layer-scroll-in-body');
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
body {
    &.layer-scroll-in-body {
        overflow: hidden;
    }
}

最后,记得在弹窗关闭的时候,还原相关的更改即可

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-12-01 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
请收下这只可爱的猫咪吧
制作一个盛放内容的盒子,在BlogRoot/themes/butterfly/layout/includes/head.pug最后一行加入如下代码:
唐志远
2023/08/01
2230
请收下这只可爱的猫咪吧
js实现:仿京东搜索栏随滑动透明度渐变
注意:不兼容IE8及以下,IE11和360的IE兼容模式测试通过====IE8不支持opacity
Rattenking
2021/01/29
2K0
js实现:仿京东搜索栏随滑动透明度渐变
JQuery 实现开发常用功能
标签克隆的两种实现方式: <body> <div> <p> <a onclick="Add(this)">+</a> <input type="text"/> </p> </div> <script src="https://code.jquery.com/jquery-3.4.1.min.js"></script> <script> function Add(ths) {
王瑞MVP
2022/12/28
5.4K0
一个简单的图片列表动效
<!doctype html> <html> <head> <script src="jquery.js"></script> <script> $(document).ready(function(e) { var h=$(".list span").width() $(".list span").css("height",h) $(".list span").css("line-height",h+"px") $(window).resize( function(){ h=$(".lis
用户1730674
2018/05/02
8790
一个简单的图片列表动效
基于jQuery的公告无限循环滚动实现代码
基于jQuery的公告无限循环滚动实现代码,效果如下,多用于pc端电商网站之中不断的循环更新的公告消息。
王小婷
2018/12/21
4K0
jQuery基础--jQuery特殊属性操作
区别:html方法会识别html标签,text方法会那内容直接当成字符串,并不会识别html标签。
eadela
2019/09/29
2.2K0
MUI导航栏透明渐变----原生JS实现
首先声明:由于backgroundColor的值采用的是RGBA,IE8及以下不支持,所以此效果不支持IE8及以下的浏览器 此效果采用的RGBA做的透明渐变,所以CSS样式中的backgroundColor的值必须是RGBA css代码 body,p,h1{margin: 0;} .module-layer{ width: 100%; position: fixed; top: 0; left: 0; z-index: 100000; } .module-layer-
Rattenking
2021/01/29
5.4K0
纯CSS解决iOS下网页不满一屏header、footer随页面滚动问题
前端页面开发或是现在日渐增多的Hybird APP应用开发中,经常遇到模拟原生APP界面效果不佳情况,固定header、footer便是其中一种。
Power
2023/05/28
6630
浮动清楚浮动及position的用法
static 默认值,无定位,不能当作绝对定位的参照物,并且设置标签对象的left、top等值是不起作用的的。
IT人一直在路上
2019/09/18
2.2K0
H5开发笔记
1.css实现自动隐藏scroll滚动条但不影响滚动功能 谷歌内核webkit .container::-webkit-scrollbar { display: none; //SafariandChrome } IE或者Firefox .container { -ms-overflow-style: none; //IE 10+ overflow: -moz-scrollbars-none; //Firefox } 2.浮层去除底部滚动 stopBodyScroll (isFi
无忧366
2021/01/06
8240
jQuery遮罩(Mask)及弹窗时禁止页面滚动实现
保险起见可以把 html 和 body 的高度都设置 100% ,如下,用添加 class 的方法实现:
德顺
2019/11/13
6.7K0
【如果你要学JS XIII】——实现放大镜效果、client&scroll属性、固定侧边栏
client翻译过来就是客户端,我们使用client系列的相关属性来获取元素可视区的相关信息。通过client系列 的相关属性可以动态的得到该元素的边框大小、元素大小等。
像素人
2023/12/26
5510
【如果你要学JS XIII】——实现放大镜效果、client&scroll属性、固定侧边栏
CSS3新特性应用之用户体验
一、光标 新增加not-allowed光标,不允许访问 隐藏光标,在触模应用上很有用,css2.1需要一个透明的图片来实现,而css3直接用cursor:none即可。 完整代码: curosr: url(transparent.gif'); cursor: none; 二、扩大热区 应用在小按钮的情况下,不好被鼠标点击到 代码如下: .btn{ position: relative; cursor: pointer; } .btn:after{ position: absolute
sam dragon
2018/01/17
8620
jQuery文档对象模型DOM的实际应用
DOM 在 JavaScript 课程中我们详细的探讨过,它是一种文档对象模型。方便开发者对 HTML 结构元素内容进行展示和修改。在 JavaScript 中,DOM 不但内容庞大繁杂,而且我们开发的过程中需要考虑更多的兼容性、扩展性。
王小婷
2018/12/19
1.2K0
蒙层禁止页面滚动的方案
弹窗是一种常见的交互方式,而蒙层是弹窗必不可少的元素,用于隔断页面与弹窗区块,暂时阻断页面的交互。但是在蒙层出现的时候滚动页面,如果不加处理,蒙层底部的页面会开始滚动,实际上我们是不希望他进行滚动的,因此需要阻止这种行为。当弹出蒙层时禁止蒙层下的页面滚动,也可以称为滚动穿透的问题,文中介绍了一些常用的解决方案。
WindRunnerMax
2022/05/06
6.5K0
分享一个自用emlog手机底部导航加样式代码
看到很多朋友都要这个手机端底部导航索性就分享了,这玩意其实我也不是不舍得发,是懒得而已 这玩意我都是扣别人的所以这个东西自己扣就行了,如果你不会扣那我赶紧我分享出来你也不会用。
用户8099761
2023/05/11
7640
jquery学习
<1> jQuery由美国人John Resig创建,至今已吸引了来自世界各地的众多 javascript高手加入其team。
菲宇
2019/06/13
2.3K0
jQuery
jQuery是目前使用最广泛的javascript函数库。据统计,全世界排名前100万的网站,有46%使用jQuery,远远超过其他库。微软公司甚至把jQuery作为他们的官方库。
py3study
2020/01/16
4.2K0
使用dreamweaver制作采用DIV+CSS进行布局——美食甜品店铺加盟企业HTML静态网页 ——学生美食网页设计作品静态HTML网页模板源码
👨‍🎓静态网站的编写主要是用HTML DIV+CSS JS等来完成页面的排版设计👩‍🎓,常用的网页设计软件有Dreamweaver、EditPlus、HBuilderX、VScode 、Webstorm、Animate等等,用的最多的还是DW,当然不同软件写出的前端Html5代码都是一致的,本网页适合修改成为各种类型的产品展示网页,比如美食、旅游、摄影、电影、音乐等等多种主题,希望对大家有所帮助。 🧡 【作者主页——🔥获取更多优质源码】 🧡 【web前端期末大作业——🔥🔥毕设项目精品实战案例(1000套)
IT司马青衫
2022/08/23
1.2K0
使用dreamweaver制作采用DIV+CSS进行布局——美食甜品店铺加盟企业HTML静态网页 ——学生美食网页设计作品静态HTML网页模板源码
CSS笔记(15)
overflow属性指定了如果内容溢出一个元素的框(超出其高度及宽度)时,会发生什么.
y191024
2022/09/20
1.2K0
CSS笔记(15)
相关推荐
请收下这只可爱的猫咪吧
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验