首页 > 其他分享 >TreeSaver 图片的定位

TreeSaver 图片的定位

时间:2023-06-27 20:01:56浏览次数:58  
标签:定位 container treesaver sibling TreeSaver new size 图片

Treesaver 是浏览器大小尺寸敏感(size-sensitive)的,会就着当前的浏览器尺寸(browser size),选用不同的分栏表格(grid)做排版。不同排版效果下,图片出现的位置有啥规律,这就是本文要分析的内容:

 

一些典型的图片出现的规律:

首先我们看一些图片出现的规律:

一、当显示的区域只有两栏时,显示另外一个能贯穿两栏的图片,而不是之前贯穿三栏的图片。

TreeSaver 图片的定位_h5

这时候的图片相关CSS定义如下(使用Firefox的firebug监控到的解析后的html):

<div data-sizes="double-16x9 double-4x3 double-1x1 double-3x4" 
class="container col-1 img w6col overflow double-16x9 zoomable" 
  style="bottom: auto;" data-figureindex="3">
  <div data-minwidth="518" data-sizes="double-16x9" data-minheight="363" class="">
        <img width="518" height="291" data-src="../img/10_395.jpg" src="../img/10_395.jpg">
        <p class="caption">
          (double)Jacob Wysocki in the title role, and John C. Reilly as Mr.
          Fitzgerald in Azazel Jacobs’ new film <em>Terri</em>.  
          <span class="credit">Art Takes Over5</span>
        </p>
</div></div>

二、三栏,图片在最上面,贯穿三栏:

TreeSaver 图片的定位_h5_02

这时候的图片相关CSS定义如下(使用Firefox的firebug监控到的解析后的html):

<div data-sizes="triple-16x9 triple-4x3 triple-1x1 triple-3x4" 
  class="container col-1 img w9col overflow triple-16x9 zoomable" 
    style="bottom: auto;" data-figureindex="3">
   <div data-minwidth="788" data-sizes="triple-16x9" data-minheight="515" class="">
  <img width="788" height="443" data-src="../img/10_394.jpg" 
             src="../img/10_394.jpg">
  <p class="caption">
    (triple) Jacob Wysocki in the title role, and John C. Reilly as Mr.
    Fitzgerald in Azazel Jacobs’ new film <em>Terri</em>.  
                <span class="credit">Art Takes Over6</span>
  </p>
   </div>
</div>

三、四栏时图片出现在左下角,图片仍然是三栏

TreeSaver 图片的定位_html_03

这时候的图片相关CSS定义如下(使用Firefox的firebug监控到的解析后的html):

<div> 
    <div data-sizes="triple-16x9 triple-3x4 triple-1x1 triple-4x3" 
    class="container col-1 w9col img bottom triple-16x9 zoomable" style="top: auto;" 
    data-figureindex="3">
    <div data-minwidth="788" data-sizes="triple-16x9" data-minheight="515" class="">
  <img width="788" height="443" data-src="../img/10_394.jpg" src="../img/10_394.jpg">
  <p class="caption">
    (triple) Jacob Wysocki in the title role, and John C. Reilly as Mr.
    Fitzgerald in Azazel Jacobs’ new film <em>Terri</em>.  
    <span class="credit">Art Takes Over6</span>
  </p>
  </div>
  </div> 
    <div class="column col-1 flexed" style="min-height: 0px; bottom: 486px; height: 72px;">
      <h5 style="margin-top: 0px;">动感车身(前脸、保险杠、扰流板)</h5><p class="first">
  一些混排文字  
    </p></div> 
    <div class="column col-4 flexed" style="min-height: 0px; bottom: 486px; height: 72px;">
      <p class="first" style="margin-top: -54px;">
  一些混排文字  
  </p></div> 
    <div class="column col-7 flexed" style="min-height: 0px; bottom: 486px; height: 72px;">
    <p class="first" style="margin-top: -126px;">
  一些混排文字
  </p></div> 
</div>

四、三栏,刚好可以放下一个图

TreeSaver 图片的定位_html_04

这时候的图片相关CSS定义如下(使用Firefox的firebug监控到的解析后的html):

