Better grid management
authorveltr
Wed, 04 Sep 2013 13:34:26 +0200
changeset 102 5d83d0105559
parent 101 19de76fe00a9
child 103 da385c0872a6
Better grid management
src/jocondelab/static/jocondelab/css/front-common.css
src/jocondelab/static/jocondelab/js/front-common.js
--- a/src/jocondelab/static/jocondelab/css/front-common.css	Tue Sep 03 15:50:59 2013 +0200
+++ b/src/jocondelab/static/jocondelab/css/front-common.css	Wed Sep 04 13:34:26 2013 +0200
@@ -110,7 +110,7 @@
 
 body {
     color: #000000; background: url('../img/background-pinstripe-yellow.png');
-    font-family: 'OpenSans'; font-size: 10px;
+    font-family: 'OpenSans'; font-size: 10px; overflow-x: hidden;
 }
 
 .header-wrapper {
@@ -194,7 +194,7 @@
 
 .menu-list {
     position: absolute; top: 25px; right: 0; background: #ffffff; display: none;
-    font-size: 12px; box-shadow: 1px 1px 3px #333333; z-index: 2; text-align: right;
+    font-size: 12px; box-shadow: 1px 1px 3px #333333; z-index: 3; text-align: right;
 }
 
 .menu-item {
@@ -274,17 +274,41 @@
     height: 160px;
     overflow: hidden;
     float: left;
+    position: relative;
+}
+
+@media screen and (max-width: 640px) {
+    .notice-item {
+        width: 120px;
+        height: 120px;
+    }
+}
+
+.notice-image {
+    font-size: 0; line-height: 0;
+}
+
+.notice-item.notice-hover {
+    overflow: visible;
 }
 
 .notice-item .notice-metadata {
     display: none;
 }
 
-.notice-popin {
-    position: absolute; padding: 10px; z-index: 1;
+.notice-item.notice-hover .notice-metadata {
+    display: block;
+}
+
+.notice-contents {
+    position: absolute; padding: 9px; z-index: 1;
     background: url('../img/background-pinstripe-yellow.png'); border: 1px solid #cccccc; box-shadow: 0 0 5px #333333;
 }
 
+.notice-hover .notice-contents {
+    z-index: 2;
+}
+
 .notice-contents h2 {
     font-size: 15px; margin-bottom: 6px; line-height: 1.1em;
 }
--- a/src/jocondelab/static/jocondelab/js/front-common.js	Tue Sep 03 15:50:59 2013 +0200
+++ b/src/jocondelab/static/jocondelab/js/front-common.js	Wed Sep 04 13:34:26 2013 +0200
@@ -107,18 +107,18 @@
     }
     
     window.bindDbpediaBox = function(selector, defaultUri) {
-        $(selector).on({
-            mouseenter: function(e) {
-                $refdiv = $(this);
-                var dbpediaUri = $refdiv.attr("data-dbpedia-uri") || defaultUri;
-                if (!dbpediaUri || dbpediaUri === "None") {
-                    return;
-                }
-                hovering = dbpediaUri;
-                showUriData(dbpediaUri) || getUriData(dbpediaUri);
-            },
-            mouseleave: onDbpediaLeave
+        var $sel = $(selector);
+        $sel.off("mouseenter mouseleave");
+        $sel.mouseenter(function(e) {
+            $refdiv = $(this);
+            var dbpediaUri = $refdiv.attr("data-dbpedia-uri") || defaultUri;
+            if (!dbpediaUri || dbpediaUri === "None") {
+                return;
+            }
+            hovering = dbpediaUri;
+            showUriData(dbpediaUri) || getUriData(dbpediaUri);
         });
+        $sel.mouseleave(onDbpediaLeave);
     }
         
     $overlay.hover(function() {
@@ -134,59 +134,15 @@
     /* NOTICE LIST MANAGEMENT */
    
     var gridsize = 160,
-        $popin = null;
+        $popin = null,
+        hoverPopin = false;
     
     function removePopin() {
         if ($popin) {
-            $popin.remove();
+            $(".notice-item").removeClass("notice-hover");
             $popin = null;
         }
-    }
-    
-    function movePopin() {
-        if ($popin) {
-            var $tblist = $(".notice-list"),
-                $img = $popin.find(".notice-image"),
-                $refli = $tblist.find("li[data-notice-id=" + $popin.attr("data-notice-id") + "]"),
-                $refimg = $refli.find(".notice-image"),
-                $md = $popin.find(".notice-metadata"),
-                refo = $refimg.offset(),
-                refw = $refimg.width(),
-                winw = $win.width(),
-                x = refo.left + refw / 2;
-            $popin.css({
-                top: refo.top - 11,
-                width: refw + 260
-            });
-            if (x < winw / 2) {
-                $img.css({
-                    float: "left"
-                });
-                $md.css({
-                    "margin-left": refw + 10,
-                    "margin-right": 0
-                });
-                $popin.css({
-                    right: "none",
-                    left: refo.left - 11
-                });
-            } else {
-                $img.css({
-                    float: "right"
-                });
-                $md.css({
-                    "margin-left": 0,
-                    "margin-right": refw + 10
-                });
-                $popin.css({
-                    left: "none",
-                    right: winw - refo.left - refw - 11
-                });
-            }
-        }
-    }
-    
-    var hoverPopin = false;
+    }  
     
     function deferredRemovePopin() {
         window.setTimeout(function() {
@@ -199,73 +155,87 @@
     function adaptGrid() {
         var $tblist = $(".notice-list");
         if ($tblist.length) {
+            gridsize = $tblist.children(":first").width() || 160;
             $tblist.css({
                 padding: "0 " + Math.floor($tblist.parent().width() % gridsize / 2) + "px"
             });
         }
+        throttledCheckSizes();
     }
     
     function checkSizes() {
         var notloaded = false;
-        $(".notice-image").each(function() {
-            if (this.__isloaded) {
-                return;
-            }
-            var ih = this.height;
+        $(".notice-item").each(function() {
+            var $this = $(this),
+                $nc = $(this).find(".notice-contents"),
+                $img = $(this).find(".notice-image"),
+                $md = $(this).find(".notice-metadata"),
+                img = $img[0],
+                ih = img.height;
             if (ih < 30) {
                 notloaded = true;
                 return;
             }
-            var iw = this.width,
+            var iw = img.width,
                 scale = gridsize / Math.min(iw, ih),
                 nw = scale * iw,
-                nh = scale * ih;
-            $(this).css({
+                nh = scale * ih,
+                ww = $win.width(),
+                isleft = ($this.offset().left + gridsize / 2 < ww / 2),
+                isfull = (nw > ww - 300);
+            $img.css({
                 width: nw + "px",
                 height: nh + "px",
-                "margin-top": (gridsize - nh) / 2 + "px",
-                "margin-left": (gridsize - nw) / 2 + "px"
+                float: isleft ? "left": "right"
+            });
+            $md.css({
+                "margin-left" : (isleft && !isfull) ? nw + 10 : 0,
+                "margin-right" : (!isleft && !isfull) ? nw + 10 : 0
             });
-            this.__isloaded = true;
+            $nc.css({
+                left: isleft ? "0" : "",
+                right: isleft ? "" : "0",
+                width: isfull ? nw : (nw + 260),
+                "margin-top": ((gridsize - nh) / 3 - 10) + "px",
+                "margin-left": isleft ? ((gridsize - nw) / 2 - 10) + "px" : 0,
+                "margin-right": isleft ? 0 : ((gridsize - nw) / 2 - 10) + "px"
+            });
         });
         if (notloaded) {
-            setTimeout(checkSizes, 500);
+            setTimeout(throttledCheckSizes, 500);
         }
     }
     
+    var throttledCheckSizes = _(checkSizes).throttle(200);
+    
     window.bindResultsMouseover = function() {
-        $(".notice-item").mouseover(function() {
+        var $items = $(".notice-item");
+        $items.off("mouseenter mouseover");
+        $items.mouseenter(function() {
             var $this = $(this);
-            window.setTimeout(function() {
-                removePopin();
-                if (!$this.find(".notice-image")[0].width) {
-                    return;
-                }
-                $popin = $('<div class="notice-popin"></div>').append($this.find(".notice-contents").clone());
-                $popin.attr("data-notice-id",$this.attr("data-notice-id"));
-                $popin.find(".notice-image").css("margin", 0);
-                $("body").append($popin);
-                movePopin();
-                bindDbpediaBox($popin.find(".notice-term a"));
-                $popin.mouseover(function() {
-                    hoverPopin = true;
-                }).mouseleave(function() {
-                    hoverPopin = false;
-                    if ($overlay.is(":hidden")) {
-                        deferredRemovePopin();
-                    }
-                });
-            }, 0);
+            hoverPopin = true;
+            if ($popin && $popin === $this) {
+                return;
+            }
+            removePopin();
+            if (!$this.find(".notice-image")[0].width) {
+                return;
+            }
+            $popin = $this;
+            $this.addClass("notice-hover");
         });
-        
-        removePopin();
+        $items.mouseleave(function() {
+            hoverPopin = false;
+            if ($overlay.is(":hidden")) {
+                deferredRemovePopin();
+            }
+        });
+        bindDbpediaBox($items.find(".notice-term a"));
         adaptGrid();
-        checkSizes();
     }
     
     $win.resize(function() {
         adaptGrid();
-        movePopin();
         moveDbpediaPopin();
     }).scroll(moveDbpediaPopin);