Mostrando entradas con la etiqueta Blogger. Mostrar todas las entradas
Mostrando entradas con la etiqueta Blogger. Mostrar todas las entradas

Entradas populares con forma de cubo 3D para Blogger

4 comentaron

Todos los que utilizamos la plataforma de Blogger, conocemos el gadget de entradas populares, que nos informa de los articulos mas visitados de nuestro blog. El aspecto 'de casa' de este artilugio es un poquito simple, pero siempre se puede rediseñar como ya os he mostrado en otras tantas entradas. En este caso lo vamos a 'convertir' en un cubo que ira girando con efecto 3D, mostrando los posts en cada una de sus caras.

Para instalarlo en el blog, obviamente debemos tener el gadget de entradas populares, marcando solamente la casilla de imagen en miniatura, como podeis ver en esta imagen.



Despues, deberemos copiar el siguiente codigo y pegarlo en un gadget HTML/Javascript y situarlo encima del anterior, como podeis observar en la imagen de la izquierda. Guardamos los cambios y la disposicion y ya lo tenemos. Facilito ¿Verdad? Si lo deseais, podeis ver una demo haciendo click aqui.

ver codigo
<style type="text/css">
.cube { width: 200px; height: 200px;margin: 0 auto;}
a img { border: none; }
#linksCube img { width: 100%; height: 100%; }
</style>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js" type="text/javascript"></script>
<script>
(function($) { // Hide scope, no $ conflict

/* Image cube manager. */
function ImageCube() {
    this._defaults = {
        direction: 'random', // Direction of rotation: random|up|down|left|right
        randomSelection: ['up', 'down', 'left', 'right'], // If direction is random, select one of these
        speed: 1000, // Time taken (milliseconds) to transition
        easing: 'linear', // Name of the easing to use during transitions
        repeat: true, // True to automatically trigger a new transition after a pause
        pause: 1000, // Time (milliseconds) between transitions
        selection: 'forward', // How to choose the next item to show:
            // 'forward', 'backward', 'random'
        shading: true, // True to add shading effects, false for no effects
        opacity: 0.8, // Maximum opacity (0.0 - 1.0) for highlights and shadows
        imagePath: '', // Any extra path to locate the highlight/shadow images
        full3D: true, // True to add cubic perspective, false for 2D rotation
        segments: 20, // The number of segments that make up each 3D face
        reduction: 30, // The amount (pixels) of reduction for far edges of the cube
        expansion: 10, // The amount (pixels) of expansion for the near edge of the cube
        lineHeight: [0.0, 1.25], // Hidden and normal line height (em) for text
        letterSpacing: [-0.4, 0.0], // Hidden and normal letter spacing (em) for text
        beforeRotate: null, // Callback before rotating
        afterRotate: null // Callback after rotating
    };
};

var UP = 0;
var DOWN = 1;
var LEFT = 2;
var RIGHT = 3;

var PROP_NAME = 'imageCube';

$.extend(ImageCube.prototype, {
    /* Class name added to elements to indicate already configured with image cube. */
    markerClassName: 'hasImageCube',

    /* Override the default settings for all image cube instances.
       @param  options  (object) the new settings to use as defaults */
    setDefaults: function(options) {
        extendRemove(this._defaults, options || {});
    },

    /* Attach the image cube functionality to a div.
       @param  target   (element) the containing division
       @param  options  (object) the settings for this image cube instance (optional) */
    _attachImageCube: function(target, options) {
        target = $(target);
        if (target.hasClass(this.markerClassName)) {
            return;
        }
        var allOptions = $.extend({_position: target.css('position')},
            this._defaults, options || {});
        $.data(target[0], PROP_NAME, allOptions);
        target.addClass(this.markerClassName).css({position: 'relative'}).
            children().each(function() {
                var child = $(this);
                $.data(this, PROP_NAME,
                    {width: child.css('width'), height: child.css('height'),
                    position: child.css('position'), lineHeight: child.css('lineHeight'),
                    letterSpacing: child.css('letterSpacing')});
                child.css({width: target.css('width'), height: target.css('height'),
                    position: 'absolute', lineHeight: allOptions.lineHeight[1],
                    letterSpacing: allOptions.letterSpacing[1]});
            }).not(':first').hide();
        this._prepareRotation(target[0]);
    },

    /* Note current visible child and schedule a repeat rotation (if required).
       @param  target  (element) the containing division */
    _prepareRotation: function(target) {
        target = $(target);
        target.children('.imageCubeShading,.imageCubeFrom,.imageCubeTo').remove();
        var options = $.data(target[0], PROP_NAME);
        options.current = target.children(':visible')[0];
        var randomSelection = function(collection) {
            return (!collection.length ? collection : collection.filter(
                ':eq(' + Math.floor(Math.random() * collection.length) + ')'));
        };
        options.next = (options.selection == 'random' ?
            randomSelection(target.children(':hidden')) :
            (options.selection == 'backward' ? $(options.current).prev() :
            $(options.current).next()));
        options.next = (options.next.length ? options.next :
            (options.selection == 'random' ? options.current :
            (options.selection == 'backward' ? target.children(':last') :
            target.children(':first'))))[0]; // Cycle around if at the end
        if (options.repeat && !options._timer) {
            options._timer = setTimeout(function() {
                    $.imagecube._rotateImageCube(target[0]); },
                options.pause);
        }
        $.data(target[0], PROP_NAME, options);
    },

    /* Rotate the image cube to the next face.
       @param  target    (element) the containing division
       @param  next      (jQuery or element or string or number) next face to show (optional)
       @param  callback  (function) a function to call when finished with the rotation (optional) */
    _rotateImageCube: function(target, next, callback) {
        if (typeof next == 'function') {
            callback = next;
            next = '';
        }
        target = $(target);
        this._stopImageCube(target[0], true);
        var options = $.data(target[0], PROP_NAME);
        if (next != null) {
            next = (typeof next == 'number' ? target.children(':eq(' + next + ')') : $(next));
            if (target.children().filter(function() { return this === next[0]; }).length > 0) {
                options.next = next;
            }
        }
        var callbackArgs = [options.current, options.next];
        if (options.beforeRotate) {
            options.beforeRotate.apply(target[0], callbackArgs);
        }
        var animTo = {};
        animTo[PROP_NAME] = 1.0;
        target.attr(PROP_NAME, 0.0).animate(animTo, options.speed, options.easing,
            function() {
                if (options.afterRotate) {
                    options.afterRotate.apply(target[0], callbackArgs);
                }
                if (callback) {
                    callback.apply(target[0]);
                }
            });
    },

    /* Retrieve the currently visible child of an image cube div.
       @param  target  (element) the containing division
       @return  (element) the currently displayed child of target division */
    _currentImageCube: function(target) {
        return ($(target).hasClass(this.markerClassName) ?
            $.data(target, PROP_NAME).current : null);
    },

    /* Retrieve the next visible child of an image cube div.
       @param  target  (element) the containing division
       @return  (element) the next to be displayed child of target division */
    _nextImageCube: function(target) {
        return ($(target).hasClass(this.markerClassName) ?
            $.data(target, PROP_NAME).next : null);
    },

    /* Stop the image cube automatically rotating to the next face.
       @param  target     (element) the containing division
       @param  timerOnly  (boolean) true if only temporarily stopping (optional) */
    _stopImageCube: function(target, timerOnly) {
        var options = $.data(target, PROP_NAME);
        if (options._timer) {
            clearTimeout(options._timer);
            options._timer = null;
        }
        if (!timerOnly) {
            options.repeat = false;
        }
        $.data(target, PROP_NAME, options);
    },

    /* Start the image cube automatically rotating to the next face.
       @param  target  (element) the containing division */
    _startImageCube: function(target) {
        this._changeImageCube(target, {repeat: true});
    },

    /* Reconfigure the settings for an image cube div.
       @param  target   (element) the containing division
       @param  options  (object) the new settings for this image cube instance or
                        (string) the name of the setting
       @param  value    (any, optional) the value of the setting */
    _changeImageCube: function(target, options, value) {
        if (typeof options == 'string') {
            var opts = {};
            opts[options] = value;
            options = opts;
        }
        var curOptions = $.data(target, PROP_NAME);
        extendRemove(curOptions || {}, options || {});
        $.data(target, PROP_NAME, curOptions);
        this._prepareRotation(target);
    },

    /* Remove the image cube functionality from a div.
       @param  target  (element) the containing division */
    _destroyImageCube: function(target) {
        target = $(target);
        if (!target.hasClass(this.markerClassName)) {
            return;
        }
        this._stopImageCube(target[0]);
        var options = $.data(target[0], PROP_NAME);
        target.stop().css({position: options._position}).
            removeClass(this.markerClassName).
            children('.imageCubeShading,.imageCubeFrom,.imageCubeTo').remove();
        target.children().each(function() {
            $(this).css($.data(this, PROP_NAME)).show();
            $.removeData(this, PROP_NAME);
        });
        $.removeData(target[0], PROP_NAME);
    },

    /* Prepare the image cube for animation.
       @param  target  (element) the containing division */
    _prepareAnimation: function(target) {
        var options = $.data(target, PROP_NAME);
        var target = $(target);
        var offset = {left: 0, top: 0};
        target.parents().each(function() { // Check if this area is fixed
            var $this = $(this);
            if ($this.css('position') == 'fixed') {
                offset.left -= $this.offset().left;
                offset.top -= $this.offset().top;
                return false;
            }
        });
        var dims = {width: target.width(), height: target.height()};
        var direction = (options.direction != 'random' ? options.direction :
            options.randomSelection[Math.floor(Math.random() * options.randomSelection.length)]);
        direction = Math.max(0, $.inArray(direction, ['up', 'down', 'left', 'right']));
        options._curDirection = direction;
        var upDown = (direction == UP || direction == DOWN);
        var leftRight = (direction == LEFT || direction == RIGHT);
        var upLeft = (direction == UP || direction == LEFT);
        var firstOpacity = (upLeft ? 0 : options.opacity);
        var pFrom = $(options.current);
        var pTo = $(options.next);
        // Calculate borders and padding for both elements
        var border = [];
        var parseBorders = function(p) {
            var b = [0, 0, 0, 0];
            if (!$.browser.msie || p.css('border')) {
                for (var i = 0; i < 4; i++) {
                    b[i] = p.css('border' + ['Left', 'Right', 'Top', 'Bottom'][i] + 'Width');
                    var extra = ($.browser.msie ? 1 : 0);
                    b[i] = parseFloat(
                        {thin: 1 + extra, medium: 3 + extra, thick: 5 + extra}[b[i]] || b[i]);
                }
            }
            return b;
        };
        border[0] = parseBorders(pFrom);
        border[1] = parseBorders(pTo);
        var pad = [];
        pad[0] = [parseFloat(pFrom.css('padding-left')), parseFloat(pFrom.css('padding-right')),
            parseFloat(pFrom.css('padding-top')), parseFloat(pFrom.css('padding-bottom'))];
        pad[1] = [parseFloat(pTo.css('padding-left')), parseFloat(pTo.css('padding-right')),
            parseFloat(pTo.css('padding-top')), parseFloat(pTo.css('padding-bottom'))];
        var extras = [];
        extras[0] = [($.boxModel ? border[0][0] + border[0][1] + pad[0][0] + pad[0][1] : 0),
            ($.boxModel ? border[0][2] + border[0][3] + pad[0][2] + pad[0][3] : 0)];
        extras[1] = [($.boxModel ? border[1][0] + border[1][1] + pad[1][0] + pad[1][1] : 0),
            ($.boxModel ? border[1][2] + border[1][3] + pad[1][2] + pad[1][3] : 0)];
        // Define the property ranges per element
        var stepProps = [];
        stepProps[0] = {elem: pFrom[0], // Currently displayed element
            props: {left: {start: offset.left,
                end: offset.left + (direction == RIGHT ? dims.width : 0), units: 'px'},
            width: {start: dims.width - extras[0][0],
                end: (upDown ? dims.width - extras[0][0] : 0), units: 'px'},
            top: {start: offset.top,
                end: offset.top + (direction == DOWN ? dims.height : 0), units: 'px'},
            height: {start: dims.height - extras[0][1],
                end: (upDown ? 0 : dims.height - extras[0][1]), units: 'px'},
            paddingLeft: {start: pad[0][0], end: (leftRight ? 0 : pad[0][0]), units: 'px'},
            paddingRight: {start: pad[0][1], end: (leftRight ? 0 : pad[0][1]), units: 'px'},
            paddingTop: {start: pad[0][2], end: (upDown ? 0 : pad[0][2]), units: 'px'},
            paddingBottom: {start: pad[0][3], end: (upDown ? 0 : pad[0][3]), units: 'px'},
            borderLeftWidth: {start: border[0][0], end: (leftRight ? 0 : border[0][0]), units: 'px'},
            borderRightWidth: {start: border[0][1], end: (leftRight ? 0 : border[0][1]), units: 'px'},
            borderTopWidth: {start: border[0][2], end: (upDown ? 0 : border[0][2]), units: 'px'},
            borderBottomWidth: {start: border[0][3], end: (upDown ? 0 : border[0][3]), units: 'px'},
            lineHeight: {start: options.lineHeight[1],
                end: (upDown ? options.lineHeight[0] : options.lineHeight[1]), units: 'em'},
            letterSpacing: {start: options.letterSpacing[1],
                end: (upDown ? options.letterSpacing[1] : options.letterSpacing[0]), units: 'em'}}};
        stepProps[1] = {elem: pTo[0], // New element to be displayed
            props: {left: {start: offset.left + (direction == LEFT ? dims.width : 0),
                end: offset.left, units: 'px'},
            width: {start: (upDown ? dims.width - extras[1][0] : 0),
                end: dims.width - extras[1][0], units: 'px'},
            top: {start: offset.top + (direction == UP ? dims.height : 0),
                end: offset.top, units: 'px'},
            height: {start: (upDown ? ($.browser.msie ? 1 : 0) : dims.height - extras[1][1]),
                end : dims.height - extras[1][1], units: 'px'},
            paddingLeft: {start: (leftRight ? 0 : pad[1][0]), end: pad[1][0], units: 'px'},
            paddingRight: {start: (leftRight ? 0 : pad[1][1]), end: pad[1][1], units: 'px'},
            paddingTop: {start: (upDown ? 0 : pad[1][2]), end: pad[1][2], units: 'px'},
            paddingBottom: {start: (upDown ? 0 : pad[1][3]), end: pad[1][3], units: 'px'},
            borderLeftWidth: {start: (leftRight ? 0 : border[1][0]), end: border[1][0], units: 'px'},
            borderRightWidth: {start: (leftRight ? 0 : border[1][1]), end: border[1][1], units: 'px'},
            borderTopWidth: {start: (upDown ? 0 : border[1][2]), end: border[1][2], units: 'px'},
            borderBottomWidth: {start: (upDown ? 0 : border[1][3]), end: border[1][3], units: 'px'},
            lineHeight: {start: (upDown ? options.lineHeight[0] : options.lineHeight[1]),
                end: options.lineHeight[1], units: 'em'},
            letterSpacing: {start: (upDown ? options.letterSpacing[1] : options.letterSpacing[0]),
                end: options.letterSpacing[1], units: 'em'}}};
        if (options.shading) {
            // Initialise highlight and shadow objects (or colours on IE)
            var setHighShad = function(props, startOpacity, endOpacity) {
                return {left: {start: props.left.start, end: props.left.end, units: 'px'},
                    width: {start: props.width.start, end: props.width.end, units: 'px'},
                    top: {start: props.top.start, end: props.top.end, units: 'px'},
                    height: {start: props.height.start, end: props.height.end, units: 'px'},
                    paddingLeft: {start: props.paddingLeft.start + props.borderLeftWidth.start,
                        end: props.paddingLeft.end + props.borderLeftWidth.end, units: 'px'},
                    paddingRight: {start: props.paddingRight.start + props.borderRightWidth.start,
                        end: props.paddingRight.end + props.borderRightWidth.end, units: 'px'},
                    paddingTop: {start: props.paddingTop.start + props.borderTopWidth.start,
                        end: props.paddingTop.end + props.borderTopWidth.end, units: 'px'},
                    paddingBottom: {start: props.paddingBottom.start + props.borderBottomWidth.start,
                        end: props.paddingBottom.end + props.borderBottomWidth.end, units: 'px'},
                    opacity: {start: startOpacity, end: endOpacity, units: ''}};
            };
            stepProps[2] = {elem: // Highlight shading (up/left)
                $(($.browser.msie ? '<img src="' + options.imagePath + 'imageCubeHigh.png"' :
                '<div') + ' class="imageCubeShading" style="background-color: white; opacity: ' +
                firstOpacity + '; z-index: 10; position: absolute;"' +
                ($.browser.msie ? '/>' : '></div>'))[0],
                props: setHighShad(stepProps[upLeft ? 0 : 1].props,
                firstOpacity, options.opacity - firstOpacity)};
            stepProps[3] = {elem: // Shadow shading (down/right)
                $(($.browser.msie ? '<img src="' + options.imagePath + 'imageCubeShad.png"' :
                '<div') + ' class="imageCubeShading" style="background-color: black; opacity: ' +
                (options.opacity - firstOpacity) + '; z-index: 10; position: absolute;"' +
                ($.browser.msie ? '/>' : '></div>'))[0],
                props: setHighShad(stepProps[upLeft ? 1 : 0].props,
                options.opacity - firstOpacity, firstOpacity)};
        }
        // Set up full 3D rotation
        if (options.full3D) {
            for (var i = 0; i < options.segments; i++) {
                target.append(pFrom.clone().addClass('imageCubeFrom').
                    css({display: 'block', position: 'absolute', overflow: 'hidden'}));
                if (options.shading) {
                    target.append($(stepProps[upLeft ? 2 : 3].elem).clone());
                }
            }
            for (var i = 0; i < options.segments; i++) {
                target.append(pTo.clone().addClass('imageCubeTo').
                    css({display: 'block', position: 'absolute', width: 0, overflow: 'hidden'}));
                if (options.shading) {
                    target.append($(stepProps[upLeft ? 3 : 2].elem).clone());
                }
            }
            pFrom.hide();
            pTo.css({width: dims.width - extras[1][0], height: dims.height - extras[1][1]});
        }
        else {
            // Initialise from and to objects
            var initCSS = function(props) {
                return {left: props.left.start + 'px', width: props.width.start + 'px',
                    top: props.top.start + 'px', height: props.height.start + 'px',
                    lineHeight: props.lineHeight.start + 'em',
                    padding: props.paddingTop.start + 'px ' + props.paddingRight.start + 'px ' +
                    props.paddingBottom.start + 'px ' + props.paddingLeft.start + 'px',
                    borderLeftWidth: props.borderLeftWidth.start + 'px',
                    borderRightWidth: props.borderRightWidth.start + 'px',
                    borderTopWidth: props.borderTopWidth.start + 'px',
                    borderBottomWidth: props.borderBottomWidth.start + 'px',
                    letterSpacing: props.letterSpacing.start + 'em', overflow: 'hidden'};
            };
            pFrom.css(initCSS(stepProps[0].props));
            pTo.css(initCSS(stepProps[1].props)).show();
            if (options.shading) {
                target.append(stepProps[2].elem).append(stepProps[3].elem);
            }
        }
        // Pre-compute differences
        for (var i = 0; i < stepProps.length; i++) {
            for (var name in stepProps[i].props) {
                var prop = stepProps[i].props[name];
                prop.diff = prop.end - prop.start;
            }
        }
        return stepProps;
    },

    /* Draw one panel of the 3D perspective view of the cube.
       @param  target     (element) the container
       @param  pos        (number) the current position (0.0 - 1.0)
       @param  stepProps  (object[]) details about the items being animated
       @return  (boolean) true if drawn in 3D, false if not */
    _drawFull3D: function(target, pos, stepProps) {
        var options = $.data(target, PROP_NAME);
        if (!options.full3D) {
            return false;
        }
        var target = $(target);
        var direction = options._curDirection;
        var upDown = (direction == UP || direction == DOWN);
        var upLeft = (direction == UP || direction == LEFT);
        var width = target.width();
        var height = target.height();
        if (width == 0 || height == 0) {
            return true;
        }
        var current = (1 - pos) * (upDown ? height : width);
        var segments = options.segments;
        var maxExpand = options.expansion * (1 - Math.abs(2 * current - (upDown ? height : width)) /
            (upDown ? height : width));
        var maxReduce = options.reduction - (options.reduction * current / (upDown ? height : width));
        var update = function(className, al, at, bl, bt, cl, ct, dl, dt, opacity, props, attr) {
            var ws = [bl - al, cl - dl];
            var w = Math.max(ws[0], ws[1]);
            var hs = [dt - at, ct - bt];
            var h = Math.max(hs[0], hs[1]);
            var wStep = (upDown ? (ws[0] - ws[1]) / (segments - 1) / 2 : w / segments);
            var hStep = (upDown ? h / segments : (hs[0] - hs[1]) / (segments - 1) / 2);
            var pbw = props.paddingLeft[attr] + props.paddingRight[attr] +
                props.borderLeftWidth[attr] + props.borderRightWidth[attr];
            var pbh = props.paddingTop[attr] + props.paddingBottom[attr] +
                props.borderTopWidth[attr] + props.borderBottomWidth[attr];
            var ral = Math.round(al);
            var rat = Math.round(at);
            var thisLeft = ral;
            var thisTop = rat;
            var i = 0;
            for (var j = 0; j < target[0].childNodes.length; j++) {
                var child = target[0].childNodes[j];
                if (child.className != className) {
                    continue;
                }
                var nextLeft = Math.round(al + (i + 1) * wStep);
                var nextTop = Math.round(at + (i + 1) * hStep);
                var wCur = ws[0] - (upDown ? 2 * i * wStep : 0);
                var hCur = hs[0] - (upDown ? 0 : 2 * i * hStep);
                child.style.left = (upDown ? thisLeft : al) + 'px';
                child.style.top = (upDown ? at : thisTop) + 'px';
                child.style.width = Math.max(0, wCur - pbw) + 'px';
                child.style.height = Math.max(0, hCur - pbh) + 'px';
                child.style.letterSpacing = (upDown ? wCur / w * (options.letterSpacing[1] -
                    options.letterSpacing[0]) + options.letterSpacing[0] :
                    pos * props.letterSpacing.diff + props.letterSpacing.start) +
                    props.letterSpacing.units;
                child.style.lineHeight = (!upDown ? hCur / h * (options.lineHeight[1] -
                    options.lineHeight[0]) + options.lineHeight[0] :
                    pos * props.lineHeight.diff + props.lineHeight.start) +
                    props.lineHeight.units;
                child.style.clip = 'rect(' + (!upDown ? 'auto' : (thisTop - rat) + 'px') + ',' +
                    (upDown ? 'auto' : (nextLeft - ral) + 'px') + ',' +
                    (!upDown ? 'auto' : (nextTop - rat) + 'px') + ',' +
                    (upDown ? 'auto' : (thisLeft - ral) + 'px') + ')';
                if (options.shading) {
                    var shading = child.nextSibling;
                    shading.style.left = thisLeft + 'px';
                    shading.style.top = thisTop + 'px';
                    shading.style.width = (upDown ? ws[0] - 2 * i * wStep : nextLeft - thisLeft) + 'px';
                    shading.style.height = (upDown ? nextTop - thisTop : hs[0] - 2 * i * hStep) + 'px';
                    shading.style.opacity = opacity;
                    if ($.browser.msie) {
                        shading.style.filter = 'alpha(opacity=' + (opacity * 100) + ')';
                    }
                }
                thisLeft = nextLeft;
                thisTop = nextTop;
                i++;
            }
        };
        update('imageCubeFrom',
            [maxReduce, -maxExpand, 0, width - current][direction], // top left
            [0, height - current, maxReduce, -maxExpand][direction],
            [width - maxReduce, width + maxExpand, current, width][direction], // top right
            [0, height - current, -maxExpand, maxReduce][direction],
            [width + maxExpand, width - maxReduce, current, width][direction], // bottom right
            [current, height, height + maxExpand, height - maxReduce][direction],
            [-maxExpand, maxReduce, 0, width - current][direction], // bottom left
            [current, height, height - maxReduce, height + maxExpand][direction],
            (!options.shading ? 0 : (upLeft ? pos : 1 - pos) *
            stepProps[2].props.opacity.diff + stepProps[2].props.opacity.start),
            stepProps[0].props, 'start');
        update('imageCubeTo',
            [-maxExpand, options.reduction - maxReduce, current, 0][direction], // top left
            [current, 0, -maxExpand, options.reduction - maxReduce][direction],
            [width + maxExpand, width - (options.reduction - maxReduce), width, width - current][direction], // top right
            [current, 0, options.reduction - maxReduce, -maxExpand][direction],
            [width - (options.reduction - maxReduce), width + maxExpand, width, width - current][direction], // bottom right
            [height, height - current, height - (options.reduction - maxReduce), height + maxExpand][direction],
            [options.reduction - maxReduce, -maxExpand, current, 0][direction], // bottom left
            [height, height - current, height + maxExpand, height - (options.reduction - maxReduce)][direction],
            (!options.shading ? 0 : (upLeft ? pos : 1 - pos) *
            stepProps[3].props.opacity.diff + stepProps[3].props.opacity.start),
            stepProps[1].props, 'end');
        return true;
    }
});

/* jQuery extend now ignores nulls!
   @param  target  (object) the object to extend
   @param  props   (object) the attributes to modify
   @return  (object) the updated target */
function extendRemove(target, props) {
    $.extend(target, props);
    for (var name in props) {
        if (props[name] == null) {
            target[name] = null;
        }
    }
    return target;
}

/* Attach the image cube functionality to a jQuery selection.
   @param  command  (string) the command to run (optional, default 'attach')
   @param  options  (object) the new settings to use for these image cube instances
   @return  (jQuery) for chaining further calls */
$.fn.imagecube = function(options) {
    var otherArgs = Array.prototype.slice.call(arguments, 1);
    if (options == 'current' || options == 'next') {
        return $.imagecube['_' + options + 'ImageCube'].
            apply($.imagecube, [this[0]].concat(otherArgs));
    }
    return this.each(function() {
        if (typeof options == 'string') {
            $.imagecube['_' + options + 'ImageCube'].
                apply($.imagecube, [this].concat(otherArgs));
        }
        else {
            $.imagecube._attachImageCube(this, options);
        }
    });
};

/* Enable synchronised animation for all of the image cube properties.
   @param  fx  (object) the effects instance to animate */
$.fx.step[PROP_NAME] = function(fx) {
    if (fx.state == 0 || !fx.stepProps) { // Initialisation
        fx.start = 0.0;
        fx.end = 1.0;
        fx.stepProps = $.imagecube._prepareAnimation(fx.elem);
        var elem = fx.stepProps[0].elem;
        fx.saveCSS = {borderLeftWidth: elem.style.borderLeftWidth,
            borderRightWidth: elem.style.borderRightWidth,
            borderTopWidth: elem.style.borderTopWidth,
            borderBottomWidth: elem.style.borderBottomWidth,
            padding: elem.style.padding};
    }

    if (!$.imagecube._drawFull3D(fx.elem, fx.pos, fx.stepProps)) {
        for (var i = 0; i < fx.stepProps.length; i++) { // Update all elements
            var comp = fx.stepProps[i];
            for (var name in comp.props) { // Update all properties
                var prop = comp.props[name];
                comp.elem.style[name] = (fx.pos * prop.diff + prop.start) + prop.units;
                if ($.browser.msie && name == 'opacity') {
                    comp.elem.style.filter = 'alpha(opacity=' +
                        ((fx.pos * prop.diff + prop.start) * 100) + ')';
                }
            }
        }
    }

    if (fx.state == 1) { // Tidy up afterwards
        $(fx.stepProps[0].elem).hide().css(fx.saveCSS);
        $(fx.stepProps[1].elem).show();
        $.imagecube._prepareRotation(fx.elem);
    }
};

/* Initialise the image cube functionality. */
$.imagecube = new ImageCube(); // singleton instance

})(jQuery);
</script>
<script type="text/javascript" charset="utf-8">
$(function () {
    $('.popular-posts ul').abupopularcube();
});