<div> 
    <div data-sizes="triple-16x9 triple-3x4 triple-1x1 triple-4x3" 
    class="container col-1 w9col img bottom triple-16x9 zoomable" style="top: auto;" data-figureindex="3">
    <div data-minwidth="788" data-sizes="triple-16x9" data-minheight="515" class="">
  <img width="788" height="443" data-src="../img/10_394.jpg" src="../img/10_394.jpg">
  <p class="caption">
    (triple) Jacob Wysocki in the title role, and John C. Reilly as Mr.
    Fitzgerald in Azazel Jacobs’ new film <em>Terri</em>.  
    <span class="credit">Art Takes Over6</span>
  </p>
</div></div> 
    <div class="column col-1 flexed" style="min-height: 0px; bottom: 486px;"> 
    </div> 
    <div class="column col-4 flexed" style="min-height: 0px; bottom: 486px;"> 
    </div> 
    <div class="column col-7 flexed" style="min-height: 0px; bottom: 486px;"> 
    </div> 
</div>

二、三这两个情况其实产生的html是一样的,只不过三产生的html中,填充图片空白位置的文字是空的,二产生的空白位置的文字是有的。

五、四栏图片,出现在最上面

TreeSaver 图片的定位_html_05

这时候的图片相关CSS定义如下(使用Firefox的firebug监控到的解析后的html):

<div data-sizes="quad-16x9 quad-4x3 quad-1x1 quad-3x4" 
       class="container col-1 img w12col overflow quad-16x9 zoomable" 
  style="bottom: auto;" data-figureindex="3">
    <div data-minwidth="1058" data-sizes="quad-16x9" data-minheight="667" class="">
        <img width="1058" height="595" data-src="../img/325_16813.jpg" src="../img/325_16813.jpg">
        <p class="caption">
          (quad) Jacob Wysocki in the title role, and John C. Reilly as Mr.
          Fitzgerald in Azazel Jacobs’ new film <em>Terri</em>.  
          <span class="credit">Art Takes Over7</span>
        </p>
</div></div>

 

在页面文件中我们可以看到下面的Html代码,显然我们可以在这里看到,同一个图片,我们预先定义了一些适合于不同设备的图片

<!--同一张图片 预先定义一些适用于不同设备的图片 -->
    <figure class="zoomable">
    
    <!-- 移动设备大小 -->
      <div data-minHeight="229" data-sizes="mobile-16x9"
        data-minWidth="280">
        <!-- 演示效果中没有这部分,就省略它 //-->
      </div>
      
    <!--小单栏 -->
      <div data-minHeight="160" data-sizes="small-single-16x9"
        data-minWidth="158">
      <!-- 演示效果中没有这部分,就省略它 //-->
      </div>
    <!-- 单栏 (single) -->
      <div data-minHeight="211" data-sizes="single-16x9"
        data-minWidth="248">
        <!-- 演示效果中没有这部分,就省略它 //-->
      </div>
     <!-- 小双栏 -->
      <div data-minHeight="262" data-sizes="small-double-16x9"
        data-minWidth="338">
        <!-- 演示效果中没有这部分,就省略它 //-->
      </div>
     <!-- 双栏(double) -->
      <div data-minHeight="363" data-sizes="double-16x9"
        data-minWidth="518">
        <img width="518"
          data-src="../img/10_395.jpg"
          height="291" />
        <p class="caption">
          (double)Jacob Wysocki in the title role, and John C. Reilly as Mr.
          Fitzgerald in Azazel Jacobs’ new film <em>Terri</em>.  <span
            class="credit">Art Takes Over5</span>
        </p>
      </div>
   <!-- 19 显示器 16x9  三栏(triple)-->
<div data-minHeight="515" data-sizes="triple-16x9"
  data-minWidth="788">
  <img width="788"
    data-src="../img/10_394.jpg"
    height="443" />
  <p class="caption">
    (triple) Jacob Wysocki in the title role, and John C. Reilly as Mr.
    Fitzgerald in Azazel Jacobs’ new film <em>Terri</em>.  <span
      class="credit">Art Takes Over6</span>
  </p>
