Подтвердить что ты не робот

Каков наилучший способ сделать самый большой рекламный блок, который вписывается в его контейнер при использовании отзывчивого дизайна?

Я ищу подходящие объявления Google AdSense в отзывчивом дизайне (в частности, используя Twitter Bootstrap).

Проблема заключается в том, что с адаптивным дизайном ширина контейнера может меняться в зависимости от ширины окна вашего браузера. Хотя это одна из основных сильных сторон для гибкого дизайна, может быть трудно подогнать контент фиксированной ширины, например рекламу. Например, данный контейнер может быть шириной 300 пикселей для пользователей, просматривающих страницу с браузером шириной не менее 1200 пикселей. Но в окне браузера шириной 768 пикселей один и тот же контейнер может иметь ширину всего 180 пикселей.

Я ищу решение JavaScript (jQuery?) для загрузки самого большого формата объявлений, который соответствует ширине контейнера.

Предположим, у меня есть следующие рекламные места (форматы объявлений):

name      width x height   slot_id
slot_180    180 x 160      1234567890
slot_250    250 x 250      2345678901
slot_300    300 x 250      3456789012
slot_336    336 x 280      4567890123
slot_728    728 x  90      5678901234

Здесь script, который должен включать:

<script type="text/javascript"><!--
    google_ad_client   =  "ca-ABCDEFGH";
    google_ad_slot     =  "[###slot_id###]";
    google_ad_width    =   [###width###];
    google_ad_height   =   [###height###];
//--></script>
<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>';

И вот несколько примеров html:

<body>
    <div class="row">
        <div class="span3"><p>Lorem ipsum</p></div>
        <div class="span3" id="adSlot1"><!-- [### INSERT AD 1 HERE ###] --></div>
        <div class="span3"><p>Lorem ipsum</p></div>
        <div class="span3"><p>Lorem ipsum</p></div>
    </div>
    <div class="row">
        <div class="span4" id="adSlot2"><!-- [### INSERT AD 2 HERE ###] --></div>
        <div class="span4"><p>Lorem ipsum</p></div>
        <div class="span4" id="adSlot3"><!-- [### INSERT AD 3 HERE ###] --></div>
    </div>
</body>

Я бы хотел показать самый большой рекламный блок, который подходит в данном контейнере.

Например:

Если # adSlot1 имеет ширину 300 пикселей, покажите slot_300 (вернее, id: 3456789012 вместе с его шириной и высотой в JavaScript AdSense).

Теперь скажем, что вы просматриваете страницу на другом устройстве, а # adSlot1 теперь имеет ширину 480 пикселей. Теперь используйте slot_336. 1000px широкий элемент? Используйте slot_728. Получите это?

Обратите внимание, что это против Google TOS для отображения всех разных слотов и всего лишь .show()/.hide() в зависимости от ширины. Вместо этого, если JavaScript-код вызывается, он должен быть видимым на странице. (Представьте себе, как это испортило бы все сообщения, если скрытые объявления будут считаться впечатлениями!)

Я также не очень заинтересован в том, чтобы люди растягивали и сокращали свое окно браузера во время просмотра страницы. Но бонусные очки, если есть здравый ответ на это. До тех пор это может загружаться один раз на загрузку страницы.

Что вы предлагаете - лучший, самый элегантный способ сделать это?

4b9b3361

Ответ 1

AdSense не поддерживает ширину жидкости (не то, что я знаю), но вы можете служить различные размеры в зависимости от фактического размера контейнера с использованием JavaScript.

Посмотрите на это:

http://james.cridland.net/code/dynamic_google_adsense.html

ИЗМЕНИТЬ

Было бы полезно, если бы вы объяснили, как вы использовали пример в приведенной выше ссылке.

Вот более подробный пример как плагин jQuery, который должен работать теоретически.

var google_ad_slot, google_ad_width, google_ad_height;
(function( $ ){
    $.fn.google_ads = function(slots) {
        /* Sort slots by width descending */
        slots.sort(function(a, b){
            var a1 = a[0], b1 = b[0];
            if(a1 == b1) return 0;
            return a1 > b1? -1: 1;
        });
        return this.each(function(){
            /* Get slot container width */
            var width = $(this).width();

            /* Find fitting slot */
            var slot = null;
            $.each(slots, function(){
                slot = this;
                if(width >= slot[0]){
                    return false;
                }
            });

            if( slot !== null ){
                /* Set global variables for external script */
                google_ad_slot = slot[2];
                google_ad_width = slot[0];
                google_ad_height = slot[1];

                /* Append script to slot container */
                var script_el = $('<script>', {
                    'type': 'text/javascript',
                    'src': 'http://pagead2.googlesyndication.com/pagead/show_ads.js'
                }).on('load', function() {
                    /* May need to wait with next slot until script is loaded */
                    console.log('loaded');
                });
                $(this).append(script_el);
            }

        });
    };
})( jQuery );

Пример использования [ширина, высота, слот]

<h2>Slot 1</h2>
<div id="slot-1" class="slot" style="width:300px;"></div>
<h2>Slot 2</h2>
<div id="slot-2" class="slot" style="width:400px;"></div>
<script type="text/javascript">

var google_ad_client = "ca-pub-527527527527527";
$('.slot').google_ads([
    [180, 160, 1234567890],
    [250, 250, 2345678901],
    [300, 250, 3456789012],
    [336, 280, 4567890123],
    [728, 90, 5678901234]
]);

</script>

Более вероятным (и уродливым) способом добиться успеха будет:

<script type="text/javascript">
var get_google_ad_params = function(width, slots){

    /* Sort slots by width descending */
    slots.sort(function(a, b){
        var a1 = a[0], b1 = b[0];
        if(a1 == b1) return 0;
        return a1 > b1? -1: 1;
    });

    /* Find fitting slot */
    var slot = null;
    $.each(slots, function(){
        slot = this;
        if(width >= slot[0]){
            return false;
        }
    });
    return slot;
};

var slots = [
    [180, 160, 1234567890],
    [250, 250, 2345678901],
    [300, 250, 3456789012],
    [336, 280, 4567890123],
    [728, 90, 5678901234]
];
</script>

<h2>Slot 1</h2>
<div id="slot-1" class="slot" style="width:300px;">
    <script type="text/javascript">
    var params = get_google_ad_params($('#slot-1').width(), slots);
    var google_ad_slot = params[2];
    var google_ad_width = params[0];
    var google_ad_height = params[1];
    </script>
    <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
</div>
<h2>Slot 2</h2>
<div id="slot-2" class="slot" style="width:400px;">
    <script type="text/javascript">
    var params = get_google_ad_params($('#slot-2').width(), slots);
    var google_ad_slot = params[2];
    var google_ad_width = params[0];
    var google_ad_height = params[1];
    </script>
    <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
</div>

Ответ 2

Это может показаться немного рудиментарным, особенно по сравнению с ответом Sunn0, но как насчет чего-то такого простого?

function findAd(){
$('.adSlot').each(function(){
    var adSlotWidth = $(this).width();
    if(adSlotWidth >= 728){
        $(this).html(/* GOOGLE AD */);  
    } else if(adSlotWidth >= 336 && adSlotWidth <= 727){
        $(this).html(/* GOOGLE AD */);
    } else if(adSlotWidth >= 300 && adSlotWidth <= 335){
        $(this).html(/* GOOGLE AD */);
    } else if(adSlotWidth >= 250 && adSlotWidth <= 299){
        $(this).html(/* GOOGLE AD */);
    } else{
        $(this).html(/* GOOGLE AD */);
    }
});
}


$(document).ready(function(){

    findAd();
    $(window).resize(function(){
        findAd();   
    });

});

Редактирование для включения кода

Ответ 3

Вы должны иметь возможность вызывать плагин sunn0 при изменении размера окна и работать с ним также на отзывчивость. Однако вы должны изучить дросселирование события изменения размера. Это хороший пост, чтобы прочитать об этом.

http://paulirish.com/2009/throttled-smartresize-jquery-event-handler/