</script>
<script>
eval(function(p,a,c,k,e,r){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('(0($){$.h.j=0(){4 a=[];$6=$(\'.2-3 k\');a.5(\'<7 l="8"  m="n o">\');$(9).1(\'p\').q(0(){a.5($(9).1(\'.r-s\').t())});a.5(\'</7>\');$6.u(a.v(\'\'));4 b=$(\'.2-3\').1("d");b.f("w");b.f("x");4 c=$(\'.2-3\').1("a");c.g("y","");$(\'.2-3\').1("d").g(\'z\',0(i,e){A e.B("C-c","D")})}})(E);$(0(){$(\'#8\').F()});',42,42,'function|find|popular|posts|var|push|list|div|linksCube|this||||img||removeAttr|attr|fn||abupopularcube|ul|id|class|cube|repeatingCube|li|each|item|thumbnail|html|replaceWith|join|width|height|target|src|return|replace|s72|s300|jQuery|imagecube'.split('|'),0,{}))
</script>



leer articulo ➨

Flat Press, plantilla para Blogger

3 comentaron



Flat Press es una plantilla actual para la plataforma de Blogger muy bien realizada, diseñada al estilo magazine y distribuida por bloques de categorias.

Características:
100% Responsive.
Articulos recientes divididos por etiquetas.
Menu desplegable (fijo cuando te desplazas hacia abajo).
Paginacion.
Articulos relacionados.
Slider de imagenes.
Slider automatico de posts. (texto)
Iconos sociales.
Emoticonos para comentarios.

ver demo descargar


leer articulo ➨

Formulario de busqueda elegante para Blogger

4 comentaron



En distintos articulos de este blog, ya os he mostrado mas de un formulario o barra de busqueda personalizada, una herramienta imprescindible sobre todo si tenemos un blog. Y como los que nos ofrece Blogger son un poco 'comunes', aqui os traigo este con un diseño sencillo pero a la vez elegante, en tonos blancos y grises realizado utilizando estilos CSS3. Se adapta automaticamente y te abre los resultados de la busqueda en una pestaña nueva. Si te gusta y quieres ponerlo en tu blog, tan solo debes copiar el codigo siguiente y pegarlo alli donde quieras mostrarlo (en un gadget HTML, por ejemplo), asi de facil.


ver codigo
<div id="buscaform"></div><form class="formbusca" action="/search" method="get" target="_blank"><input name="q" type="search" placeholder="Buscar" /><button type="submit" value="Buscar">&nbsp;</button></form>
<style>
#buscaform{
    width:0;
    height:50px;
    margin:0 auto;
    border-radius:100%;
    -webkit-box-shadow: 0 50px 200px 150px rgba(255, 255, 255, 0.93);
    -moz-box-shadow: 0 50px 200px 150px rgba(255, 255, 255, 0.93);
    box-shadow: 0 50px 200px 150px rgba(255, 255, 255, 0.93);
}
.formbusca{
    background-color:#fffbf8;
    padding:13px;
    width:335px;
    margin:0px auto;
    -webkit-box-sizing:border-box;
    -moz-box-sizing:border-box;
    box-sizing:border-box;
    border-radius:6px;
    -webkit-box-shadow:
        0 2px 4px 0 rgba(72, 72, 72, 0.83),
        0 10px 15px 0 rgba(126, 126, 126, 0.12),
        0 -2px 6px 1px rgba(199, 199, 199, 0.55) inset,
        0 2px 4px 2px rgba(255, 255, 255, 0.83) inset;
    -moz-box-shadow:
        0 2px 4px 0 rgba(72, 72, 72, 0.83),
        0 10px 15px 0 rgba(126, 126, 126, 0.12),
        0 -2px 6px 1px rgba(199, 199, 199, 0.55) inset,
        0 2px 4px 2px rgba(255, 255, 255, 0.83) inset;
    box-shadow:
        0 2px 4px 0 rgba(72, 72, 72, 0.83),
        0 10px 15px 0 rgba(126, 126, 126, 0.12),
        0 -2px 6px 1px rgba(199, 199, 199, 0.55) inset,
        0 2px 4px 2px rgba(255, 255, 255, 0.83) inset;
}
input[type="search"]{
    width:250px;
    height:30px;
    padding-left:15px;
    border-radius:6px;
    border:none;
    color:#939393;
    font-weight:bold;
    background-color:#fffbf8;
    -webkit-box-shadow:
        0 -2px 2px 0 rgba(199, 199, 199, 0.55),
        0 1px 1px 0 #fff,
        0 2px 2px 1px #fafafa,
        0 2px 4px 0 #b2b2b2 inset,
        0 -1px 1px 0 #f2f2f2 inset,
        0 15px 15px 0 rgba(41, 41, 41, 0.09) inset;
    -moz-box-shadow:
        0 -2px 2px 0 rgba(199, 199, 199, 0.55),
        0 1px 1px 0 #fff,
        0 2px 2px 1px #fafafa,
        0 2px 4px 0 #b2b2b2 inset,
        0 -1px 1px 0 #f2f2f2 inset,
        0 15px 15px 0 rgba(41, 41, 41, 0.09) inset;
    box-shadow:
        0 -2px 2px 0 rgba(199, 199, 199, 0.55),
        0 1px 1px 0 #fff,
        0 2px 2px 1px #fafafa,
        0 2px 4px 0 #b2b2b2 inset,
        0 -1px 1px 0 #f2f2f2 inset,
        0 15px 15px 0 rgba(41, 41, 41, 0.09) inset;
}
button[type="submit"]{
    width:35px;
    height:30px;
    background-image:url(data:image/png;base64,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);
    background-repeat: no-repeat;
    background-position: 10px 5px;
    background-color:transparent;
    -webkit-background-size:20px 20px;
    background-size:20px 20px;
    border:none;
    cursor:pointer;
}
input[type="search"]:focus{
    outline:0;
}
</style>