</div>
      <!-- 四栏(quad) -->
      <div data-minHeight="667" data-sizes="quad-16x9" data-minWidth="1058">
        <img width="1058"
          data-src="../img/325_16813.jpg"
          height="595" />
        <p class="caption">
          (quad) Jacob Wysocki in the title role, and John C. Reilly as Mr.
          Fitzgerald in Azazel Jacobs’ new film <em>Terri</em>.  <span
            class="credit">Art Takes Over7</span>
        </p>
      </div>
    <!-- fallback (备用)  -->
      <div class="img fallback keeptogether" data-sizes="fallback">
        <img  src="../img/test1.jpg"
          data-sizes="fallback" width="40" itemprop="thumb" height="40" />
        <p class="caption">
          (fallback) Jacob Wysocki in the title role, and John C. Reilly as Mr.
          Fitzgerald in Azazel Jacobs’ new film <em>Terri</em>.  <span
            class="credit">Art Takes Over8</span>
        </p>
      </div>
    </figure>

同一个图片位置,我们上面看到预先定义了一些适合不同设备的不同大小的图片,每个图片的设置中描述了这个图片适合的大小,以及适合的分栏情况:

比如这个:<div data-minHeight="363" data-sizes="double-16x9"  data-minWidth="518">

就描述了适合于双栏:data-sizes="double-16x9",最小高度要求:data-minHeight="363",最小宽度要求:data-minWidth="518"

TreeSaver 在运算出适合用几栏来显示后, 根据这里定义的适合的栏数,以及最小长宽,选择合适的图来显示。

图片的位置从上面分析来看,只有两种:

overflow 和 bottom 。 对应的样式:  style="top: auto;"  和 style="bottom: auto;"

TreeSaver的源代码中有下面代码:

/**
 * @param {!Element} container
 * @param {!treesaver.layout.Figure} figure
 * @param {!treesaver.layout.Grid.ContainerMap} map
 * @param {?number} lineHeight
 * @return {boolean} True if the figure fit within the container.
 */
treesaver.layout.Page.fillContainer = function(container, figure, map,
    lineHeight) {
  var size, figureSize,
      containerHeight, sibling,
      maxContainerHeight,
      anchoredTop = true;
  size = map.size;
  figureSize = map.figureSize;
  if (goog.DEBUG) {
    if (!size) {
      treesaver.debug.error('Empty size!');
    }
    if (!figureSize) {
      treesaver.debug.error('Empty figureSize!');
    }
  }
  maxContainerHeight = treesaver.dimensions.getOffsetHeight(container);
  // Do any content switching that needs to happen
  figureSize.applySize(container, size);
  // If the container is fixed, then we are done no matter what
  if (!map.flexible) {
    return true;
  }
  // Adjust flexible containers
  // Unhinge from a side before measuring
  if (treesaver.dom.hasClass(container, 'bottom')) {
    anchoredTop = false;
    container.style.top = 'auto';
  }
  else {
    container.style.bottom = 'auto';
  }
  containerHeight = treesaver.dimensions.getOffsetHeight(container);
  // Did not fit :(
  // TODO: Use something better than parent height
  if (containerHeight > maxContainerHeight) {
    treesaver.debug.info('Container failure: ' + containerHeight + ':' + maxContainerHeight);
    if (goog.DEBUG) {
      container.setAttribute('data-containerHeight', containerHeight);
      container.setAttribute('data-maxHeight', maxContainerHeight);
      container.setAttribute('data-attemptedSize', size);
    }
    // Revert after failure
    figureSize.revertSize(container, size);
    // TODO: Return style.bottom & style.top to originals?
    return false;
  }
  // Round to nearest for column adjustment to maintain grid
  if (lineHeight && containerHeight % lineHeight) {
    containerHeight = treesaver.dimensions.roundUp(containerHeight, lineHeight);
  }
  // Go through this containers siblings, adjusting their sizes
  sibling = container;
  while ((sibling = sibling.nextSibling)) {
    if (sibling.nodeType !== 1) {
      // Ignore non-elements
      continue;
    }
    // Cast for compiler
    sibling = /** @type {!Element} */ (sibling);
    // Don't touch fixed items
    if (treesaver.dom.hasClass(sibling, 'fixed')) {
      continue;
    }
    if (treesaver.dom.hasClass(sibling, 'column') ||
        treesaver.dom.hasClass(sibling, 'container') ||
        treesaver.dom.hasClass(sibling, 'group')) {
      // Add a flag for debugging / later detection
      treesaver.dom.addClass(sibling, 'flexed');
      // Make sure we don't go negative
      if (treesaver.dimensions.getOffsetHeight(sibling) <= containerHeight) {
        treesaver.debug.info('Sibling shrunk to zero height: ' + sibling);
        // TODO: Remove from tree?
        treesaver.dimensions.setCssPx(sibling, 'height', 0);
      }
      else {
        // Since items are always absolutely positioned, we can
        // adjust the position of the column directly based on it's
        // offsets
        if (anchoredTop) {
          treesaver.dimensions.setCssPx(sibling, 'top',
            treesaver.dimensions.getOffsetTop(sibling) + containerHeight);
        }
        else {
          // Compute the current 'bottom' value by using the parent's offsetHeight
          treesaver.dimensions.setCssPx(sibling, 'bottom',
            treesaver.dimensions.getOffsetHeight(sibling.offsetParent) -
            (treesaver.dimensions.getOffsetTop(sibling) + treesaver.dimensions.getOffsetHeight(sibling)) + containerHeight);
        }
      }
    }
  }
  return true;
};

注意其中的这一段:

if (treesaver.dom.hasClass(container, 'bottom')) {
    anchoredTop = false;
    container.style.top = 'auto';
  }
  else {
    container.style.bottom = 'auto';
  }

这意味着,默认情况下,我们是把图片显示在上面。 只有在 treesaver.dom.hasClass(container, 'bottom') 时才会显示图片在左下角。
treesaver.dom.hasClass 函数如下:

 

/**
 * Check if an element has the given class
 * Hat Tip: Dean Edwards http://dean.edwards.name/IE7/caveats/
 *
 * @param {!Element|!HTMLDocument} el
 * @param {!string} className
 * @return {boolean} True if the element has that class.
 */
treesaver.dom.hasClass = function(el, className) {
  var regexp = new RegExp('(^|\\s)' + className + '(\\s|$)');
  return !!(el.className && regexp.test(el.className));
};

即,我们通过判断元素的class 中是否存在 'bottom' 这个样式定义来决定是否该如何显示的。

我们对上面代码加断点,并监控 container.className 的值,会看到它的值是:类似如下的:"container col-7 w6col img double-4x3"

我们在资源文件中搜索container col-7 w6col img,会看到两个Grid中有如下定义:

<!-- 非第一页的奇数页 //-->
  <div class="grid w12col feature1 odd no-page-1"> 
   <div class="runningtitle"> 
    <span> 
     Nomad Editions
    </span> 
    <span data-bind="vertical"> 
     vertical
    </span> 
   </div> 
   <div> 
    <div class="container col-1 w3col pullquote bottom" data-sizes="pullquote"> 
    </div> 
    <div class="column col-1"> 
    </div> 
   </div> 
   <div class="column col-4"> 
   </div> 
   <div> 
    <div class="container col-7 w6col img" data-sizes="double-16x9 double-3x4 double-1x1 double-4x3"> 
    </div> 
    <div class="column col-7 bottom"> 
    </div> 
    <div class="column col-10 bottom"> 
    </div> 
   </div> 
  </div> 
<!-- 非第一页的偶数页 //-->
<div class="grid w12col feature2 even no-page-1"> 
   <div class="runningtitle"> 
    <span> 
     Nomad Editions
    </span> 
    <span data-bind="vertical"> 
     vertical
    </span> 
   </div> 
   <div> 
    <div class="container col-1 w3col pullquote bottom" data-sizes="pullquote"> 
    </div> 
    <div class="column col-1"> 
    </div> 
   </div> 
   <div class="column col-4"> 
   </div> 
   <div> 
    <div class="container col-7 w6col img" data-sizes="double-16x9 double-3x4 double-1x1 double-4x3"> 
    </div> 
    <div class="column col-7"> 
    </div> 
    <div class="column col-10"> 
    </div> 
   </div> 
  </div>

从这里我的猜测整个处理流程是

根据Grid的适用场景,我们选择合适的Grid,

在Grid内部,我们会根据我们的配置来显示这个Grid。

所以理解Grid内部工作原理,如何选择Grid会是理解TreeSaver的一个关键。