leer articulo ➨

Como poner descargas directas de imagenes alojadas en Blogger

2 comentaron


¿Sabeis que en nuestro Blogger podemos añadir descargas de imagenes? Os voy a explicar este sencillisimo truco que permitira a vuestros usuarios descargarse automaticamente, haciendo click, cualquier imagen que tengamos alojada en nuestro blog.


Cuando subimos una imagen en Blogger, aparece el siguiente codigo en el que se repite dos veces la direccion URL de esta, como podeis ver indicado en color azul.

<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWxeRbh2QoF45xY69dYLeizR7t0aNQsR85SfVVN4kQfRlmzoLwkq6JTyXvGeq9xMVL6BhAcS7VDjnVAkGZqTsvrt1rSQrHGs6TxNs00oJkFdungZZaaubsgCd_QFTXBt6fvInRT7hqCl8/s1600/1385421049969.jpeg" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWxeRbh2QoF45xY69dYLeizR7t0aNQsR85SfVVN4kQfRlmzoLwkq6JTyXvGeq9xMVL6BhAcS7VDjnVAkGZqTsvrt1rSQrHGs6TxNs00oJkFdungZZaaubsgCd_QFTXBt6fvInRT7hqCl8/s1600/1385421049969.jpeg" /></a>


Bien, como podeis ver, estas URLs estan repletas de letritas y numeritos. Lo que tenemos que localizar es un trozo mas pequeño que empieza por s (en este caso s1600). Estos numeros pueden variar segun el tamaño que hayamos redimensionado la imagen, esta del ejemplo esta en su tamaño original. A la primera de las dos URLs, le añadiremos un guion (-) y la letra d, o sea: -d , tal cual os he puesto en el codigo de ejemplo resaltado en color rojo.