标签:定位,container,treesaver,sibling,TreeSaver,new,size,图片
From: https://blog.51cto.com/u_15588078/6565318

相关文章

  • TreeSaver 使用教程整理——Step 4: Using a Title Figure
    请首先阅读前几篇教程,才能对本篇文章了解比较深入:TreeSaver使用教程整理——Step1:GettingStartedTreeSaver使用教程整理——Step2:AddingBasicUITreeSaver使用教程整理——Step3:CreatingGrids我们在第二步的基础上,copy到step4作为我们step4初始的基础。 Step4......
  • TreeSaver 使用教程整理——Step 3: Creating Grids
    请首先阅读前几篇教程,才能对本篇文章了解比较深入:TreeSaver使用教程整理——Step1:GettingStartedTreeSaver使用教程整理——Step2:AddingBasicUI我们在第二步的基础上,copy到step3作为我们step3初始的基础。 Step3:CreatingGrids模板文件resources.html的变化在......
  • TreeSaver 使用教程整理——Step 2: Adding Basic UI
    请首先阅读前一篇教程:TreeSaver使用教程整理——Step1:GettingStartedStep2:AddingBasicUI我们上一步实现的网页有了一个最最简单的功能,这一步我们将在上一步基础上添加切换分页的按钮以及显示当前页面信息。请Copy上一步的内容,并对下面文件做如下修改: 对资源文件(resource......
  • TreeSaver 使用教程整理——Step 1: Getting Started
    TreeSaver介绍Treesaver是一个开源的JavaScript框架,用来创建杂志风格的网页布局。 为何要整理这个系列的文章下面的教程整理自:https://github.com/Treesaver/treesaver/wiki/Walkthrough,也许是这个框架目前才刚刚起步,它的文档很成问题,文档中一些链接不能下载,源代码中欠缺一......
  • PHP语言对接抖音快手小红书视频/图片去水印API接口的案例
    这篇文章主要介绍了PHP语言对接抖音快手小红书视频/图片去水印API接口的案例,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获。下面让小编带着大家一起了解一下。以下为PHP语言调用去水印接口的示例,展示GET请求方式的调用方式。示例代码中用到的Uid和Toke......
  • WEB自动化-selenium-定位方式
    定位元素的时候可以修改JS样式来确定定位的元素是否正确#通过selenium修改JS属性,用来确定我定位的元素是什么?driver.execute_script("arguments[0].setAttribute('style',arguments[1]);",el,"border:2pxsolidgreen;"#边框,green绿色) ......
  • 数据库索引问题定位与分析
    数据库索引问题定位与分析一.数据库服务器添加慢查询配置1.my.cnf文件添加监控慢查询配置cd/etc/my.cnfvimy.cnf添加如下配置:slow_query_log=1long_query_time=0.012.重启数据库服务器systemctlrestartmysqld3.检查配置是否生效showvariableslike'%slow_query_......
  • 联合索引问题定位与分析
    联合索引问题定位与分析一.配置联合索引二.联合索引生效规则最左侧生效原则1.不生效情况Age在联合索引的第左侧,where字句中,没有用到age所以联合索引不生效2.部分生效情况Email在联合索引的最左侧,slq语句中有email字段,email生效3.联合索引都生效Sql语句中where字段与联合索引完全一致......
  • 图片大小如何调整?调整图片大小方法分享!​
    相信大家在日常的生活中,经常会遇到图片加载很慢或者图片不兼容的情况,比如考试报名,或者网上办理业务,都需要上传自己的证件照,这类要求是比较严格的,一般出现无法上传的情况,那么可能是因为你的图片大小不合适,或者图片不兼容。那么图片的大小怎么才能调整呢?今天小编教大家两种方法,让你顺......
  • html编辑器 复制word里面带图文的文章,图片可以直接显示
    ​ 在之前在工作中遇到在富文本编辑器中粘贴图片不能展示的问题,于是各种网上扒拉,终于找到解决方案,在这里感谢一下知乎中众大神以及TheViper。通过知乎提供的思路找到粘贴的原理,通过TheViper找到粘贴图片的方法。其原理为一下步骤:监听粘贴事件;【用于插入图片】获取光标位置;【......