<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWxeRbh2QoF45xY69dYLeizR7t0aNQsR85SfVVN4kQfRlmzoLwkq6JTyXvGeq9xMVL6BhAcS7VDjnVAkGZqTsvrt1rSQrHGs6TxNs00oJkFdungZZaaubsgCd_QFTXBt6fvInRT7hqCl8//-d/1385421049969.jpeg" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWxeRbh2QoF45xY69dYLeizR7t0aNQsR85SfVVN4kQfRlmzoLwkq6JTyXvGeq9xMVL6BhAcS7VDjnVAkGZqTsvrt1rSQrHGs6TxNs00oJkFdungZZaaubsgCd_QFTXBt6fvInRT7hqCl8/s1600/1385421049969.jpeg" /></a>


Todas la imagenes a las que le agregueis esto en su codigo de enlace se podran descargar directamente. Podeis probar haciendo clic en la siguiente instantanea.



Tambien podemos poner enlaces de texto para esta funcion. Como podeis ver a continuacion:
descargar imagen del coche


Para ello, modificamos un poco el codigo y eliminamos el 2º enlace. Sustituye lo que esta en color verde por el texto que tu desees.

<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWxeRbh2QoF45xY69dYLeizR7t0aNQsR85SfVVN4kQfRlmzoLwkq6JTyXvGeq9xMVL6BhAcS7VDjnVAkGZqTsvrt1rSQrHGs6TxNs00oJkFdungZZaaubsgCd_QFTXBt6fvInRT7hqCl8//-d/1385421049969.jpeg" imageanchor="1" >AQUI TU TEXTO</a>


leer articulo ➨

ModernBlog, plantilla para Blogger

comentar



ModernBlog es una plantilla gratuita para Blogger estilo magazine diseñada por Sora Templates y vickystudio, con un aspecto sobrio a la par que elegante, en la que sus colores predominantes son el blanco, amarillo, gris y el azul oscuro. Cuenta con un menu deslizante, bloque superior de ultimas entradas, widget social con iconos, paginacion, efecto zoom en imagenes y widget de posts relacionados, entre los elementos destacables. En definitiva, una plantilla sin grandes estridencias, pero con un diseño bastante aceptable y profesional. Una buena opcion, sin duda, para instalarla en tu blog.

ver plantilla descargar

leer articulo ➨

Blogger incorpora (por fin) un formulario de contacto

3 comentaron

Los usuarios lo llevabamos esperando mucho tiempo y al fin ha llegado. Blogger ha incorporado un gadget nuevo, un formulario para que nuestros lectores/visitantes puedan ponerse en contacto con nosotros sin necesidad de depender de servicios externos. Esta pensado para ponerlo en la sidebar de nuestro blog como cualquier otro gadget, se adapta al diseño de nuestro blog automaticamente y de momento cuenta con 3 casillas a rellenar, la del nombre, la de la direccion de correo y otra para el mensaje. Por el momento no nos deja manejar opciones ni subir archivos, aunque mas adelante puede que si.


Para acceder al formulario, te diriges a Diseño > Añadir un gadget y, en el menu de la parte izquierda seleccionas Mas gadgets y ahi te aparecera como puedes ver en la imagen de abajo. Como he dicho antes, este formulario esta preparado para ponerlo en la sidebar, pero si quieres añadirlo en una pagina estatica y personalizarlo un poco con CSS, te recomiendo que leas este articulo de Oloblogger.




leer articulo ➨